Android圖形系統的分析與移植--七、雙緩衝framebuffer的實現
1 實現原理
在基本的FrameBuffer已經實現的基礎上,需要實現的是與Android原本模擬器所使用的goldfish FrameBuffer之間的區別。比較一下不難發現,從以下及方面著手:
1. 修改初始化FrameBuffer資訊;
2. 分配FrameBuffer記憶體
3. 實現雙緩衝操作函式
下面簡單介紹一下實現過程。
2 初始化FrameBuffer資訊
FrameBuffer資訊主要儲存在fb_info這個資料結構中,修改如下:
struct fb_info*fbinfo;
...
fbinfo->fix.ypanstep = 1;
fbinfo->var.yres_virtual = gm->lcd.yres * 2;
fbinfo->fix.smem_len = (gm->lcd.xres*gm->lcd.yres *gm->lcd.bpp / 8) * 2;
3 分配FrameBuffer記憶體
記憶體大小控制主要mvfb_info這個資料結構中,修改如下:
struct mvfb_info*fbi;
...
fbi->map_size= PAGE_ALIGN(fbi->fb->fix.smem_len + PAGE_SIZE);
fbi->map_cpu =dma_alloc_writecombine(fbi->dev, fbi->map_size,
&fbi->map_dma, GFP_KERNEL);
4 實現雙緩衝操作函式fb_pan_display
首先,實現雙緩衝操作函式:
static intmvfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fb)
{
...
}
FrameBuffer所有的操作函式都儲存在fb_ops資料結構中,所以,將上述操作函式新增到此資料結構中:
static structfb_ops mvfb_ops = {
.owner =THIS_MODULE,
.fb_check_var = mvfb_check_var,
.fb_set_par = mvfb_set_par,
.fb_setcolreg = mvfb_setcolreg,
.fb_blank = mvfb_blank,
.fb_pan_display = mvfb_pan_display,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
.fb_mmap = mvfb_mmap,
};
經過以上四步,雙緩衝FrameBuffer就可以移植成功了,當然,上述只是簡單地描述了一下移植的步驟,具體細節沒有展開。