diff --git a/CMakeLists.txt b/CMakeLists.txt index 362d22f..55bbee1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,9 +118,10 @@ set(TARGET_CFLAGS_HARDWARE "-mcpu=cortex-m4 -mthumb -mfloat-abi=soft") # Conditional flags # DEBUG -set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -O1 -g") -set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -O1 -g") -set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -O1 -g") +set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -O2 -g") +set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -O2 -g") +set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -O2 -g") +set(CMAKE_EXE_LINKER_FLAGS_DEBUG "") # RELEASE set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O2 -flto") diff --git a/MK60DN512xxx10.mex b/MK60DN512xxx10.mex index c37025c..bbf683a 100644 --- a/MK60DN512xxx10.mex +++ b/MK60DN512xxx10.mex @@ -247,7 +247,7 @@ - + @@ -274,7 +274,7 @@ - + true diff --git a/board/clock_config.c b/board/clock_config.c index 38e51f8..6e6efed 100644 --- a/board/clock_config.c +++ b/board/clock_config.c @@ -133,7 +133,7 @@ called_from_default_init: true outputs: - {id: Bus_clock.outFreq, value: 50 MHz} - {id: Core_clock.outFreq, value: 100 MHz} -- {id: Flash_clock.outFreq, value: 12.5 MHz} +- {id: Flash_clock.outFreq, value: 25 MHz} - {id: FlexBus_clock.outFreq, value: 50 MHz} - {id: LPO_clock.outFreq, value: 1 kHz} - {id: MCGFFCLK.outFreq, value: 39.0625 kHz} @@ -159,7 +159,7 @@ settings: - {id: SIM.OUTDIV1.scale, value: '1', locked: true} - {id: SIM.OUTDIV2.scale, value: '2'} - {id: SIM.OUTDIV3.scale, value: '2'} -- {id: SIM.OUTDIV4.scale, value: '8'} +- {id: SIM.OUTDIV4.scale, value: '4'} - {id: SIM.SDHCSRCSEL.sel, value: OSC.OSCERCLK} sources: - {id: OSC.OSC.outFreq, value: 50 MHz, enabled: true} @@ -191,7 +191,7 @@ const sim_clock_config_t simConfig_BOARD_BootClockRUN = { .pllFllSel = SIM_PLLFLLSEL_MCGFLLCLK_CLK, /* PLLFLL select: MCGFLLCLK clock */ .er32kSrc = SIM_OSC32KSEL_OSC32KCLK_CLK, /* OSC32KSEL select: OSC32KCLK clock */ - .clkdiv1 = 0x1170000U, /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV2: /2, OUTDIV3: /2, OUTDIV4: /8 */ + .clkdiv1 = 0x1130000U, /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV2: /2, OUTDIV3: /2, OUTDIV4: /4 */ }; const osc_config_t oscConfig_BOARD_BootClockRUN = { diff --git a/include/ffconf.h b/include/ffconf.h index fb6433e..5ff7044 100644 --- a/include/ffconf.h +++ b/include/ffconf.h @@ -231,7 +231,7 @@ / buffer in the filesystem object (FATFS) is used for the file data transfer. */ -#define FF_FS_EXFAT 0 +#define FF_FS_EXFAT 1 /* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) / To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) / Note that enabling exFAT discards ANSI C (C89) compatibility. */ @@ -263,7 +263,7 @@ */ -#define FF_FS_LOCK 0 +#define FF_FS_LOCK 32 /* The option FF_FS_LOCK switches file lock function to control duplicated file open / and illegal operation to open objects. This option must be 0 when FF_FS_READONLY / is 1. diff --git a/include/lcd_impl.h b/include/lcd_impl.h index fdd54bb..97f172d 100644 --- a/include/lcd_impl.h +++ b/include/lcd_impl.h @@ -18,5 +18,6 @@ epd_ret_t epd_impl_init(void *handle); epd_ret_t epd_impl_write_command(void *handle, uint8_t *command, uint32_t len); epd_ret_t epd_impl_write_data(void *handle, uint8_t *data, uint32_t len); epd_ret_t epd_impl_reset(void *handle); +epd_ret_t epd_impl_delay(void *handle, uint32_t msec); #endif \ No newline at end of file diff --git a/lib/LCD b/lib/LCD index 42c8727..d691a74 160000 --- a/lib/LCD +++ b/lib/LCD @@ -1 +1 @@ -Subproject commit 42c8727a321e6667dfabe85c7bb508a6f7a39e67 +Subproject commit d691a7412ab130da14fc501bf69328f4df0835f8 diff --git a/src/lcd_impl.c b/src/lcd_impl.c index f0fa887..5ef8eba 100644 --- a/src/lcd_impl.c +++ b/src/lcd_impl.c @@ -91,15 +91,16 @@ epd_ret_t epd_impl_write_data(void *handle, uint8_t *data, uint32_t len) { } epd_ret_t epd_impl_reset(void *handle) { - uint32_t delay = CLOCK_GetCoreSysClkFreq() / 50; /* 20 msec */ - GPIO_WritePinOutput(BOARD_INITPINS_TFT_RESET_GPIO, BOARD_INITPINS_TFT_RESET_PIN, 0U); - - for (uint32_t i = 0; i < delay; i++) { - asm("nop"); - } - + vTaskDelay(pdMS_TO_TICKS(20)); GPIO_WritePinOutput(BOARD_INITPINS_TFT_RESET_GPIO, BOARD_INITPINS_TFT_RESET_PIN, 1U); + vTaskDelay(pdMS_TO_TICKS(20)); + + return EPD_OK; +} + +epd_ret_t epd_impl_delay(void *handle, uint32_t msec) { + vTaskDelay(pdMS_TO_TICKS(msec)); return EPD_OK; } \ No newline at end of file diff --git a/src/lvgl_helpers.c b/src/lvgl_helpers.c index bf50ad6..a7afc08 100644 --- a/src/lvgl_helpers.c +++ b/src/lvgl_helpers.c @@ -18,8 +18,9 @@ #define LVGL_FS_BASE "0:/LV_ROOT/" -#define LVGL_RES_HOR 240 -#define LVGL_RES_VER 320 +#define LVGL_RES_HOR 240 +#define LVGL_RES_VER 320 +#define LVGL_CACHE_DEPTH 20 SemaphoreHandle_t g_lvgl_semphr; EventGroupHandle_t g_lvgl_event_group; @@ -36,14 +37,15 @@ static lcd_generic_ssd1289_t s_lcd = { .reset_cb = epd_impl_reset, .write_command_cb = epd_impl_write_command, .write_data_cb = epd_impl_write_data, + .delay_cb = epd_impl_delay, }, .dir = LCD_GENERIC_SSD1289_DIR_VERTICAL, .mode = LCD_GENERIC_SSD1289_MODE_XBRG8888, .user_data = &s_lcd_impl, }; -__attribute((section(".lvgl_buffer"))) static lv_color_t s_lvgl_buf_1[LVGL_RES_HOR * 20]; -__attribute((section(".lvgl_buffer"))) static lv_color_t s_lvgl_buf_2[LVGL_RES_HOR * 20]; +__attribute((section(".lvgl_buffer"))) static lv_color_t s_lvgl_buf_1[LVGL_RES_HOR * LVGL_CACHE_DEPTH]; +__attribute((section(".lvgl_buffer"))) static lv_color_t s_lvgl_buf_2[LVGL_RES_HOR * LVGL_CACHE_DEPTH]; void lvgl_task(void *pvParameters); @@ -74,87 +76,144 @@ static void lvgl_set_px_cb(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf } static void *lvgl_fs_open_cb(lv_fs_drv_t *drv, const char *path, lv_fs_mode_t mode) { - FIL *fp = pvPortMalloc(sizeof(FIL)); - if (fp == NULL) { - return NULL; - } + LV_UNUSED(drv); + uint8_t flags = 0; - char *ff_path = pvPortMalloc(255); + if (mode == LV_FS_MODE_WR) + flags = FA_WRITE | FA_OPEN_ALWAYS; + else if (mode == LV_FS_MODE_RD) + flags = FA_READ; + else if (mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) + flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS; + + FIL *f = lv_mem_alloc(sizeof(FIL)); + if (f == NULL) return NULL; + + TCHAR *ff_path = lv_mem_alloc(sizeof(TCHAR) * 256); if (ff_path == NULL) { - vPortFree(fp); + lv_mem_free(f); return NULL; } - snprintf(ff_path, 255, LVGL_FS_BASE "%s", path); - FRESULT res = f_open(fp, ff_path, FA_READ); - if (res != FR_OK) { - vPortFree(ff_path); - vPortFree(fp); + snprintf(ff_path, 256, LVGL_FS_BASE "%s", path); + FRESULT res = f_open(f, ff_path, flags); + + lv_mem_free(ff_path); + + if (res == FR_OK) { + return f; + } else { + lv_mem_free(f); return NULL; } - - vPortFree(ff_path); - - return fp; } static lv_fs_res_t lvgl_fs_close_cb(lv_fs_drv_t *drv, void *file_p) { - FIL *fp = file_p; - - FRESULT res = f_close(fp); - - vPortFree(fp); - - if (res != FR_OK) { - return LV_FS_RES_FS_ERR; - } - + LV_UNUSED(drv); + f_close(file_p); + lv_mem_free(file_p); return LV_FS_RES_OK; } static lv_fs_res_t lvgl_fs_read_cb(lv_fs_drv_t *drv, void *file_p, void *buf, uint32_t btr, uint32_t *br) { - FIL *fp = file_p; + LV_UNUSED(drv); + FRESULT res = f_read(file_p, buf, btr, (UINT *)br); + if (res == FR_OK) + return LV_FS_RES_OK; + else + return LV_FS_RES_UNKNOWN; +} - FRESULT res = f_read(fp, buf, btr, (unsigned int *)br); - if (res != FR_OK) { - return LV_FS_RES_FS_ERR; +static lv_fs_res_t lvgl_fs_write_cb(lv_fs_drv_t *drv, void *file_p, const void *buf, uint32_t btw, uint32_t *bw) { + LV_UNUSED(drv); + FRESULT res = f_write(file_p, buf, btw, (UINT *)bw); + if (res == FR_OK) + return LV_FS_RES_OK; + else + return LV_FS_RES_UNKNOWN; +} + +static lv_fs_res_t lvgl_fs_seek_cb(lv_fs_drv_t *drv, void *file_p, uint32_t pos, lv_fs_whence_t whence) { + LV_UNUSED(drv); + switch (whence) { + case LV_FS_SEEK_SET: + f_lseek(file_p, pos); + break; + case LV_FS_SEEK_CUR: + f_lseek(file_p, f_tell((FIL *)file_p) + pos); + break; + case LV_FS_SEEK_END: + f_lseek(file_p, f_size((FIL *)file_p) + pos); + break; + default: + break; } + return LV_FS_RES_OK; +} + +static lv_fs_res_t lvgl_fs_tell_cb(lv_fs_drv_t *drv, void *file_p, uint32_t *pos_p) { + LV_UNUSED(drv); + *pos_p = f_tell((FIL *)file_p); + return LV_FS_RES_OK; +} + +static void *lvgl_fs_dir_open_cb(lv_fs_drv_t *drv, const char *path) { + LV_UNUSED(drv); + DIR *d = lv_mem_alloc(sizeof(DIR)); + if (d == NULL) return NULL; + + TCHAR *ff_path = lv_mem_alloc(sizeof(TCHAR) * 256); + if (ff_path == NULL) { + lv_mem_free(d); + return NULL; + } + + snprintf(ff_path, 256, LVGL_FS_BASE "%s", path); + + FRESULT res = f_opendir(d, ff_path); + + lv_mem_free(ff_path); + + if (res != FR_OK) { + lv_mem_free(d); + d = NULL; + } + return d; +} + +static lv_fs_res_t lvgl_fs_dir_read_cb(lv_fs_drv_t *drv, void *dir_p, char *fn) { + LV_UNUSED(drv); + FRESULT res; + FILINFO fno; + fn[0] = '\0'; + + do { + res = f_readdir(dir_p, &fno); + if (res != FR_OK) return LV_FS_RES_UNKNOWN; + + if (fno.fattrib & AM_DIR) { + fn[0] = '/'; + strcpy(&fn[1], fno.fname); + } else + strcpy(fn, fno.fname); + + } while (strcmp(fn, "/.") == 0 || strcmp(fn, "/..") == 0); return LV_FS_RES_OK; } -static lv_fs_res_t lvgl_fs_seek_cb(lv_fs_drv_t *drv, void *file_p, uint32_t pos, lv_fs_whence_t whence) { - FRESULT res; - - FIL *fp = file_p; - - uint32_t size = f_size(fp); - - if (whence != LV_FS_SEEK_CUR) { - res = f_rewind(fp); - - if (res != FR_OK) { - return LV_FS_RES_FS_ERR; - } - } - - if (whence == LV_FS_SEEK_END) { - pos = (size - 1) - pos; - } - - res = f_lseek(fp, pos); - if (res != FR_OK) { - return LV_FS_RES_FS_ERR; - } - +static lv_fs_res_t lvgl_fs_dir_close_cb(lv_fs_drv_t *drv, void *dir_p) { + LV_UNUSED(drv); + f_closedir(dir_p); + lv_mem_free(dir_p); return LV_FS_RES_OK; } int lvgl_setup(void) { lv_init(); - lv_disp_draw_buf_init(&s_lvgl_disp_buf, s_lvgl_buf_1, s_lvgl_buf_2, LVGL_RES_HOR * 10); + lv_disp_draw_buf_init(&s_lvgl_disp_buf, s_lvgl_buf_1, s_lvgl_buf_2, LVGL_RES_HOR * LVGL_CACHE_DEPTH); epd_impl_init(&s_lcd_impl); lcd_generic_ssd1289_init(&s_lcd); @@ -170,11 +229,16 @@ int lvgl_setup(void) { lv_disp_drv_register(&s_lvgl_disp_drv); lv_fs_drv_init(&s_lvgl_fs_drv); - s_lvgl_fs_drv.letter = 'A'; - s_lvgl_fs_drv.open_cb = lvgl_fs_open_cb; - s_lvgl_fs_drv.close_cb = lvgl_fs_close_cb; - s_lvgl_fs_drv.read_cb = lvgl_fs_read_cb; - s_lvgl_fs_drv.seek_cb = lvgl_fs_seek_cb; + s_lvgl_fs_drv.letter = 'A'; + s_lvgl_fs_drv.open_cb = lvgl_fs_open_cb; + s_lvgl_fs_drv.close_cb = lvgl_fs_close_cb; + s_lvgl_fs_drv.read_cb = lvgl_fs_read_cb; + s_lvgl_fs_drv.write_cb = lvgl_fs_write_cb; + s_lvgl_fs_drv.seek_cb = lvgl_fs_seek_cb; + s_lvgl_fs_drv.tell_cb = lvgl_fs_tell_cb; + s_lvgl_fs_drv.dir_open_cb = lvgl_fs_dir_open_cb; + s_lvgl_fs_drv.dir_read_cb = lvgl_fs_dir_read_cb; + s_lvgl_fs_drv.dir_close_cb = lvgl_fs_dir_close_cb; lv_fs_drv_register(&s_lvgl_fs_drv); @@ -185,7 +249,7 @@ int lvgl_setup(void) { xSemaphoreGive(g_lvgl_semphr); - if (xTaskCreate(lvgl_task, "LVTASK", 2048, NULL, 32, NULL) != pdPASS) { + if (xTaskCreate(lvgl_task, "LVTASK", 2048, NULL, 13, NULL) != pdPASS) { return -3; } diff --git a/src/main.c b/src/main.c index 0975551..88282b9 100644 --- a/src/main.c +++ b/src/main.c @@ -57,7 +57,7 @@ int main(void) { // mtls_selftests(1); - xTaskCreate(vTaskHello, "HELLO", 256, NULL, 32, NULL); + xTaskCreate(vTaskHello, "HELLO", 512, NULL, 32, NULL); vTaskStartScheduler(); @@ -102,7 +102,7 @@ static void vTaskHello(void *pvParameters) { strftime(time_str, 7, "%H:%M", cur_tm); - xQueueSend(g_ui_standby_queue, &cmd, 0); + xQueueSend(g_ui_standby_queue, &cmd, portMAX_DELAY); printf("Current time: %04d-%02d-%02d %02d:%02d:%02d\r\n", cur_tm->tm_year + 1900, cur_tm->tm_mon + 1, cur_tm->tm_mday, cur_tm->tm_hour, cur_tm->tm_min, cur_tm->tm_sec); diff --git a/src/ui/ui.c b/src/ui/ui.c index 025e88d..4837194 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -10,7 +10,7 @@ int ui_setup(void) { return -1; } - if(xTaskCreate(ui_standby_task, "U_STBY", 256, NULL, 33, NULL) != pdPASS) { + if(xTaskCreate(ui_standby_task, "U_STBY", 256, NULL, 14, NULL) != pdPASS) { return -2; }