1、 LCD驱动内核框架:
lcd驱动的核心层文件:/driver/vedio/fbmem.c, 提供了对LCD的所有抽象操作。
在这个文件的入口函数里面:register_chrdev(29,"fb",&fb_fops)。ls /dev/fb*时,可以知道主设备号就是29。因此,当我们调用open/read/write函数时,实际上会调用到这里的fb_fops里面的open/read/write。
2、app应用程序的访问lcd设备的流程:
app: open("/dev/fb0",...) 主设备号: 29, 次设备号: 0
--------------------------------------------------------------
kernel:
fb_open
int fbidx = iminor(inode);
struct fb_info *info = = registered_fb[0];
app: read()
---------------------------------------------------------------
kernel:
fb_read
intfbidx = iminor(inode);
struct fb_info *info = registered_fb[fbidx];
if(info->fbops->fb_read)
returninfo->fbops->fb_read(info, buf, count, ppos);
从上面的访问流程可以知道,当app访问一个lcd设备的时候,会根据次设备号,找到一个struct fb_info类型的变量,并调用该变量的成员。
3、lcd驱动程序的编写
(1)注册核心结构体fb_info static structfb_info *s3c_lcd = framebuffer_alloc(0,NULL);
(2)设置成员:设置固定参数(fb_fix_screeninfo)//参考内核源码
(3)设置成员:设置可变参数(fb_var_screeninfo)//参考内核源码
(4)硬件相关操作(主要是struct file_operations fb_fops) //参考内核源码
(5) 注册 register_framebuffer(s3c_lcd) :会把 s3c_lcd 放到 registered_fb[minor] ,然后创建设备节点,次设备号为 minor