框架概述
在开始学习LCD驱动程序前先了解下什么是frame buffer. frame buffer即帧缓冲,是一种独立于硬件的抽象图形设备,它使得应用程序可以通过一组定义良好的接口访问各类图形设备,不需要了解底层硬件细节.从用户观点看,frame buffer设备与/dev目录下其他设备没有区别,通过/dev/fb*设备文件来访它.frame buffer属于"普通的"内存设备,只不过它的内存是显卡专用的内存.应用程序可以直接更改frame buffer内存中的数据,效果立即显示在显示器.
帧缓冲设备驱动的程序结构
例如当用户空间的应用程序打开设备时,最终会调用fb_open();
static int fb_open(struct inode *inode, struct file *file)
{
...
int fbidx = iminor(inode); //获取次设备号
...
struct fb_info *info = = registered_fb[fbidx]; //以次设备号为下标找到对应的fb_info结构体
...
if (info->fbops->fb_read) //判断是否存在
res = info->fbops->fb_open(info,1); //打开对应设备的open();
...
}
其中register_fb[]
的定义struct fb_info *registered_fb[FB_MAX];
其存放的是各个LCD驱动的信息。而它的内容在register_framebuffer();
中填充:
int register_framebuffer(struct fb_info *fb_info)
{
...
for (i = 0 ; i < FB_MAX; i++)
if (!registered_fb[i]) //分配次设备号
break;
...
fb_info->dev = device_create(fb_class, fb_info->device,
MKDEV(FB_MAJOR, i), "fb%d", i); //使用上面得到的次设备号创建设备节点
...
/* 构造fb_info结构体 */
registered_fb[i] = fb_info;
...
}
平台驱动的注册
由于LCD控制器经常被集成在SoC上作为一个独立的硬件模块(成为platform device),因此,LCD驱动中也经常包含平台驱动,这样,在帧缓冲设备驱动的模块加载函数中完成的工作只是注册平台驱动,而fb_info结构体的初始化、LCD控制器硬件的初始化、申请帧缓冲设备的显示缓冲区空间和注册帧缓冲设备的工作则移交到平台驱动的探测函数中完成。
以drivers\video\s3c2410fb.c
为例:
int __devinit s3c2410fb_init(void)
{
return platform_driver_register(&s3c2410fb_driver);
}
probe()
函数如下:
static int __init s3c2410fb_probe(struct platform_device *pdev)
{
struct s3c2410fb_info *info;
struct fb_info *fbinfo;
...
fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), &pdev->dev);
info = fbinfo->par;
info->fb = fbinfo;
info->dev = &pdev->dev;
...
strcpy(fbinfo->fix.id, driver_name);
memcpy(&info->regs, &mach_info->regs, sizeof(info->regs));
...
/* 初始化fb_info结构体中的固定和可变的参数 */
/* 硬件相关的操作,设置中断,LCD时钟频率,显存地址, 配置引脚 */
...
/* Initialize video memory */
ret = s3c2410fb_map_video_memory(info);
ret = register_framebuffer(fbinfo); //注册fb_info结构体
...
/* create device files */
device_create_file(&pdev->dev, &dev_attr_debug);
printk(KERN_INFO "fb%d: %s frame buffer device\n",
fbinfo->node, fbinfo->fix.id);
...
}
平台驱动完成的工作
1. 申请fb_info结构体内存空间,初始化fb_info结构体中var、fix参数
2. 根据具体LCD屏幕特点,完成LCD控制器硬件的初始化
3. 申请帧缓冲设备的显示缓冲区空间
4. 注册帧缓冲设备
平台设备的注册
上面的xxxfb.c文件注册的是平台驱动,而其对应的平台设备在arch\arm\mach-s3c2410\mach-smdk2410.c
中注册,其所用到的硬件资源在arch\arm\plat-s3c24xx\devs.c
中定义。这三个文件的关系如下图: