#include "FreeRTOS.h" #include "board.h" #include "chip.h" #include "sfud.h" #include "romfile.h" #include "ota_update.h" #include "sysinfo.h" #include "ff_stdio.h" #include "delta_update.h" #include "test_demo.h" #ifdef SDMMC1_SUPPORT #if SDMMC_TEST static int sdcard_read_test(void) { #ifdef OTA_UPDATE_SUPPORT int filetype; char filename[32]; FF_FILE *fp; #ifdef DELTA_UPDATE_SUPPORT //Demo从U盘读取patch文件来模拟接收patch文件 size_t filesize; uint8_t *filebuf; size_t leftsize; size_t wrsize; uint32_t offset; #if DEVICE_TYPE_SELECT != EMMC_FLASH sfud_flash *sflash = sfud_get_device(0); #endif filebuf = pvPortMalloc(0x10000); if (!filebuf) { printf("%s filebuf malloc fail.\n", __func__); return -1; } for (filetype = UPFILE_TYPE_LDR; filetype < UPFILE_TYPE_NUM; filetype++) { strcpy(filename, "/sd/"); strcat(filename, g_upfilename[filetype]); strcpy(strrchr(filename, '.'), "_patch.bin"); fp = ff_fopen(filename, "rb"); if (!fp) { printf("not found patch file %s.\n", filename); continue; } offset = OTA_MEDIA_OFFSET; filesize = ff_filelength(fp); leftsize = filesize; #if DEVICE_TYPE_SELECT != EMMC_FLASH sfud_erase(sflash, OTA_MEDIA_OFFSET, filesize); #endif while (leftsize) { wrsize = leftsize > 0x10000 ? 0x10000 : leftsize; ff_fread(filebuf, 1, wrsize, fp); #if DEVICE_TYPE_SELECT == EMMC_FLASH emmc_write(offset, wrsize, filebuf); #else sfud_write(sflash, offset, wrsize, filebuf); #endif offset += wrsize; leftsize -= wrsize; } ff_fclose(fp); delta_update(filetype, filesize); } vPortFree(filebuf); #else for(filetype = 0; filetype < UPFILE_TYPE_NUM; filetype++) { sprintf(filename, "%s/%s", "/sd", g_upfilename[filetype]); fp = ff_fopen(filename, "rb"); if (fp) { ff_fclose(fp); update_from_media("/sd", filetype); } } #endif #endif return 0; } static void sdcard_read_thread(void *para) { unsigned int status = 0; for (;;) { if (!status) { mmcsd_wait_sdio_ready_by_name("/sd",portMAX_DELAY); printf("card inserted.\n"); sdcard_read_test(); } else { mmcsd_wait_sdio_unready_by_name("/sd",portMAX_DELAY); printf("card removed.\n"); } status = !status; } vTaskDelete(NULL); } void sdcard_read_demo(void) { xTaskCreate(sdcard_read_thread, "sdcard_read_demo", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY + 20, NULL); } #endif #endif