关闭
关闭
首页 > 嵌入式软件 > linux

1.基于ARM处理器的LCD编程设计:

随着单片机技术的飞速发展,新型的仪器仪表呈现出操作简单、便携化的趋势。LCD模块能够满足嵌入式系统日益增长的要求,它可以显示汉字、字符和图形,同时还具有低压、低功耗、体积小、重量轻等诸多优点,因而应用十分广泛。

液晶显示模块(LCM)是由控制器、行驱动器、列驱动器、显示存储器和液晶显示屏等器件通过PCB组装成一体的低成本输出设备,被广泛用于各种仪器仪表等设备中。其核心部件LCD控制器是可编程接口芯片,它一方面提供与微控制器(MCU)的接口,一方面连接行/列驱动器。用户对LCD控制器编程就是实现对LCM的操作控制。LCD控制器的功能是接收计算机发来的指令和数据,并向计算机反馈所需的数据信息。 T6963控制模块 T6963控制器型液晶显示模块的驱动控制系统由液晶显示控制器T6963及其外围电路、行驱动器组、列驱动器组和液晶驱动偏电压电路组成。

T6963C是一种内置控制器的图形LCD,其面向显示存储器的引脚有8根数据线(D7~D0)、16根地址线(AD15~AD0)和4根控制线,最多能管理64KB大小的显示存储器。T6963C将显示存储器分成3个区,分别是文本显示缓冲区、图形显示缓冲区和字符产生器RAM(CGRAM)区。 采用图形显示方式时,液晶屏显示单元的单位是8&TImes;1点阵(称为一个图形显示单位)。每个图形显示单位对应图形显示缓冲区中的一个存储单元。将点阵状态信息写入这个存储单元,则对应的位置就会显示出图形。

采用文本显示方式时,液晶屏显示信息的单位是8&TImes;8点阵(称为一个文本显示单位)。每个文本显示单位对应文本显示缓冲区中的8个连续存储单元。但采用文本显示方式时,写入文本显示缓冲区的不是点阵状态信息,而是字符代码,其点阵状态信息(8&TImes;8)(即字模)存放在CGRAM中。当8&TImes;8的点阵不足以描述一个符号时,则通常用多个字符的组合来描述。例如,一般采用16×16的点阵来描述汉字,将该点阵分为4个8×8的点阵,用4个字符代码描述一个汉字,根据这4个部分的位置关系将4条代码写入相应的文本显示缓冲区。T6963C片内还包含一个字模库CGROM,固化了数字、英文字母和常用符号等128个字符的点阵状态信息。

系统硬件结构 1. 处理器 本文系统中的处理器选用的是ARM7系列AT91SAM7S64,该器件具有64KB的高速Flash、16KB的SRAM以及丰富的外设资源,因而可以给系统设计提供强大的硬件支持。它包含的主要功能单元是: PDC(Peripheral Data Controller,外设数据控制器),可以通过该控制器管理SPI接口和串口。串口作为本系统各部分之间通信的主要手段,而SPI接口作为ARM处理器和A/D、D/A模块之间通信和控制的主要手段。 AIC(Advanced Interrupt Controller,先进中断控制器),可以通过该控制器产生计时器中断和串口中断,计时器中断可作为本系统分时作业编程的主要手段,而串口中断是数据通信的处理手段。

PIOA(Parallel Input/Output Controller,并行输入/输出控制器),可以通过该控制器管理ARM系统的各个设备,同时本系统也使用PIOA来控制LCD。 其它功能单元包括看门狗、电源控制器等。可以通过编程对这些控制器进行管理,在IAR开发环境下采用C语言进行编程,并通过JTAG调试接口下载到板上FLASH中运行调试。

2. 液晶屏连接方式 T6963液晶显示模块与处理器的连接方式通常有两种:直接访问方式和间接控制方式。

直接访问方式是指处理器以访问存储器或I/O设备的方式控制液晶控制模块工作,模块的数据线与处理器的数据总线连接,片选及寄存器选择由处理器的地址总线提供,读和写操作由处理器的读写操作信号控制;而在间接控制方式中,处理器通过自身或系统的并行接口与液晶控制模块相连,处理器通过I/O接口的操作间接实现对模块的控制。 本系统采用的是直接访问方式,如图1所示。使用ARM处理器AT91SAM7S64的引脚完全可编程和复用功能,以4路模拟显示模块控制信号,8路作为数据线。这样即充分发挥了T91SAM7S64处理器功能强大、资源丰富的优点,又简化了控制并易于实现编程。

 

1_副本.jpg

 

图1:ARM与LCD的接口示意图

软件实现 本系统对图形显示方式进行编程。图形显示方式可显示任何形状的图形(包括字符),在该方式下,T6963C还可以提供对“位”的操作,即通过命令控制液晶屏上的任意一点是否显示。每个点的显示状态用一位二进制信息表示,当这一位信息为“1”时显示屏上相应的点就显示,为“0”时则不显示。 但由于本设计中采用的是32位ARM处理器,而不是8位的51系列,因此在直接控制方式下的编程过程中,应注意数据的对应关系。 1. T6963指令集及时序 T6963拥有一系列操作指令,通过这些指令可以实现对显示屏的控制。在设计过程中,根据T6963的指令系统以及时序信号波形图等进行编程。T6963指令系统见表1。液晶显示模块的控制引脚和读写信号的控制关系如图2所示。

 

2_副本.jpg

 

表1:T6963指令表

 

3_副本.jpg

 

图2:T6963信号时序图

2. 程序流程图

通常液晶显示编程的过程是:首先编写状态查询、写指令、写数据、读数据等子程序;然后编写清屏、画点等基本子程序;在此基础上编写程序以显示字符、数字、汉字及复杂的图形等。每条指令的执行都是先送入参数,再送入指令代码,因此每次操作之前最好先进行状态字检测。 通过对内置T6963点阵式液晶显示的软件设计,可以发现该液晶显示控制模块的控制语句简单、调试方便。T6963C内部通过一根地址线来确定两个寄存器,当地址线为低电平,选择DATA寄存器;当地址线为高电平,则选择COMMAND/STATUS寄存器。在对T6963C发送每条指令或参数前,必须先读取COMMAND/STATUS寄存器以检查T6963C的状态字。状态字节的含义如下: STA0:1/0,指令读写状态为准备好/忙;

STA1:1/0,数据读写状态为准备好/忙;

STA2:1/0,数据自动读状态为准备好/忙;

STA3:1/0,数据自动写状态为准备好/忙;

STA4:未用;

STA5:1/0,控制器运行检测可能/不能;

STA6:1/0,屏读/拷贝状态为出错/正确;

STA7:1/0,闪烁状态检测为正常显示/关显示。 由于各状态位的含义不同,因此在不同的场合应检测不同的状态位。在CPU对T6963C中每一字节的指令或数据进行读写前,应先将STA0和STA1同时置为“准备好”状态。T6963C模块的控制指令可带有0个、1个或2个参数。在执行每条指令时都是先送入参数(如果有的话),再送入指令代码。当向T6963C读、写数据或写入命令时,必须严格遵循T6963C的时序。如果送入的参数多于规定个数,则认为最后一次送入的有效。每次操作之前必须先进行状态字检测。

 

4_副本.jpg

 

图3a给出了显示操作的流程框图

图3:(a) 显示操作流程框图;(b) 双参数指令传输过程。 以上每个步骤又需要完成以下流程:对于无参数或自动指令,以上过程仅执行1次,单参数指令需执行2次,而双参数指令则需执行3次(前2次传参数,最后1次传指令)。图3b以双参数指令为例给出了指令传输过程。 检测程序如下: //指令、数据读写状态检查 void RWCheck()

{

unsigned int dat = 0;

do

{

*AT91C_PIOB_CODR=CS;

*AT91C_PIOA_ODSR = DATA_BUS;

*AT91C_PIOB_SODR = A0;

*AT91C_PIOB_CODR = RD;

delay_bus();

dat=*AT91C_PIOA_PDSR;//读出当前PIO管脚状态

dat = 0x00600000&dat;//取出需要的数据位,看STA0,STA1是否准备好

delay_bus();

*AT91C_PIOA_SODR = RD;

delay_bus();

*AT91C_PIOA_SODR=CS;

} 3. 汉字显示 以本系统的显示模块LCM240128为例,液晶显示屏上横向的8个点是一个字节数据,某位为1则对应点变亮,对于240×128的显示模块来说,每行为240点,每列为128点。每个字节在显示缓冲区中均有对应的地址,液晶屏幕的左上角横向8个点对应液晶模块显示缓冲区的首地址。最常见的显示方式有两种,以常用的16×16点阵汉字为例,一种是先将左半部16个字节写入显示缓冲区,再写入右半部的16个字节;另一种则先写入上半部的16个字节,再写入下半部的16个字节。然后单片机通过接口电路,按照规定的时序将待显示汉字字模的所有字节按液晶控制器规定的方式,在预定位置写入液晶控制器缓冲区。程序如下: void ShowHZ(unsigned int lin,unsigned int column,unsigned int hzcode)

{

unsigned char i;

unsigned int StartAddr = 0;

StartAddr=lin*LineChar column; //定位起始行

for(i=0;i《16;i )

{

OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr》》8), 0x24);

OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一

OutPortCom2( HZTable[hzcode][i*2 1], 0xc4); //右半部 字模地址加一

StartAddr=StartAddr LineChar;

}

} 4. 图形显示 固定格式的图形图像显示与在图形方式下显示汉字类似,即先确定点阵信息,再送入显示位置对应的缓冲区中。

实际上,每个汉字都是一幅图像,只是在处理坐标数据时有所不同。与汉字显示的主要区别是:图形显示中数据需逐点生成并按一定算法逐点送入缓冲区单元;为获得良好的显示效果,标准图元(直线、圆、椭圆等)可利用图形学中的某些生成算法。由于硬件要求一次扫1行,因此必须先找到该点所在的行地址,然后在字节内计算点的位置,将该位置1;若是擦除,则将该位置0。画点是实现其它图形的基础,利用画点程序,只需按照图形学算法控制坐标变量x、y并移位,然后逐一画点,就能组成任何图形。

5. 动态显示 当动态显示图形时,用T6963C控制器的命令和功能编程,获得变参数的各种基本图形函数,以显示不同的图形,在动态图形显示之前将固定的图形采用屏拷贝方式保存下来,动态图形显示结束时恢复原来的图形。汉字字符和数字字符的固定显示在初始化过程中完成,动态显示则直接用覆盖的方式完成。 无论汉字、数字、英文字符或图形,液晶显示控制器都视为在规定区域根据给定数据控制各个点的显示,它们的显示控制原理并没有本质区别,这样在编程时就可以将所有显示内容都当作图形处理。

驱动程序采用C语言编写,具有模块化的结构和代码可移植性,且通用性较好。

本文小结 采用点阵式图形液晶显示模块将使显示更直观、界面更丰富。直接访问方式的驱动程序比间接控制方式更精简一些,程序的运行效率也较高。本文中的程序采用C语言编写,通用性强、移植方便。该方法及程序在系统显示部分中,显示清晰、工作稳定。具有模块化结构和代码可移植性,且通用性较好,在嵌入式系统中有一定代表性和广泛用途。

怎样写 Linux LCD 驱动程序:

基本原理

通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来;

驱动程序分配系统内存作为显存;实现 file_operations 结构中的接口,为应用程序服务;实现 fb_ops 结构中的接口,控制和操作 LDC 控制器;

驱动程序将显存的起始地址和长度传给 LCD 控制器的寄存器 (一般由 fb_set_var 完成) , LDC 控制器会自动的将显存中的数据显示在 LCD 屏上。

写 framebuffer 驱动程序要做什么

简单的讲,framebuffer 驱动的功能就是分配一块内存作显存,然后对 LCD 控制器的寄存器作一些设置。

具体来说:

填充一个 fbinfo 结构

用 reigster_framebuffer (fbinfo*) 将 fbinfo 结构注册到内核

对于 fbinfo 结构,最主要的是它的 fs_ops 成员,需要针对具体设备实现 fs_ops 中的接口

考虑是否使用中断处理

考虑内存访问方式

显卡不自带显存的,分配系统内存作为显存

显卡自带显存的,用 I/O 内存接口进行访问 (request_mem_region / ioremap),

