全志T3 Linux显示驱动分析

  

<强> 1,总体架构

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

全志T3 Linux显示驱动分析

1.1图帧缓冲设备驱动结构

,

全志T3 Linux显示驱动分析

1.2图显示控制器驱动架构

<强> 2,关键数据结构

,,,,显示驱动信息总的结构体disp_drv_info如程序清单2.1所示,包含显示驱动所有的相关信息。

程序清单2.1

typedef 结构   {   struct  device ,,,,,,,,,, *开发;   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 ,,,, *经理[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 中断   bool,,,,,,,,,,,,,, b_lcd_enabled [DISP_SCREEN_NUM];   bool ,,,,,,,,,,,,,,,,,,,请来;//indicate  driver  if  init   disp_bsp_init_para ,,,,,对位;   # if 定义(CONFIG_ION_SUNXI)   struct  ion_client  *客户;   struct  ion_handle  *处理;   # endif   }disp_drv_info;


,,,,,,,, struct disp_manager是管理抽象层的数据结构体,可以看到包含设备驱动,smbl驱动,增强驱动,cptr驱动,图层驱动以及管理层的相关操作接口,并且disp_drv_info中包含有struct disp_manager类型的成员。

程序清单2.2

struct  disp_manager  {/*,data  fields  */char [32]名称;   u32  disp;   u32  num_chns;   u32  num_layers;   struct  disp_device  *装置;   struct  disp_smbl  * smbl;   struct  disp_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 (使)(struct  disp_manager  *经理);   s32  (* sw_enable) (struct  disp_manager  *经理);   s32 (*禁用)(struct  disp_manager  *经理);   s32  (* is_enabled) (struct  disp_manager  *经理);   s32 空白(*)(struct  disp_manager  *下,,bool 空白);/*,init: clock  init ,,, reg  init ,, register  irq   ,*退出:clock  exit ,, unregister  irq   ,*/s32  (* init) (struct  disp_manager  *经理);   s32 退出(*)(struct  disp_manager  *经理);      s32  (* set_back_color) (struct  disp_manager  *下,struct  disp_color  * bk_color);   s32  (* get_back_color) (struct  disp_manager  *下,struct  disp_color  * bk_color);   s32  (* set_color_key) (struct  disp_manager  *下,,struct  disp_colorkey  * ck);   s32  (* get_color_key) (struct  disp_manager  *下,,struct  disp_colorkey  * ck);      s32  (* get_screen_size) (struct  disp_manager  *下,,u32  *宽度,u32  *高);   s32  (* set_screen_size) (struct  disp_manager  *下,,u32 宽度,,u32 高度);   s32  (* get_clk_rate) (struct  disp_manager  *经理);/*,layer  mamage  */s32  (* check_layer_zorder) (struct  disp_manager  *下,,struct  disp_layer_config  *配置,u32  layer_num);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

全志T3 Linux显示驱动分析