upgrade_lib.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "ets_sys.h"
  2. #include "spi_flash.h"
  3. //#include "net80211/ieee80211_var.h"
  4. #include "lwip/mem.h"
  5. #include "upgrade.h"
  6. struct upgrade_param {
  7. uint32 fw_bin_addr;
  8. uint8 fw_bin_sec;
  9. uint8 fw_bin_sec_num;
  10. uint8 fw_bin_sec_earse;
  11. uint8 extra;
  12. uint8 save[4];
  13. uint8 *buffer;
  14. };
  15. LOCAL struct upgrade_param *upgrade;
  16. extern SpiFlashChip *flashchip;
  17. /******************************************************************************
  18. * FunctionName : system_upgrade_internal
  19. * Description : a
  20. * Parameters :
  21. * Returns :
  22. *******************************************************************************/
  23. LOCAL bool ICACHE_FLASH_ATTR
  24. system_upgrade_internal(struct upgrade_param *upgrade, uint8 *data, uint16 len)
  25. {
  26. bool ret = false;
  27. if(data == NULL || len == 0)
  28. {
  29. return true;
  30. }
  31. upgrade->buffer = (uint8 *)os_zalloc(len + upgrade->extra);
  32. os_memcpy(upgrade->buffer, upgrade->save, upgrade->extra);
  33. os_memcpy(upgrade->buffer + upgrade->extra, data, len);
  34. len += upgrade->extra;
  35. upgrade->extra = len & 0x03;
  36. len -= upgrade->extra;
  37. os_memcpy(upgrade->save, upgrade->buffer + len, upgrade->extra);
  38. do {
  39. if (upgrade->fw_bin_addr + len >= (upgrade->fw_bin_sec + upgrade->fw_bin_sec_num) * SPI_FLASH_SEC_SIZE) {
  40. break;
  41. }
  42. if (len > SPI_FLASH_SEC_SIZE) {
  43. } else {
  44. // os_printf("%x %x\n",upgrade->fw_bin_sec_earse,upgrade->fw_bin_addr);
  45. /* earse sector, just earse when first enter this zone */
  46. if (upgrade->fw_bin_sec_earse != (upgrade->fw_bin_addr + len) >> 12) {
  47. upgrade->fw_bin_sec_earse = (upgrade->fw_bin_addr + len) >> 12;
  48. spi_flash_erase_sector(upgrade->fw_bin_sec_earse);
  49. // os_printf("%x\n",upgrade->fw_bin_sec_earse);
  50. }
  51. }
  52. if (spi_flash_write(upgrade->fw_bin_addr, (uint32 *)upgrade->buffer, len) != SPI_FLASH_RESULT_OK) {
  53. break;
  54. }
  55. ret = true;
  56. upgrade->fw_bin_addr += len;
  57. } while (0);
  58. os_free(upgrade->buffer);
  59. upgrade->buffer = NULL;
  60. return ret;
  61. }
  62. /******************************************************************************
  63. * FunctionName : system_upgrade
  64. * Description : a
  65. * Parameters :
  66. * Returns :
  67. *******************************************************************************/
  68. bool ICACHE_FLASH_ATTR
  69. system_upgrade(uint8 *data, uint16 len)
  70. {
  71. bool ret;
  72. ret = system_upgrade_internal(upgrade, data, len);
  73. return ret;
  74. }
  75. /******************************************************************************
  76. * FunctionName : system_upgrade_init
  77. * Description : a
  78. * Parameters :
  79. * Returns :
  80. *******************************************************************************/
  81. void ICACHE_FLASH_ATTR
  82. system_upgrade_init(void)
  83. {
  84. uint32 user_bin2_start;
  85. uint8 flash_buf[4];
  86. uint8 high_half;
  87. spi_flash_read(0, (uint32 *)flash_buf, 4);
  88. high_half = (flash_buf[3] & 0xF0) >> 4;
  89. if (upgrade == NULL) {
  90. upgrade = (struct upgrade_param *)os_zalloc(sizeof(struct upgrade_param));
  91. }
  92. system_upgrade_flag_set(UPGRADE_FLAG_IDLE);
  93. if (high_half == 2 || high_half == 3 || high_half == 4) {
  94. user_bin2_start = 129; // 128 + 1
  95. upgrade->fw_bin_sec_num = 123; // 128 - 1 - 4
  96. } else {
  97. user_bin2_start = 65; // 64 + 1
  98. upgrade->fw_bin_sec_num = 59; // 64 - 1 - 4
  99. }
  100. upgrade->fw_bin_sec = (system_upgrade_userbin_check() == USER_BIN1) ? user_bin2_start : 1;
  101. upgrade->fw_bin_addr = upgrade->fw_bin_sec * SPI_FLASH_SEC_SIZE;
  102. }
  103. /******************************************************************************
  104. * FunctionName : system_upgrade_deinit
  105. * Description : a
  106. * Parameters :
  107. * Returns :
  108. *******************************************************************************/
  109. void ICACHE_FLASH_ATTR
  110. system_upgrade_deinit(void)
  111. {
  112. os_free(upgrade);
  113. upgrade = NULL;
  114. }