LCD驱动分析(一)字符设备驱动框架分析
参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>
S3C2440 LCD驱动(FrameBuffer)实例开发<二>
LCD驱动也是字符设备驱动,也遵循字符设备驱动的流程:
a. 分配主设备号
b. 构建file_operations结构体中的open,write,read...等函数
c. 调用register_chrdev()函数注册字符设备
d. 调用class_register()注册类
e. 调用device_create()创建设备,linux会在sysfs目录下自动创建字符设备。
以上的步骤同样适用于分析输入子系统,只不过上面的各个步骤可能分散在不同的文件与函数中完成。
1.linux/drivers/video/fbmem.c中的fbmem_init()函数完成a,b,c,d完成以上四步。
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.unlocked_ioctl = fb_ioctl,
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
.llseek = default_llseek,
};
static int __init fbmem_init(void)
{
proc_create("fb", , NULL, &fb_proc_fops);
if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR);
fb_class = class_create(THIS_MODULE, "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 ;
}
2. 那么谁来调用device_create()创建设备?这里直接给出结论,后面再分析过程。
fbmem.c中定义的fb_info结构体的全局指针数组,fb_info结构体是LCD驱动的关键。register_framebuffer()函数中会调用device_create()函数创建设备节点。
struct fb_info *registered_fb[FB_MAX] __read_mostly; //FB_MAX=32
int register_framebuffer(struct fb_info *fb_info)
-->ret = do_register_framebuffer(fb_info);
-->找到空的registered_fb[i]
-->fb_info->dev = device_create(fb_class, fb_info->device, MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
-->设置fb_info
-->registered_fb[i] = fb_info;
3. 如何打开设备?
fb_open(struct inode *inode, struct file *file)
-->int fbidx = iminor(inode);
-->struct fb_info *info=get_fb_info(fbidx);//根据此设备号找到fb_info结构体
-->fb_info = registered_fb[fbidx];
--> file->private_data = info;
--> if (info->fbops->fb_open) res = info->fbops->fb_open(info,1);//如果结构体中定义了open函数,执行新的open函数
4.如何读取设备?这里的关键是info->screen_base,设置为LCD控制器帧缓冲区的起始地址。
fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
-->struct fb_info *info = file_fb_info(file);//找到打开的fb_info结构体
--> if (info->fbops->fb_read)//如果fb_info中定义的读函数,则执行新的读函数
return info->fbops->fb_read(info, buf, count, ppos);
//没有定义新的读函数则执行下面
-->src = (u8 __iomem *) (info->screen_base + p);//设置源地址
-->buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);//设置目的地址
-->dst = buffer;
-->fb_memcpy_fromfb(dst, src, c);//读到用户空间
-->copy_to_user(buf, buffer, c)
LCD驱动分析(一)字符设备驱动框架分析的更多相关文章
- Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程
/*********************************************************************************** * * 字符设备驱动基本操作及 ...
- Linux驱动开发2——字符设备驱动
1.申请设备号 #include <linux/fs.h> int register_chrdev_region(dev_t first, unsigned int count, char ...
- 【Linux 驱动】简单字符设备驱动架构(LED驱动)
本文基于icool210开发板,内核版本:linux2.6.35: 驱动代码: (1)头文件:led.h #ifndef __LED_H__ #define __LED_H__ #define LED ...
- Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 阻塞 阻 ...
- Linux驱动开发之字符设备驱动模型之file_operations
90%的驱动模型都是按照下图开发的 下面来说下设备描述结构是什么东西 打开Linux-2.6.32.2的Source Insight 工程,搜索cdev 比如一个应用程序需要调用read和write这 ...
- 【linux驱动笔记】字符设备驱动相关数据结构与算法
欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...
- [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联
转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...
- linux学习--字符设备驱动
目录 1.字符设备驱动抽象结构 2.设备号及设备节点 2.1 设备号分配与管理 2.2 设备节点的生成 3.打开设备文件 linux驱动有基本的接口进行注册和卸载,这里不再做详细说明,本文主要关注li ...
随机推荐
- hdu6318( 2018 Multi-University Training Contest 2)
bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6318 求逆序数的对数 #include<iostream> #include ...
- 洛谷P2514||bzoj2426 [HAOI2010]工厂选址
洛谷P2514 bzoj2426 其实是个简单的贪心,然而不适合在脑子不清醒的时候做...看不懂题意续了1个小时 很容易发现应该枚举新建哪个发电厂,对于这种方案就是取其中b吨煤运到原来发电厂,取剩下( ...
- 552 Student Attendance Record II 学生出勤记录 II
给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值.学生出勤记录是只包含以下三个字符的字符串: 1.'A' : ...
- EDAS提交论文字体未嵌入
一.深夜更一波,刚刚在EDAS提交论文,提示格式不通过,说我有字体未嵌入.但是之前一直都没有问题,这次只是在LaTeX中嵌图的时候把eps换成PDF了.所以问题应该是出在我的PDF图里,里面有字体未被 ...
- (转载)Unity 优化总结
Unity 优化总结 2017-03-10 | 发布 大海明月 zengfeng75@qq.com | 分类 Unity | 标签 Unity 优化 相关文档 UGUI 降低填充率技巧两则 U ...
- toLua学习
toLua学习通用的过程//开始LuaState lua = new LuaState();lua.Start();--在这个位置插入lua的具体操作--//结束lua.CheckTop();lua. ...
- apache配置优化 - 解决apache环境下网站访问速度慢的问题(重点参考)
如果apche访问量过大,将会导致页面打开迟缓,下载速度也降低,如果由于经费和环境问题,集群方案没有得以应用.可以通过对Apache2增加模块MPM来进行优化, 这里我选择线程型MPM加以优化: 开 ...
- PL/SQL学习笔记(四)之——删除重复记录
例:假设员工表中有若干记录重复,请删除重复的记录(某企业面试题) ------模拟建表 create table employee( e_id varchar2(20) primary key, e_ ...
- ycsb模板介绍
#对应的mongodb uri参数等mongodb.url=mongodb://127.0.0.1:27010/test_1 #对应的mongo数据库名称mongodb.database=test_1 ...
- 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例
今年6月SAP发布C/4HANA之后,有顾问朋友们在微信公众号后台留言,询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来,从而打通企业的前后端业务,帮助企业实现数字化转型. 有的顾 ...