嵌入式Linux工控板EM9160主要应用之一就是可以作为智能终端的核心平台,智能终端总是带有一种显示单元。EM9160作为一种高效、低成本的产品解决方案,专门针对小型的单色LCD显示模块(分辨率通常在128×64至320×240),在嵌入式Linux下完成了LCD驱动程序,以实现对LCD屏读写操作,驱动程序可以实现直接对硬件访问、操作的功能,从而可以大大地加快了LCD屏的显示速度。
嵌入式Linux下LCD驱动简介
在嵌入式Linux环境下,LCD的驱动已自动加载,其设备文件名为“/dev/em9x60_lcd”。应用程序通过调用5个IOCTL命令来实现对于LCD屏的操作。
EM9X60_LCD_IOCTL_TYPE: 用于设置LCD屏类型。
EM9X60_LCD_IOCTL_LINE: 图形方式的操作,包括画点、画线以及画Bar条。
EM9X60_LCD_IOCTL_BLOCK:数据块显示操作,主要用于字模的显示。
EM9X60_LCD_IOCTL_CLEAR:清屏操作。
EM9X60_LCD_IOCTL_UPDATE:用于刷新LCD屏数据。
针对于画点、画线、画Bar条命令EM9X60_LCD_IOCTL_LINE需要用到以下结构:
struct lcd_line
{
unsigned int type; // = 0: point; = 1: line; = 2: bar
unsigned int x0;
unsigned int y0;
unsigned int x1;
unsigned int y1;
unsigned int color; // = 0: write ‘0’; = 1: write ‘1’, = 2: xor operation
};
数据块显示操作命令EM9X60_LCD_IOCTL_BLOCK会用到struct lcd_block结构,该结构中的数据data[16]中每个data[n] 值是按照x方向排列的,x 方向的大小最多为8个bit;数据data[0] ~ data[15]是按照y方向排列的,一次最多写16个字节大小的数据。这种数据块结构可应用在写字模,或是公司专用图形LOGO上。
struct lcd_block
{
unsigned int x0;
unsigned int y0;
unsigned int xsize; // = 1 – 8; left alignment
unsigned int ysize; // = 1 – 16;
unsigned char data[16]; // block data to be copied
};
如写一个汉字字模为16X16点阵的数据,汉字模为ffont[32],可以用如下代码来实现:
LCD_WriteByteBlock( x, y, ffont, 16 );
LCD_WriteByteBlock( x+8, y, &ffont[16], 16 );
intLCD_WriteByteBlock( int x, inty, unsigned char* hfont, intNumOfBytes )
{
int rc;
unsigned int cmd;
structlcd_block block;
inti1;
block.x0 = x;
block.y0 = y;
block.xsize = 8;
block.ysize = NumOfBytes;
for( i1=0; i1<NumOfBytes; )
{
block.data[i1]= hfont[i1];
}
cmd = EM9X60_LCD_IOCTL_BLOCK;
rc = ioctl(lcd_fd, cmd, &block );
if(rc < 0)
{
return rc;
}
return rc;
}
LCD应用API函数简介
为了方便客户的使用,在基于em9x60_lcd驱动基础上设计了一套通用的汉字及图形显示接口函数,这些函数均定义在LCD_API.H中。LCD_API函数提供了一系列对LCD屏进行画点、画线、画Bar条以及字符串(包括汉字和西文)显示的接口函数,一共包括了11个函数,关于各个函数的定义说明,可以参见LCD_AP.H头文件中的中文注释。其中的汉字支持为标准一级全汉字,为16×16点阵字模或12×12点阵字模,西文(字母、数字和符号)为8×14点阵字模,这两个字模文件分别为cclib、cclib12.fnt、ascii.chr,放置在EM9160工控板的根文件系统“/lib”目录中。
目前支持的LCD屏类型包括有:
LCD控制器类型 | 显示分辨率 | 简要说明 |
KS0108 | 128×64 | 最常用的LCD模块 |
T6963C | 240×128 | 具有较大的显示窗口 |
SED1335 | 320×240 | |
KS0108 | 192×64 | |
UC1698U | 160×160 | 电力集抄终端标准显示屏 |
在头文件LCD_API.H中的对应定义如下。
#define LCD_12864 1 // LCD 128×64 KS0108控制器
#define LCD_240128 2 // LCD 240×128 T6963C控制器
#define LCD_320240 3 // LCD 320×240 SED1335控制器
#define LCD_19264 4 // LCD 192×64 KS0108控制器
#defineLCD_160160 5 // LCD 192×64 UC1698U控制器
经过测试LCD的显示速率得到了大大的提高,以下为常用的两种LCD显示速率:
LCD控制器类型 | 显示分辨率 | 清屏速率 | 满屏字符显示速率 |
T6963C | 240×128 | 10ms | 20ms |
UC1698U | 160×160 | 9ms | 12ms |