嵌入式Linux网络打印服务器的实现
引 言
网络打印服务器的出现很好地解决了多个PC机共用一台打印机的问题,但传统的网络打印服务需要专门一台Pc机作为网络打印服务器,浪费资源、打印成本高,且使用不方便。基于以上情况,本文设计并实现了一种基于嵌入式IJnux的网络打印服务器。打印机连接在价格低廉、体积小巧的嵌入式网络打印服务器上,网络打印服务器连接到局域网,所有用户PC的打印任务都可以通过访问嵌入式网络打印服务器完成打印任务。图l为嵌入式网络打印服务器应用场景。
![]() |
嵌入式网络打印服务器结构如图2所示。
![]() |
CPU采用Samsung公司ARM920t处理器S3C2440A,主频可达400 MHz,同时支持L,inux、Vx_works和wincE 3种主流嵌入式操作系统。系统包括网口、USB口、并口3个对外接口,网口芯片采用支持10 Mbit·s-1/100 Mbit·s-1速率的DM9000,并行打印机端口通过CPLD(复杂可编程逻辑器件)实现,cPU自身提供USB接口。Flash是32 MB Nand Flash存储器,存储u-BOOT、启动参数、内核以及文件系统,其他部分包括电源、复位、晶振等电路。
CPU频率较高,普通并口控制芯片(如8255)读写时序不能满足CPU读写时序要求,故一般采用可编程逻辑器件实现并口内部的逻辑,完成并口功能。
系统采用源码开放的Linux操作系统,所需的各种驱动可从互联网下载,根据系统电路设计对驱动参数稍做修改。实现打印机共享的应用程序需要移植。 本文将介绍并行打印机端口的实现和打印机共享应用程序的移植。
2并行打印机端口的实现
目前,常用打印机接口有USB口和并口,并口技术经多年发展,现已形成了IEEE 1284标准。该标准目前定义了5种并口通信模式,见表1。标准并口模式是为打印输出而设计的,数据由计算机单向输出,不能用数据线进行数据输入,要进行数据输入只能利用状态线。并口状态线只有5条,所以每个字节要分两次输入,再拼装为一个完整的字节。标准并口模式速度较低,对硬件的要求不高,适用于低速的应用场合。
2.1并行打印机端口硬件结构
并行打印机端口内部主要包括缓冲器和锁存器以及控制电路,具体结构可以见文献[1]。用CPLD实现其功能的结构如图3所示。
![]() |
CPLD采用XlLINx公司的XC9572xLVQ64,与CPU接口有13根线,其中数据线8条、信号控制线5条。nGS为片选信号,nOE为读使能,nWE为写使能,以上3个信号都是低电平有效。cpuDATA[0…7]为数据线,CMD为数据写和控制写区分信号,当CMD为低电平时,数据写使能,否则为控制写使能,连接CPU地址线。EINT为中断信号,当EINT为低电平时产生中断,CPI~一CLOCK为输入时钟信号。74LVT244是驱动芯片,由于cPu输出为CMOS电平,而打印机为TTL电平,需要驱动芯片实现电平匹配,74LVT244电源电压3.3 V,但输入输出兼容5 VTTL电平。
2.2并行打印机端口的VHDL实现
并行打印端口实现CPU和打印机连接,在编写VHDL代码时,所实现的并行打印端口时序要与cPu读写时序和打印机数据传输时序匹配。具体的时序要求分别参考S3C2440A用户使用手册和文献[1]中通过并行打印机适配器在PC和打印机之间进行数据传输的时序图。
cPu读写并口时钟频率是内部CPU时钟频率400 MHz经过分频产生的,CPU读写周期可编程。CPLD时钟频率必须满足CPU读写时序要求。
在数据进人cPLD后,打印机选通信号STB经过一定的延迟后产生0.5μs逻辑低电平,选通打印机接收CPLD中的数据。
并行打印机端口VHDL实现流程如图4所示。
![]() |
3应用程序的移植、安装与运行
嵌入式网络打印服务器运行Linux操作系统,一般办公的用户PC机运行Windows操作系统,因此,网络打印服务器需要能够支持Windows用户对Linux资源的访问,而Samba正是使Linux支持SMB(服务器消息块)协议的一组软件包,通过Samba可以实现Win.dows用户对Linux共享资源包括打印机的访问,此外,网络打印服务器需要软件实现打印管理功能,CUPS(通用Unix打印系统)是一个能运行在Linux操作系统上的最新打印管理系统,Samba支持CUPS,所以,软件设计上采用Samba+CUPS。
3.1基本过程
从文献[4-5]的网址主页下载程序源代码,用GCC(GNU编译器集合)交叉编译器交叉编译CUPS和Samba,交叉编译命令安装在/usr/local/arm/2.95.3/bin/目录下。在编译Samba时,默认的情况下除了需要CUPS的支持外,还需要libcrypto.a和libssl.a,这两个库函数由Openssl文件交叉编泽生成。然后配置嵌入式Linux内核,使之支持USB和并口打印机,最后在嵌入式Linux操作系统上安装并运行Samba和CUPS。
3.2应用程序的移植
3.2.1 CUPs的移植
交叉编译CUPS的配置如下:
修改CUPS源代码,在backend/usb-unix.C源代码加#undef_linux。分别运行./configure和make命令编译。注意:要将非交叉编译生成的文件man/man_tohtml覆盖交叉编译生成的man/mantohtml文件。然后再在交叉编译环境下继续运行make命令完成编译,将交叉编译CUPS后生成的cups目录拷贝到Sam_ba文件夹以供交叉编译Samba时使用。
3.2.2 Openssl的移植
将顶层Makefile的参数CC修改为CC=/usr/lo_cal/arm/2.95.3/bin/arm.1inux-gcc,交叉编译完成后将libcrypto.a和libssl.a两个库文件拷贝到/usr/local/arm/2.95.3/arm.1inux/lib目录下,以供交叉编译Sam-ba时使用。
3.2.3 Samba的移植
交叉编译Samba的配置如下:
运行./configure,在生成的include/config.h中加宏定义:
#define HAVE-GETTMEOFDAYTZ l
然后运行makj完成交叉编泽。
3.2.4配置Linux内核
Linux内核支持HP和Cannon大部分的系列,只要在配置内核使其支持打印机,嵌入式Linux操作系统就能识别连接在目标板的打印机,将生成支持打印机的内核下载到嵌入式网络打印服务器。
3.3应用程序的安装
将交叉编译后的文件下载到嵌入式网络打印服务器,具体安装位置如表2所示。文件的具体含义见文献[4-5]。
![]() |
3.4调试并运行应用程序
CuPS的调度程序为cupsd,配置文件为cupsd.conf,执行/USr/sbin/cupsd命令启动cuPs的调度程序,可以从脚本文件/vat/log/cups/error log察看其是否正确启动,如果没有正常启动,可将cupsd.conf文件中logLevel参数的值从info改为debug或者debug 2,重新运行cuPs,脚本文件erroLlog会出现cuPS详细启动信息,可根据这些信息进行调试,在确定cuPs正常工作后,要将loglevel的值重新设为info,同时用lpadmin命令设置打印机。
Samba服务器实际包含了两个服务器程序:smbd和nmbd。smbd是Samba的核心,其作用是处理到来的SMB数据包,负责建立对话进程,验证用户身份,提供埘文件系统和打印机的访问机制;nmbd实现网络浏览服务器的功能。smb.eonf是Samba的配置信息,为了支持打印机共享,需要对文件进行合理设置,具体设置见文献[4]。Samba服务器不能正常运行一般都与smb.eonf设置相关,可以使用smbclient命令对smbd是否正确启动进行测试,具体错误信息存放于/var/log.smbd和/var/log.nmbd。
3.5服务器的自启动的实现
为了能在启动之后自动完成打印机服务器的启动,需要在/root./bash-profile文件中加入以下命令:
chmod 777没备文件名 //修改设备文件权限
rm-rf/var/spool/cups//删除以前全部打印文件
mkdir/var/spool/cups //新建打印路径
smbd//启动smbd守护进程
nmbd//启动nmbd守护进程
cupsd//启动CUPS调度程序
cuspenable-打印机名//使能打印机
3.6 USB打印机热插拔的实现
uSB打印机被拔除后,设备文件被删除,当打印机重新接在服务器后,设备文件为不可执行文件,而只有当没备文件为可执行文件时,打印机才能完成扣'印,这就需要一个后台脚本程序进行监控,当重新检测到设备文件后,将设备文件属性修改为可执行文件,否则,不做任何_T作。流程图如图5所示。将程序脚本放入/root/.bash-profile文件中并在后台运行,就可以实现USB打印机的热插拔。
![]() |
在嵌入式网络打印服务器正常工作后。windows下的用广可以通过添加网络打印机来使用这个嵌入式网络打印服务器所连接的打印机完成打印任务。
4结束语
本文介绍了利用cPLD实现并行打印端口的方法,设计并实现了基于嵌入式Linux、支持并口和USB接口的网络打印服务器。嵌人式网络打印服务器成本低、体积小,管理功能强,相信会得到越来越广泛的应用。






