摘要:通过对ARM11嵌入式系统Linux下的实时网络通信和LCD显示进行研究,分析了网络通信协议和LCD驱动方式。在ARM11嵌入式系统下设计了直接读写GPIO的LCD显示程序,并实现网络终端服务器和客户端双线程的工作模式,解决了网络通信实时性和可靠性的问题。实际应用表明:该方法LCD显示速度快、网络通信实时性强可靠性好、ARM11和计算机的资源利用率高。
关键词:ARM11;实时网络通信;LCD;Linux
引言
ARM11主频为533 MHz,最高可达667 MHz,较ARM7主频提高了10倍,且拥有更丰富的片上资源,处理速度更快,功能更强。基于上述特点,ARM11可完全适应实时性较强的网络终端的设计。
在以ARM11为核心的网络终端设计中,需要LCD在终端实时显示网络通信的各项参数和设备工作状态,LCD的显示内容依靠网络传输数据中的指令来控制,而网络终端的操作数据也要通过网络传输到计算机,因此网络通信和LCD显示需要很强的实时性才能合理使用计算机和ARM11的资源,从而提高系统的运行效率。
该文以ARM11处理器S3C6410为平台,基于Linux操作系统设计了一种在ARM11内核直接控制LCD显示的方法,并采用TCP/IP协议设计了一种同时作客户端和服务器的终端工作模式。
1 ARM11网络终端实时通信特性分析
1.1 数据流分析
在计算机与ARM11通信的系统中,计算机的处理速度比ARM11快很多,如将数据处理等工作量大的任务分配给计算机去处理,则可大大减少ARM11的资源消耗,ARM11就可以更快地去响应其他操作,因此为了减少ARM11显示任务的时间,可以将ARM11要显示图片的数据处理交给计算机,计算机按照ARM11显示的数据要求处理好数据后再通过网络传到ARM11再完成LCD的显示。此外,ARM11网络终端还要向计算机传输设备工作状态信息,计算机则还要向网络终端传输一些控制命令。
1.2 通信协议分析
网络通信必然涉及到通信协议的问题,目前普遍采用的网络协议有UDP协议和TCP/IP协议。在实时性要求较高的网络通信中希望能做到想发就发,有数据就收。两个协议中UDP比较符合这个要求,但是它不能保证数据传输的有效性,当数据较多时很可能会发生严重的丢包现象,尤其是像LCD显示的图片数据这类数据较大而且传输频繁的数据,可能会严重影响液晶显示这是不能被接受的。相比之下TCP/IP协议能够保证数据传输的有效性。
在TCP/IP协议ARM11网络终端作为服务器或者客户端是不能做到随时想发就发,有数据就收的,比如作为服务器接收完来自计算机的数据后,如果计算机断开了连接,那么网络终端再想向计算机发送数据,就必须等到计算机再次作为客户端向终端发起连接才行。为了解决TCP/IP协议的这种问题,本文设计了网络终端和计算机既作客户端又作服务器的双线程工作模式,在这种工作模式下终端和计算机随时能发起和断开连接,从而做到随时想发就发,有数据就收。
2 LCD显示的软件设计
2.1 LCD的显示方法分析
(1)基于Framebuffer驱动方式。在Linux下有完善的Framebuffer驱动程序,所以可以利用ARM11集成的LCD控制器采用Framebuffer控制LCD,Framebuffer是显示设备抽象为帧缓冲区,用户通过内存映射将其映射到进程地址空间之后,就可以直接进行读写操作,而操作可以直接反应到屏幕上。该方法反应速度快、执行效率高,应用程序简单,但是底层硬件驱动复杂,硬件变更后编写难度大,不易实现。不带控制器的LCD通常采用这种方法。
(2)直接读写GPIO驱动方式。目前有很多类型的液晶屏自带LCD控制器,ARM向控制器写控制指令和数据就可以完成对LCD的初始化和内容的显示。这种显示方法软件设计相对简单,占用的代码空间小,可以通过简单的控制芯片进行驱动。针对自带控制器的LCD,本文设计了直接读写GPIO驱动LCD的方法。该方法在底层驱动向LCD控制器和LCD的应用程序提供接口,LCD控制器的读写时序全部在底层驱动中完成,底层驱动向应用程序提供初始化接口和显示数据接口。该方法应用程序和内核的交互少,程序执行效率高。
2.2 LCD显示的实现
通过上述分析,本文设计直接读写GPIO驱动带LCD控制器的液晶屏,该方法的程序结构如图1所示。
在底层驱动中主要包括以下几个函数:
(1)初始化函数s3c6410_inti。该函数包括2部分的初始化:一是对ARM11用于同LCD控制器相连GPIO口控制寄存器的初始化,核心语句是writel(tmp,S3C64XX_GPICON),其中writel是驱动层的写函数,tmp是写入控制寄存器的数据,S3C64XX_GPICON是S3C6410中第I组GPIO口的控制寄存器,如果采用别的GPIO口就改用别的控制寄存器宏定义;二是对LCD控制器初始化。
(2)写数据函数s3c6410_WRData和写命令函数s3c6410_WRCommand。这2个函数按照具体LCD控制寄存器的写数据时序和写命令时序,完成对LCD控制器的写数据和写命令,向GPIO写数据的函数是writel(tmp,S3C64XX_GPIDAT),writel和tmp与上述相同,S3C64XX_GPIDAT是S3C64 10中第I组GPIO口的数据寄存器。
(3)显示函数s3c6410_LCDdisplay。该函数通过调用写命令函数和写数据函数到达在液晶屏上具体位置显示具体图片或文字的效果。
(4)系统调用接口函数s3c64xx_ioctl(structfile*file,int cmd,long int data)。该函数定义s3c6410_inti和s3c6410_LCDdisplay2个函数接口通过系统调用iotcl(fd,1,xx)和iotcl(fd,2,xx),以供应用程序调用,应用程序使用iotcl(fd,1,xx)就可初始化结晶屏,只需要向s3c6410_LCDdisplay的接口iotcl(fd,2,xx)中写数据就实现了数据的LCD显示。