全志T3 Linux显示驱动分析

news/2024/10/17 0:18:05/

1、总体架构

全志T3处理器的显示框架是基于标准Linux的帧缓冲架构,其结构如图 1.1所示。显示控制器DE的驱动架构如图 1.2所示,包括屏蔽差异的显示管理抽象层,以及显示图层驱动、显示设备驱动、背光驱动、enhance驱动和capture驱动。

图 1.1 帧缓冲设备驱动结构题

 

 

图 1.2 显示控制器驱动架构

 

2、关键数据结构

显示驱动信息总的结构体disp_drv_info如程序清单 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 interruptbool			              b_lcd_enabled[DISP_SCREEN_NUM];bool                    inited;//indicate driver if initdisp_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类型的成员。

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_WBwait_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驱动关联起来。

http://www.ppmy.cn/news/585188.html

相关文章

树莓派 PHP白屏,树莓派3.5英寸屏幕安装显示驱动,解决白屏问题

前几天为了树莓派显示DNS解析统计,我购买了一个3.5英寸的树莓派显示屏幕,它采用的显示方式是SPI方式,占用树莓派的26个IO口,由于不是采用HDMI方式显示,所以要安装树莓派显示驱动,否则屏幕是一片空白。本文教大家如何在树莓派Raspberry官方镜像下安装显示驱动。 不安装驱动…

OLED显示模块驱动原理及应用

OLED显示模块驱动原理及应用 本文以中景园OLED显示模块为例,介绍模块的应用和OLED显示及驱动的基本原理。文中介绍了显示模块、SSD1306驱动芯片以及GT20L16S1Y字库芯片相关技术内容及原理,并加上了作者的理解和应用记录。 一、 模块介绍 1. OLED显示…

Adobe Premiere Pro CC 2019启动时提示找不到任何具有视频播放功能的模板,请更新视频显示驱动程序并再次启动/PR启动时提示找不到任何具有视频播放功能的模板

Adobe Premiere Pro CC 2019启动时提示找不到任何具有视频播放功能的模板,请更新视频显示驱动程序并再次启动/PR启动时提示找不到任何具有视频播放功能的模板 一、开头 最近刚开学,算是把整个开学过程记录了一下,拍了很多视频素材&#xff0…

7段数码管显示驱动电路参数推导

7段数码管价格低廉驱动简单,能够显示数字0~9、字符A、b、C、d、E、 F、P、q、L等,被广泛应用于电子产品的简单数据的显示。比如温控仪的温度及设置参数的显示、电子钟的时间显示、电梯的楼层显示等。 以前感觉7段数码管的驱动电路很简单,而且…

五、TDDI 触控、显示驱动一体化技术

TDDI(触控、显示驱动一体化技术)即触控与显示驱动器集成(Touch and Display Driver Integration )。目前智能手机的触控和显示功能都由两块芯片独立控制,而TDDI最大的特点是把触控芯片与显示芯片整合进单一芯片中。 T…

手把手教你写HT1621显示驱动,简单明了,内含原码,方便移植,

HT1621显示驱动 Author:家有仙妻谢掌柜 Date:2021/1/5 最近用到了HT1621来驱动一个断码屏,写在这里记录自己的成长历程,也分享出去供大家参考! /* 首先声明在本程序中和移植相关的针对不同MCU所需要的做出的修改如下…

计算机硬件系统设计—码表数码管显示驱动设计

码表数码管显示驱动设计 功能:利用4个并行的7段数码管显示16位的BCD码。 输入:16位BCD码。 输出:4个7段数码管的控制信号(32位数据) S4T,S4B,S3T,S3B,S2T,S2B,S1T,S1B 。 这32位数据中,每8位数据用来控制显示1个7段数码管的控制信号。 要求: (1)将16位BCD码分为4组,每组…

安装ps显示检测到计算机,修复:win10下Photoshop遇到显示驱动程序问题

修复:win10下Photoshop遇到显示驱动程序问题 使用Photoshop时,您可能会遇到几个错误。一个这样的错误是“Photoshop遇到了显示驱动程序的问题,并且暂时禁用了使用图形硬件的增强功能”。 如错误消息所示,问题可能是由于图形卡驱动程序引起的。其他photoshop用户面临的类似问…