2/21/2011

LCD Driver (3)

剛仔細看了probe的程式...發現LCD Driver在probe所做的事情真的很多...雖然都只是初始化而己

但很多預備工作少不了,而且所需要的相關知職更多....

在上述的fb_info部份成員填進去之後,開始分配記憶體空間了:

/* Map registers.*/
fbi->reg_base = ioremap_nocache(res->start, res->end - res->start);
if (fbi->reg_base == NULL) {
ret = -ENOMEM;
goto failed;
}

/* Allocate framebuffer memory.*/
fbi->fb_size = PAGE_ALIGN(DEFAULT_FB_SIZE);
fbi->fb_start = dma_alloc_writecombine(fbi->dev, fbi->fb_size + PAGE_SIZE,
&fbi->fb_start_dma,
GFP_KERNEL);
if (fbi->fb_start == NULL) {
ret = -ENOMEM;
goto failed;
}

ioremap_nocache和dma,相信這兩個名詞很多人相當熟悉...鑑於我的腦袋...還是把僅存的己知寫上去 XD

首先講敘ioremap_cache是怎麼回事,它的原型是長這樣 :

static inline void __iomem * ioremap_nocache(unsigned long offset,
unsigned long size)
{
return ioremap(offset, size);
}

傳的參數非常簡單,就是取得之前platform的resource的實體io/memory等相關資源之後,再利用ioremap來轉換成核心虛擬記憶體

那為什麼一定要轉成核心虛擬記憶體勒 ? 有個觀念要僅記....任何device的driver,都不可以直接存取實體記憶體 !

分配好對應硬體資源的虛擬記憶體之後,接著就是分配DMA的空間(即顯卡記憶體),其中的DEFAULT_FB_SIZE定義如下 :

/* default fb buffer size VGA-32bits double buffer */
#define DEFAULT_FB_SIZE (640 * 480 * 8 + PAGE_SIZE)

本來我認為FB的SIZE應該是要跟自身定義的解析度有關,這樣才合理

也就是說,video_mode是定義800*480,應該修改成一樣才對....但結果好像不是...很怪

而且查了之前的案子,發現之前的LCD屏幕使用的是HX8369-A

Datasheet裡面有寫,Frame memory area是480*864*24 , 當然這裡指的是最高支持的解析程度..

但如果是我的話...FB SIZE應該要定義最高的解析程度吧.....這樣才能都適用呀... XD

先來看一個很重要的資料結構,在上面分配完之後,有一個function pointer放進fb_info :

info->fbops = &pxa950fb_gfx_ops;


static struct fb_ops pxa950fb_gfx_ops = {
.owner = THIS_MODULE,
.fb_blank = pxa950fb_gfx_blank,
.fb_ioctl = pxa950fb_gfx_ioctl,
.fb_check_var = pxa950fb_check_var,
.fb_set_par = pxa950fb_set_par,
.fb_setcolreg = pxa950fb_setcolreg, /* TODO */
.fb_pan_display = pxa950fb_pan_display,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
};

很眼熟吧 ? 它就是LCD驅動提供給上層設備調用的操作函數,至於這誰會調用,等把整個流程理清之後,後面開始說明重要的資料結構和大體架構.

最後,有三個重要的function來結束整個主要驅動註冊和初始化過程 :

pxa950fb_set_par(info);


register_framebuffer(info);


device_create_file(&pdev->dev, &dev_attr_vsync);

pxa950fb_set_par主要是設置BPP(Bit Per Pixel)屬性和計算Line(行)的長度,而register_framebuffer和device_create_file就很簡單理解了

FrameBuffer真的要能工作起來,這個註冊function不能少,屆時另開章節來講LCD架構和資料結構的說明..

在公司的板子和新的Datasheet來之前,要趕快搞清楚這些東西...不然還真不好porting......

No comments:

Post a Comment