6. Linux-LCD 驱动程序概述

6. Linux-LCD 驱动程序概述,第1张

入局:应用程序是如何 *** 控LCD显示器的?

      我们知道应用程序的调用接口,无非 open/read/write ...然后通过驱动程序最终作用到硬件设备上。以字符设备为例,对于驱动的开发者,实现了应用程序调用的驱动层中与之相匹配的 drv_open/drv_read/drv_write 函数,为应用层序提供了 *** 作实际硬件设备的通道。那么,对于LCD驱动程序又是如何?先来了解下两个非常重要的概念。

      LCD控制器的功能是控制驱动信号,进而驱动LCD。用户只需要通过读写一系列的寄存器,完成配置和显示驱动。在驱动LCD设计的过程中首要的是配置LCD控制器,而在配置LCD控制器中最重要的一步则是帧缓冲区(Frame Buffer)的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上的。帧缓冲区的大小由屏幕的分辨率和显示色彩数决定。驱动帧缓冲的实现是整个驱动开发过程的重点。

      帧缓冲区是出现在Linux 2.2.xx及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备区。帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。这样软件无须了解任何涉及硬件底层驱动的东西(如硬件寄存器)。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和I/O控制等 *** 作。通过专门的设备节点可对该设备进行访问,如/dev/fb*。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以进行读写 *** 作,而读写 *** 作可以反映到LCD。

      帧缓冲(Frame Buffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写 *** 作。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Frame Buffer设备驱动来完成的。帧缓冲设备属于字符设备。

      Linux系统Frame Buffer本质上只是提供了对图形设备的硬件抽象,在开发者看来,Frame Buffer是一块显示缓存,向显示缓存中写入特定格式的数据就意味着向屏幕输出内容。

由于有了frambuffer的抽象,使得应用程序通过定义好的接口就可以访问硬件。所以应用程序不需要考虑底层的(寄存器级)的 *** 作。应用程序对设备文件的访问一般在/dev目录,如 /dev/fb*。

内核中的frambuffer在: drivers/video/fbmem.c (fb: frame buffer)

(1) 创建字符设备"fb", FB_MAJOR=29,主设备号为29。

(2)创建类,但并没有创建设备节点,因为需要注册了LCD驱动后,才会有设备节点;

2.1 fb_open函数如下:

(1) registered_fb[fbidx] 这个数组也是fb_info结构体,其中fbidx等于次设备号id,显然这个数组就是保存我们各个lcd驱动的信息

2.2 fb_read函数如下:

从.open和.read函数中可以发现,都依赖于fb_info帧缓冲信息结构体,它从registered_fb[fbidx]数组中得到,这个数组保存我们各个lcd驱动的信息。由此可见,fbmem.c提供的都是些抽象出来的东西,最终都得依赖registered_fb这个数组。

这个register_framebuffer()除了注册fb_info,还创建了设备节点。

以s3c2410fb.c为例,分析驱动的实现。

既然是总线设备驱动模型,那我们关心的是它的probe函数。

看到这里驱动的写法也大致清晰:

附:

LCD的显示过程与时序:

      1.显示从屏幕左上角第一行的第一个点开始,一个点一个点地在LCD上显示,点与点之间的时间间隔为VCLK(像素时钟信号);当显示到屏幕的最右边就结束这一行(Line),这一行的显示对应时序图上的HSYNC(水平同步信号)

      2. 接下来显示指针又回到屏幕的左边从第二行开始显示,显示指针针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换。

      3. 以此类推,显示指针就这样一行一行的显示至矩形的右下角才把一幅图像(帧:frame)显示完成,这一帧的显示时间在时序图上表示为VSYNC(垂直同步信号)。

参考:

https://sites.google.com/a/hongdy.org/www/linux/kernel/lcddriver

不用看是不是ARM中的函数,从C语言基本就可以理解。

(struct s3c44b0fb_info *)info怎么去理解?

将info强制装换为结构体指针!同类型才能赋值!

我想知道这个函数到底实现一个什么功能,然后本函数的CON参数有什么用

仔细阅读程序:&fb_display[con].cmap (仔细看这句话)

可以用. *** 作,说明fb_display肯定是结构体对象,而且还是数组型对象,具体有多少个对象不管,至少知道CON是其中的一个。可以肯定CON是 unsigned int 型。具体是几不在乎。对于数组只取其中一个fb_display[con],当然加上&,取地址符。那么cmap必定是fb_display[con]中的一个成员变量。具体你要去找fb_display的定义,(这里你没写出来),看fb_display是从哪定义的结构体对象。

static int s3c44b0fb_set_cmap这个函数的作用,从参数猜测也简单。

首先第一个参数:struct fb_cmap *cmap 一张要显示的图,这个图(可能是图的像素)是用结构体存放的。

看到程序后面有alloc,显然要为这个图指定一个内存空间缓存。

第二个参数:int kspc 不管了,我也不知道,但不影响读程序.

后面两个已经解释过了.

基本功能就是要LCD显示一张图片,把图片的数据和大小给 s3c44b0fb_set_cmap ,分配内存空间给图片也就是设定图片“ 格式” 。设定完后,下一步,可能就是要调用显示程序,让LCD显示图片了。

楼主,单纯的看个程序没太大用。

你完全可以去看看 三星 44B0X 的API。(不过ARM7快淘汰了,但也应该找的到的)。关于LINUX的API是不会淘汰的,查一查,这种函数肯定不是用户写的,肯顶是 API。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8900930.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存