6410之LCD驱动程序(层次分析)
来源:互联网 发布:linux系统环境变量设置 编辑:程序博客网 时间:2024/06/06 03:59
LCD的核心层:
Fbmem.c (drivers\video)
static int __initfbmem_init(void){proc_create("fb", 0, NULL, &fb_proc_fops);if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) //注册了名字为fb的字符设备,相关操作为fb_fopsprintk("unable to get major %d for fb devs\n", FB_MAJOR);fb_class = class_create(THIS_MODULE, "graphics");//创建了一个名字为graphics的类if (IS_ERR(fb_class)) {printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));fb_class = NULL;}return 0;}fb_fops为上层app提供了open,read,write,mmap,ioctrl的相关操作:
open操作:
app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0
--------------------------------------------------------------
kernel:
fb_open
int fbidx = iminor(inode);
struct fb_info *info = = registered_fb[0]; // registered_fb很重要,从registered_fb数组中获取到fb_info,并且如果定义了info->fbops->fb_open,就会调用底层的fb_open
read操作:
app: read()
---------------------------------------------------------------
kernel:
fb_read
int fbidx = iminor(inode); //获取次设备号
struct fb_info *info = registered_fb[fbidx]; //和open一样,从registered_fb数组中获取fb_info
if (info->fbops->fb_read) //假如底层定义了info->fbops->fb_read,就使用底层的fb_read
return info->fbops->fb_read(info, buf, count, ppos);
//否则就直接copy_to_user
src = (u32 __iomem *) (info->screen_base + p);
dst = buffer;
*dst++ = fb_readl(src++);
copy_to_user(buf, buffer, c)
问1. registered_fb数组在哪里被设置?
答1. register_framebuffer
intregister_framebuffer(struct fb_info *fb_info){。。。fb_info->dev = device_create(fb_class, fb_info->device, MKDEV(FB_MAJOR, i), NULL, "fb%d", i); //生成/dev/下的fb节点。。。registered_fb[i] = fb_info; //将传进来的fb_info放入到registered_fb数组中。。。}
再查找register_framebuffer再哪被调用,发现6410的LCD驱动代码(硬件相关操作)路径为:
S3cfb.c (drivers\video),可以参考此代码编写驱动程序。
总结一下如何编写一个LCD驱动程序:
1. 分配一个fb_info结构体: framebuffer_alloc
2. 设置,fb_info相关
3. 注册: register_framebuffer
4. 硬件相关的操作:硬件设备寄存器相关
下面是从网上截取的图片,很直观:
- 6410之LCD驱动程序(层次分析)
- 6410之LCD驱动程序(层次分析)
- LCD驱动程序层次分析
- LCD驱动程序之层次分析与硬件原理
- 6410之LCD驱动程序(硬件操作)
- 6410之LCD驱动程序(驱动框架)
- 嵌入式linux之LCD驱动层次分析
- lcd驱动层次分析
- LCD驱动--层次分析
- LCD驱动程序分析
- linux驱动LCD对对程序之层次分析与框架
- s3c2410 linux LCD驱动程序分析
- LCD驱动程序架构和分析
- LCD驱动程序——框架分析(一)
- LCD驱动程序——框架分析(一)
- LCD驱动程序——框架分析(一)
- LCD驱动程序——框架分析(一)
- ok6410之lcd驱动程序设计
- 客户端MapReduce提交到YARN过程(一)
- 取网卡地址
- IOS开发之内存管理--dealloc该写些什么
- Java - 封装类
- 10种不可思议的材料
- 6410之LCD驱动程序(层次分析)
- hdu4431 Mahjong 枚举搜索。。
- JDBC连接之Oraclel数据库
- 【Lucene3.6.2入门系列】第15节_SolrJ高亮
- IO同步与异步
- C#常用字符串截取
- SIFT中尺度空间的几个小问题
- android activity生命周期
- lua 实现文件读取四则算式并计算结果