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

被折叠的 条评论
为什么被折叠?



