您的位置:首页 > 运维架构 > Linux

5、linux下LCD驱动

2015-06-12 16:15 375 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: