ota_update.c 36 KB

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