sdmmc_test_demo.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "FreeRTOS.h"
  2. #include "board.h"
  3. #include "chip.h"
  4. #include "sfud.h"
  5. #include "romfile.h"
  6. #include "ota_update.h"
  7. #include "sysinfo.h"
  8. #include "ff_stdio.h"
  9. #include "delta_update.h"
  10. #include "test_demo.h"
  11. #ifdef SDMMC1_SUPPORT
  12. #if SDMMC_TEST
  13. static int sdcard_read_test(void)
  14. {
  15. #ifdef OTA_UPDATE_SUPPORT
  16. int filetype;
  17. char filename[32];
  18. FF_FILE *fp;
  19. #ifdef DELTA_UPDATE_SUPPORT
  20. //Demo从U盘读取patch文件来模拟接收patch文件
  21. size_t filesize;
  22. uint8_t *filebuf;
  23. size_t leftsize;
  24. size_t wrsize;
  25. uint32_t offset;
  26. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  27. sfud_flash *sflash = sfud_get_device(0);
  28. #endif
  29. filebuf = pvPortMalloc(0x10000);
  30. if (!filebuf) {
  31. printf("%s filebuf malloc fail.\n", __func__);
  32. return -1;
  33. }
  34. for (filetype = UPFILE_TYPE_LDR; filetype < UPFILE_TYPE_NUM; filetype++) {
  35. strcpy(filename, "/sd/");
  36. strcat(filename, g_upfilename[filetype]);
  37. strcpy(strrchr(filename, '.'), "_patch.bin");
  38. fp = ff_fopen(filename, "rb");
  39. if (!fp) {
  40. printf("not found patch file %s.\n", filename);
  41. continue;
  42. }
  43. offset = OTA_MEDIA_OFFSET;
  44. filesize = ff_filelength(fp);
  45. leftsize = filesize;
  46. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  47. sfud_erase(sflash, OTA_MEDIA_OFFSET, filesize);
  48. #endif
  49. while (leftsize) {
  50. wrsize = leftsize > 0x10000 ? 0x10000 : leftsize;
  51. ff_fread(filebuf, 1, wrsize, fp);
  52. #if DEVICE_TYPE_SELECT == EMMC_FLASH
  53. emmc_write(offset, wrsize, filebuf);
  54. #else
  55. sfud_write(sflash, offset, wrsize, filebuf);
  56. #endif
  57. offset += wrsize;
  58. leftsize -= wrsize;
  59. }
  60. ff_fclose(fp);
  61. delta_update(filetype, filesize);
  62. }
  63. vPortFree(filebuf);
  64. #else
  65. for (filetype = UPFILE_TYPE_LDR; filetype < UPFILE_TYPE_NUM; filetype++) {
  66. sprintf(filename, "%s/%s", "/sd", g_upfilename[filetype]);
  67. fp = ff_fopen(filename, "rb");
  68. if (fp) {
  69. ff_fclose(fp);
  70. update_from_media("/sd", filetype);
  71. }
  72. }
  73. if (get_update_status()) {
  74. printf("%s, entry wdt reset.\n", __func__);
  75. wdt_cpu_reboot();
  76. }
  77. #endif
  78. #endif
  79. return 0;
  80. }
  81. static void sdcard_read_thread(void *para)
  82. {
  83. unsigned int status = 0;
  84. for (;;) {
  85. if (!status) {
  86. mmcsd_wait_sdio_ready_by_name("/sd",portMAX_DELAY);
  87. printf("card inserted.\n");
  88. sdcard_read_test();
  89. } else {
  90. mmcsd_wait_sdio_unready_by_name("/sd",portMAX_DELAY);
  91. printf("card removed.\n");
  92. }
  93. status = !status;
  94. }
  95. vTaskDelete(NULL);
  96. }
  97. void sdcard_read_demo(void)
  98. {
  99. xTaskCreate(sdcard_read_thread, "sdcard_read_demo", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY + 20, NULL);
  100. }
  101. #endif
  102. #endif