一、开发环境 硬件环境:DM365 打印机型号:HP P1007 虚拟机系统:Red Hat Enterprise Linux 5 交叉编译环境:Ti交叉编译环境安装包 二、详细步骤 1.下载Ghostscript 9.01,网址:http://pages.cs.wisc.edu/~ghost/doc/GPL/index.htm 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,网址为http://foo2zjs.rkkda.com/ 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目录下 三、打印操作: 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,文件可以打印。 |
嵌入式系统中打印机驱动的移植
最新推荐文章于 2022-02-14 19:31:11 发布