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

一、开发环境
硬件环境: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,文件可以打印。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值