全志Melis LVGL显示初始化
- 初始化显示图层
static void disp_init(void)
{
__s32 width, height;
__disp_layer_info_t layer_para;
__u32 arg[3];
__s32 ret;
__u32 value;
p_disp = esKSRV_Get_Display_Hld();
if(!p_disp)
{
__wrn("open display device fail!\n");
return EPDK_FAIL;
}
g_screen_width = esMODS_MIoctrl(p_disp, MOD_DISP_GET_SCN_WIDTH, 0, 0);
g_screen_height = esMODS_MIoctrl(p_disp, MOD_DISP_GET_SCN_HEIGHT, 0, 0);
width = g_screen_width;
height = g_screen_height;
arg[0] = MOD_DISP_LAYER_WORK_MODE_NORMAL;
arg[1] = 0;
arg[2] = 0;
lvgl_layer = esMODS_MIoctrl(p_disp, MOD_DISP_LAYER_REQUEST, 0, (void*)arg);
if(lvgl_layer != NULL)
{
eLIBs_printf("layer ok! lvgl_layer = %d\n",lvgl_layer);
}
return EPDK_OK;
}
- 初始化绘制缓冲区
static lv_disp_draw_buf_t draw_buf_dsc_3;
static lv_color_t *buf3_1 = NULL;
static lv_color_t *buf3_2 = NULL;
buf3_1 = esMEMS_Palloc((g_screen_width*g_screen_height*4+1023)>>10, 0);
buf3_2 = esMEMS_Palloc((g_screen_width*g_screen_height*4+1023)>>10, 0);
lv_disp_draw_buf_init(&draw_buf_dsc_3, buf3_1, buf3_2, g_screen_width * g_screen_height);
- 实现刷图函数
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
__s32 width, height;
static __disp_layer_info_t layer_para;
__u64 arg[3];
__s32 ret;
static int cnt = 0;
static __disp_fb_t fb_para;
static lv_color_t*pic = NULL;
if(cnt == 0)
{
cnt++;
layer_para.mode = MOD_DISP_LAYER_WORK_MODE_NORMAL;
esMEMS_CleanFlushDCacheRegion((__u32)color_p, g_screen_width*g_screen_height*4);
layer_para.fb.format = DISP_FORMAT_ARGB_8888;
layer_para.fb.seq = DISP_SEQ_ARGB;
layer_para.fb.mode = DISP_MOD_INTERLEAVED;
layer_para.fb.br_swap = 0;
layer_para.fb.cs_mode = DISP_BT601;
layer_para.mode = MOD_DISP_LAYER_WORK_MODE_NORMAL;
layer_para.pipe = 0;
layer_para.prio = 4;
layer_para.alpha_en = 0;
layer_para.alpha_val = 0xff;
layer_para.ck_enable = 0;
layer_para.src_win.x = 0;
layer_para.src_win.y = 0;
layer_para.src_win.width = g_screen_width;
layer_para.src_win.height = g_screen_height;
layer_para.scn_win.x = 0;
layer_para.scn_win.y = 0;
layer_para.scn_win.width = g_screen_width;
layer_para.scn_win.height = g_screen_height;
layer_para.fb.addr[0] = (__u64)color_p;
layer_para.fb.addr[1] = NULL;
layer_para.fb.addr[2] = NULL;
layer_para.fb.size.width = g_screen_width;
layer_para.fb.size.height = g_screen_height;
close_logo();
arg[0] = lvgl_layer;
arg[1] = (__u32)&layer_para;
arg[2] = 0;
esMODS_MIoctrl(p_disp,MOD_DISP_CMD_LAYER_SET_PARA,0,(void*)arg);
}
else
{
esMEMS_CleanFlushDCacheRegion((__u32)color_p, g_screen_width*g_screen_height*4);
layer_para.fb.addr[0] = (__u32)color_p;
arg[0] = lvgl_layer;
arg[1] = (__u32)&layer_para;
arg[2] = 0;
esMODS_MIoctrl(p_disp,MOD_DISP_CMD_LAYER_SET_PARA,0,(void*)arg);
}
lv_disp_flush_ready(disp_drv);
}