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)