Use LVGL FS implementation, updated LCD driver, fixed FatFS config.

This commit is contained in:
imi415 2022-06-14 09:28:55 +08:00
parent 2e7d02458b
commit cbc12d55ac
Signed by: imi415
GPG Key ID: 885EC2B5A8A6F8A7
10 changed files with 152 additions and 85 deletions

View File

@ -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")

View File

@ -247,7 +247,7 @@
<clock_outputs>
<clock_output id="Bus_clock.outFreq" value="50 MHz" locked="false" accuracy=""/>
<clock_output id="Core_clock.outFreq" value="100 MHz" locked="false" accuracy=""/>
<clock_output id="Flash_clock.outFreq" value="12.5 MHz" locked="false" accuracy=""/>
<clock_output id="Flash_clock.outFreq" value="25 MHz" locked="false" accuracy=""/>
<clock_output id="FlexBus_clock.outFreq" value="50 MHz" locked="false" accuracy=""/>
<clock_output id="LPO_clock.outFreq" value="1 kHz" locked="false" accuracy=""/>
<clock_output id="MCGFFCLK.outFreq" value="39.0625 kHz" locked="false" accuracy=""/>
@ -274,7 +274,7 @@
<setting id="SIM.OUTDIV1.scale" value="1" locked="true"/>
<setting id="SIM.OUTDIV2.scale" value="2" locked="false"/>
<setting id="SIM.OUTDIV3.scale" value="2" locked="false"/>
<setting id="SIM.OUTDIV4.scale" value="8" locked="false"/>
<setting id="SIM.OUTDIV4.scale" value="4" locked="false"/>
<setting id="SIM.SDHCSRCSEL.sel" value="OSC.OSCERCLK" locked="false"/>
</clock_settings>
<called_from_default_init>true</called_from_default_init>

View File

@ -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 =
{

View File

@ -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.

View File

@ -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

@ -1 +1 @@
Subproject commit 42c8727a321e6667dfabe85c7bb508a6f7a39e67
Subproject commit d691a7412ab130da14fc501bf69328f4df0835f8

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}