代码语言:javascript复制
/* framebuffer分析 */
/* framebuffer初始化 */
static int __init fbmem_init(void)
{
proc_create("fb", 0, NULL, &fb_proc_fops);
//注册主设备号29, 次设备号为0的字符设备
if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devsn", FB_MAJOR);
//创建class。 既然创建class, 那就需要创建class_devcie。可是没有, 那一定在那里创建呢?
fb_class = class_create(THIS_MODULE, "graphics");
if (IS_ERR(fb_class)) {
printk(KERN_WARNING "Unable to create fb class; errno = %ldn", PTR_ERR(fb_class));
fb_class = NULL;
}
return 0;
}
/* 当应用程序调用open函数,就调用fb_open函数 */
static int fb_open(struct inode *inode, struct file *file)
{
int fbidx = iminor(inode); //获取次设备号
struct fb_info *info;
int res = 0;
info = get_fb_info(fbidx); //根据次设备号获取fb_info结构
file->private_data = info;
if (info->fbops->fb_open) {
res = info->fbops->fb_open(info,1);
if (res)
module_put(info->fbops->owner);
}
return res;
}
//根据次设备号获取fb_info结构
static struct fb_info *get_fb_info(unsigned int idx)
{
fb_info = registered_fb[idx];
return fb_info;
}
/* 那 registered_fb 结构是从那里获得的?*/
//注册frame_buffer。
int register_framebuffer(struct fb_info *fb_info)
{
ret = do_register_framebuffer(fb_info);
}
static int do_register_framebuffer(struct fb_info *fb_info)
{
//查找空闲的fb_info
for (i = 0 ; i < FB_MAX; i )
if (!registered_fb[i])
break;
registered_fb[i] = fb_info;
}
/*把传进来的fb_info放如到registered_fb数组中。 在get_fb_info用到了。
可见当我们注册fb_info结构时, 就会将注册的fb_info放到registered_fb中
*/
/*那如何写LCD驱动程序呢?
1: 分配一个fb_info结构
framebuffer_alloc()函数
2: 设置fb_info结构
2.1 设置不变的参数: fb_info->fix
2.2 设置可变的参数: fb_info->var
2.3 设置fbops: fb_info->fbops
2.4 设置调色板: fb_info->pseudo_palette
3: 注册fb_info结构
register_framebuffer()函数
4: 硬件相关的初始化
4.1 初始化IO端口用作LCD
4.2 初始化LCDCON1-5
4.3 初始化framebuffer。 并把framebuffer的基地址告诉LCD控制器
4.4 使能LCD。包括背光,LCD控制器, LCD自身的电源
*/