LCD驱动程序层次分析

    xiaoxiao2021-03-25  181

    我们内核里面自带的触摸屏驱动是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

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

    /*__________________________________________________________________________________

    后面会接着介绍

    转载请注明原文地址: https://ju.6miu.com/read-1834.html

    最新回复(0)