关于LCD 设备资料可参考如下资料:

Datasheet of LCD device

书:液晶显示技术

书:液晶显示器件

什么是 frame buffer 设备

frame buffer 设备是图形硬件的抽象,它代表了图形硬件的侦缓冲区,允许应 用程序通过指定的接口访问图形硬件。因此,应用程序不必关心底层硬件细节。

设备通过特定的设备节点访问,通常在 /dev 目录下,如 /dev/fb*。

更多关于 frame buffer device 的资料可以在以下两个文件中找到: linux /Documentation/fb/framebuffer.txt 和 linux /Documentation/fb /interal.txt,但这些资料内容不多,还需要看看结合代码具体分析。

Linux Frame Buffer 驱动程序层次结构

Frame Buffer 设备驱动可以从三个层次来看:

应用程序与系统调用;

适用于所有设备的通用代码,避免重复,包括 file_operations 结构、register/unregister framebuffer 接口等;

操作具体硬件的代码,主要是 fs_ops 结构。

在 Linux 内核中,Frame Buffer 设备驱动的源码主要在以下两个文件中,它们 处于 frame buffer 驱动体系结构的中间层,它为上层的用户程序提供系统调用, 也为底层特定硬件驱动提供了接口:

linux/inlcude/fb.h

linux/drivers/video/fbmem.c

数据结构

头文件 fb.h 定义了所有的数据结构:

fb_var_screeninfo:描述了一种显卡显示模式的所有信息,如宽、高、颜色深度等,不同的显示模式对应不同的信息;

fb_fix_screeninfo:定义了显卡信息,如 framebuffer 内存的起始地址,地址长度等;

fb_cmap:设备独立的 colormap 信息,可以通过 ioctl 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令设置 colormap;

fb_info:包含当前 video card 的状态信息,只有 fb_info 对内核可见;

fb_ops : 应用程序使用 ioctl 系统调用操作底层的 LCD 硬件,fb_ops 结构中定义的方法用于支持这些操作;

这些结构相互之间的关系如下所示:

framebuffer 驱动主要数据结构

接口

fbmem.c 实现了所有驱动使用的通用代码,避免了重复。

全局变量:

struct fb_info *registered_fb [FB_MAX]

int num_registered_fb;

这个两个变量用于记录正在使用的 fb_info 结构实例。fb_info 代表 video card 的当前状态,所有的 fb_info 结构都放在数组中。当一个 frame buffer 在内核中登记时,一个新的 fb_info 结构被加入该数组,num_registered_fb 加 1。

fb_drivers 数组:

static struct {

const char *name;

int (*init)(void);

int (*setup)(void);

} fb_drivers[] __initdata= { 。。。。};

若 frame buffer 驱动程序是静态链接到内核中,一个新的 entry 必须要加到这个表中。 若该驱动程序是使用 insmod/rmmod 动态加载到内核,则不必关心这个结构。

static struct file_operations fb_ops ={

owner: THIS_MODULE,

read: fb_read,

write: fb_write,

ioctl: fb_ioctl,

mmap: fb_mmap,

open: fb_open,

release: fb_release

};

这是用户应用程序的接口,fbmem.c 实现了这些函数。

register/unregister framebuffer:

register_framebuffer(struct fb_info *fb_info)

unregister_framebuffer(struct fb_info *fb_info)

这是底层 frame buffer 设备驱动程序的接口。驱动程序使用这对函数实现注册和撤销操作。底层驱动程序的工作基本上是填充 fb_info 结构,然后注册它。

一个 LCD controller 驱动程序

实现一个 LCD controller 驱动程序主要做如下两步:

分配系统内存作显存

根据具体的硬件特性,实现 fb_ops 的接口

在 linux/drivers/fb/skeletonfb.c 中有一个 frame buffer 驱动程序的框架,它示例了怎样用很少的代码实现一个 frame buffer 驱动程序。

分配系统内存作为显存

由于大多数 LDC controller 没有自己的显存,需要分配一块系统内存作为显存。 这块系统内存的起始地址和长度之后会被存放在 fb_fix_screeninfo 的 smem_start 和 smem_len 域中。该内存应该是物理上连续的。

