十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1、總體架構(gòu)
站在用戶的角度思考問題,與客戶深入溝通,找到鼓樓網(wǎng)站設(shè)計與鼓樓網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鼓樓地區(qū)。
全志T3處理器的顯示框架是基于標(biāo)準(zhǔn)Linux的幀緩沖架構(gòu),其結(jié)構(gòu)如圖 1.1所示。顯示控制器DE的驅(qū)動架構(gòu)如圖 1.2所示,包括屏蔽差異的顯示管理抽象層,以及顯示圖層驅(qū)動、顯示設(shè)備驅(qū)動、背光驅(qū)動、enhance驅(qū)動和capture驅(qū)動。
圖 1.1幀緩沖設(shè)備驅(qū)動結(jié)構(gòu)
圖 1.2顯示控制器驅(qū)動架構(gòu)
2、關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
顯示驅(qū)動信息總的結(jié)構(gòu)體disp_drv_info如程序清單 2.1所示,包含顯示驅(qū)動所有的相關(guān)信息。
程序清單 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是管理抽象層的數(shù)據(jù)結(jié)構(gòu)體,可以看到包含設(shè)備驅(qū)動、smbl驅(qū)動、enhance驅(qū)動、cptr驅(qū)動、圖層驅(qū)動以及管理層的相關(guān)操作接口,并且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、顯示驅(qū)動初始化流程
顯示驅(qū)動初始化總體流程如圖 3.1所以,驅(qū)動注冊為Linux的平臺設(shè)備,初始化入口是disp_probe。在disp_probe中首先從dtb中獲取顯示驅(qū)動相關(guān)的一些參數(shù)比如寄存器基地址、中斷號、時鐘等,然后調(diào)用disp_init接口。disp_init接口主要進行一些系統(tǒng)相關(guān)的參數(shù)、接口初始化,顯示控制器DE驅(qū)動初始化(bsp_disp_init),LCD設(shè)備初始化,fb緩存初始化,最后通過start_process啟動顯示。
圖 3.1 顯示驅(qū)動初始化總體流程
圖 3.2 顯示控制器驅(qū)動初始化
bsp_disp_init完成顯示控制器DE的驅(qū)動初始化,主要的動作如圖 3.2所示:
初始化全局變量gdisp中的init_para參數(shù);
初始化顯示控制器DE的默認(rèn)參數(shù);
掛接中斷處理中tasklet處理函數(shù);
設(shè)置顯示打印等級;
初始化顯示控制器DE的抽象圖層驅(qū)動;
初始化顯示控制器DE的lcd設(shè)備抽象驅(qū)動;
初始化顯示控制器DE的管理層驅(qū)動;
初始化顯示控制器DE的enhance驅(qū)動;
初始化顯示控制器DE的背光控制驅(qū)動;
初始化顯示控制器DE的capture驅(qū)動;
將管理層驅(qū)動與抽象圖層、lcd設(shè)備驅(qū)動、enhance驅(qū)動、背光控制驅(qū)動、capture驅(qū)動關(guān)聯(lián)起來。