一、开发环境
硬件环境: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,文件可以打印。