千家信息网

全志T3 Linux显示驱动分析

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,1、总体架构全志T3处理器的显示框架是基于标准Linux的帧缓冲架构,其结构如图 1.1所示。显示控制器DE的驱动架构如图 1.2所示,包括屏蔽差异的显示管理抽象层,以及显示图层驱动、显示设备驱动、背
千家信息网最后更新 2024年12月13日全志T3 Linux显示驱动分析

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所示:

  1. 初始化全局变量gdisp中的init_para参数;

  2. 初始化显示控制器DE的默认参数;

  3. 挂接中断处理中tasklet处理函数;

  4. 设置显示打印等级;

  5. 初始化显示控制器DE的抽象图层驱动;

  6. 初始化显示控制器DE的lcd设备抽象驱动;

  7. 初始化显示控制器DE的管理层驱动;

  8. 初始化显示控制器DE的enhance驱动;

  9. 初始化显示控制器DE的背光控制驱动;

  10. 初始化显示控制器DE的capture驱动;

  11. 将管理层驱动与抽象图层、lcd设备驱动、enhance驱动、背光控制驱动、capture驱动关联起来。



驱动 控制 控制器 设备 结构 管理 参数 接口 架构 如图 总体 流程 清单 程序 管理层 设备驱动 处理 信息 数据 数据结构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 cs架构比较直连数据库的优势 软件开发的测试和评价技术 华为数据库安全产品 合作 学校网络安全知识手抄报 黑客攻防与网络安全试题 战马下载软件开发 贵阳有哪些软件开发公司 用友软件应用服务器安装图文教程 万方数据库怎样进入 浙江新闻网络安全 网络安全可以研发什么产品 为网络安全建言献策 可视化smt软件开发 泉州短视频直播软件开发项目经理 sql数据库的优化方法 普法网络安全法实施时间 如何看懂设备与服务器通讯报文 美电贝尔服务器尺寸大小 上饶雅冈网络技术有限公司 5g网络技术细节 软件开发0基础招聘 rbl数据库 中金众联互联网科技集团 加强网络安全管理的指导思想 和祐美和医院网络安全改造 无线网络技术考核代码 黑镖客梦回三国志哪个服务器 上海舒科网络技术科技 数据库查询表格创建时间 数据库应用技术的功能
0