电子工程师的网站
首 页 |  新闻资讯 | 最新产品 | 解决方案 | 技术参数
设计应用
电路图 | 技术资料 | 芯片资料 | 技术论坛
  现在位置: 首页 > 设计应用 > 显示/光电技术 > 详细信息
显示/光电技术:PXA270的LCD显示系统的设计与实现
来源: 电子家园 DZJIA.CN 徐少峰   时间: 2007-9-24 15:50:43    

引言

  Xscale处理器是Intel公司推出的基于ARMv5TE体系结构的ARM处理器。PXA270是该公司于2003年第四季度推出一款全性能、高性价比、低功耗的Xscale处理器,其最高主频可达624MHz。

  PXA270拥有的 Quick Capture(快速拍摄)、Wireless MMX(无线MMX指令)和Wireless Speed Step(无线动态节能)技术,大大提升了多媒体处理能力;同时在保证CPU性能的情况下,最大限度地降低移动设备功耗。

  嵌入式Linux(Embedded Linux)是指对标准Linux经过小型化裁减处理之后,能够固化在容量只有几KB或者几MB的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。在目前已经开发成功的嵌入式系统中,大约有一半使用的是Linux。

1  LCD液晶显示原理

  嵌入式系统一般采用液晶显示屏LCD。本系统采用的是LG Philiph的TFT6.4寸的真彩显示屏LP064V02。

  液晶显示的原理是液晶在不同电压的作用下会呈现出不同的光特性。TFT是薄膜晶体管Thin Film Transitor的缩写。FB(Frame Buffer)是帧缓冲器。

  显示屏所显示的一幅完整画面就是一个帧(Frame),其整个显示区域,在系统内会有一段存储空间与之对应,通过改变该存储空间的内容,从而改变显示屏的内容,该存储空间被称为Frame Buffer。显示屏上的每一点都必然与Frame Buffer里的某一位置对应。而计算机显示的颜色是通过RGB值来表示的,因此如果要在屏幕某一点显示某种颜色,则必须给出相应的RGB值。Frame Buffer就是用来存放整个显示的编码和像点值的外部存储器区域。帧缓冲器的每一个字节对应着LCD中的一个像素,例如LP064V02显示屏有640×480=307200个像素。

2 PXA270中内置的LCD控制器

2.1 LCD控制器介绍

  Frame Buffer和LCD显示屏之间的数据传输很频繁,完全由CPU通过程序直接驱动显然不合适。因此,为减轻CPU的负担,在Frame Buffer与显示屏之间还需要一个中间件,该中间件负责从Frame Buffer里提取数据,进行处理,并传输到显示屏上。

  LCD控制器由以下部分组成:LCD DMAC(本文提出的DMAC都是指集成在LCDC内部的DMAC),输入/输出FIFO,内部调色板,TMED抖动(帧速率控制),寄存器组。

  LCDC的内部操作方式会因为所接LCD类型的不同而有所不同。本系统采用的是主动16位像点模式。在这种主动彩色模式中,LCDC内部的工作方式相对简单,Frame Buffer内的数据是16位的像素数据,此时,LCDC无需加载数据到内部调色板,并且数据无需经过帧速率控制单元的处理,直接发送至LCD控制器的数据脚,通过DMAC传输到输入 FIFO后,数据又立刻被传送到输出 FIFO。

2.2 LCD模块的硬件连接

PXA270与LCD模块的硬件连接如图1所示。各信号引脚的说明如下:

LCD接口框图

图1  LCD接口框图

  • L_DD[15:0]:数据线。16位数据线可以显示红、绿、蓝像点,使用5位红、6位绿和5位蓝就能实现不同颜色的显示。
  • L_PCLK:像点时钟。用于把彩色数据输入到LCD显示器中的移位寄存器中。被动模式下,像点时钟仅在数据线上数据有效时才发生跳变;主动模式下,像点时钟连续跳变。
  • L_LCLK:行扫描时钟。用于LCD显示器行显示的结束和把移位寄存器的行数据送到显示器中,并且将行指针加1。主动模式下,它是水平同步信号。
  • L_FCLK:帧扫描时钟。用于LCD显示器新的帧像点的开始。显示器复位时行指针指向显示屏的顶部。在主动模式下,它是垂直同步信号。
  • L_BIAS:AC偏置。主动方式下,它是数据使能信号。

3  LCD驱动程序的设计与实现

  PXA270嵌入式系统对LCD显示屏的驱动分成两方面:一方面是对LCD及相关部件的初始化,包括帧缓冲区的创建和对DMA通道的设置;另一方面就是对帧缓冲区的读写,将帧缓冲区的内容输送到LCD显示屏由硬件完成,对于驱动来说是透明的。

3.1 帧缓冲器的初始化

主要数据结构如下:

  struct pxafb_info:主要用于帧缓冲区设备驱动框架的搭建,也是Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还记录了帧缓冲器设备的全部信息。每个帧缓冲设备都必须与一个fb_info结构相对应。其中成员变量modename为设备名称,fontname为显示字体,fbops为指向底层操作的函数的指针。

 

  struct pxafb_fix_screeninfo:记录用户不能修改的显示控制器参数。它包括屏幕缓冲区的物理地址和长度。

  struct pxafb_var_screeninfo:记录用户可以修改的显示控制器参数。它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。其中变量xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数,bits_per_pixel定义了每个像素用多少个位来表示。

  帧缓冲区的初始化函数在/drivers/video/pxafb.c文件中,结构如下:

  int __init pxafb_init(void)

  {

        struct pxafb_info *fbi;

        int ret;

  …………

        fbi = pxafb_init_fbinfo();     //初始化一些重要的数据结构

  …………

  /* Initialize video memory */

        ret = pxafb_map_video_memory(fbi);  //在内存中创建一个图像缓存区

        …………

        pxafb_set_var(&fbi->fb.var, -1, &fbi->fb);

     …………

        ret = register_framebuffer(&fbi->fb);   //登记,使画面缓冲区与控制台设备驱动的高层挂钩

…………

  / * Ok, now enable the LCD controller  */

        set_ctrlr_state(fbi, C_ENABLE);

        …………

        return ret;

  }

  首先是pxafb_init_fbinfo()的调用,目的在于对几个数据结构进行初始化,并设置有关的基本的参数,例如所用的字体、显示屏的规格等,还有为了搭建帧缓冲器的设备驱动框架做一些准备。接着通过pxafb_map_video_memory()函数在内存中创建帧缓冲区,实际上是为一个内存区间另外建立一个映射。这里分配用于帧缓冲区的内存区间应该是不经高速缓存、不加写缓冲的,这样才可以一经写入便立即反映在显示屏上,而无需先对高速缓存进行刷新。

  pxafb_set_var()函数是为控制台设备驱动的高层提供一个驱动帧缓冲区的界面。同时也确定一些与画面缓冲区有关的参数,并记录在一个fb_var_screeinfo数据结构中。确定了这些参数以后,如果目标帧缓冲区属于当前选定的控制台设备,就通过pxa_activate_var()函数把这些参数分门别类地组合生成PXA270各有关寄存器的映像,并最终设置到PXA270的各个LCD控制寄存器中。

这里用到6个寄存器:

  • DBAR1:DMA通道1的基地址寄存器,用于调色板;
  • DBAR2:DMA通道2的基地址寄存器,用于画图;
  • LCCR0:黑白/彩色模式选择,单画面/双画面显示方式、被动/主动显示模式选择;
  • LCCR1:控制着水平方面的扫描,包括每行的像素、水平同步脉冲宽度、在水平扫描行的开头和末尾各空出几个像素等参数;
  • LCCR2:控制着垂直方面的扫描,包括每个画面的行数、垂直同步脉冲宽度、在画面的顶部和底部各空出几行等参数;
  • LCCR3:控制着像素时钟的频率以及各种同步脉冲的极性。

  这些宏操作都在/drivers/video/pxafb.h文件里。

  #if defined(CONFIG_FB_LB064v02)

 

  #define LCD_PIXCLOCK        250000//54000//150000

  #define LCD_BPP             16

  #define LCD_XRES            640

  #define LCD_YRES            480

  #define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 46

  #define LCD_VERTICAL_SYNC_PULSE_WIDTH   1

  #define LCD_ BEGIN_OF_LINE_WAIT_COUNT    96

  #define LCD_BEGIN_FRAME_WAIT_COUNT    35

  #define LCD_END_OF_LINE_WAIT_COUNT     4

  #define LCD_END_OF_FRAME_WAIT_COUNT    0

  #define LCD_SYNC    (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT)

  #define LCD_LCCR0   (LCCR0_OUC | LCCR0_CMDIM | LCCR0_RDSTM | LCCR0_OUM | LCCR0_BM | LCCR0_QDM | LCCR0_PAS |LCCR0_EFM | LCCR0_IUM | LCCR0_SFM | LCCR0_LDM )

  #define LCD_LCCR3                   (LCCR3_PCP | LCCR3_HSP | LCCR3_VSP)

  #endif

  最后是通过register_framebuffer()进行各项登记,使帧缓冲区与控制台设备驱动的高层相连。参数fbi是一个指向fb_info数据结构的指针,通过这个数据结构使帧缓冲区与文件系统连接起来。

