嵌入式系统Internet打印的设计与实现
扫描二维码
随时随地手机看文章
摘要:本文通过设计实例介绍了一种嵌入式网络打印的实现方案。该方案选用ATmega128为MPU、LAN91C111为网络控制器,以通用的SPP打印并口作为物理输出端口,硬件构成上具有典型意义。软件上精简了TCP/IP协议栈,完成了网络接口程序的设计,构建了嵌入式WEB服务器。在分析网络打印模型的基础上,实现了IPP网络打印协议的基本功能。
关键词:嵌入式系统;打印;IPP;LAN91C111
1 引言
随着嵌入式技术的发展,硬件的性价比越来越高。本文介绍了一种嵌入式系统网络打印的实现方案,把并口打印机连接到能执行IPP(Internet Printing Protocol)协议的嵌入式系统上,实现了网络打印。整个网络打印的模型如图1所示[1]。这种应用方案不仅可以整合到嵌入式系统中用来提供网络打印支持,也可以单独设计成一个嵌入式打印服务器,实现远程打印或对普通打印机提供打印共享支持。
图 1基于IPP协议的嵌入式网络打印模型 |
2 IPP因特网打印协议
IPP协议是由互联网工程任务组(IETF,Internet Engineering Task Force)于1997年提出来的,目前最高版本为1.1。操作系统Windows2000和Red Hat Linux8.0以上提供了对IPP协议的支持。IPP 协议基于客户机/服务器模式,客户在操作系统或应用程序中重定向打印服务到服务器的知名端口631,通过双方会话完成打印任务。客户查找打印机时,只要输入IPP打印机的网址便可获取远程打印机的列表。应用层协议IPP依赖于HTTP协议,双方的会话数据和打印数据嵌在HTTP数据体中完成的。双方会话时须使用POST方法,同时启用了新的Content-Type,即“application / ipp”,用来指出MESSAGE-BODY是IPP数据[2]。
3 硬件设计
本方案采用ATMEL 公司8位芯片中性能最高的ATmega128,以及SMSC公司的第三代10/100M以太网控制芯片LAN91C111。 两种芯片都是Little Endian字节顺序,且ATmega128是8位机,数据线可直接连接。如图2所示[3],外部采用单一的外总线结构,64K外部空间的低32K的分配给SRAM,另外的32K空间除了8个留给并行打印端口之外,其余地址取连续的16个分配给网卡使用。
LAN91C111工作电压是3.3V,但I/O口是5V电平,本方案使用了一片LM3940作电压转换。采用双绞线输出时,必须在RBIAS引脚接一个下拉偏置电阻。本方案LAN91C111没有外接EEPROM,将ENEEP接地,运行参数初始化时由用户通过主CPU写入[4]。
图 2 硬件原理图
对LAN91C111的操作通过其内部的寄存器读写进行。内部的寄存器分为BANK0-BANK3共四页,页面选择通过页选择寄存器(Bank Select register, BSR)来进行。不论当前页是哪一页,改变BSR的值就可以切换BANK,利用16个字节地址空间映射到I/O口就能实现对整个芯片的操作。
LAN91C111内部有一个8K的SRAM作为发送/接收缓存,由存储管理单元(Memory Management Unit, MMU)管理,方便了用户的编程,减少了主CPU的开销。8K的缓存固定分为4页,编号为0-3,每页为2K。以太帧最大为1518字节,每页完全可以存放一个以太帧。对发送和接收没有固定的分配页,其分配和释放可以通过写寄存器相应的位完成。
3.1 打印接口的设计
图 3 SPP打印接口原理图
Centronics并行口虽然速度较慢,但其SPP (Standard Parallel Port)模式控制方便,这是许多打印机都支持的接口模式。实验中用ATmega128的I/O口作打印数据传输线,其余的信号线最简洁的接法只需连接选通信号nSTB和忙信号BUSY[5]。本方案为节省硬件,只对打印机数据输出采用地址译码的控制方式。ATmega128不用的口线较多,可将打印机的缺纸、打印出错等信号状态线也接上。采用中断编程的方法时,要将nACK接到ATmega128的一根中断请求线上并设置为低电平中断。为避免损坏打印口,减少干扰,中间使用74HC244作为三态缓冲,具体应用时,应注意CMOS和TTL电平的匹配,原理图如图3所示。
4 软件设计
4.1 LAN91C111复位
可以通过两种方法使芯片(MAC&PHY)复位。一是将复位引脚置位至少100ns;二是将接收控制寄存器(Receive Control Register)的SOFT_RST位先写1,至少50ms后再写0使其复位。复位后,物理层模块处于隔离模式(Isolation Mode),芯片不能收发数据包,必须设置PHY层的串行口控制寄存器(Control Register)的MII_DIS位才能使芯片正常工作。
4.2 LAN91C111初始化
初始化发送控制寄存器,写入0x8010,打开自动填充符功能和自动添加CRC功能。初始化接收控制寄存器,写入0x0000,自动去除帧尾的CRC检验码。初始化接收/物理层控制寄存器(Receive/Phy Control Register, RPCR),设置为0X3010,选择自动侦察模式,两个LED分别设置成连接指示和收发指示。初始化配置寄存器,写入缺省值0XA0B1,本系统无外接E2PROM,使用内部物理层模块。初始化基址寄存器,采用缺省地址值300H。初始化芯片物理地址寄存器,此值不能和子网内其它设备重复。初始化控制寄存器,写入初值0x1A10,CRC校验有错时,不产生中断信号且所占用的缓存被自动释放, AUTO_RELEASE位置1。 初始化早期接收寄存器,去掉早期接收功能,设置ERCV寄存器ERCV_THRESHOLD位为1FH。只有接收的字节数超过阈值,早期中断才会产生。
4.3 以太帧的收发
4.3.1 以太帧的发送
发送和接收以太帧采用中断和查询方式都可以。以太帧的发送分为五步:
(1) 通过向MMU命令寄存器MMUCR写入0x0020,请求MMU分配一页缓存;
(2) 测试分配是否完成,如果完成则返回缓存包序号在Allocation Result Register;
(3) 将包序号复制到Packet Number Register中,写Pointer Register为0x4000, 表明是发送过程、写操作且指针自动增1;
(4) 写数据入缓存,由Data Register依次写入status word、 byte count、 destination address、 source address、packet type、packet data、 control word ;
(5) 加入发送队列,等待发送中断,主CPU向MMUCR写入队指令0x00C0。
接着主CPU就等待发送中断出现,判断是否发送成功并进行后续处理。
4.3.2 以太帧的接收
主程序中将RCR的RXEN位置1,允许接收数据包,即将0x0300写入RCR。如果接收正确,且前面的接收包已被处理,则新接收的包序号位于RX FIFO的队头,接下来的任务都在接收中断程序中完成:
(1) 设置数据包的Pointer Register 中的RCV, RD, AUTOINC三个位都为1,写入0xE000。
(2) 从Data Register中读取缓存中的数据到内存中,处理后交上层协议。
4.4 TCP/IP协议的实现
TCP/IP协议在网络接口层处理以太帧,实现高层协议的封装和解析。根据以太帧中的类型字节,数据包分为三类:ARP、RARP和IP,逐层解析。由于网络运行参数如IP地址、网关地址等可以通过DHCP协议自动获取,也可以由手工进行设置,因此本系统提供了手动配置和DHCP协议自动配置的功能。为方便系统的运行,将上次成功运行的参数保存在ATmega128的EEPROM中。由于本服务器主要是对服务请求做出响应,接收要打印的数据,以及上传打印机的工作状态,因此发送的数据加上协议的封装不会超过网络的MTU。由于系统本身资源有限,为减少TCP协议解析的复杂度,采用定长缓存。系统中发送接收缓存容量为256×6=1536字节,可以容纳最大以太帧。通过调整滑动窗口,以确保数据包大小不超过缓存容量,接收一包处理一包。从每包的特征字节可判断数据包是独立包还是上一包的继续[6]。系统中设计了一个3KB定长的打印队列,打印数据直接送入打印队列。
本方案需要的协议有RAP协议,UDP协议,DHCP协议,IP协议,TCP协议, ICMP协议,HTTP协议,IPP协议。解析的流程[7]如图4:
图 4以太帧解析流程
待发送的数据可分为两大类,一类是IPP服务器的应答数据,二是辅助信息,如ARP请求、数据包的确认等。系统根据需要装配数据,最后由网络接口层发送出去。所有协议中TCP协议的处理最复杂,约占了整个代码的1/3。
4.5 IPP的子集的构建
IPP协议的网络打印模型有两类对象:
(1) 打印机对象(IPP Printer Object),执行服务器的IPP的协议,负责受理打印请求、作业排队、验证,将打印数据提交给打印机,回应用户打印状态的查询请求。
(2) 作业对象(IPP Job Object)。当打印机对象创建打印作业时就生成相应的作业对象。作业对象包含要打印的文档或文档的引用(URI,Uniform Resource Identifier)。
IPP的1.1版本中并不含有通知服务。所谓通知服务是指当打印机或作业对象发生改变,例如出现打印故障时,服务器端主动通知客户端。由于打印机种类繁多,对打印机驱动程序处理采用给出URI的方法,系统不提供下载。
IPP打印申请和打印过程是通过服务器和客户端的一组请求及响应操作完成的。属于打印机对象的操作有:直接传送文档的打印;作业的验证;作业的创建;打印机属性的获取与应答。下面的五种操作不予实现:通过URI获取打印文档;打印作业列表;暂停所有打印;恢复打印;清除所有打印作业。属于打印作业对象的操作有:文档发送;打印作业取消;打印作业属性的获取;打印作业的挂起;打印作业的就绪。
IPP协议的请求与响应的属性比较复杂,下面列出提交到服务器的打印作业请求的IPP包片断[2]:
编码 |
具体值 |
解释 |
0x0101 |
1.1 |
IPP版本号 |
0x0002 |
Print-Job |
操作码 |
0x00000001 |
1 |
请求编号 |
0x01 |
start operation-attributes |
表示操作属性开始 |
0x47 |
charset type |
标签值代码,下面开始的是charset |
0x0012 |
|
名字长度为18字节 |
attributes-charset |
attributes-charset |
具体名字 |
0x0008 |
|
具体值的长度是8字节 |
us-ascii |
US-ASCII |
具体值是US-ASCII |
0x48 |
natural-language type |
标签值代码,下面开始的是natural-language |
… |
… |
… |
0x03 |
end-of-attributes |
属性结束标志 |
%!PS... |
<PostScript> |
打印数据 |
表1 IPP打印作业请求包格式
5 结束语
利用ATmega128和网络控制芯片LAN91C111,我们设计了基于IPP协议的嵌入式系统网络打印方案。系统外接了小型热敏并口打印机,利用VB直接在程序中处理IPP会话,使用ESC打印语言构造打印数据,经测试,可以满足一般的打印需求,具有一定的实用价值。本方案只实现了IPP的基本功能,在双向打印端口的设计、打印数据的网络安全等方面还有许多地方有待完善。
本文作者创新点:设计了高性价比的嵌入式网络硬件接口,在精简的TCP/IP协议栈上实现了网络打印协议IPP的基本功能,为设计通用的嵌入式网络打印方案提供了新思路。
[1] 匡晓雪.分布式打印环境和Internet打印技术[J].计算机工程与应用,2001,(1):105
[2] RFC2911.Internet Printing Protocol/1.1:Model and Semantics[S]
[3]Atmel 公司. ATmega128 datasheet[EB/OL]. Atmel Corporation,2001
[4] SMSC公司. LAN91C111 datasheet[EB/OL]. SMSC Corporation,2004
[5] 冯志华,张平,骆念武等. 各种语言下的打印口直接I/O访问编程[J]. 微计算机信息, 2000, 16(4):61
[6] Adam Dunkels. Full TCP/IP for 8-bit architectures. Proceedings of the 1st international conference on Mobile systems[C]. California: ACM, 2003. 85-98.
[7] Jones M.T., 路晓村等译.嵌入式系统TCP/IP应用层协议[M].北京:电子工业出版社,2003