IAP.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("AutoChips Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
  6. * the prior written permission of AutoChips inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of AutoChips Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * AutoChips Inc. (C) 2016. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
  15. * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
  25. * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
  30. * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
  32. */
  33. #include <string.h>
  34. #include "IAP.h"
  35. static __align(4)uint8_t WriteDataBuff[2048];
  36. static uint32_t s_writeAddress;
  37. static uint8_t s_iapStep;
  38. static uint32_t s_writeDataBuffSeek;
  39. void IAP_Start(void)
  40. {
  41. if (s_iapStep == 1)
  42. {
  43. return; ///<repeat start
  44. }
  45. s_writeAddress = APP_ADDRESS;
  46. s_iapStep = 1;
  47. }
  48. int IAP_Write(uint8_t *pdata, uint16_t length)
  49. {
  50. EFLASH_StatusType ret = EFLASH_STATUS_SUCCESS;
  51. uint16_t MiniLength = 0;
  52. if (s_iapStep != 1) ///<防止用户不先调用start就开始写
  53. return -1;
  54. while (length > 0)
  55. {
  56. if ((s_writeAddress < APP_ADDRESS) || (s_writeAddress >= APP_ADDRESS_END)) ///<IAP不能超出APP_BKP地址范围
  57. return -1;
  58. if (s_writeDataBuffSeek + length > 2048) ///得到单次写入的长度
  59. {
  60. MiniLength = 2048 - s_writeDataBuffSeek; ///<长度超出buff
  61. }
  62. else
  63. {
  64. MiniLength = length; ///<全部写完,
  65. }
  66. memcpy(&WriteDataBuff[s_writeDataBuffSeek], pdata, MiniLength);
  67. pdata += MiniLength;
  68. s_writeDataBuffSeek += MiniLength;
  69. length -= MiniLength;
  70. if (s_writeDataBuffSeek == 2048)
  71. {
  72. EFLASH_UnlockCtrl();
  73. ret = EFLASH_PageErase(s_writeAddress); ///<erase page
  74. if (ret != EFLASH_STATUS_SUCCESS) return -1;
  75. ret = EFLASH_PageEraseVerify(s_writeAddress); ///< verify erase state
  76. if (ret != EFLASH_STATUS_SUCCESS) return -1;
  77. ret = EFLASH_PageProgram(s_writeAddress, (uint32_t *)WriteDataBuff, 512);
  78. if (ret != EFLASH_STATUS_SUCCESS) return -1;
  79. EFLASH_LockCtrl();
  80. s_writeAddress += 2048;
  81. s_writeDataBuffSeek = 0;
  82. }
  83. }
  84. return 0;
  85. }
  86. int IAP_Stop(void)
  87. {
  88. EFLASH_StatusType ret = EFLASH_STATUS_SUCCESS;
  89. s_iapStep = 0; ///<stop后重置step
  90. if ((s_writeAddress < APP_ADDRESS) || (s_writeAddress >= APP_ADDRESS_END)) ///<IAP不能超出APP_BKP地址范围
  91. return -1;
  92. EFLASH_UnlockCtrl();
  93. ret = EFLASH_PageErase(s_writeAddress); ///<erase page
  94. if (ret != EFLASH_STATUS_SUCCESS) return -1;
  95. ret = EFLASH_PageEraseVerify(s_writeAddress); ///< verify erase state
  96. if (ret != EFLASH_STATUS_SUCCESS) return -1;
  97. ret = EFLASH_PageProgram(s_writeAddress, (uint32_t *)WriteDataBuff, 512); ///<此处应该不满2048,但还是全部写入,后面为多余字节
  98. if (ret != EFLASH_STATUS_SUCCESS) return -1;
  99. EFLASH_LockCtrl();
  100. return 0;
  101. }