Linux下驱动STN彩色LCD(2)

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

  
  应用程序层对帧缓冲设备的访问同对文件的访问操作类似。在应用程序中,对帧缓冲设备(dev/fb)的操作只需调用文件层的操作函数。首先打开/dev/fb设备文件;随后用ioctl操作取得屏幕的分辨率和bpp值,从而计算出屏幕缓冲区的大小,并将屏幕的缓冲区映射到用户空间;最后就可直接对屏幕缓冲区进行图片显示。
  
  嵌入式linux操作系统对帧缓冲的初始化入口在fbmem.c中的如下定义:
  
  static struct {
  const char *name;
  int (*init)(void);[来源 www.iocblog.net]
  int (*setup)(char*);
  } fb_drivers[ ]__initdata = {
  #ifdef config_fb_yourcard
  { "driver_name", xxxfb_init, xxxfb_setup },
  #endif
  
  通过该入口可进入帧缓冲的初始化函数。下面是对整个帧缓冲的实现过程。
  
  首先,根据所选择的stn型lcd先初始化显示屏幕的分辨率(640×480)、每个像素的比特数(实际所选的lcd为12bpp,但在设计中可作为16bpp来设计。这是因sa1110的lcd控制器对两者处理方式相同而只有色彩深度的比例不同的缘故)和各种时序值。随后这些值将会被写入lcd控制器的控制寄存器lccr0到lccr3内,即完成对lcd控制器内一部分寄存器的配置。特殊的一点,因为所选的lcd是12bpp显示,所以rgbt色彩的深度比值应为4:4:4:0。
  
  其次对lcd进行显示缓冲区的分配。该过程由kmalloc函数实现动态分配一片连续的空间,需要分配的缓冲区大小为600k字节。缓冲区是在sdram中分配大容量的地址,存储器映射至sa1110内,其中上半屏起始地址保存到lcd控制器的寄存器dbar1中,下半屏起始地址保存到dbar2中。在此完全初始化一个fb_info结构,填充其中的各成员变量。之后进行中断处理请求和各种变量和调色板等的设置。然后注册驱动程序,通过调用register_framebuffer(&fb_info)实现将fb_info登记入内核。最后,启动gpio9~2和lcd控制器。
  
  效果
  
  因为该设计将驱动作为内核的一部分,而不是模块加载的方式,所以需重新编译内核,并将新编译的linux内核下载到开发板内。重新启动系统后,通过应用程序检测,可以使屏幕显示任意所需图片,表明了驱动lcd显示的设计已成功实现。
  
  在对嵌入式linux系统进行驱动lcd的开发时,不仅涉及到对开发板的了解(特别是微处理器和外围接口),还要求熟练配置linux内核、掌握linux的整个系统启动过程和linux下开发设备驱动程序过程,同时开发人员还需掌握所开发的lcd技术资料。本文具体的介绍驱动lcd过程中驱动帧缓冲的设计。该设计的实现使得此lcd可应用在嵌入式开发的多种领域,因此具有实用价值。

上一页 [1] [2]


Tag: LCD



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