LCD内核自带驱动分析
分析内种LCD驱动程序框架
LCD在fbmem.c文件中
1.找到init.函数
static int __initfbmem_init(void)
{
做的工作: (1).if (register_chrdev(FB_MAJOR,"fb",&fb_fops))注册字符处理函数结构体,以及生成设备号,
(2)fb_class = class_create(THIS_MODULE, "graphics");生成一个类
}
2.打开注册设备中的字符函数结构体fb_fops
static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.ioctl = fb_ioctl,
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
};
APP层如果要打开这个设备,就会执行经过系统调用执行fb_open函数
3.分析这个函数
static int fb_open(struct inode *inode, struct file *file)
{
int fbidx = iminor(inode);生成一个次设备号
struct fb_info *info;定义一个fb_info结构体
if (!(info = registered_fb[fbidx]))把registered_fb[]结构体数组中以这个设备的次设备号为索引,把数组中的值赋值给info
}
4.如果应用程序要对这个驱动进行读写操作,就会调用read函数
static ssize_t
fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
那么读函数主要做的工作:
int fbidx = iminor(inode);获得设备的次设备号
struct fb_info *info = registered_fb[fbidx];在fb_info结构体中以此设备号为索引找到一个成员赋值给info变量。
if (info->fbops->fb_read)如果字符结构体函数定义fb_read,则执行相应处理
return info->fbops->fb_read(info, buf, count, ppos);
total_size = info->screen_size; 虚拟屏的大小
buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count,分配页大小的缓冲区
src = (u32 __iomem *) (info->screen_base + p);//显存基地址,作为源地址
dst = buffer;把分配的缓冲区作为目的地址
*dst++ = fb_readl(src++);把源地址中的数据拷贝到目的地址中
if (copy_to_user(buf, buffer, c))把数据传递到应用程序
kfree(buffer);释放缓冲区
}
不管是读还是写都用到了registered_fb[];
5.那么这个结构体数组是怎么赋值的呢registered_fb[];
在这个函数中有对这个结构体进行赋值
int register_framebuffer(struct fb_info *fb_info)
{
分析这个函数
fb_info->dev = device_create(fb_class, fb_info->device,
MKDEV(FB_MAJOR, i), "fb%d", i);在fb_class类下面创建一个类的设备,
fb_init_device(fb_info);初始化这个设备
......对fb_info进行初始化操作
registered_fb[i] = fb_info;把这个传进来的变量存入数组中,那么是由谁调用这个函数,并传进参数的呢
可以发现有很多不同厂家的触摸屏.c函数都会调用这个函数,这说明这个函数是抽象出来的,大家都在用它,那么根据什么来区别他们呢,那就根据registered_fb数组中的成员,
}
6.比如打开s3c2410fb.c这个函数,
找到init函数
int __devinit s3c2410fb_init(void)
{
return platform_driver_register(&s3c2410fb_driver);
}
进入到int platform_driver_register(struct platform_driver *drv)里面
{
drv->driver.bus = &platform_bus_type;
....
return driver_register(&drv->driver);
}
}
进入int driver_register(struct device_driver * drv)函数里面
{....
return bus_add_driver(drv);
int bus_add_driver(struct device_driver *drv)
error = driver_attach(drv);
bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
driver_probe_device(drv, dev);
if (drv->bus->match && !drv->bus->match(dev, drv))
return ret;如果设备和驱动的名字匹配,那么就会调用probe函数,也就是会调用
.probe = s3c2410fb_probe,这个函数
7.分析这个函数static int __init s3c2410fb_probe(struct platform_device *pdev)
{
主要工作:struct fb_info *fbinfo;定义一个fb_info结构体指针变量
fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), &pdev->dev);为这个结构体指针变量分配大小
....初始化这个结构体
ret = register_framebuffer(fbinfo);注册这个结构体,就把这个结构体注册到内核中,也就是存在registered_fb数组中去,
}
总结:整个LCD驱动架构就是设备和驱动分离
驱动是对所有的LCD抽出来的共性
设备是根据不同厂家的LCD来进注册,如果设备的名字和驱动的名字相同,那么就可以调用probe函数对着设备进行注册;从而达到了设备和驱动分离的目的。
LCD内核自带驱动分析的更多相关文章
- linux内核SPI总线驱动分析(一)(转)
linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析 (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...
- linux内核SPI总线驱动分析(二)(转)
简而言之,SPI驱动的编写分为: 1.spi_device就构建并注册 在板文件中添加spi_board_info,并在板文件的init函数中调用spi_register_board_info(s3 ...
- s3c2440液晶屏驱动 (非内核自带) linux-4.1.24
对于,不想逐一检查内核自带驱动,想自己编写驱动. 1,make menuconfig 去掉 编译到内核,改为 M 编译为 模块(因为要用到里面的3个.ko 驱动) Device Drivers --- ...
- Linux驱动之内核自带的S3C2440的LCD驱动分析
先来看一下应用程序是怎么操作屏幕的:Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户 ...
- Linux的LCD驱动分析及移植
测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...
- 高通 android平台LCD驱动分析
目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...
- S3C6410 LCD驱动分析(转)
一. 理论分析1. 几个概念:FIMC : Fully Interactive Mobile Camera (完全交互式移动摄像机)FIMD: Fully Interactive Mob ...
- mini2440触摸屏驱动分析
mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...
- 19.Linux-USB总线驱动分析
如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: ...
随机推荐
- iOS控制器之基类设计
题记 在进入新公司后.经过这一个月的重构项目,终于把项目做到了个人相对满意的程度(还有一种不满意的叫老板的需求,提过多次意见也没用= =!).在这次重构中按照以前的思路设计出了个人觉得比较适用的一个基 ...
- zoj3806Incircle and Circumcircle
链接 自己的本本没有装画图软件,先借用两张图片..博客园不让贴源地址... 可以想到对于一个确定的外接圆的三角形来说内切圆最大的时候为等边三角形,如下图: 确定有合法的解之后,接下来就是去找这个解,解 ...
- JQuery_处理元素和浏览器的窗口的尺寸
一.jQuery width() 和 height() 方法 width() 方法设置或返回元素的宽度(不包括内边距.边框或外边距). height() 方法设置或返回元素的高度(不包括内边距.边框或 ...
- 【java基础】面向对象的三大特征---多态
java的引用变量有两种类型,编译时类型和运行时类型,如果编译时类型和运行时类型不一致,就会出现多态. 多态分为: 运行时多态 java运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称 ...
- asp 使用TreeView控件
这段代码为了使用 TreeNodeCheckChanged 事件,会有回刷新的效果: 不喜欢的可查看改进版,利用js控制选择操作,无界面刷新, “http://www.cnblogs.com/GoCi ...
- Linux 虚拟机重新生成配置文件无法启动
ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: service network restartShutting down loopback insterface: ...
- MYSQL 模糊查询
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...
- 不在折腾---hive-0.13.1-bin
Hive只在一个节点安装即可 上传tar包 解压 > tar zxvf hive-0.13.1-bin.tar.gz 配置mysql * 检查MySQL是否安装:rpm -qa | grep m ...
- 小小border用处多
1.实现梯形 利用边框我们可以得到梯形,首先我们给一个div添加边框,当给边框设置四个不同的颜色时,我们可以得到这样的样式,可以看到这里上边框是一个梯形,那么如果我们给其他边框设置颜色为透明(tran ...
- 机器学习实战knn
最近在学习这本书,按照书上的实例编写了knn.py的文件,使用canopy进行编辑,用shell交互时发现运行时报错: >>> kNN.classify0([0,0],group,l ...