全志T3 Linux显示驱动分析

 

1、总体架构

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

2c73c6d562e5d1971d82178c6fcdfb30f3e.jpg

图 1.1帧缓冲设备驱动结构

 

222c647cf810e6fcf4f0d245225a0218802.jpg

图 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启动显示。

 

c2bd430a6b0cb8c576d8535e78814fddf6d.jpg

图 3.1 显示驱动初始化总体流程

 

ff08b82d834b642737de6c9fd46868447b1.jpg

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

 

转载于:https://my.oschina.net/u/3770369/blog/2208872

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值