基于SEP4O2O的Linux frame buffer驅動設計
完成可變參數和固定參數的填充之后,要為本驅動申請中斷資源,具體函數為requestirq(irq,sep4020fb_irq,SA INTERRUPT,pdev一>name,info),irq為請求的中斷號,sep4020fb_irq為中斷處理服務子程序,SA_INTERRUPT表示為一個快速中斷處理,在執行中斷的過程中禁止所有在當前處理器上的其他中斷。申請中斷完畢之后,就要完成本驅動關鍵步驟,調用sep4020fb_map_video_memory()函數申請顯示緩沖區。在該函數中,首先調用PAGE_ALIGN()函數對齊申請的緩沖區的大小,使即將申請的顯示緩沖區大小為頁的整數倍;然后調用函數dma_all oc_writecombine(fbi->dev,fbi一>map_size,&fbi一>map_dma,GFP_KERNEL), 分配一塊寫合并的內存區域作為幀緩存,函數返回值為申請的幀緩存的起始位置的虛擬地址,fbi一>map_dma代表的是該位置的物理地址,fbi一>map_si ze為此內存區的大小。
完成上面的工作之后,驅動程序在就有了一塊內存區域作為幀緩沖,向此區域寫入數據就能顯示在液晶屏上。后面還要調用sep4020fb_init_registers(info)函數初始化L C D控制器的寄存器;然后調用sep4020fb_check_var(&fbinfo一>var,fbinfo)檢查可變參數,最后調用register_framebuffer(fbinfo)注冊幀緩沖設備。
3.3 提供給應用程序的接口
本驅動設計定義了如下幾個接口供應用程序調用:fb_ioctl,fb_blank,fb_fillrect.
部分代碼如下:本文引用地址:http://www.104case.com/article/202630.htm
sep4020_blank函數主要實現了將液晶屏清屏的功能。
sep4020fb_fillrect函數實現了填充液晶屏一塊矩形區域的功能。
sep4020fb_ioctl函數則為上層應用提供了更多的功能,部分可供上層調用的命令如下:
FBIOGET_VSCREENINFO表示用戶獲取屏幕的可變參數;
FBIOPUT_VSCREENINFO表示用戶設置可變的屏幕參數;
FBIOGET_FSCREENINFO表示用戶獲得屏幕的固定參數;
FBIOBLANK表示調用sep4020fb_blank函數清空液晶屏;
FBIOPUTCMAP表示設置屏幕的顏色表;
FBIOGETCMAP表示獲得顏色表。
3.4 用戶空間對幀緩沖設備進行訪問
驅動程序經過編譯并加載為模塊后,成為/dev/fb0設備,在應用程序中,操作/dev/fb0一般遵循如下步驟:1)打開/dev/fb0設備文件;2)調用ioctl()操作取得屏幕的參數,如屏幕分辨率和每個像素所占的比特數,進而計算出顯示緩沖區的大小;3)將屏幕緩沖區映射到用戶空間;4)映射之后就可以向緩沖區寫入或者讀出數據,進行繪圖了。
4 測試與結論
根據前面論述的步驟向屏幕緩沖區寫入數據,將每個像素的值設為0xF0F0,在屏幕上顯示如下圖像:
測試結果顯示,在本課題驅動模塊的支持下,可以向屏幕緩沖區寫入數據并正確地在屏幕上顯示出來,工作完全正常。本文所提出的設計方案已經應用在本單位某產品上。
評論