generated from Embedded_Projects/Landzo_K60Z_LwIP
Use LVGL FS implementation, updated LCD driver, fixed FatFS config.
This commit is contained in:
parent
2e7d02458b
commit
cbc12d55ac
|
@ -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")
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 =
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
2
lib/LCD
2
lib/LCD
|
@ -1 +1 @@
|
|||
Subproject commit 42c8727a321e6667dfabe85c7bb508a6f7a39e67
|
||||
Subproject commit d691a7412ab130da14fc501bf69328f4df0835f8
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue