首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux液晶屏驱动开发 02

Linux液晶屏驱动开发 02

 3.Linux的帧缓冲设备
  帧缓冲区是出现在Linux 2.2.xx及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备区。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的、统一的,用户不必关心物理显存的位置、换页机制等具体细节。这些都由Framebufer设备驱动来完成。帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0。当然在嵌入式系统中支持一个显示设备就够了。在使用Framebufer时,Linux是将显卡置于图形模式下的.在应用程序中,一般通过将Frame-Buffer设备映射到进程地址空间的方式使用,对于帧缓冲来说,可以把它看成是一段内存,用于读写内存的函数均可对这段地址进行读写,只不过这段内存被专门用于放置要在LCD上显示的内容,其目的就是通过配置LCDC寄存器在一段指定内存与LCD 之间建立一个自动传输的通道。这样,任何程序只要修改这段内存中的数据,就可以改变LCD 上的显示内容。
  FrameBuffer设备驱动基于linux/include/linux/fb.h和linux/drivers/video/fbmem.c这两个文件,下面就详细分析这两个文件。
  首先分析linux/include/linux/fb.h文件,几乎主要的结构都是在这个文件中定义的。这些结构包括:
  fb_var_screeninfo 这个结构描述了显示卡的特性,记录了帧缓冲设备和指定显示模式的可修改信息。其中变量xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数,bits_per_pixel定义了每个像素用多少个位来表示。
fb_fix_screeninfon 这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修改;比如FrameBuffer内存的起始地址。
  struct fb_info Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结构相对应。其中成员变量modename为设备名称,fontname为显示字体,fbops为指向底层操作的函数的指针。
  fb_cmap描述设备无关的颜色映射信息。可以通过FBIOGETCMAP 和FBIOPUTCMAP 对应的ioctl操作设定或获取颜色映射信息。然后分析fbmem.h文件。
  帧缓冲设备属于字符设备,采用“文件层-驱动层”的接口方式。在文件层为之定义了以下数据结构

  其成员函数都在Linux/driver/video/fbmem.c中定义,其中的函数对具体的硬件进行操作,对寄存器进行设置,对显示缓冲进行映射。
  对于/dev/fb,对显示设备的操作主要有以下几种:
  读/写(read/write)/dev/fb 相当于读/写屏幕缓冲区。
  映射(map)操作 由于Linux工作在保护模式和每个应用程序里都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。因此,Linux在文件操作file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间。对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图。
  I/O控制 对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数和屏幕大小等。ioctl的操作是由底层的驱动程序来完成的。
  在应用程序中,操作/dev/fb的一般步骤为首先打开/dev/fb设备文件,然后用ioctl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数,根据屏幕参数可计算屏幕缓冲区的大小。接下来,将屏幕缓冲区映射到用户空间。最后,映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。典型程序段如下:

  由于准备在LCD 上显示一幅256色BMP图片,关于BMP 图片方面的知识请见相关链接。
返回列表