1. 怎么编写字符设备驱动程序
本文参考百问网驱动大全
- 主设备号
- 构造 file_operations 结构体,填充 open/read/write 等成员函数
- 注册驱动:register_chrdev(major, name, &fops)
- 入口函数
- 出口函数
2. Framebuffer 驱动程序框架
分为上下两层:
- fbmem.c:承上启下
- 实现、注册 file_operations 结构体
- 把 APP 的调用向下转发到具体的硬件驱动程序
- xxx_fb.c:硬件相关的驱动程序
- 实现、注册 fb_info 结构体
- 实现硬件操作
调用关系:
例子1: app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0 -------------------------------------------------------------- kernel: fb_open int fbidx = iminor(inode); struct fb_info *info = = registered_fb[0]; 例子2: app: read() --------------------------------------------------------------- kernel: fb_read int fbidx = iminor(inode); struct fb_info *info = registered_fb[fbidx]; if (info->fbops->fb_read) return info->fbops->fb_read(info, buf, count, ppos); src = (u32 __iomem *) (info->screen_base + p); dst = buffer; *dst++ = fb_readl(src++); copy_to_user(buf, buffer, c)
3. 怎么编写 Framebuffer 驱动程序
核心结构体:
- 分配 fb_info
- framebuffer_alloc
- 设置 fb_info
- var
- fbops
- 硬件相关操作
- 注册 fb_info
- register_framebuffer
4. 阅读源码
阅读 Android 和 Linux kernel 源码: