在寫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函式中找到了對它的賦值
intregister_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 st...
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的可變引數...