Linux下驱动STN彩色LCD

分类: 设备驱动   出处:iocblog整理  更新时间:2009-07-20   添加到收藏  


  伴随着高性能嵌入式处理器的飞速发展与普及,特别是arm处理器系列的出现,嵌入式系统的功能也变得越来越强大。以前的单色lcd已不能满足现今的各种多媒体应用,彩色lcd被越来越多地应用到嵌入式系统中。同时,在应用需求的促使下,许多工作在linux下的图形界面软件包的开发和移植工作中都涉及到底层lcd驱动的开发问题。
  
  在硬件采用intel assabet开发板,软件采用linux 2.4.19平台,编译器为arm-linux-gcc的交叉编译器作为开发的前提下,因为assabet开发板上使用的是sharp 3.9英寸320×240 tft彩色lcd,现改用kyocera 7.7英寸640×480 stn型彩色lcd,所以通过对其linux驱动程序进行改写和调试,成功地实现了对该种屏的驱动和显示。
  
  lcd
  
  控制器
  lcd控制器的功能是显示驱动信号,进而驱动lcd显示器。在驱动lcd设计的过程中首要的是配置lcd控制器。在配置lcd控制器中最重要的一步则是帧缓冲区的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上。帧缓冲区的大小由屏幕的分辨率和显示色彩数决定。驱动帧缓冲的实现是整个驱动开发过程的重点。
  
  assabet开发板采用sa1110作为处理器。sa1110微处理器是intel公司生产的一种基于strongarm环境的微处理器。该处理器内部有一lcd驱动控制器,可支持单、双屏显示和最大1024×1024dpi。每个像素数据以4、8、12或16位编码后存储于外部存储器内,通过lcd的专用dam控制器,被装入至532位的fifo中。在双屏显示时,两个dma通道分别负责上下屏幕的显示,但只有第一个dma通道有调色板缓冲器。帧缓冲器中的已编码像素数据是作为指针指向256×12位的调色板。调色板的色调数据控制着抖动逻辑,以产生各种灰度和彩色信号并从lcd数据引脚输出。
  
  显示屏
  lcd选择kyocera公司的7.7英寸stn型lcd。该lcd可在640×480分辨率的情况下提供12位彩色显示。该屏为双屏扫描模式,具有两个8位的数据通道,每种基色都由4位的抖动逻辑来产生15级灰度,因此可以显示最多153=3375种可能的颜色。
  
  驱动lcd的设计
  
  帧缓冲设备
  帧缓冲设备为图像硬件设备提供了一种抽象化处理。它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。这样软件无需了解任何涉及硬件底层驱动的东西(如硬件寄存器)。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和i/o控制等操作。通过专门的设备节点可对该设备进行访问,如/dev/fb*。
  
  linux下可支持多个帧缓冲设备,最多可达32个,即从/dev/fb0到/dev/fb31。通常情况下,缺省的帧缓冲设备为/dev/fb0。
  
  在sa1110处理器的lcd控制器操作中,帧缓冲器用于存放全部屏幕的所有编码像素数据。在它的最低位地址处是32或512字节的缓冲器,用来存放调色板数据表。32位缓冲器用于4、12或16位像素编码的16项调色板;512字节缓冲器用于装入8位像素编码的256项调色板。在12或16位像素编码时,不使用调色板,此时的帧缓冲器的起始32字节必须填入全零。
  
  主要结构体
  
  struct fb_fix_screeninfo中记录了帧缓冲设备和指定显示模式的不可修改信息。它包含了屏幕缓冲区的物理地址和长度。
  
  struct fb_var_screeninfo中记录了帧缓冲设备和指定显示模式的可修改信息。它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。其中变量xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数,bits_per_pixel定义了每个像素用多少个位来表示。
  
  struct fb_info是linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一fb_info结构相对应。其中成员变量modename为设备名称,fontname为显示字体,fbops为指向底层操作的函数的指针。
  
  linux内核配置与编译
  
  使用下面的命令启动linux内核配置工具:
  #make menuconfig
  
  启动如下内核选项,选择对应的选项之后,执行下面的命令:
  
  console drivers --->
  frame-buffer support--->
  [*] support for frame buffer devices (experimental)
  [*] sa-1100 lcd support (new)
  [*] advanced low level driver options (new)
  [*] 16 bpp packed pixels support (new)
  [*] select compiled-in fonts (new)
  [*] vga 88 font
  #make dep
  #make zimage
  
  驱动帧缓冲的设计
  帧缓冲设备属于字符设备,采用了“文件层-驱动层”的接口方式。linux为帧缓冲设备定义的驱动层接口为struct fb_info结构。在文件层次上,linux为其定义了下面的操作函数:
  
  static struct file_operations fb_fops = {
  owner: this_module,
  read: fb_read, /* 读操作*/
  write: fb_write, /* 写操作*/
  ioctl: fb_ioctl, /* 控制操作*/
  mmap: fb_mmap, /* 映射操作*/
  open: fb_open, /* 打开操作*/
  release: fb_release, /*关闭操作*/
  };[来源 www.iocblog.net]

[1] [2] 下一页


Tag: LCD



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。