3.2 帧缓冲区的操作

  对帧缓冲区的操作,应用程序首先要打开代表帧缓冲区的设备文件,帧缓冲区的file_operations数据结构是fb_fops。

  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,    // 关闭操作

  #ifdef HAVE_ARCH_FB_UNMAPPED_AREA

        get_unmapped_area: get_fb_unmapped_area,

  #endif

  };

  应用程序层对帧缓冲设备的访问同对文件的访问操作类似。在应用程序中,对帧缓冲设备(dev/fb)的操作只需调用文件层的操作函数。首先打开/dev/fb设备文件;随后用ioctl操作取得屏幕的分辨率和bpp值,从而计算出屏幕缓冲区的大小,并将屏幕的缓冲区映射到用户空间;最后就可直接对屏幕缓冲区进行图片显示。对帧缓冲区的打开文件操作是由fb_open()完成等。

  驱动程序编写完成后,开发者可以将其编译为动态加载模式,或静态地编译入内核中。

4 结束语

  随着后PC时代的到来,嵌入式系统得到了越来越广泛的应用。现在的嵌入式系统一般都需要提供图形化的人机界面。本文所设计的系统运行良好,性能稳定。在实际产品中取得了比较满意的经济效益。

相关信息
发表评论
打印本页 关闭本页
Adeneo提供微软 .NET Micro Framework软件工程服务
    Adeneo公司在刚于美国东岸举行的嵌入式系统会议(EmbeddedSystemsConferenceEast)上展示了在爱特梅尔基于ARM9的AT91SAM9微控制器移植.NETMicroFramework的成果。这项移植表明Adeneo能够为那些想在.NETMicroFramework上构建产品的OEM厂商,提供强而有力的技术支持和工程服务。Adeneo是微软Windows嵌入式伙伴服务计划的金级会员,在欧洲和美国均拥有研发设施。 .  NETMicroFramework为...
>>详细内容
基于PXA270的LCD显示系统的设计与实现
    本文介绍了液晶显示器(LCD)的基本工作原理和IntelXscalePXA270的内置LCD控制器。 设计了PXA270与LCD模块的硬件电路和针对LCD的具体参数配置了LCD控制器中的相关寄存器,最后在嵌入式的Linux操作系统中编写和加载了LCD的驱动程序。 引言 Xscale处理器是Intel公司推出的基于ARMv5TE体系结构的ARM处理器。PXA270是该公司于2003年第四季度推出一款全性能、高性价比、低功耗的Xs...
>>详细内容
CSR公司的BlueCore-Multimedia采用STEP的PROX技术
  CSR公司(伦敦证券交易所:CSR.L)宣布其BlueCore-Multimedia采用了一种重要的第三方软件。随着CSR公司eXtension伙伴计划继续扩大,CSR公司的BlueCore-Multimedia现在能够提供STEP公司用于高性能耳机和汽车免提组件的各种音频声学 (audio acoustic) 技术。PROX是STEP公司的核心技术之一,为麦克风耳机建立了一个新的标准,并将在2007年1月8日在美国举行的国际消费电子展上推出。   P...
>>详细内容
高压大电流达林顿晶体管阵列系列产品(ULN2003A)及其应用
  摘要:ULN2000、ULN2800是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003A电路是美国Texas Instruments公司和Sprague公司开发的高压大电流达林顿晶体管阵列电路,文中介绍了它的电路构成、特征参数及典型应用。 关键词:达林顿晶体管阵列 驱动电路 ULN2003 ULN2000系列 ULN2800系...
>>详细内容
ULQ2003AN的技术参数
  产品型号:ULQ2003AN输出电压(V):500开关电压MAX(V):1峰值输出电流(mA):50驱动器数/封装:7输出箝位二极管:Yes输入兼容性:CMOS/TTL延迟时间(ns)典型值:1000封装/温度(℃):PDIP-16/-40~85描述:高电压,大电流达林顿晶体管阵列价格/1片(套):¥2.10
>>详细内容
ULN2003AN的技术参数
  产品型号:ULN2003AN输出电压(V):50开关电压MAX(V):50峰值输出电流(mA):500驱动器数/封装:7输出箝位二极管:Yes输入兼容性:CMOS/TTL延迟时间(ns)典型值:250封装/温度(℃):16PDIP/-20~70描述:达林顿晶体管阵列价格/1片(套):¥1.70
>>详细内容
已有(
)位对此新闻感兴趣的网发发表了看法 >>更多评论
内 容:
     
 
热点新闻
一周排行
关于我们 | 服务项目 | 付款方式 | 广告服务 | 联系我们 | 友情链接 | 投诉 建议 合作 | 网站地图 | 加入收藏
Copyright © 2007-2008 WEEQOO.COM Corp.All Rights Reserved. 版权所有 经营许可证编号:浙B2-20050339 法律声明
维库电子旗下网站:维库电子市场网 | ChinaICMart | 维库电子开发网 | 维库电子人才网
总部:杭州市下城区朝晖路182号国都发展大厦1号楼80A
电话:0571-85889139-8007 QQ:303939539 | MSN:zh1226@hotmail.com |  邮箱:laz8258@163.com dzsc51@163.com