新闻中心

EEPW首页>嵌入式系统>设计应用> 基于S3C2440A终端LCD驱动电路的设计与实现

基于S3C2440A终端LCD驱动电路的设计与实现

作者: 时间:2011-09-09 来源:网络 收藏
LED背光

本文引用地址://m.amcfsurvey.com/article/150246.htm

作为一种被动显示器件本身并不能发光,必须要有背光模块提供光源。白光LED由于复杂程度较低、成本低且尺寸较小,被普遍用做嵌入式手持设备的背光源。本文中背光如图3所示。

背光驱动电路

芯片采用MP1521,该芯片有3组独立的电流反馈回路,可同时驱动3组并联的LED。现将3组反馈回路FB1、FB2、FB3短接,可以提供更大的驱动电流,用于驱动6个白色串联LED背光灯。

  MP1521支持两种方式控制LED亮度,一是将BRT连接在范围为0.26V~1.2V的电压上,另外一种是通过PWM信号控制LED亮度。时,将其连接在PWM端口,使用PWM控制背光亮度。

有5个16bit定时器,其中定时器0、1、2、3有PWM功能。将BRT连接到能够输出PWM信号的CPU的TOUT0/GPB0引脚,利用定时器0产生的PWM信号控制LCD亮度。通过改变PWM信号的占空比调整LED亮度,而通过设置CPU内部寄存器的值可以改变PWM的占空比。

  为了节省功耗,的使能(EN)端接CPU的LCD_PWREN管脚,高电平时背光电路工作;低电平时背光电路不工作。同时,可将EN端通过电阻直接连接到3.3V电源上以便调试时使用。

  LCD_BCK+和LCD_BCK-分别连接到串联LED的正负两端。

  软件

  手持的嵌入式Linux所采用的内核版本是kernel-2.4.18。 为了使LCD能正常显示,还需要在Linux系统下开发LCD的驱动程序。

  字符设备的驱动程序

  字符设备是Linux系统中最简单的设备,可以像文件一样访问。当字符设备初始化的时候,其驱动程序向Linux内核登记,在chrdevs向量表中增加一个device_struct数据结构条目。这个设备的主设备标识符用作这个向量表的索引。一个设备的主设备标识符是固定的。chrdevs向量表中的device_struct数据结构包括一个登记设备驱动程序名称的指针和一个指向一组文件操作的指针。这组文件操作本身位于这个设备的字符设备驱动程序中,并处理一些特定任务。

  Linux下的帧缓冲设备

  Linux操作系统为LCD等显示设备提供了帧缓冲区。帧缓冲区(Framebuffer)是Linux为显示设备提供的一个接口,是把显存抽象化后的一种设备。为LCD编写驱动程序的实质就是为帧缓冲区编写驱动程序。

  由于帧缓冲驱动程序的在许多论文中有详细叙述,这里不再赘述,本文重点讨论背光设备驱动程序的

  LCD背光设备的驱动程序

  LCD背光设备可看作字符设备,可以按照字符设备驱动程序的编写方法进行。在驱动程序里实现了LCD各种控制功能。驱动程序主要包括lcdctrl.c和lcdctrl_smdk2440.c。其中lcdctrl.c屏蔽了具体的硬件,它通过钩子函数调用lcdctrl_smdk2440.c相关函数完成各种具体操作。为了形象地说明两个文件之间的关系,这里以LCD亮度调节过程为例,说明函数的调用过程,如图4所示。

函数的调用过程

  lcdctrl.c中的lcdctrl_ioctl函数需根据上层应用程序的不同参数实现不同的功能,这些控制LCD的功能包括亮度调整、对比度调整、关闭LCD、开启LCD等。

  下面分别叙述两个文件的实现。

  lcdctrl.c文件

  1、定义file_operation结构体

  static struct file_operations lcdctrl_fops = {

  ioctl: lcdctrl_ioctl,

  open: lcdctrl_open,

  release: lcdctrl_close };

  LCD的各种控制功能在lcdctrl_ioctl函数中实现,lcdctrl_open和lcdctrl_close不实现具体功能,直接返回0值。

  2、lcdctrl_ioctl函数

  lcdctrl_ioctl函数需根据上层应用程序的不同参数实现不同的功能,这里主要说明亮度调节功能的实现。部分代码如下:

  static int lcdctrl_ioctl(struct inode * inode, struct file *filp, unsigned int cmd , unsigned long arg)

  {……

  switch(cmd)

  { ……

  case

  _LCDCTRL_IOCTL_BRIGHTNESS:

  if ((arg >=0) (arg = 100))

  ret = lcdctrl_set_brightness(arg);

  break; //调节LCD背光亮度

  ……

  break;}

  return ret;}

  当应用程序传递的命令参数为LCDCTRL_IOCTL_BRIGHTNESS时,lcdctrl_ioctl调用lcdctrl_set_ brightness具体实现亮度调节功能。

  3、lcdctrl_set_brightness函数

  lcdctrl_set_brightness具体实现亮度调节功能。主要代码如下:

  int lcdctrl_set_brightness(int b)

  {

  brightness = b;

  return lcd_device->set_brightness(b);

  }

  可以看出,此函数调用lcd_ device->set_brightness函数,而lcd_device在初始化时已被指向与具体的硬件相关的函数。

DIY机械键盘相关社区:机械键盘DIY




评论


相关推荐

技术专区

关闭