我们内核里面自带的触摸屏驱动是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
我们来看一看这个成员里面有什么东西
/*__________________________________________________________________________________
后面会接着介绍