1、总体架构
全志T3处理器的显示框架是基于标准Linux的帧缓冲架构,其结构如图 1.1所示。显示控制器DE的驱动架构如图 1.2所示,包括屏蔽差异的显示管理抽象层,以及显示图层驱动、显示设备驱动、背光驱动、enhance驱动和capture驱动。
图 1.1帧缓冲设备驱动结构
图 1.2显示控制器驱动架构
2、关键数据结构
显示驱动信息总的结构体disp_drv_info如程序清单 2.1所示,包含显示驱动所有的相关信息。
程序清单 2.1
typedef struct { struct device *dev; uintptr_t reg_base[DISP_MOD_NUM]; u32 irq_no[DISP_MOD_NUM]; struct clk *mclk[DISP_MOD_NUM]; disp_init_para disp_init; struct disp_manager *mgr[DISP_SCREEN_NUM]; struct disp_eink_manager *eink_manager[1]; struct proc_list sync_proc_list; struct proc_list sync_finish_proc_list; struct ioctl_list ioctl_extend_list; struct ioctl_list compat_ioctl_extend_list; struct standby_cb_list stb_cb_list; struct mutex mlock; struct work_struct resume_work[DISP_SCREEN_NUM]; struct work_struct start_work; u32 exit_mode;//0:clean all 1:disable interrupt bool b_lcd_enabled[DISP_SCREEN_NUM]; bool inited;//indicate driver if init disp_bsp_init_para para; #if defined(CONFIG_ION_SUNXI) struct ion_client *client; struct ion_handle *handle; #endif }disp_drv_info;
struct disp_manager是管理抽象层的数据结构体,可以看到包含设备驱动、smbl驱动、enhance驱动、cptr驱动、图层驱动以及管理层的相关操作接口,并且disp_drv_info中包含有struct disp_manager类型的成员。
程序清单 2.2
struct disp_manager { /* data fields */ char name[32]; u32 disp; u32 num_chns; u32 num_layers; struct disp_device *device; struct disp_smbl *smbl; struct disp_enhance *enhance; struct disp_capture *cptr; struct list_head lyr_list; #ifdef SUPPORT_WB wait_queue_head_t write_back_queue; u32 write_back_finish; #endif /* function fields */ s32 (*enable)(struct disp_manager *mgr); s32 (*sw_enable)(struct disp_manager *mgr); s32 (*disable)(struct disp_manager *mgr); s32 (*is_enabled)(struct disp_manager *mgr); s32 (*blank)(struct disp_manager *mgr, bool blank); /* init: clock init && reg init && register irq * exit: clock exit && unregister irq */ s32 (*init)(struct disp_manager *mgr); s32 (*exit)(struct disp_manager *mgr); s32 (*set_back_color)(struct disp_manager *mgr, struct disp_color *bk_color); s32 (*get_back_color)(struct disp_manager *mgr, struct disp_color *bk_color); s32 (*set_color_key)(struct disp_manager *mgr, struct disp_colorkey *ck); s32 (*get_color_key)(struct disp_manager *mgr, struct disp_colorkey *ck); s32 (*get_screen_size)(struct disp_manager *mgr, u32 *width, u32 *height); s32 (*set_screen_size)(struct disp_manager *mgr, u32 width, u32 height); s32 (*get_clk_rate)(struct disp_manager *mgr); /* layer mamage */ s32 (*check_layer_zorder)(struct disp_manager *mgr, struct disp_layer_config *config, u32 layer_num); s32 (*set_layer_config)(struct disp_manager *mgr, struct disp_layer_config *config, unsigned int layer_num); s32 (*force_set_layer_config)(struct disp_manager *mgr, struct disp_layer_config *config, unsigned int layer_num); s32 (*force_set_layer_config_exit)(struct disp_manager *mgr); s32 (*get_layer_config)(struct disp_manager *mgr, struct disp_layer_config *config, unsigned int layer_num); s32 (*extend_layer_config)(struct disp_manager *mgr, struct disp_layer_config *info, unsigned int layer_num); s32 (*set_output_color_range)(struct disp_manager *mgr, u32 color_range); s32 (*get_output_color_range)(struct disp_manager *mgr); s32 (*update_color_space)(struct disp_manager *mgr); s32 (*apply)(struct disp_manager *mgr); s32 (*force_apply)(struct disp_manager *mgr); s32 (*update_regs)(struct disp_manager *mgr); s32 (*sync)(struct disp_manager *mgr); s32 (*tasklet)(struct disp_manager *mgr); /* debug interface, dump manager info */ s32 (*dump)(struct disp_manager *mgr, char *buf); };
3、显示驱动初始化流程
显示驱动初始化总体流程如图 3.1所以,驱动注册为Linux的平台设备,初始化入口是disp_probe。在disp_probe中首先从dtb中获取显示驱动相关的一些参数比如寄存器基地址、中断号、时钟等,然后调用disp_init接口。disp_init接口主要进行一些系统相关的参数、接口初始化,显示控制器DE驱动初始化(bsp_disp_init),LCD设备初始化,fb缓存初始化,最后通过start_process启动显示。
图 3.1 显示驱动初始化总体流程
图 3.2 显示控制器驱动初始化
bsp_disp_init完成显示控制器DE的驱动初始化,主要的动作如图 3.2所示:
初始化全局变量gdisp中的init_para参数;
初始化显示控制器DE的默认参数;
挂接中断处理中tasklet处理函数;
设置显示打印等级;
初始化显示控制器DE的抽象图层驱动;
初始化显示控制器DE的lcd设备抽象驱动;
初始化显示控制器DE的管理层驱动;
初始化显示控制器DE的enhance驱动;
初始化显示控制器DE的背光控制驱动;
初始化显示控制器DE的capture驱动;
将管理层驱动与抽象图层、lcd设备驱动、enhance驱动、背光控制驱动、capture驱动关联起来。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。