Linux FrameBuffer分析

2022-05-08 15:46:19 浏览数 (1)

代码语言: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自身的电源

*/

0 人点赞