Framebuffer/LCD框架

本文探讨了mmap系统调用及其在Linux内核中的实现流程,并深入分析了LCD架构,包括关键数据结构如fb_var_screeninfo、fb_fix_screeninfo和fb_info的作用,以及LCD控制器驱动的具体实现细节。


fb数据结构

fb.h中一些主要的数据结构

struct fb_info {
	struct fb_var_screeninfo var;	/* Current var */
	struct fb_fix_screeninfo fix;	/* Current fix */

	struct fb_pixmap pixmap;	/* Image hardware mapper */
	struct fb_pixmap sprite;	/* Cursor hardware mapper */
	struct fb_cmap cmap;		/* Current cmap */

	struct fb_ops *fbops;

    union
    	char __iomem *screen_base;	/* Virtual address */
	};
}

struct fb_info 结构体:包含当前显示卡的所有状态信息

struct fb_var_screeninfo结构体:描述了一种显示模式的所有信息,如宽、高、颜色深度等,不同显示模式对应不同的信息,通常是被用户设置

struct fb_fix_screeninfo结构体:定义了显卡信息,如framebuffer内存的起始地址,地址的长度,图形卡的硬件特性,是不能改变的.

struct fb_cmap结构体:用来定义帧缓存区设备的颜色表(colormap)信息, 可以通过ioctl()函数的FBIOGETCMAP和FBIOPUTCMAP命令来设置colormap

struct fb_ops结构体:应用程序使用这些函数操作底层的LCD硬件,fb_ops结构中定义的方法用于支持这些操作

screen_base: IO设备显存经过ioremap后的虚拟地址或者分配的物理内存(充当临时显存)所表示的虚拟地址.

fbmem公共层


公共层级(fbmem.c)
register_chrdev(FB_MAJOR,"fb",&fb_fops)为控制器驱动提供统一的调用接口, 设备号FB_MAJOR为29.

ret = register_chrdev(FB_MAJOR, "fb", &fb_fops);

fb_class = class_create(THIS_MODULE, "graphics");

 提供register_framebuffer函数来给设备控制器使用

int register_framebuffer(struct fb_info *fb_info)
{
	fb_info->dev = device_create(fb_class, fb_info->device, MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
}

公共层级open/write函数简单如下

open( )
fb_open()
{
    int fbidx = iminor(inode);
    struct fb_info *info;
    info = registered_fb[fbidx]; 
   
    if (info->fbops->fb_open)
        res = info->fbops->fb_open //控制器驱动ops回调函数
}

write()
fb_write()
{
    struct fb_info *info = file_fb_info(file);
    dst = (u8 __iomem *) (info->screen_base + p);    //framebuffer地址
    fb_memcpy_tofb(dst, src, c);
}

控制器驱动层


LCD控制器驱动以s3c-fb.c为例采用平台总线形式直接分析.probe = s3c_fb_probe函数

s3c_fb_probe
s3c_fb_probe_win
static int  s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
          struct s3c_fb_win_variant *variant,
          struct s3c_fb_win **res)
{
    fbinfo = framebuffer_alloc(sizeof(struct s3c_fb_win) + palette_size * sizeof(u32), sfb->dev);
          
    s3c_fb_alloc_memory(sfb, win);  /*fbi->screen_base初始化*/
      
    fbinfo->fbops = &s3c_fb_ops;  /*为fbinfo->fbops 赋值, s3c_fb_ops属于控制器操作方法*/
      
    /* create initial colour map */
    ret = fb_alloc_cmap(&fbinfo->cmap, win->variant.palette_sz, 1);
    if (ret == 0)
        fb_set_cmap(&fbinfo->cmap, fbinfo);
     
    s3c_fb_set_par(fbinfo);  /*初始化fb_fix_screeninfo*/
      
    ret = register_framebuffer(fbinfo); 
}  
   
static int  s3c_fb_alloc_memory(struct s3c_fb *sfb, struct s3c_fb_win *win)   
{
    /*Virtual address 帧缓存虚拟地址*/
    fbi->screen_base = dma_alloc_writecombine(sfb->dev, size,&map_dma, GFP_KERNEL);
    memset(fbi->screen_base, 0x0, size);

    fbi->fix.smem_start = map_dma; /*Start of frame buffer mem (physical address)*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值