微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 嵌入式LCD驱动开发要如何进行?LCD维护常见的几种方法

嵌入式LCD驱动开发要如何进行?LCD维护常见的几种方法

时间:04-26 来源:网络整理 点击:

LCD 控制器的功能是显示驱动信号,进而驱动LCD。用户只需要通过读写一系列的寄存器,完成配置和显示驱动。在驱动LCD设计的过程中首要的是配置LCD控制 器,而在配置LCD控制器中最重要的一步则是帧缓冲区(FrameBuffer)的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上的。帧 缓冲区的大小由屏幕的分辨率和显示色彩数决定。驱动帧缓冲的实现是整个驱动开发过程的重点。S3C2410中的LCD控制器可支持STN和TFT两种液 晶。对于STN 液晶平板,该LCD控制器可支持4位双扫描、4位单扫描和8位单扫描三种显示类型,支持4级和16级灰度级单色显示模式,支持256色和4096色显示, 可接多种分辨率的LCD,例如640×480、320×240和160×160等,在256色显示模式时,最大可支持4096×1024、2048× 2048和1024×4096显示。TFT液晶平板可支持1-2-4-8bpp(bits per pixel)调色板显示模式和16bpp非调色板真彩显示。

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

  帧缓冲设备对应的设备文件是/dev/fb*。如果系统有多个显卡,Linux还支持多个帧缓冲设备,最多可达32个,即/dev/fb0~/dev/fb31。而/dev/fb则指向当前的帧缓冲设备,通常情况下,默认的帧缓冲设备为/dev/fb0。

  帧缓冲设备也属于字符设备,采用"文件层-驱动层"的接口方式。在文件层为之定义了以下数据结构。

  Static struct file_operations fb_fops={

  ower: THIS_MODULE,

  read: fb_read, /*读操作*/

  write: fb_write, /*写操作*/

  ioct1: fb_ioct1, /*I/O操作*/

  mmap: fb_mmap, /*映射操作*/

  open: fb_open, /*打开操作*/

  release: fb_release, /*关闭操作*/

  }

  其成员函数都在linux/driver/video/fbmem.c中定义,其中的函数对具体的硬件进行操作,对寄存器进行设置,对显示缓冲进行映射。主要结构体还有以下几个。

  ● Struct fb_fix_screeninfo:记录了帧缓冲设备和指定显示模式的不可修改信息。它包含了屏幕缓冲区的物理地址和长度。

  ● Struct fb_var_screeninfo:记录了帧缓冲设备和指定显示模式的可修改信息。它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。其中变量 xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数,bits_per_pixel定义了每个像素用多少个位来表示。

  ● Struct fb_info:Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结 构相对应。其中成员变量modename为设备名称,FONTname为显示字体,fbops为指向底层操作的函数的指针。

  LCD驱动开发的主要工作

  1 编写初始化函数

  初始化函数首先初始化LCD 控制器,通过写寄存器设置显示模式和颜色数,然后分配LCD显示缓冲区。在Linux中可以用kmalloc()函数分配一段连续的空间。缓冲区大小为: 点阵行数×点阵列数×用于表示一个像素的比特数/8。缓冲区通常分配在大容量的片外SDRAM中,起始地址保存在LCD控制寄存器中。本文采用的LCD显 示方式为640×480,16位彩色,则需要分配的显示缓冲区为640×480×2=600kb。最后是初始化一个fb_info结构,填充其中的成员变 量,并调用register_framebuffer(&fb_info),将fb_info登记入内核。

  2 编写成员函数

  编写结构fb_info中函数指针fb_ops对应的成员函数,对于嵌入式系统的简单实现,只需要下列三个函数就可以了。

  struct fb_ops{

  ……

  int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info);

  int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);

  int (*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);

……}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top