基于SEP4O2O的Linux frame buffer驅動設計
3 L i nux驅動軟件設計實現
3.1 驅動核心結構體的介紹
3.1.1.fb_jnfo結構體
幀緩沖設備最關鍵的一個數據結構體是fb info結構體,其中包含了關于幀緩沖設備屬性和操作的完整描述,定義如下:本文引用地址:http://www.104case.com/article/202630.htm
限于篇幅,只列出了部分成員,其中fb_var_screeninfo記錄用戶可以修改的顯示控制器參數,包括屏幕分辨率和每個像素的比特數等;fb_fix_screeninfo記錄用戶不能修改的顯示控制器參數;cmap為目前的顏色表;fb_ops為幀緩沖操作函數集;screen_base為幀緩沖的虛擬基地址;i oremapped的虛擬內存大小;pseudo_palette為偽16色的顏色表。
3.1.2.fb_ops結構體
本結構體為指向底層操作的函數的指針,這些函數是需要驅動程序開發人員編寫填充的,部分成員定義如下
fb_check_var ()用于調整可變參數,并修整為硬件支持的值;fb_set_par()則根據屏幕參數設置具體讀寫LCD控制器的寄存器以使得LCD控制器進入相應的工作狀態,使用戶設置的屏幕參數在硬件上有效;f bsetcolreg ()成員函數實現偽顏色表和顏色表的填充。
3.1.3.fb_var_screeni nfo
本結構體定義了用戶可以修改的顯示控制器參數,部分成員如下:
本結構體中,xres為屏幕的水平像素數;yres為屏幕垂直寬度:bits_per_pixel定義每個像素由多少個位表示;pixclock定義了像素時鐘;left_margin是表示行切換中從同步到繪圖之間的延遲;right_margin表示行切換中從繪圖到同步之間的延遲;upper_margin表示幀切換中從同步到繪圖之間的延遲;lower_margin表示幀切換中從繪圖到同步之間的延遲;hsyn_len表示水平同步的長度;vsync_len表示垂直同步的長度。
3.2 Linux幀緩沖設備的模塊加載和卸載函數
由于LCD控制器被集成在SOC芯片上作為一個獨立的硬件模塊,也就是platform_device而存在,因此本驅動中包含平臺驅動。首先我們要定義platform_driver結構體:
定義了此結構體之后,在幀緩沖設備的模塊加載函數sep4020fb_init(void)中,我們只需要使用函數platform_driver_register(sep4020fb_driver)注冊平臺驅動,而其余大部分的初始化工作移交到平臺驅動的探測函數sep4020fb_probe中完成。
在函數sep4020fb_probe(struct platform_device*pdev)中,首先要申請SEP4020的幀緩沖信息結構體:structsep4020fb_info*info,在此結構體中,成員sep4020fb_ma c h_i n f o記錄了seP4020幀緩存的機器信息,sep4020fb_hw包含了sep4020微處理器LCD控制器所涉及到的所有寄存器的信息,screen_dma表示幀緩存的物理地址,而screen_cpu代表了幀緩存的虛擬地址。之后要為sep4020fb_mach_info申請內存空間,申請完畢之后就要初始化fb_info結構體中的固定和可變參數,即填充fb_var_screeninfo var和fb_fix_screeninfo fix成員。首先通過fb_info一>fbops=&sep4020fb_ops將為sep4020微處理器定義的函數操作結構體賦予幀緩存信息結構體中對應的成員,sep4020fb_ops定義了指向底層操作的一系列函數,本文將在后面詳細介紹;由于本課題選用的液晶屏為320×240TFT彩屏,所以fb_info->var.xres賦值為320,fb_info一>var.yres賦值為240,fb_info一>var.bits_per_pixel賦值為16,這樣就可以算出幀緩存的長度為320×240×16/8個字節,將此值賦給fbinfo->fix.smem_len成員。
評論