感谢支持
我们一直在努力

嵌入式Linux系统中打印机驱动的移植

一、开发环境


硬件环境:DM365


打印机型号:HP P1007


虚拟机系统:Red Hat Enterprise Linux 5


交叉编译环境:Ti交叉编译环境安装包


二、详细步骤


1.下载Ghostscript 9.01


2.解压,tar xzvf ghostscript-9.01.tar.gz


3.执行cd ghostscript-9.01  


4.执行./configure


5.执行make,生成x86下的gs,在源代码的bin目录下


6.解压,mkdir ghostscript-9.01.arm  tar xzvf ghostscript-8.15.tar.gz -C ghostscript-9.01.arm


7.进入ghostscript-9.01.arm,执行./configure –host=arm_v5t_le –prefix=/opt/printer(注:如果是在三星的板子上,修改–host=arm_linux)


8.执行make ,出错,复制ghostscript-9.01/obj目录下的mkromfs可执行文件拷贝到ghostscript-9.01.arm/obj目录下


9.重新执行make编译生成bin/gs,有17M的大小,再执行make install,将bin/gs拷贝到开发板中/bin目录下


10.在开发板中执行gs -h(x86下编译出来的gs),可获取gs的帮助信息,从中了解到相应支持的打印机的类型


11.将虚拟机中的/opt/printer,拷贝到开发板中相应的目录下。将源代码中的./Resources/Font拷贝到开发板中的/opt/printer1/share/ghostscript/9.01/Resource/Font下


12.虚拟机中执行arm_v5t_le-ldd bin/gs,查看可执行文件依赖的库文件,并将依赖的库文件拷贝到开发板中


13.下载foo2zjs


14.执行:tar zxf foo2zjs.tar.gz,cd foo2zjs ,make,并将生成的arm2hpdl保存下来


15.修改Makefile,使得CC=arm_v5t_le-gcc,执行make,(注:这里编译生成的结果是错误的,具体解决办法看下面)


16.配置虚拟机可上网,执行./getweb P1007,下载得到惠普打印机P1007的固件sihpP1005.img


17.将步骤14中保存的arm2hpdl替换步骤15编译生成的arm2hpdl二进制文件,执行./arm2hpdl sihpP1005.img > sihpP1007.dl


18.将foo2xqx及sihpP1007拷贝到开发板文件系统中的/bin目录下


文中要用到的Ghostscript 9.01与foo2zjs文件下载在Linux公社论坛的1号FTP服务器里,下载地址:


FTP地址:ftp://www.linuxidc.com


用户名:www.linuxidc.com


密码:www.muu.cc


在 2011年LinuxIDC.com\4月\嵌入式Linux系统中打印机驱动的移植


下载方法见 http://www.linuxidc.net/thread-1187-1-1.html

三、打印操作:


1.mdev/udev自动生成设备节点/dev/lp0(配置内核使得内核支持usb打印机,且文件系统得支持udev或者是mdev)。


2.加载固件:cat /bin/sihpP1007.dl > /dev/lp0 (有网上介绍采用cp /bin/sihpP1007.dl /dev/lp0,这种操作应该有误,至少在我的移植中无法正常加载固件)。


3.此时能听到打印机初始化的声音,执行:# usb_printerid /dev/lp0 得到下面信息:


GET_DEVICE_ID string:


MFG:Hewlett-Packard;MDL:HP LaserJet P1007;CMD:HBS,PJL,ACL;CLS:PRINTER;DES:HP LaserJet P1007;FWVER:20090916;


也就是说打印机正常初始化了


(注:usb_printerid为foo2zjs源代码make后生成的二进制文件)


4.执行:gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE -sPAPERSIZE=a4 -r300x300 -sDEVICE=pbmraw -sOutputFile=test.pbm chess.ps


5.执行:foo2xqx -z0 -p9 -r600x600 test.pbm > /dev/lp0(成功打印,不过图片感觉偏小)


四、出现错误:


问题一:


问题描述:


交叉编译好的foo2zjs,在虚拟机中执行arm_v5t_le-ldd查找库的依赖过程中出现段错误,在开发板中运行出现/bin/foo2zjs: line 1: syntax error: unexpected “(“。


执行arm_v5t_gcc-readelf -h foo2zjs,发现编译好的代码是386下的可执行文件,显然Makefile存在问题


阅读Makefile,发现存在如下语句:


   5 ifeq ($(UNAME),SunOS)


   6     EUID := $(shell /usr/xpg4/bin/id -u)


   7     SHELL=bash


   8     CC=arm_v5t_le-gcc(原为gcc)


   9     OLDGROFF=OLDGROFF


  10 else


  11     EUID := $(shell id -u)


  12 endif


大致意思应该是:查找文件系统是否为SunOS,如果是则将编译器修改为arm_v5t_le-gcc,否则仍旧采用默认的gcc。为什么做这样的判断呢?莫名其妙!


问题解决:


修改Makefile,将第8行剪切到判断语句后面。


问题二:


执行打印命令的时候,刚开始采用./foo2zjs -z1 -p9 -r600x600 test.pbm > /dev/lp0(注意:这是在网上介绍移植P1020打印机驱动中,使用P1007打印机的命令)


实际上P1007采用的是foo2xqx,两者的协议不一样。采用foo2zjs,系统不报错,但是打印机没有反应。正确的命令是:foo2xqx -z0 -p9 -r600x600 test.pbm > /dev/lp0,文件可以打印。

赞(0) 打赏
转载请注明出处:服务器评测 » 嵌入式Linux系统中打印机驱动的移植
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