Linux LCD 驱动编写<一>

我们知道,字符设备编写可以分为以下几个步骤

1)确定主设备号major

2)构造file_operations  结构体fops

3)register_chrdev(major,name, fops)

4)入口函数

5)出口函数

那么LCD驱动也是字符设备驱动,肯定也会有这几个步骤,下面来看以下/drivers/video/fbmem.c

首先看入口函数fbmem_init()

1 register_chrdev(FB_MAJOR,"fb",&fb_fops) //FB_MAJOR:29

构成字符设备的主要要素都有了,下面主要来看file_operations  结构体fb_fops

 1 static const struct file_operations fb_fops = {
 2     .owner =    THIS_MODULE,
 3     .read =        fb_read,
 4     .write =    fb_write,
 5     .unlocked_ioctl = fb_ioctl,
 6     .mmap =        fb_mmap,
 7     .open =        fb_open,
 8     .release =    fb_release,
 9     ......
10 };

 

当用户空间打开lcd设备时,就会调用内核结构体file_operations的open函数,这里是fb_open函数

1 fb_open
2 {
3   int fbidx = iminor(inode);
4   struct fb_info *info;
5   info = registered_fb[fbidx];
   if (info->fbops->fb_open)
   res = info->fbops->fb_open(info,1);
6 }

可见,open函数以次设备号为下标从registered_fb数组里取得fb_info结构体,如果在我们的驱动程序里设置了open函数,那么就会调用我们的open函数;那么registered_fb是在哪里被设置的,经过查找发现是在register_framebuffer里设置的,而在我们写的驱动里就要包含register_framebuffer,总结一下自己写lcd驱动的步骤:

1)分配一个fb_info结构体

2)设置

3)硬件相关的操作

4)注册(register_framebuffer) 

 下面我们就开始自己开始写LCD驱动了(参照/drivers/video/s3c2410.c)

 

posted @ 2013-04-08 00:49  linux_rookie  阅读(524)  评论(0编辑  收藏  举报