當前位置:編程學習大全網 - 編程語言 - 6. Linux-LCD 驅動程序概述

6. Linux-LCD 驅動程序概述

入局:應用程序是如何操控LCD顯示器的?

? 我們知道應用程序的調用接口,無非 open/read/write ...然後通過驅動程序最終作用到硬件設備上。以字符設備為例,對於驅動的開發者,實現了應用程序調用的驅動層中與之相匹配的 drv_open/drv_read/drv_write 函數,為應用層序提供了操作實際硬件設備的通道。那麽,對於LCD驅動程序又是如何?先來了解下兩個非常重要的概念。

? LCD控制器的功能是控制驅動信號,進而驅動LCD。用戶只需要通過讀寫壹系列的寄存器,完成配置和顯示驅動。在驅動LCD設計的過程中首要的是配置LCD控制器,而在配置LCD控制器中最重要的壹步則是幀緩沖區(Frame Buffer)的指定。用戶所要顯示的內容皆是從緩沖區中讀出,從而顯示到屏幕上的。幀緩沖區的大小由屏幕的分辨率和顯示色彩數決定。驅動幀緩沖的實現是整個驅動開發過程的重點。

? 幀緩沖區是出現在Linux 2.2.xx及以後版本內核當中的壹種驅動程序接口,這種接口將顯示設備抽象為幀緩沖區設備區。幀緩沖區為圖像硬件設備提供了壹種抽象化處理,它代表了壹些視頻硬件設備,允許應用軟件通過定義明確的界面來訪問圖像硬件設備。這樣軟件無須了解任何涉及硬件底層驅動的東西(如硬件寄存器)。它允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫和I/O控制等操作。通過專門的設備節點可對該設備進行訪問,如/dev/fb*。用戶可以將它看成是顯示內存的壹個映像,將其映射到進程地址空間之後,就可以進行讀寫操作,而讀寫操作可以反映到LCD。

? 幀緩沖(Frame Buffer)是Linux為顯示設備提供的壹個接口,把顯存抽象後的壹種設備,允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。用戶不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由Frame Buffer設備驅動來完成的。幀緩沖設備屬於字符設備。

? Linux系統Frame Buffer本質上只是提供了對圖形設備的硬件抽象,在開發者看來,Frame Buffer是壹塊顯示緩存,向顯示緩存中寫入特定格式的數據就意味著向屏幕輸出內容。

由於有了frambuffer的抽象,使得應用程序通過定義好的接口就可以訪問硬件。所以應用程序不需要考慮底層的(寄存器級)的操作。應用程序對設備文件的訪問壹般在/dev目錄,如 /dev/fb*。

內核中的frambuffer在: drivers/video/fbmem.c (fb: frame buffer)

(1) 創建字符設備"fb", FB_MAJOR=29,主設備號為29。

(2)創建類,但並沒有創建設備節點,因為需要註冊了LCD驅動後,才會有設備節點;

2.1 fb_open函數如下:

(1) registered_fb[fbidx] 這個數組也是fb_info結構體,其中fbidx等於次設備號id,顯然這個數組就是保存我們各個lcd驅動的信息;

2.2 fb_read函數如下:

從.open和.read函數中可以發現,都依賴於fb_info幀緩沖信息結構體,它從registered_fb[fbidx]數組中得到,這個數組保存我們各個lcd驅動的信息。由此可見,fbmem.c提供的都是些抽象出來的東西,最終都得依賴registered_fb這個數組。

這個register_framebuffer()除了註冊fb_info,還創建了設備節點。

以s3c2410fb.c為例,分析驅動的實現。

既然是總線設備驅動模型,那我們關心的是它的probe函數。

看到這裏驅動的寫法也大致清晰:

附:

LCD的顯示過程與時序:

? 1.顯示從屏幕左上角第壹行的第壹個點開始,壹個點壹個點地在LCD上顯示,點與點之間的時間間隔為VCLK(像素時鐘信號);當顯示到屏幕的最右邊就結束這壹行(Line),這壹行的顯示對應時序圖上的HSYNC(水平同步信號)

? 2. 接下來顯示指針又回到屏幕的左邊從第二行開始顯示,顯示指針針在從第壹行的右邊回到第二行的左邊是需要壹定的時間的,我們稱之為行切換。

? 3. 以此類推,顯示指針就這樣壹行壹行的顯示至矩形的右下角才把壹幅圖像(幀:frame)顯示完成,這壹幀的顯示時間在時序圖上表示為VSYNC(垂直同步信號)。

參考:

/a/hongdy.org/www/linux/kernel/lcddriver

  • 上一篇:如何在EXCL中不同的單元格中加入相同的字母
  • 下一篇:如何在WP8上搭建cocos2d-x的遊戲開發環境
  • copyright 2024編程學習大全網