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

2021-08-04 12:39:51 字數 2714 閱讀 5413

**

在寫lcd驅動程式之前,我們必須先要明白lcd驅動程式編寫的框架,這點韋東山老師分析的相當詳細,讓我們來學習一下吧!首先從fbmem.c檔案開始。

(1)我們先找到入口函式:

static int __init fbmem_init(void)

return 0; }

(2)接下來當然要看操作函式集fb_fops

static const struct file_operations fb_fops = ;

我們選兩個來分析:open和read

首先是open函式:

static int 

fb_open(struct inode *inode, struct file *file)

__acquires(&info->lock)

__releases(&info->lock)

file->private_data = info;

if (info->fbops->fb_open)//

如果在在幀緩衝區操作函式集裡定義了open函式,就會呼叫open函式,否則就算了

#ifdef config_fb_deferred_io

if (info->fbdefio)

fb_deferred_io_open(info, inode, file);

#endif

out:

mutex_unlock(&info->lock);

return res; }

接下來我們看看read函式

static ssize_t

fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)

if (copy_to_user(buf, buffer, c))//

將buffer中的資料拷貝到使用者空間,這樣在使用者空間呼叫read函式時就把視訊記憶體內容讀出來了

*ppos += c;

buf += c;

cnt += c;

count -= c; }

kfree(buffer);

return (err) ? err : cnt; }

注釋1:registered_fb這個東東**來的呢?我們收索了一下,並在本檔案的register_framebuffer函式中找到了對它的賦值

int

register_framebuffer(struct fb_info *fb_info)

else

fb_init_device(fb_info);

if (fb_info->pixmap.addr == null) }

fb_info->pixmap.offset = 0;

if (!fb_info->pixmap.blit_x)

fb_info->pixmap.blit_x = ~(u32)0;

if (!fb_info->pixmap.blit_y)

fb_info->pixmap.blit_y = ~(u32)0;

if (!fb_info->modelist.prev || !fb_info->modelist.next)

init_list_head(&fb_info->modelist);

fb_var_to_videomode(&mode, &fb_info->var);

fb_add_videomode(&mode, &fb_info->modelist);

registered_fb[i] = fb_info;//我們在這裡找到了它

event.info = fb_info;

fb_notifier_call_chain(fb_event_fb_registered, &event);

return 0; }

結合之前的知識我們就可以將整個框架大致搭建起來了,我們在驅動程式中呼叫register_framebuffer(struct fb_info *fb_info)這個函式,並將幀緩衝裝置描述結構體struct fb_info *fb_info傳遞了進來,在這個結構體裡就定義了幀緩衝操作函式集,以及各種跟硬體相關的東西。現在我們就清楚了

registered_fb這個陣列只是起到了乙個中間變數的作用,在註冊函式中將

struct fb_info結構體存進去,然後在操作函式中再取出來。

(3)現在框架就搭建起來了,不過為了進一步理解,我們在核心裡檢視一下有哪些檔案呼叫了register_framebuffer(struct fb_info *fb_info),並適當分析其各種硬體相關設定。其實我們搜尋到的這些檔案就是我們編寫驅動程式應當編寫的東西,下面我們以/driver/video/arcfb.c來分析一下:

platform_driver_register(&arcfb_driver);

int __init arcfb_probe(struct platform_device *dev)

register_framebuffer(info);

//struct fb_info *info;這個結構體裡有各種東東的,包括file_operations結構體,註冊前已經設定了

這樣一註冊的話,fb_info 裡設定的東東就都傳過去了,核心就可以呼叫我們自己寫的東東了。

我們稍微總結一下驅動程式的流程:

分配fb_info

設定註冊

硬體相關設定

關於驅動程式的編寫我們在接下來程式中會涉及。

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

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

LCD驅動程式(一)

lcd顯示原理 在jz2440上,想要讓lcd顯示,需要幾個部分1 lcd硬體 2 開發板上的lcd控制器 3 sdram記憶體存放資料frambuffer 4 可能還需要乙個調色盤 實際上是一塊記憶體,裡面資料可以組成各種顏色 顯示原理 在開發板上操作lcd控制器,使得開發板向sdram記憶體裡去...

lcd驅動程式

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