LCD驅動程式之層次分析與硬體原理

2021-07-26 17:39:44 字數 1742 閱讀 3586

核心中自帶的lcd驅動程式在drivers/video/fbmem.c,它是乙個抽象性的框架程式,並不是乙個具體的驅動,它依賴於底層的某個驅動程式提供註冊乙個fb_info結構體。

fb的意思是framebuffer.

首先假設,應用程式呼叫了open(「/dev/fb0」, …),主裝置號是29,次裝置號是0,經過層層呼叫,會呼叫到file_operations裡的open函式。在fb_open函式裡做了什麼呢?

先獲得了次裝置號:

int fbidx = iminor(inode);

然後以次裝置號為陣列的下標,得到了乙個結構體:

struct fb_info *info = registered_fb[0]

再假設,應用程式呼叫了read(),經過層層呼叫,會呼叫到file_operations裡的read函式,那麼在fb_open裡做了什麼呢?

int fbidx = iminor(inode);

struct fb_info *info = registered_fb[fbidx];

if (info->fbops->fb_read)

return info->fbops->fb_read(info, buf, count, ppos);

src = (u32

__iomem *) (info->screen_base + p);

dst = buffer;

*dst++ = fb_readl(src++);

copy_to_user(buf, buffer, c)

先得到了次裝置號,然後又從陣列裡得到了乙個結構體,如果這個結構體裡有read函式的話,則呼叫read函式,如果沒有則讀取現存基址的資料,然後把資料拷貝到使用者空間。

仔細比較下open和read,可以看到,裡面有乙個關鍵的結構體,這個結構體是從以次裝置號為下標的陣列registered_fb中取出來的。

可以看到,fbmen.c提供的是乙個抽象的東西,最終都得依賴於registered_fb這個陣列。那麼,registered_fb這個陣列在**被設定呢?是在register_framebuffer()中。

我們可以總結如何寫乙個lcd驅動程式:

1. 分配乙個fb_info結構體: framebuffer_alloc

2. 設定

3. 註冊: register_framebuffer

4. 硬體相關的操作

下面介紹一下硬體大致的原理。如下圖:

可以把lcd人為是乙個乙個畫素,每一行、每一列的數目都是固定的,在後面有乙個電子槍打出顏色到螢幕上,每次打乙個,然後向後移動。電子槍如何知道移動到下乙個畫素呢?顯然是有乙個時鐘vclk,每來乙個時鐘就向右移動乙個畫素,直到移動到一行的末尾。那如何換到下一行呢?自然是有乙個水平方向的同步訊號hsync,可以想像 出來,電子槍的路線是「z字型」。到了最後一行的最後乙個,如何跳回第一行第乙個呢?通過垂直方向的同步訊號vsync。顏色是從何而來的呢?lcd與lcd控制器之間有vd0~vd23(只用到一部分),顏色的rgb值就從控制器傳到lcd。lcd還有乙個顏色使能訊號vden,只有在這個訊號有效的時候顏色才會被打到螢幕上,否則電子槍只移動不噴色。那lcd控制器的顏色從何而來呢?自然是從視訊記憶體(framebuffer)得到,所以我們應該在sdram裡分配視訊記憶體,還要把視訊記憶體的位址告訴lcd控制器。

lcd驅動程式

ok6410lcd測試程式 1.在螢幕上分別顯示紅綠藍三個長方形 自定義結構體用來在使用者空間裡管理幀緩衝的資訊 typedef struct fd dev fb dev t 實現緩衝裝置的開啟和關閉操作的介面 int fb open fb dev t fbd,char fbn 獲取lcd的可變引數...

LCD驅動程式 框架分析(一)

在寫lcd驅動程式之前,我們必須先要明白lcd驅動程式編寫的框架,這點韋東山老師分析的相當詳細,讓我們來學習一下吧!首先從fbmem.c檔案開始。1 我們先找到入口函式 static int init fbmem init void return 0 2 接下來當然要看操作函式集 fb fops s...

LCD驅動程式 框架分析(一)

在寫lcd驅動程式之前,我們必須先要明白lcd驅動程式編寫的框架,這點韋東山老師分析的相當詳細,讓我們來學習一下吧!首先從fbmem.c檔案開始。1 我們先找到入口函式 static int init fbmem init void return 0 2 接下來當然要看操作函式集fb fops st...