全志T3 Linux顯示驅動分析

 

一、整體架構緩存

全志T3處理器的顯示框架是基於標準Linux的幀緩衝架構,其結構如圖 1.1所示。顯示控制器DE的驅動架構如圖 1.2所示,包括屏蔽差別的顯示管理抽象層,以及顯示圖層驅動、顯示設備驅動、背光驅動、enhance驅動和capture驅動。數據結構

圖 1.1幀緩衝設備驅動結構架構

 

圖 1.2顯示控制器驅動架構app

二、關鍵數據結構框架

顯示驅動信息總的結構體disp_drv_info如程序清單 2.1所示,包含顯示驅動全部的相關信息。函數

程序清單 2.1ui

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類型的成員。spa

程序清單 2.2debug

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);
};

 

 

三、顯示驅動初始化流程code

顯示驅動初始化整體流程如圖 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驅動關聯起來。
相關文章
相關標籤/搜索