分类: LINUX
2012-07-06 15:05:59
在基本的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就可以移植成功了,当然,上述只是简单地描述了一下移植的步骤,具体细节没有展开。