对于带独立显存的显卡,使用 request_mem_region 和 ioremap 将显卡外设内存映射到处理器虚拟地址空间。

实现 fb_ops 结构

目前还没有讨论的 file_operations 方法是 ioctl ()。用户应用程序使用 ioctrl 系统调用操作 LCD 硬件。fb_ops 结构中定义的方法为这些操作提供支 持。注意, fb_ops 结构不是 file_operations 结构。fb_ops 是底层操作的抽 象,而 file_operations 为上层系统调用接口提供支持。

下面考虑需要实现哪些方法。ioctl 命令和 fb_ops 结构中的接口之间的关系如 下所示:

 

5_副本.jpg

 

FBIOGET_VSCREENINFO fb_get_var

FBIOPUT_VSCREENINFO fb_set_var

FBIOGET_FSCREENINFO fb_get_fix

FBIOPUTCMAP fb_set_cmap

FBIOGETCMAP fb_get_cmap

FBIOPAN_DISPLAY fb_pan_display

只要我们实现了那些 fb_XXX 函数,那么用户应用程序就可以使用 FBIOXXXX 宏 来操作 LDC 硬件了。那怎么实现那些接口呢?可以参考下 linux/drivers/video 目录下的驱动程序。

在众多接口中, fb_set_var 是最重要的。它用于设置 video mode 等信息。下 面是实现 fb_set_var 函数的通用步骤:

检查是否有必要设置 mode

设置 mode

设置 colormap

根据上面的设置重新配置 LCD controller 寄存器

其中第四步是底层硬件操作。

换一批

延伸阅读

[新鲜事] Linux Steam Beta 版将会在十月封测

Linux Steam Beta 版将会在十月封测

Valve 旗下的 Steam 一直以来都是 Windows 的好伙伴,不过他们的创办人 Gabe Newell 早前曾经高调说过:「Windows 8 是一场灾难」,并会将 Steam 平台移植到 Linux 作为「避险策略」。直到现在......

关键字:Linux Steam Beta 封测

[新鲜事] 针对 Linux 的木马程序Wirenet出现

针对 Linux 的木马程序Wirenet出现

以往Linux其中一个卖点是“没有病毒”,然而Linux日益普及却令它也开始成为恶意程式的目标。根据俄罗斯保安方案开发商Dr Web的报告、继 Mac OS X之后,在Linux也发现了意图取得用户密码的木马程序。 ......

关键字:Wirenet Linux 木马 程序

[真心话] Windows、Linux、OS X 版 Opera 12.10 正式发布:支持 Windows 8 触控、Retina 屏幕、SPDY 协议

Windows、Linux、OS X 版 Opera 12.10 正式发布:支持 Windows 8 触控、Retina 屏幕、SPDY 协议

Opera 日前正式在 Windows、Linux、OS X 三大平台上推出了 12.10 版本。作为 Opera 12 的后续版本,Opera 12.10 新加入了对 OS X 通知中心、Retina 屏幕、Windows 8 触控......

关键字:Windows Retina Linux 12.10

[新鲜事] 最奇闻:使用Mac和Linux系统的脑部结构不一样

最奇闻:使用Mac和Linux系统的脑部结构不一样

美国一项最新研究表明,进行脑部扫描的时候,使用不同的PC软件和平台会呈现不一样的脑部结构。该研究用一款 FreeSurfer 的图像工具分析了30幅大脑 MRI 扫描图像, 图像主要来自Mac和Linux用户。根据使用Mac系统还是Li......

关键字:Linux Mac 系统

[真心话] 神技能get:实现1秒启动Linux?

神技能get:实现1秒启动Linux?

尽可能快的启动系统,对于自动化设备是非常重要的。系统能够在用户无法感知的时间内启动,也就意味着在不需要工作时,可以完全切断电源,而不是挂起进入休眠状态。本文基于Atmel AT91系列片上系统和NAND闪存,经过一......

关键字:Linux 自动化设备 启动 系统

[新鲜事] CentOS系统宣布为ARM(armhfp)硬件架构发布CentOS Linux 7(1611)镜像

CentOS系统宣布为ARM(armhfp)硬件架构发布CentOS Linux 7(1611)镜像

今天,CentOS系统开发人员Fabian Arrotin非常高兴的宣布为ARM(armhfp)硬件架构发布CentOS Linux 7(1611)镜像。该GNU/Linux发行版本深受单板计算机和嵌入式设备的喜爱,支持树莓派3、树莓派2、......

关键字:ARM CentOS Linux

[新鲜事] Linux内核修复Ryzen线程数目识别错误,多线程性能将会飙升

Linux内核修复Ryzen线程数目识别错误,多线程性能将会飙升

Linux已经在官网发布最新的内核修复这一问题,预计Ryzen 7处理器又能纵横在Linux系统上。......

关键字:Linux内核 Ryzen 多线程

[新鲜事] Windows、Mac、Linux 3 版 Skype 更新齐发

Windows、Mac、Linux 3 版 Skype 更新齐发

在今天一天内 Windows、Mac、Linux 3 个平台上的 Skype 都获得了更新。在 Windows 版本中 UI 得到了一些改进,包括可以将联系人「钉」到联系人列表顶部、在配置较差的电脑上加入了影像渲染的反向兼容性以及更好的 ......

关键字:Windows Linux Skype Mac

[猎聘集] 全世界最成功的程序员:远见卓识会毁了Linux

全世界最成功的程序员:远见卓识会毁了Linux

Linux发明者称,正因为我不知道它将来会怎样,所以我对别人的建议和影响才表现得格外开放。......

关键字:程序员 Linux 开源

[新鲜事] Valve老大G胖:支持Linux因Win8是个灾难

Valve老大G胖:支持Linux因Win8是个灾难

华尔街日报》旗下科技博客AllThingsD报道,昨日Valve老大Gabe Newell出席了由Google风投等私募公司在西雅图举行的一场晚宴,期间和前微软游戏发行部门副总裁Ed Fries谈到了他近期对业界一些的看法。Valve在上周......

关键字:Valve Linux Win8

[新鲜事] Twitter 成为 Linux 基金会新成员

Twitter 成为 Linux 基金会新成员

继英伟达和三星之后,Twitter 日前宣布他们也将于本周在加州举行的北美站 LinuxCon 大会上正式成为 Linux 基金会的成员(英特尔、IBM、Google 等:「鼓掌欢迎!」)。Twitter 的开源业务经理 Chris An......

关键字:Twitter Linux 基金会

[新鲜事] Linux基金会:3-5年经验的Linux人才最吃香

Linux基金会:3-5年经验的Linux人才最吃香

就业市场回暖的节奏仍然十分缓慢,不过IT就业市场的表现则始终领先于其它行业。大家觉得如今哪类技术领域对IT雇员的需求量最大?没错,正是Linux。根据Linux基金会与Dice共同发布的调查报告,通过对来自全球各地的大......

关键字:Linux 基金会 经验
条评论

我 要 评 论

网友评论

大家都爱看

  • 华为的优势,就是自家的各种自研芯片

    CPU即中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

    2017-08-16
  • 你不知道Ryzen芯片有多火?来看看AMD的股票吧

    据外媒报道,美银美林认为,AMD最新的Ryzen芯片可能会引发一波销售浪潮,进而推动该股继续上涨。它认为AMD股票还有40%以上的上涨空间。

    2017-08-16
  • 国产芯片:厚积薄发,强势崛起

    关于国产芯片,是近几年才有崛起的势头,可是在几年之前,国产芯片还处于“沉睡”的状态,尤其是手机芯片,几乎大部分都依赖进口,而且国外的市场几乎被高通和联发科所垄断,也就展讯还在市场边…

    2017-08-16
  • 为了数据安全 大疆无人机增加隐私飞行功能

    大疆周一表示,在美国陆军因为“网络缺陷”而要求其成员停用大疆无人机后,这家中国无人机制造商将加强无人机的数据安全性。 大疆政策和法务副总裁布伦丹&middot…

    2017-08-15
  • Intel代工 展讯发布14nm SC9853I手机SoC

    SC9853I采用的Intel的14nm FinFET制程,架构为8核64位Airmont架构,主频1.8GHz,GPU为Mali-T820 MP2,号称面向799~1299元档次的手机。…

    2017-08-15