LCD驱动程序层次分析

我们内核里面自带的触摸屏驱动是fbmem.c

它肯定不止一个,根据我们驱动的分层思想,它肯定会把共性的东西抽出来

我们来看这个驱动的入口函数


看看fops


我们是不是可以通过这些函数来操作LCD呢,那肯定不行,这是通用的文件


LCD驱动程序:


假设

app : open("/dev/fb0",.....); 假设主设备号是29,次设备号为0

————————————————————————————

最终会找到我们file_operations的open函数


看看get_fb_info这个函数




那么读呢,假设我们想对这片内存,看看LCD上面有什么东西

怎么读呢

应用程序来读

————————————————————

最终会调用到驱动中的read函数


我们也来看看这个file_fb_info这个函数



read函数主要做的事情是:如果有读函数就调用读函数,如果没有读函数,就从src = (u8 __iomem *) (info->screen_base + p); 这里来读

dst = buffer;目的等于buffer


fb_memcpy_fromfb(dst, src, c);
dst += c;
src += c; 这里的意思是 *dst++=fb_readl(src++);

然后在copy_to_user(buf, buffer, c)


可以看到open与read都依赖于一个结构体,fb_info结构体,这个结构体哪里来呢

fb_info = registered_fb[idx];从这个数组中得到,以设备号未下标,在这个次设备号上得到的


那么这个数组在哪里被设置???

我们可以看到fbmem.c都是一些抽象出来的东西,最终还是要依赖与fb_info这个结构体

这个结构体在哪里被设置

在fb.h被定义

这个里面的

do_register_framebuffer 这个函数中的registered_fb[i] = fb_info;这一行


这就体现了分层的思想


fbmem.c这里提供了一些抽象的东西

硬件相关的操作通过register_framebuffer 反应给fbmem.c


我们来看一看register_framebuffer这个函数做了什么事情




我们搜索这个函数,发现很多lcd的驱动程序都调用了这个函数

这就是我们设备相关的操作


以前我们的驱动都是自己写,现在改了 内核帮我们写一部分


我们来看一看S3c2410fb.c看看人家做什么事情


看驱动程序从入口开始看

int __init s3c2410fb_init(void)
{
int ret = platform_driver_register(&s3c2410fb_driver);


if (ret == 0)
ret = platform_driver_register(&s3c2412fb_driver);


return ret;
}

注册一个平台driver

总线设备模型 我们进入它的probe函数




所以我们硬件相关的驱动做如下几件事情

1.分配一个fb_info结构体

2.设置

3.注册

4.硬件相关的操作


我们想得到一个LCD的分辨率该怎么做呢

调用我们的fbmem里面的ioctl


我们来看一看这个成员里面有什么东西

/*__________________________________________________________________________________

后面会接着介绍


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值