ota_update.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include "FreeRTOS.h"
  4. #include "board.h"
  5. #include "chip.h"
  6. #include "sfud.h"
  7. #include "snfud.h"
  8. #include "flash.h"
  9. #include "romfile.h"
  10. #include "animation.h"
  11. #include "sysinfo.h"
  12. #include "mmcsd_core.h"
  13. #include "ff_stdio.h"
  14. #include "crc.h"
  15. #include "mailbox_message.h"
  16. #include "mailbox_update/mailbox_update_demo.h"
  17. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  18. #include "ff_sfdisk.h"
  19. #endif
  20. #ifdef USB_SUPPORT
  21. #define USB_DEV_PLUGED 0
  22. #define USB_DEV_UNPLUGED 1
  23. extern int usb_wait_stor_dev_pluged(uint32_t timeout);
  24. #endif
  25. #ifdef OTA_UPDATE_SUPPORT
  26. #include "ota_update.h"
  27. const char *g_upfilename[UPFILE_TYPE_NUM] = {
  28. "amtldr.bin",
  29. "amt630hv160.bin",
  30. "bootanim.bin",
  31. "rom.bin",
  32. "image.bin",
  33. "fastboot.bin",
  34. };
  35. uint8_t empty_chip_update_ok = 0;
  36. uint8_t upfile_updated = 0;
  37. #ifdef MAILBOX_SUPPORT
  38. static void update_status_sync(void)
  39. {
  40. if(mailbox_msg_send(MB_MSG_T_SYS_UPDATE, NULL, 0, portMAX_DELAY))
  41. printf("%s, mailbox send fail.\n", __func__);
  42. }
  43. #endif
  44. #define UPDATE_PROGRESS_SUPPORT
  45. #define UPDATE_DONE_DISPLAY
  46. #ifdef UPDATE_PROGRESS_SUPPORT
  47. static const unsigned char font_char[] = {
  48. ',','.','a','b','c','d','e','g','i','l','m','n','o','p','r','s','t','u','w'
  49. };
  50. static const unsigned char fontdata_16x32[] = {
  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x3C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x30,0x00,0x60,0x00,/*",",12*/
  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x3C,0x00,0x3C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",14*/
  55. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x30,0x30,0x18,0x30,0x18,0x30,0x18,
  56. 0x00,0x38,0x07,0xD8,0x1C,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x19,0x30,0x79,0x1F,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"a",65*/
  57. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0xE0,0x1A,0x38,0x1C,0x18,0x1C,0x0C,0x18,0x0C,
  58. 0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x08,0x1C,0x18,0x1C,0x30,0x13,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"b",66*/
  59. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x0E,0x10,0x0C,0x18,0x18,0x18,0x30,0x18,
  60. 0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x04,0x18,0x04,0x18,0x08,0x0C,0x10,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"c",67*/
  61. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x07,0xD8,0x0C,0x38,0x18,0x18,0x18,0x18,0x30,0x18,
  62. 0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x38,0x0C,0x5E,0x07,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"d",68*/
  63. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x08,0x18,0x18,0x08,0x30,0x0C,
  64. 0x30,0x0C,0x30,0x0C,0x3F,0xFC,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x04,0x18,0x08,0x0E,0x18,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"e",69*/
  65. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x01,0x86,0x01,0x06,0x03,0x06,0x03,0x00,0x03,0x00,0x03,0x00,0x3F,0xF8,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,
  66. // 0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"f",70*/
  67. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xEE,0x0C,0x36,0x08,0x18,0x18,0x18,0x18,0x18,
  68. 0x18,0x18,0x08,0x18,0x0C,0x30,0x0F,0xE0,0x18,0x00,0x18,0x00,0x1F,0xC0,0x0F,0xF8,0x18,0x1C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0x18,0x07,0xE0,/*"g",71*/
  69. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0xE0,0x1A,0x30,0x1C,0x18,0x18,0x18,0x18,0x18,
  70. // 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"h",72*/
  71. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
  72. 0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"i",73*/
  73. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x78,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0xF0,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,
  74. // 0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x18,0x60,0x18,0x40,0x0F,0x80,/*"j",74*/
  75. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x7C,0x18,0x30,0x18,0x20,0x18,0x40,0x18,0x80,
  76. // 0x19,0x80,0x1B,0x80,0x1E,0xC0,0x1C,0xC0,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x1C,0x7E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"k",75*/
  77. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,
  78. 0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"l",76*/
  79. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xEF,0x3C,0x71,0xC6,0x61,0x86,0x61,0x86,0x61,0x86,
  80. 0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0xF3,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"m",77*/
  81. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xE0,0x7A,0x30,0x1C,0x18,0x18,0x18,0x18,0x18,
  82. 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"n",78*/
  83. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x08,0x18,0x18,0x18,0x10,0x0C,
  84. 0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0x18,0x18,0x18,0x0C,0x30,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"o",79*/
  85. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xE0,0x7A,0x30,0x1C,0x18,0x18,0x08,0x18,0x0C,
  86. 0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x18,0x1C,0x18,0x1E,0x30,0x19,0xE0,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,/*"p",80*/
  87. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC8,0x0C,0x78,0x18,0x38,0x18,0x18,0x30,0x18,
  88. // 0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x38,0x0C,0x78,0x07,0x98,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,/*"q",81*/
  89. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x1C,0x7E,0x66,0x06,0x86,0x07,0x80,0x07,0x00,
  90. 0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"r",82*/
  91. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE4,0x06,0x1C,0x0C,0x0C,0x0C,0x04,0x0C,0x04,
  92. 0x0E,0x00,0x07,0xC0,0x01,0xF0,0x00,0x78,0x00,0x1C,0x10,0x0C,0x10,0x0C,0x18,0x0C,0x1C,0x18,0x13,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"s",83*/
  93. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x3F,0xF8,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,
  94. 0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x04,0x03,0x04,0x01,0x88,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"t",84*/
  95. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x78,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
  96. 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x0C,0x5E,0x07,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"u",85*/
  97. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3E,0x18,0x0C,0x18,0x08,0x18,0x18,0x0C,0x10,
  98. // 0x0C,0x10,0x04,0x20,0x06,0x20,0x06,0x20,0x03,0x40,0x03,0x40,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"v",86*/
  99. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFB,0xCF,0x61,0x86,0x21,0x84,0x31,0x84,0x31,0x84,
  100. 0x31,0xC8,0x11,0xC8,0x1A,0xC8,0x1A,0x48,0x1A,0x70,0x0E,0x70,0x0C,0x70,0x0C,0x30,0x0C,0x20,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"w",87*/
  101. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x7C,0x0C,0x10,0x0E,0x10,0x06,0x20,0x03,0x40,
  102. // 0x03,0x40,0x01,0x80,0x01,0x80,0x01,0xC0,0x02,0x60,0x04,0x60,0x04,0x30,0x08,0x18,0x18,0x18,0x7C,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"x",88*/
  103. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3E,0x18,0x18,0x18,0x10,0x08,0x10,0x0C,0x10,
  104. // 0x04,0x20,0x06,0x20,0x06,0x20,0x02,0x40,0x03,0x40,0x01,0x40,0x01,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x3E,0x00,0x3C,0x00,/*"y",89*/
  105. // 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x30,0x38,0x30,0x30,0x20,0x60,0x20,0xE0,
  106. // 0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x00,0x06,0x00,0x0E,0x04,0x0C,0x04,0x18,0x0C,0x30,0x18,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"z",90*/
  107. };
  108. #define UPDATE_TEXT_WIDTH 400
  109. #define UPDATE_TEXT_HEIGHT 36
  110. #define PROGRESS_WIDTH 400
  111. #define PROGRESS_HEIGHT 52
  112. #define UPDATE_LOGO_WIDTH PROGRESS_WIDTH
  113. #define UPDATE_LOGO_HEIGHT (UPDATE_TEXT_HEIGHT + PROGRESS_HEIGHT)
  114. #if LCD_BPP == 32
  115. typedef unsigned int Upcolor;
  116. #define UPDATE_TEXT_COLOR 0xffffffff; //white
  117. #define UPDATE_RECT_COLOR 0xffffffff //white
  118. #define UPDATE_BAR_COLOR 0xff00ff00; //green
  119. #elif LCD_BPP == 16
  120. typedef unsigned short Upcolor;
  121. #define UPDATE_TEXT_COLOR 0xffff; //white
  122. #define UPDATE_RECT_COLOR 0xffff; //white
  123. #define UPDATE_BAR_COLOR 0x07e0; //green
  124. #endif
  125. static uint32_t upfile_total_size;
  126. static uint32_t upfile_left_size;
  127. static uint32_t logo_display_addr;
  128. static uint32_t pxp_display_addr;
  129. static int update_start = 0;
  130. static int update_percent = -1;
  131. static uint32_t line_width;
  132. void DrawPixel(int x, int y)
  133. {
  134. Upcolor *p = (Upcolor *)(logo_display_addr + y * line_width + x * LCD_BPP / 8);
  135. *p = UPDATE_TEXT_COLOR;
  136. }
  137. unsigned const char *GetCharDot(unsigned char c)
  138. {
  139. int i = 0;
  140. for (i = 0;i < sizeof(font_char); i++) {
  141. if(c == font_char[i])
  142. return &fontdata_16x32[i * 64];
  143. }
  144. return NULL;
  145. }
  146. void DrawCharToCanvas(int x, int y, unsigned char c)
  147. {
  148. unsigned short *dots = NULL;
  149. unsigned short byte;
  150. int i, b;
  151. dots = GetCharDot(c);
  152. if (!dots) {
  153. if(c != ' ')
  154. printf("%s, Character not supported.\n", __func__);
  155. return;
  156. }
  157. for (i = 0; i < 32; i++)
  158. {
  159. byte = (((dots[i] & 0xff00) >> 8 ) | ((dots[i] & 0xff) << 8));
  160. for (b = 15; b >= 0; b--)
  161. {
  162. if(byte & (1<<b))
  163. DrawPixel(x+15-b, y+i);
  164. }
  165. }
  166. }
  167. #ifdef UPDATE_DONE_DISPLAY
  168. void update_done(void)
  169. {
  170. int i = 0;
  171. unsigned char str[] = "update done,reselect boot";
  172. memset((void *)logo_display_addr, 0, UPDATE_TEXT_WIDTH * UPDATE_TEXT_HEIGHT * LCD_BPP / 8);
  173. while(str[i] != '\0') {
  174. DrawCharToCanvas(i*16, 0, str[i]);
  175. i++;
  176. }
  177. CP15_clean_dcache_for_dma(logo_display_addr, logo_display_addr + UPDATE_TEXT_WIDTH *UPDATE_TEXT_HEIGHT * LCD_BPP / 8);
  178. }
  179. #endif
  180. static void update_text_init(void)
  181. {
  182. int i = 0;
  183. unsigned char str[] = "cpu updating,wait...";
  184. while(str[i] != '\0') {
  185. DrawCharToCanvas(i*16, 0, str[i]);
  186. i++;
  187. }
  188. }
  189. void update_progress_init(void)
  190. {
  191. int i, j;
  192. Upcolor *p = (Upcolor *)(logo_display_addr +
  193. UPDATE_TEXT_HEIGHT * PROGRESS_WIDTH * LCD_BPP / 8);
  194. int height = UPDATE_LOGO_HEIGHT;
  195. Upcolor color = UPDATE_RECT_COLOR;
  196. for (j = UPDATE_TEXT_HEIGHT; j < height; j++) {
  197. for (i = 0; i < PROGRESS_WIDTH; i++) {
  198. if (j < (UPDATE_TEXT_HEIGHT + 2) || j > (height -3) ||
  199. i < 2 || i > (PROGRESS_WIDTH -3)) {
  200. *p = color;
  201. }
  202. p++;
  203. }
  204. }
  205. }
  206. void update_progress_set(int percent)
  207. {
  208. int i, j, end;
  209. unsigned int memstart = logo_display_addr +
  210. UPDATE_TEXT_WIDTH * UPDATE_TEXT_HEIGHT * LCD_BPP / 8;
  211. Upcolor *p = (Upcolor *)memstart;
  212. int height = UPDATE_LOGO_HEIGHT;
  213. Upcolor color = UPDATE_BAR_COLOR;
  214. if (percent < 0 || percent > 100)
  215. return;
  216. if (!update_start || percent == update_percent)
  217. return;
  218. update_percent = percent;
  219. end = percent * (PROGRESS_WIDTH - 3) / 100;
  220. for (j = UPDATE_TEXT_HEIGHT; j < height; j++) {
  221. for (i = 0; i < PROGRESS_WIDTH; i++) {
  222. if (j > (UPDATE_TEXT_HEIGHT + 2) && j < (height -3) \
  223. && i > 2 && i < end) {
  224. *p = color;
  225. }
  226. p++;
  227. }
  228. }
  229. CP15_clean_dcache_for_dma((unsigned int)memstart,
  230. (unsigned int)memstart + PROGRESS_WIDTH *PROGRESS_HEIGHT * LCD_BPP / 8);
  231. #if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_0
  232. uint32_t out_width, out_height;
  233. #if LCD_ROTATE_ANGLE == LCD_ROTATE_ANGLE_180
  234. out_width = UPDATE_LOGO_WIDTH;
  235. out_height = UPDATE_LOGO_HEIGHT;
  236. #else
  237. out_width = UPDATE_LOGO_HEIGHT;
  238. out_height = UPDATE_LOGO_WIDTH;
  239. #endif
  240. pxp_scaler_rotate(logo_display_addr, 0, 0,
  241. PXP_S0_FORMAT_RGB888, UPDATE_LOGO_WIDTH, UPDATE_LOGO_HEIGHT,
  242. pxp_display_addr, 0, PXP_OUT_FORMAT_ARGB888, out_width, out_height, LCD_ROTATE_ANGLE);
  243. #endif
  244. }
  245. static void update_logo_exit(void)
  246. {
  247. if (logo_display_addr) {
  248. vPortFree((void *)logo_display_addr);
  249. logo_display_addr = 0;
  250. }
  251. if (pxp_display_addr) {
  252. vPortFree((void *)pxp_display_addr);
  253. pxp_display_addr = 0;
  254. }
  255. update_start = 0;
  256. }
  257. static int update_logo_init(void)
  258. {
  259. int x, y;
  260. uint32_t width = UPDATE_LOGO_WIDTH;
  261. uint32_t height = UPDATE_LOGO_HEIGHT;
  262. if (update_start)
  263. return 0;
  264. logo_display_addr = (uint32_t)pvPortMalloc(width * height * LCD_BPP / 8);
  265. if (logo_display_addr == 0) {
  266. printf("%s malloc fail.\n", __func__);
  267. return -1;
  268. }
  269. memset((void *)logo_display_addr, 0, width *height * LCD_BPP / 8);
  270. #if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_0
  271. uint32_t out_width;
  272. uint32_t out_height;
  273. pxp_display_addr = (uint32_t)pvPortMalloc(width *height * LCD_BPP / 8);
  274. if (pxp_display_addr == 0) {
  275. printf("%s malloc fail.\n", __func__);
  276. return -1;
  277. }
  278. #endif
  279. line_width = UPDATE_TEXT_WIDTH * LCD_BPP / 8;
  280. update_text_init();
  281. update_progress_init();
  282. CP15_clean_dcache_for_dma(logo_display_addr, logo_display_addr + width *height * LCD_BPP / 8);
  283. #if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_0
  284. #if LCD_ROTATE_ANGLE == LCD_ROTATE_ANGLE_180
  285. out_width = width;
  286. out_height = height;
  287. #else
  288. out_width = height;
  289. out_height = width;
  290. #endif
  291. ark_lcd_set_osd_format(LCD_OSD1, LCD_OSD_FORAMT_ARGB888);
  292. ark_lcd_set_osd_size(LCD_OSD1, out_width, out_height);
  293. pxp_scaler_rotate(logo_display_addr, 0, 0, PXP_S0_FORMAT_RGB565, width, height,
  294. pxp_display_addr, 0, PXP_OUT_FORMAT_RGB565, out_width, out_height, LCD_ROTATE_ANGLE);
  295. ark_lcd_set_osd_yaddr(LCD_OSD1, pxp_display_addr);
  296. y = (LCD_HEIGHT - out_height) / 2;
  297. x = (LCD_WIDTH - out_width) / 2;
  298. #else
  299. ark_lcd_set_osd_format(LCD_OSD1, LCD_OSD_FORAMT_ARGB888);
  300. ark_lcd_set_osd_size(LCD_OSD1, width, height);
  301. ark_lcd_set_osd_yaddr(LCD_OSD1, logo_display_addr);
  302. x = (LCD_WIDTH - width) / 2;
  303. y = (LCD_HEIGHT - height) / 2;
  304. #endif
  305. ark_lcd_set_osd_possition(LCD_OSD1, x, y);
  306. ark_lcd_osd_enable(LCD_OSD1, 1);
  307. ark_lcd_set_osd_sync(LCD_OSD1);
  308. update_start = 1;
  309. return 0;
  310. }
  311. #endif
  312. uint8_t get_update_status(void)
  313. {
  314. return upfile_updated & 0x1;
  315. }
  316. #ifdef MAILBOX_UPDATE_SUPPORT
  317. static int MediaUpdateMCU(const char *ufile, int filetype)
  318. {
  319. int ret = -1;
  320. FF_FILE *fp;
  321. uint8_t *buf;
  322. int rlen, leftsize;
  323. uint32_t filesize;
  324. MailboxUpdateFrame tx_frame = {0};
  325. MailboxUpdateFrame *rx_frame = NULL;
  326. mb_rxmsg_t msg = {0};
  327. fp = ff_fopen(ufile, "rb");
  328. if (!fp) {
  329. printf("open %s fail.\n", ufile);
  330. return ret;
  331. }
  332. leftsize = filesize = ff_filelength(fp);
  333. if (filesize > DDR_MEDIA_USE_SIZE) {
  334. printf("The file is too large, not enough space to save.\n");
  335. goto MediaUpdateEnd;
  336. }
  337. CP15_flush_dcache_for_dma(DDR_MEDIA_USE_ADDR, DDR_MEDIA_USE_ADDR + filesize);//防止模块使用dma,导致cache中的旧数据覆盖DDR
  338. /* start transfer image_header*/
  339. buf = (uint8_t *)DDR_MEDIA_USE_ADDR;
  340. /* transfer all data */
  341. while (leftsize) {
  342. rlen = ff_fread(buf, 1, OTA_RW_SIZE, fp);
  343. if (rlen < 0 || ((rlen == 0) && leftsize)) {
  344. printf("read %s data fail.\n", ufile);
  345. ret = -1;
  346. goto MediaUpdateEnd;
  347. }
  348. buf += rlen;
  349. leftsize -= rlen;
  350. }
  351. tx_frame.DataAddr = DDR_MEDIA_USE_ADDR;
  352. tx_frame.DataSize = filesize;
  353. tx_frame.TotalSize = filesize;
  354. tx_frame.FileType = filetype;
  355. // tx_frame.FrameStatus = MUFS_TFR; //一次传输所有数据,等待响应;
  356. tx_frame.FrameRspStatus = MUFRS_ACK_OK;
  357. CP15_clean_dcache_for_dma(tx_frame.DataAddr, tx_frame.DataAddr + tx_frame.DataSize);
  358. if (ret = MailboxUpdateSendFrame(MB_MSG_T_MEDIA_UPDATE, &tx_frame))
  359. goto MediaUpdateEnd;
  360. if (!(rx_frame = MailboxUpdateReceiveFrame(MB_MSG_T_MEDIA_UPDATE, &msg, pdMS_TO_TICKS(30000)))) {
  361. ret = -1;
  362. goto MediaUpdateEnd;
  363. }
  364. if (rx_frame->FrameRspStatus == MUFRS_ACK_OK) {
  365. upfile_updated = 1;
  366. printf("burn %s ok.\n", ufile);
  367. }
  368. MediaUpdateEnd:
  369. if (fp)
  370. ff_fclose(fp);
  371. return ret;
  372. }
  373. #endif
  374. /* 获取已升级文件校验和
  375. filesize 0:获取当前运行文件的校验和,非0值:获取烧录位置升级文件的校验和;
  376. checkmode 0:不校验 1:进行校验,校验错误返回0 2:进行校验,校验出错也返回校验值
  377. */
  378. uint32_t get_upfile_checksum(int filetype, size_t filesize, int checkmode)
  379. {
  380. uint32_t checksum, calc_checksum = 0xffffffff;
  381. uint8_t *buf;
  382. uint32_t fileoffset;
  383. int off, size, leftsize;
  384. buf = pvPortMalloc(OTA_RW_SIZE);
  385. if (!buf) {
  386. printf("%s %d malloc %d bytes fail.\n", __func__, __LINE__, OTA_RW_SIZE);
  387. return 0;
  388. }
  389. if (!filesize) {
  390. fileoffset = get_upfile_offset(filetype, 0);
  391. filesize = get_upfile_size(filetype);
  392. } else {
  393. fileoffset = get_upfile_offset(filetype, 1);
  394. }
  395. size = filesize > OTA_RW_SIZE ? OTA_RW_SIZE : filesize;
  396. flash_read(fileoffset, size, buf);
  397. if (filetype == UPFILE_TYPE_APP || filetype == UPFILE_TYPE_LDR) {
  398. checksum = *(uint32_t*)(buf + APPLDR_CHECKSUM_OFFSET);
  399. *(uint32_t*)(buf + APPLDR_CHECKSUM_OFFSET) = 0;
  400. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  401. BANIHEADER *header = (BANIHEADER *)buf;
  402. checksum = header->checksum;
  403. header->checksum = 0;
  404. } else if (filetype == UPFILE_TYPE_ROM) {
  405. RomHeader *header = (RomHeader *)buf;
  406. checksum = header->checksum;
  407. header->checksum = 0;
  408. }
  409. if (!checkmode) {
  410. vPortFree(buf);
  411. return checksum;
  412. } else {
  413. calc_checksum = xcrc32(buf, size, calc_checksum, HARD_CALC_CRC);
  414. }
  415. off = fileoffset + OTA_RW_SIZE;
  416. leftsize = filesize - size;
  417. while (leftsize > 0) {
  418. size = leftsize > OTA_RW_SIZE ? OTA_RW_SIZE : leftsize;
  419. flash_read(off, size, buf);
  420. calc_checksum = xcrc32(buf, size, calc_checksum, HARD_CALC_CRC);
  421. off += size;
  422. leftsize -= size;
  423. }
  424. vPortFree(buf);
  425. if (calc_checksum == checksum || checkmode > 1)
  426. return calc_checksum;
  427. else
  428. return 0;
  429. }
  430. /* 获取外部设备中升级文件的校验和
  431. bchecked 0:不需要计算校验值,非0:需要计算校验值
  432. */
  433. static uint32_t get_mediafile_checksum(const char *ufile, int filetype, int bchecked, uint32_t *filesize)
  434. {
  435. uint32_t checksum, calc_checksum = 0xffffffff;
  436. FF_FILE *fp;
  437. uint8_t *buf;
  438. int rlen;
  439. fp = ff_fopen(ufile, "rb");
  440. if (!fp) {
  441. printf("open %s fail.\n", ufile);
  442. return 0;
  443. }
  444. if (filesize)
  445. *filesize = ff_filelength(fp);
  446. buf = pvPortMalloc(OTA_RW_SIZE);
  447. if (!buf) {
  448. printf("%s %d malloc %d bytes fail.\n", __func__, __LINE__, OTA_RW_SIZE);
  449. ff_fclose(fp);
  450. return 0;
  451. }
  452. rlen = ff_fread(buf, 1, OTA_RW_SIZE, fp);
  453. if (rlen <= 0) {
  454. printf("read %s data fail.\n", ufile);
  455. ff_fclose(fp);
  456. vPortFree(buf);
  457. return 0;
  458. }
  459. if (filetype == UPFILE_TYPE_APP || filetype == UPFILE_TYPE_LDR) {
  460. checksum = *(uint32_t*)(buf + APPLDR_CHECKSUM_OFFSET);
  461. *(uint32_t*)(buf + APPLDR_CHECKSUM_OFFSET) = 0;
  462. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  463. BANIHEADER *header = (BANIHEADER *)buf;
  464. checksum = header->checksum;
  465. header->checksum = 0;
  466. } else if (filetype == UPFILE_TYPE_ROM) {
  467. RomHeader *header = (RomHeader *)buf;
  468. checksum = header->checksum;
  469. header->checksum = 0;
  470. }
  471. if (!bchecked) {
  472. ff_fclose(fp);
  473. vPortFree(buf);
  474. return checksum;
  475. } else {
  476. calc_checksum = xcrc32(buf, rlen, calc_checksum, HARD_CALC_CRC);
  477. }
  478. while ((rlen = ff_fread(buf, 1, OTA_RW_SIZE, fp)) > 0)
  479. calc_checksum = xcrc32(buf, rlen, calc_checksum, HARD_CALC_CRC);
  480. ff_fclose(fp);
  481. vPortFree(buf);
  482. if (calc_checksum == checksum)
  483. return checksum;
  484. else
  485. return 0;
  486. }
  487. /* 烧录升级文件
  488. fileoffset: 烧录文件偏移地址
  489. show_progress 0:不显示进度条, 1:显示进度条
  490. */
  491. static int burn_update_file(int filetype, const char *ufile, size_t fileoffset, uint8_t show_progress, uint8_t do_check)
  492. {
  493. FF_FILE *fp;
  494. int leftsize, rwsize;
  495. int rlen, rwoffset;
  496. size_t filesize;
  497. int ret = 0;
  498. uint8_t *buf = NULL;
  499. uint8_t *tmp_buf = NULL;
  500. uint32_t checksum, calc_checksum = 0xffffffff;
  501. fp = ff_fopen(ufile, "rb");
  502. if (!fp) {
  503. printf("open %s fail.\n", ufile);
  504. return -1;
  505. }
  506. buf = pvPortMalloc(OTA_RW_SIZE);
  507. if (!buf) {
  508. printf("%s %d malloc %d bytes fail.\n", __func__, __LINE__, OTA_RW_SIZE);
  509. ret = -1;
  510. goto burnend;
  511. }
  512. if(do_check) {
  513. tmp_buf = pvPortMalloc(OTA_RW_SIZE);
  514. if (!tmp_buf) {
  515. printf("%s %d malloc %d bytes fail.\n", __func__, __LINE__, OTA_RW_SIZE);
  516. ret = -1;
  517. goto burnend;
  518. }
  519. }
  520. filesize = ff_filelength(fp);
  521. rlen = ff_fread(buf, 1, OTA_RW_SIZE, fp);
  522. if (rlen <= 0) {
  523. printf("read %s data fail.\n", ufile);
  524. ret = -1;
  525. goto burnend;
  526. }
  527. leftsize = filesize;
  528. rwoffset = fileoffset;
  529. while (leftsize > 0) {
  530. rwsize = leftsize > rlen ? rlen : leftsize;
  531. if (flash_erase_write(rwoffset, rwsize, buf))
  532. {
  533. printf("%s, burn %s data fail.\n", __func__, ufile);
  534. ret = -1;
  535. goto burnend;
  536. }
  537. if (do_check) {
  538. if (flash_read(rwoffset, rwsize, tmp_buf))
  539. {
  540. printf("%s, read %s data fail.\n", __func__, ufile);
  541. ret = -1;
  542. goto burnend;
  543. }
  544. if(leftsize == filesize) {
  545. if (filetype == UPFILE_TYPE_APP || filetype == UPFILE_TYPE_LDR) {
  546. checksum = *(uint32_t*)(buf + APPLDR_CHECKSUM_OFFSET);
  547. *(uint32_t*)(tmp_buf + APPLDR_CHECKSUM_OFFSET) = 0;
  548. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  549. BANIHEADER *header = (BANIHEADER *)tmp_buf;
  550. checksum = header->checksum;
  551. header->checksum = 0;
  552. } else if (filetype == UPFILE_TYPE_ROM) {
  553. RomHeader *header = (RomHeader *)tmp_buf;
  554. checksum = header->checksum;
  555. header->checksum = 0;
  556. }
  557. }
  558. calc_checksum = xcrc32(tmp_buf, rwsize, calc_checksum, HARD_CALC_CRC);
  559. }
  560. rwoffset += rwsize;
  561. leftsize -= rwsize;
  562. #ifdef UPDATE_PROGRESS_SUPPORT
  563. if (show_progress) {
  564. upfile_left_size -= rwsize;
  565. update_progress_set(((u64)upfile_total_size - upfile_left_size) * 100 / upfile_total_size);
  566. }
  567. #endif
  568. if (!show_progress) {
  569. printf("burn %d/%d.\n", filesize - leftsize, filesize);
  570. }
  571. rlen = ff_fread(buf, 1, OTA_RW_SIZE, fp);
  572. if (rlen < 0 || ((rlen == 0) && leftsize)) {
  573. printf("read %s data fail.\n", ufile);
  574. ret = -1;
  575. goto burnend;
  576. }
  577. }
  578. #if DEVICE_TYPE_SELECT == SPI_NAND_FLASH
  579. snfud_flush(snfud_get_device(0));
  580. #endif
  581. if (do_check && checksum != calc_checksum) {
  582. printf("%s, Check update file fail!\n", __func__);
  583. return -1;
  584. }
  585. burnend:
  586. #ifdef UPDATE_PROGRESS_SUPPORT
  587. if(leftsize)
  588. upfile_left_size += (filesize - leftsize);
  589. #endif
  590. if (fp)
  591. ff_fclose(fp);
  592. if (buf)
  593. vPortFree(buf);
  594. if (tmp_buf)
  595. vPortFree(tmp_buf);
  596. return ret;
  597. }
  598. /* 获取ldr, app, animation, rom升级文件单独升级时能支持的最大文件大小 */
  599. unsigned int get_upfile_maxsize(int filetype)
  600. {
  601. if (filetype == UPFILE_TYPE_LDR) {
  602. return LOADER_MAX_SIZE;
  603. } else if (filetype == UPFILE_TYPE_APP) {
  604. return APPFILE_MAX_SIZE;
  605. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  606. return ANIMFILE_MAX_SIZE;
  607. } else if (filetype == UPFILE_TYPE_ROM) {
  608. return ROMFILE_MAX_SIZE;
  609. }
  610. return 0;
  611. }
  612. /* 获取升级文件位置
  613. toburn 0:获取当前运行文件的位置,非0:获取新升级文件要烧录的位置
  614. */
  615. unsigned int get_upfile_offset(int filetype, int toburn)
  616. {
  617. SysInfo *sysinfo = GetSysInfo();
  618. if (filetype == UPFILE_TYPE_LDR) {
  619. if (!toburn)
  620. return sysinfo->loader_offset;
  621. else
  622. return (sysinfo->loader_offset == LOADER_OFFSET) ? LOADER_B_OFFSET : LOADER_OFFSET;
  623. } else if (filetype == UPFILE_TYPE_APP) {
  624. if (!toburn)
  625. return sysinfo->app_offset;
  626. else
  627. return (sysinfo->app_offset == APPFILE_OFFSET) ? APPFILE_B_OFFSET : APPFILE_OFFSET;
  628. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  629. if (!toburn)
  630. return sysinfo->anim_offset;
  631. else
  632. return (sysinfo->anim_offset == ANIMFILE_OFFSET) ? ANIMFILE_B_OFFSET : ANIMFILE_OFFSET;
  633. } else if (filetype == UPFILE_TYPE_ROM) {
  634. if (!toburn)
  635. return sysinfo->rom_offset;
  636. else
  637. return (sysinfo->rom_offset == ROMFILE_OFFSET) ? ROMFILE_B_OFFSET : ROMFILE_OFFSET;
  638. }
  639. return 0xffffffff;
  640. }
  641. //获取当前运行文件的文件大小
  642. uint32_t get_upfile_size(int filetype)
  643. {
  644. SysInfo *sysinfo = GetSysInfo();
  645. if (filetype == UPFILE_TYPE_LDR) {
  646. return sysinfo->loader_size;
  647. } else if (filetype == UPFILE_TYPE_APP) {
  648. return sysinfo->app_size;
  649. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  650. return sysinfo->anim_size;
  651. } else if (filetype == UPFILE_TYPE_ROM) {
  652. return sysinfo->rom_size;
  653. }
  654. return 0;
  655. }
  656. //校验新烧录文件并保存信息
  657. int check_upfile_and_save(int filetype, size_t filesize, size_t fileoffset)
  658. {
  659. SysInfo *sysinfo = GetSysInfo();
  660. SysInfo bak_sysinfo;
  661. if (!filesize) {
  662. printf("The burn file size is 0.\n");
  663. return -1;
  664. }
  665. memcpy(&bak_sysinfo, sysinfo, sizeof(SysInfo));
  666. if (get_upfile_checksum(filetype, filesize, 1)) {
  667. if (filetype == UPFILE_TYPE_LDR) {
  668. bak_sysinfo.loader_offset = fileoffset;
  669. bak_sysinfo.loader_size = filesize;
  670. } else if (filetype == UPFILE_TYPE_APP) {
  671. bak_sysinfo.app_offset = fileoffset;
  672. bak_sysinfo.app_size = filesize;
  673. } else if (filetype == UPFILE_TYPE_ANIMATION) {
  674. bak_sysinfo.anim_offset = fileoffset;
  675. bak_sysinfo.anim_size = filesize;
  676. } else if (filetype == UPFILE_TYPE_ROM) {
  677. bak_sysinfo.rom_offset = fileoffset;
  678. bak_sysinfo.rom_size = filesize;
  679. }
  680. memcpy(sysinfo, &bak_sysinfo, sizeof(SysInfo));
  681. SaveSysInfo();
  682. return 0;
  683. }
  684. return -1;
  685. }
  686. int update_from_media(char *mpath, int filetype)
  687. {
  688. char update_file[32];
  689. size_t filesize;
  690. size_t fileoffset;
  691. uint32_t checksum;
  692. strcpy(update_file, mpath);
  693. strcat(update_file, "/");
  694. strcat(update_file, g_upfilename[filetype]);
  695. printf("%s checksum...\n", update_file);
  696. if(filetype <= UPFILE_TYPE_ROM) {
  697. if (!(checksum = get_mediafile_checksum(update_file, filetype, 1, &filesize))) {
  698. printf("checksum fail, don't update.\n");
  699. return 0;
  700. }
  701. if (filesize > get_upfile_maxsize(filetype)) {
  702. printf("The file is too large, not enough space to save.\n");
  703. return -1;
  704. }
  705. if (checksum == get_upfile_checksum(filetype, 0, 0)) {
  706. printf("checksum is the same as now, don't update.\n");
  707. return 0;
  708. }
  709. fileoffset = get_upfile_offset(filetype, 1);
  710. if (fileoffset == 0xffffffff) {
  711. printf("get_upfile_offset fail.\n");
  712. return -1;
  713. }
  714. if (burn_update_file(filetype, update_file, fileoffset, 0, 0)) {
  715. printf("burn %s fail, don't update.\n", update_file);
  716. return -1;
  717. }
  718. printf("checksum after burn...\n");
  719. if (!check_upfile_and_save(filetype, filesize, fileoffset)) {
  720. upfile_updated = 1;
  721. printf("burn %s ok.\n", update_file);
  722. return 0;
  723. } else {
  724. printf("checksum after burn fail.\n");
  725. return -1;
  726. }
  727. } else if (filetype <= UPFILE_TYPE_MCU_FB) {
  728. #ifdef MAILBOX_UPDATE_SUPPORT
  729. return MediaUpdateMCU(update_file, filetype);
  730. #else
  731. printf("Should define MAILBOX_UPDATE_SUPPORT to support image.bin update.\n");
  732. #endif
  733. }
  734. return -1;
  735. }
  736. static int save_file_to_ota(int filetype)
  737. {
  738. char update_file[32];
  739. char ota_file[32];
  740. FF_FILE *fp, *fota;
  741. size_t filesize;
  742. int leftsize;
  743. uint8_t *buf = NULL;
  744. size_t readlen;
  745. strcpy(update_file,"/usb/");
  746. strcat(update_file, g_upfilename[filetype]);
  747. strcpy(ota_file, OTA_MOUNT_PATH "/");
  748. strcat(ota_file, g_upfilename[filetype]);
  749. if (get_mediafile_checksum(update_file, filetype, 0, &filesize) ==
  750. get_mediafile_checksum(ota_file, filetype, 0, NULL)) {
  751. if (get_mediafile_checksum(ota_file, filetype, 1, NULL)) {
  752. printf("%s is same with ota, not save.\n", g_upfilename[filetype]);
  753. return 0;
  754. }
  755. }
  756. fp = ff_fopen(update_file, "rb");
  757. if (!fp) {
  758. printf("open %s fail.\n", update_file);
  759. return -1;
  760. }
  761. fota = ff_fopen(ota_file, "wb");
  762. if (!fota) {
  763. printf("create %s in ota partition fail.\n", ota_file);
  764. ff_fclose(fp);
  765. return -1;
  766. }
  767. buf = pvPortMalloc(OTA_RW_SIZE);
  768. if (!buf) {
  769. printf("malloc OTA_RW_SIZE fail.\n");
  770. ff_fclose(fota);
  771. ff_fclose(fp);
  772. return -1;
  773. }
  774. leftsize = filesize;
  775. while (leftsize > 0) {
  776. if (readlen = ff_fread(buf, 1, OTA_RW_SIZE, fp)) {
  777. if (ff_fwrite(buf, 1, readlen, fota) != readlen) {
  778. printf("write ota data fail.\n");
  779. break;
  780. } else {
  781. printf("write ota data %d/%d.\n", filesize - leftsize + readlen, filesize);
  782. }
  783. } else {
  784. break;
  785. }
  786. leftsize -= readlen;
  787. }
  788. ff_fclose(fota);
  789. ff_fclose(fp);
  790. vPortFree(buf);
  791. if (leftsize == 0) {
  792. printf("save file ok.\n");
  793. return 0;
  794. }
  795. return -1;
  796. }
  797. static void empty_chip_update_from_media(char *mpath)
  798. {
  799. char update_file[UPFILE_TYPE_NUM][32] = {0};
  800. size_t upfile_size[UPFILE_TYPE_NUM];
  801. size_t upfile_offset;
  802. int i;
  803. size_t filesize;
  804. uint8_t retry;
  805. SysInfo b_sysinfo;
  806. SysInfo *sysinfo = GetSysInfo();
  807. FF_FILE *fp;
  808. memcpy(&b_sysinfo, sysinfo, sizeof(SysInfo));
  809. #ifdef UPDATE_PROGRESS_SUPPORT
  810. upfile_total_size = 0;
  811. #endif
  812. for (i = UPFILE_TYPE_ANIMATION; i <= UPFILE_TYPE_ROM; i++) {
  813. sprintf(update_file[i], "%s/%s", mpath, g_upfilename[i]);
  814. fp = ff_fopen(update_file[i], "rb");
  815. if (!fp) {
  816. printf("open %s fail,don't update.\n", update_file[i]);
  817. goto end;
  818. }
  819. filesize = ff_filelength(fp);
  820. ff_fclose(fp);
  821. if (filesize > get_upfile_maxsize(i)) {
  822. printf("%s is too large, not enough space to save.\n", g_upfilename[i]);
  823. goto end;
  824. }
  825. #ifdef UPDATE_PROGRESS_SUPPORT
  826. upfile_total_size += filesize;
  827. #endif
  828. upfile_size[i] = filesize;
  829. }
  830. #ifdef UPDATE_PROGRESS_SUPPORT
  831. upfile_left_size = upfile_total_size;
  832. update_logo_init();
  833. #endif
  834. for (i = UPFILE_TYPE_ANIMATION; i <= UPFILE_TYPE_ROM; i++) {
  835. printf("burn %s start.\n", g_upfilename[i]);
  836. if (i == UPFILE_TYPE_LDR) {
  837. b_sysinfo.loader_offset = upfile_offset = LOADER_OFFSET;
  838. b_sysinfo.loader_size = upfile_size[i];
  839. } else if (i == UPFILE_TYPE_APP) {
  840. b_sysinfo.app_offset = upfile_offset = APPFILE_OFFSET;
  841. b_sysinfo.app_size = upfile_size[i];
  842. } else if (i == UPFILE_TYPE_ANIMATION) {
  843. b_sysinfo.anim_offset = upfile_offset = ANIMFILE_OFFSET;
  844. b_sysinfo.anim_size = upfile_size[i];
  845. } else if (i == UPFILE_TYPE_ROM) {
  846. b_sysinfo.rom_offset = upfile_offset = ROMFILE_OFFSET;
  847. b_sysinfo.rom_size = upfile_size[i];
  848. }
  849. retry = 0;
  850. burnretry:
  851. if (burn_update_file(i, update_file[i], upfile_offset, 1, 1)) {
  852. if (retry++ < 3) {
  853. printf("burn %s fail, retry %d.\n", g_upfilename[i], retry);
  854. goto burnretry;
  855. } else {
  856. printf("burn %s fail, don't update.\n", g_upfilename[i]);
  857. goto end;
  858. }
  859. }
  860. printf("burn %s end.\n", g_upfilename[i]);
  861. if (i == UPFILE_TYPE_ROM)
  862. empty_chip_update_ok = 1;
  863. }
  864. end:
  865. if (empty_chip_update_ok) {
  866. printf("update ok, save sysinfo.\n");
  867. b_sysinfo.update_status = UPDATE_STATUS_END;
  868. memcpy(sysinfo, &b_sysinfo, sizeof(SysInfo));
  869. SaveSysInfo();
  870. #ifdef MAILBOX_SUPPORT
  871. update_status_sync();
  872. #endif
  873. #ifdef UPDATE_PROGRESS_SUPPORT
  874. update_done();
  875. //vTaskDelay(pdMS_TO_TICKS(10000));
  876. #endif
  877. } else {
  878. #ifdef UPDATE_PROGRESS_SUPPORT
  879. ark_lcd_set_osd_yaddr(LCD_OSD1, ark_lcd_get_virt_addr());
  880. ark_lcd_set_osd_sync(LCD_OSD1);
  881. update_logo_exit();
  882. #endif
  883. printf("update from %s fail.\n", mpath);
  884. }
  885. }
  886. static void empty_chip_update_thread(void *param)
  887. {
  888. SysInfo *sysinfo = GetSysInfo();
  889. unsigned int status = 0;
  890. for (;;) {
  891. if (empty_chip_update_ok) {
  892. vTaskDelay(portMAX_DELAY);
  893. } else {
  894. switch (sysinfo->update_media_type) {
  895. #ifdef USB_SUPPORT
  896. case UPDATE_FROM_MEDIA_USB_HOST:
  897. status = usb_wait_stor_dev_pluged(portMAX_DELAY);
  898. if (status == USB_DEV_PLUGED) {
  899. printf("usb dev inserted.\n");
  900. empty_chip_update_from_media("/usb");
  901. } else if (status == USB_DEV_UNPLUGED) {
  902. printf("usb removed.\n");
  903. }
  904. break;
  905. #endif
  906. #ifdef SDMMC1_SUPPORT
  907. case UPDATE_FROM_MEDIA_SD:
  908. if (!status) {
  909. mmcsd_wait_sdio_ready_by_name("/sd",portMAX_DELAY);
  910. empty_chip_update_from_media("/sd");
  911. } else {
  912. mmcsd_wait_sdio_unready_by_name("/sd",portMAX_DELAY);
  913. printf("card removed.\n");
  914. }
  915. status = !status;
  916. break;
  917. #endif
  918. default:
  919. printf("Unknown update mode, please reconfigure before power on!\n");
  920. while (1);
  921. }
  922. }
  923. }
  924. }
  925. void empty_chip_update_demo(void)
  926. {
  927. SysInfo *sysinfo = GetSysInfo();
  928. // sysinfo->update_status = UPDATE_STATUS_START;
  929. // sysinfo->update_media_type = UPDATE_FROM_MEDIA_USB_HOST;
  930. if (sysinfo->update_status == UPDATE_STATUS_START) {
  931. printf("cpu entry empty update...\n");
  932. if (xTaskCreate(empty_chip_update_thread, "empty_chip_update", configMINIMAL_STACK_SIZE * 4, NULL,
  933. configMAX_PRIORITIES / 2, NULL) != pdPASS) {
  934. printf("create update task fail.\n");
  935. return;
  936. }
  937. while (1);
  938. }
  939. }
  940. #ifdef WIFI_UPDATE_SUPPORT
  941. #define USB_DEV_PLUGED 0
  942. #define USB_DEV_UNPLUGED 1
  943. extern int usb_wait_stor_dev_pluged(uint32_t timeout);
  944. /* 用从usb读取数据来模拟wifi接收升级数据,真实的wifi接收升级文件
  945. 需要和端app适配,需要客户自己实现 */
  946. static void wifi_update_demo_thread(void *para)
  947. {
  948. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  949. FF_Disk_t *sfdisk = FF_SFDiskInit(SF_MOUNT_PATH);
  950. if (sfdisk)
  951. #endif
  952. {
  953. unsigned int status;
  954. int filetype;
  955. for (;;) {
  956. status = usb_wait_stor_dev_pluged(portMAX_DELAY);
  957. if (status == USB_DEV_PLUGED) {
  958. printf("usb dev inserted.\n");
  959. for (filetype = UPFILE_TYPE_LDR; filetype < UPFILE_TYPE_NUM; filetype++) {
  960. if (save_file_to_ota(filetype)) {
  961. printf("save_file_to_ota fail.\n");
  962. } else {
  963. printf("start to update from ota...\n");
  964. update_from_media(OTA_MOUNT_PATH, filetype);
  965. }
  966. }
  967. } else {
  968. printf("usb removed.\n");
  969. }
  970. }
  971. }
  972. for (;;)
  973. vTaskDelay(portMAX_DELAY);
  974. }
  975. void wifi_update_demo(void)
  976. {
  977. if (xTaskCreate(wifi_update_demo_thread, "wifiupdate", configMINIMAL_STACK_SIZE * 16, NULL,
  978. 1, NULL) != pdPASS) {
  979. printf("create wifi update demo task fail.\n");
  980. }
  981. }
  982. #endif
  983. #endif