嵌入式linux開發lcd設備驅動的學習

原文鏈接:https://blog.csdn.net/lee_jimmy/article/details/85919114

嵌入式系統中使用的linux OS的話,lcd的開發主要內容就是LCD設備驅動的移植,使用芯片SDK中現有的LCD框架做修改,在linux版本3.10之前沒有使用dts和這之後使用的dts,還是有些區別的。主要修改調試的地方如:平臺設備文件或者是dts節點內容,這需要根據具體使用的操作系統而定。以完成對LCD的驅動工作。

但是在這起之前還是有很多的基本概念需要清楚。

以下來自網絡。

FrameBuffer 的原理:在linux系統中中LCD這類設備稱爲幀緩衝設備,英文frameBuffer設備。

用戶可以將Framebuffer看成是顯示內存的一個映像,將其映射到進程地址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節。這些都是由Framebuffer設備驅動來完成的。

framebuffer的設備文件一般是 /dev/fb0、/dev/fb1 等,framebuffer最多支持32個設備。framebuffer是個字符設備,主設備號爲29,對應於/dev/fb%d設備文件。通常,使用如下方式(前面的數字表示次設備號)0 = /dev/fb0 第一個fb 設備1 = /dev/fb1 第二個fb 設備。 fb 也是一種普通的內存設備,可以讀寫其內容。例如,屏幕抓屏:cp /dev/fb0 myfilefb,注意,這個命令保存下來的僅是rgb數據,並不是圖片格式,Windown下是打不開的。

對程序員和Linux系統來是,framebuffer設備與其他的文件沒有區別,可以通過配置對framebuffer設備文件完成對硬件的參數設置,framebuffer映射可以通過read()和write()進行數據的讀取,或者通過mmap()函數將內部數據映射到應用程序空間,通過ioctl()可以獲得顯示設備的一些固定信息(比如顯示內存大小)、與顯示模式相關的可變信息(比如分辨率、象素結構、每掃描線的字節寬度),以及僞彩色模式下的調色板信息等等,用mmap()函數把內存中的圖像數據直接映射到framebuffer並顯示出來耗時短、效率高。

Framebuffer對應的源文件在linux/drivers/video/目錄下。總的抽象設備文件爲fbcon.c,在這個目錄下還有與各種顯卡驅動相關的源文件。幀緩衝(FrameBuffer)驅動程序主要依靠4個數據結構。這些結構定義在 include/linux/fb.h程序內。它們分別是fb_info、fb_var_screeninfo、fb_fix_screeninfo和 fb_monospecs。後3個結構可以在用戶空間訪問,結構 fb_info只能在內核空間訪問。其內部定義了struct fb_ops, 結構fb_ops成員就是由一系列Framebuffer 操作函數組成。下圖是Framebuffer的簡單層次圖。

 

核心層的代碼以fbmem.c爲主,核心層包括許多與具體硬件無關的代碼,並且提供了API給用戶空間。用戶空間使用系統調用,系統調用會使用相應的API函數,最後會調用驅動層實現功能。對於不同的設備,驅動層的代碼將有所不同。

幀緩衝設備驅動有固定編程框架,首先定義一個幀緩衝結構,第二,填充這個結構,第三使用核心層提供註冊函數註冊這個結構,這樣完成幀緩衝設備驅動的編寫。


芯片LCD的硬件資源的分析,以s3c2440爲例:

數據手冊中描述S3C2440內部的LCD控制器:

  1. LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器組成;
  2. REGBANK由17個可編程的寄存器組和一塊256*16的調色板內存組成,它們用來配置LCD控制器的;
  3. LCDCDMA是一個專用的DMA,它能自動地把在偵內存中的視頻數據傳送到LCD驅動器,通過使用這個DMA通道,視頻數據在不需要CPU的干預的情況下顯示在LCD屏上;
  4. VIDPRCS接收來自LCDCDMA的數據,將數據轉換爲合適的數據格式,比如說4/8位單掃,4位雙掃顯示模式,然後通過數據端口VD[23:0]傳送視頻數據到LCD驅動器;
  5. TIMEGEN由可編程的邏輯組成,他生成LCD驅動器需要的控制信號,比如VSYNC、HSYNC、VCLK和LEND等等,而這些控制信號又與REGBANK寄存器組中的LCDCON1/2/3/4/5的配置密切相關,通過不同的配置,TIMEGEN就能產生這些信號的不同形態,從而支持不同的LCD驅動器(即不同的STN/TFT屏)。框圖上控制器引出了很多線:數據線,控制線。這些接口占用的是GPC,GPD,這一點可以從數據手冊第9章,GPIO章節中看到(也就是第276頁第277頁)。

lcd工作時序參數分析

要驅動一個TFT屏,首先我們得先認識一下LCD控制器的工作時序。

LCD提供的外部接口信號說明:

VSYNC :垂直同步信號(TFT)/幀同步信號(STN) ;

HSYNC :水平同步信號(TFT)/行同步脈衝信號(STN) ;

VCLK :象素時鐘信號(TFT/STN) ;

VD[23:0]:LCD像素數據輸出端口(TFT/STN  );

VDEN :數據使能信號(TFT)/LCD驅動交流偏置信號(STN)/SEC TFT 信號;

LEND :行結束信號(TFT)/SEC TFT信號;

上面時序圖上各時鐘延時參數的含義如下:(這些參數的值,LCD產生廠商會提供相應的數據手冊)

VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以後的無效的行數,對應驅動中的upper_margin;

VFBD(vertical front porch):表示在一幀圖像結束後,垂直同步信號以前的無效的行數,對應驅動中的lower_margin;

VSPW(vertical sync pulse width):表示垂直同步脈衝的寬度,用行數計算,對應驅動中的vsync_len;

HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數據開始之間的VCLK的個數,對應驅動中的left_margin;

HFPD(horizontal front porth):表示一行的有效數據結束到下一個水平同步信號開始之間的VCLK的個數,對應驅動中的right_margin;

HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算,對應驅動中的hsync_len;

對於以上這些參數的值將分別保存到REGBANK寄存器組中的LCDCON1/2/3/4/5寄存器中:(對寄存器的操作請查看S3c2440數據手冊LCD部分)

LCDCON1:17 - 8位CLKVAL

         6 - 5位掃描模式(對於STN屏:4位單/雙掃、8位單掃)

         4 - 1位色位模式(1BPP、8BPP、16BPP等)

LCDCON2:31 - 24位VBPD

         23 - 14位LINEVAL

         13 - 6位VFPD

         5 - 0位VSPW

LCDCON3:25 - 19位HBPD

         18 - 8位HOZVAL

         7 - 0位HFPD

LCDCON4:7 - 0位HSPW

LCDCON5:主要是配置以上信號的極性以及像素時鐘的採樣邊沿的,這些參數要用s3c2440的時序和所使用的屏時序圖進行對比。比如mini2440以前使用過一個屏TopPoly-TD035STED4,它的時序圖如下:

這個圖和s3c2440的lcd控制器正常時序圖相比,可以發現VSYNC,HSYNC信號極性是相反的,VDEN信號是相同的,像素時鐘採樣時刻是上升沿。所以LCDCON5相應位就要配置爲反轉功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章