基于ARM9和Linux的嵌入式打印终端系统
1 嵌入式打印终端系统 的设计原理
嵌入式打印终端原理连接图如图1所示。主要由开发板、主机、打印机和扫描仪四部分组成。主机是一台PC机。开发板采用的是三星公司S3C2410开发板,ARM9的核,跑的是2.4内核版本的嵌入式Linux操作系统。扫描仪为超市等用的手持扫描仪。再加一台微型打印机接在开发板的GPIO口上。
工作流程为:开发板将扫描仪的数据从串口读出,然后通过网口将数据发送给主机进行检索处理。开发板等待直至接收到主机处理完毕的数据后转发给打印机,将信息打印出来。
2 嵌入式打印终端系统的硬件设计
2.1硬件开发平台S3C2410结构
三星公司的S3C2410开发板用的是32位RISC架构基于ARM920T核,其增强的MMU单元、AMBA总线,可以支持WinCE、 Linux等实时操作系统。片上资源丰富接口众多,包含LCD控制器、USB Host、CS9800A网络芯片、SD卡、3个UART通用异步串行口等设备接口。[1]
2.2打印机与开发板接口电路的设计
我们使用的微型打印机使用的是并行接口。由于开发板上没有提供并口,所以必须自己设计一个板卡接口电路,以连接打印机的并口和我们的嵌入式开发板。查看S3C2410的电路原理图,由于此系统不需要用到LCD屏,可以将板子上用于LCD连接的GPIO口进行改造,根据ARM9core的LCD电路引脚和板上的LCD插槽定义,如图2,找到了14根空闲的GPIO口:
gpio_c8~gpio_d15,gpi0_d0~gpio_d4。用这14根通用输入输出口连接微型打印机的并口。
同时查看打印机的电路手册和管脚定义,选用其STB选通线、ACK回答脉冲线、BUSY线、DATA0-DATA7数据线来与开发板的GPIO口相连,并初始化高低电平值。为了避免接线过紧互相干扰,制作一个接口板定义各引脚连接如图3所示。
至此,硬件的电路设计及连接基本完成。
3嵌入式打印终端系统的软件设计
软件平台采用的是基于2.4内核的嵌入式Linux系统。采用的交叉编译器工具包为CROSS2.95.3.tgz(包含arm-linux-gcc等)。
3.1 打印机驱动的编写
Linux的设备分为块设备,字符设备和网络设备,该系统使用到的微型打印机属于字符设备,下面将具体说明如何设计打印机驱动。
3.1.1 定义设备名
#define DEVICE_NAME weida_printer
3.1.2 模块函数设计
在该系统中,采用模块化加载驱动程序的方法,因此必须实现模块的初始化函数和卸载函数。采用devfs方式注册打印机。
初始化函数weida_init通过devfs_register函数向系统注册设备。
函数原型devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, 0, 0, S_IFCHR | S_IRUSR | S_IWUSR, weida_printer_fops, NULL);
其中,DEVICE_NAME为主设备名,weida_printer_fops为定义的一个数据结构,用来实现的文件操作,包括open、close、write等。
3.1.3 初始化打印端口
初始化打印机第一个要做的事情就是要对GPIO口进行初始化,初始化函数如下:
static void weida_init(void){
devfs_register(); /*注册设备驱动*/
set_gpio_ctrl(WEIDA_STB|GPIO_PULLUP_DIS|GPIO_MODE_OUT); /*设置STB口*/
write_gpio_bit(WEIDA_STB,1);
weida_printer_io_port_init();
/*设置其它IO口,以及赋初值*/ }
其中,WEIDA_STB为连接打印机选通口初始化为高电平,GPIO_PULL_DIS是设置是否需要上拉电阻,GPIO_MODE_OUT 设置GPIO口为输出口。最后使用module_init(weida_printer_init);采用模块方式加载驱动。[2]
3.1.4 接口函数设计
ioctl()函数主要完成打印机字体、行距等参数的设置,在设计过程中必须解决用户数据和内核数据之间如何传递。从用户态读取数据,然后在内核态运行,可以使用copy_from_user函数来完成传递数据。
weida_printer_write ( )先对打印机是否在线,是否忙,是否准备好做进一步的判断,然后再进行打印。在打印的时候要注意每发一个字符要延迟150毫秒,因为如果打印数据发得过快打印机的来不急处理,所以要设置延时。
open/close函数打开/关闭文件,因为在LINUX下设备都是当作文件来操作的,所以需要open和close这两个接口函数。
3.2 扫描仪串口的设置
嵌入式移动打印终端中使用到的扫描仪是串口扫描仪,这种扫描仪相对于USB接口的扫描仪来说,控制较简单,在扫描仪扫描后,可以直接从串口读取数据。
3.2.1 串口设置[3]
设置串口速率函数:set_speed(int fd, int speed),其中fd 为打开的设备文件,speed为速率。
设置串口参数:set_parity(int fd,int databits,int stopbits,int parity),databits为有多少个数据位,stopbit为设置多少个停止位,parity为奇偶校验位设置。设置串口波特率为9600,数据位为8位,一位停止位,没有校验位。
3.2.2 编写读取扫描
终端 系统 打印 嵌入式 ARM9 Linux 基于 相关文章:
- 基于MSP430的新型自报式水文遥测终端机设计方案(05-23)
- 单片机实现嵌入式因特网终端的设计(05-25)
- 基于DSP的视频采集驱动程序的实现(07-21)
- 基于DSP的安全无线多媒体数字终端(03-03)
- 基于DSP的智能视频监控终端设计与优化研究(09-28)
- μC/OS-II在GPRS终端系统中的应用(04-06)