打印机其实和Android没有什么大的关系,和linux内核关联才是比较强的。最近调试打印机,有那么一点心得,一点一点记录下来。

最终的结果是要在Android实现驱动打印机,但是一般调试一个新的驱动的流程是这样的:1.先在linux PC上进行测试。2.在标准嵌入式linux上进行调试。3.改装到Android中去

为什么这么安排,是有说道的。因为资源是递减的,可以在第一阶段确定设备有无问题,以及该设备在linux工作流程;在第二阶段是因为标准的嵌入式linux还是遵循GNU规定的,包括大部分,这个阶段验证该设备能否在ARM架构的上顺利编译通过;第三阶段就是实用阶段了,因为最终要在这个不是怎么遵守GNU规定的Android系统上运行的。


第一阶段


我测试了3台打印机:1.Canon iP2780 2.Canon MX428 3.HP Deskjet 1000。由于的我作业系统就是Linux,在Linux PC上很快就逐个搞定。第1台用的是这里的驱动(包括deb包和部分开源源码)加上这个《iP2700 series IJ Printer Driver Ver. 3.30 for Linux (操作说明)》,机器就可以正常使用了;第2台和第一台驱动模式都是一样的只不过在这里;第3台用的是这里的一级一级选择最终下载文件是:hplip-3.14.1.run,直接执行会把所缺失的东西全部安装,可以成功使用。

如果我仅仅是一个使用者,那么到现在可以就结束了。但是我是一个开发者,我最终的目标是移植到Android中,所以我的目的地不在这里,我要继续深度挖掘。要挖掘的点很多,这里说一个最迫切的就是如何用命令打印一个文件?这个问题似乎很奇怪,但是我也不知道如何做。不过最终找到了就是:lp或者lpr加文件名,就可以打印出一个文件了。例如:


?



lp ~/hello.pdf        

   


找这么一个命令我就花费了几个小时的时间,这里我就有一种很强的预感,前边的路很还很遥远。(整理文章的顺序和实验的步骤会稍有不同,其实这个命令在《iP2700 series IJ Printer Driver Ver. 3.30 for Linux (操作说明)》是有的,但是这个“操作说明”是后来才看到的)。

现在看来我不应该草率进行去进行第二个阶段,应该好好的研究一下Linux的打印系统。总结文章就按照最好的流程来吧。先说我是怎么了解了linux的打印系统的。

意外发现的这个本书《Linux系统管理技术手册》,真是对我了解Linux的打印系统帮助是最大的,涵盖的知识面也是最全的,以后的阶段中用到的自认为是新的东西,其实这本书上都详细讲解了。讲解打印不是讲解如何打印就好了,而是详细的讲解了打印机的原理,要经过哪些步骤,打印机语言等等,如果是国人写的书一般会说“此内容不在本书要讨论的范围内”一句概括。那一章我反复看了一周时间才算有些眉目。

一切终归一张图:

其实到目前为止我应该好好规划一下我要设计的东西,实现中我急功近利了,并没有做完全的规划就进行了第二阶段。

小规划:

打印机选择:推荐选择HP的,激光的喷墨的都可以,HP是全力支持Linux的。

打印系统的选择:

大的架构是CUPS,主要的模块有:

后台:

过滤器:

PPD:

其实在图中随便从上到下连一条线,就可以组合成一套打印系统。下面进入第二阶段吧。

第二阶段


调试Canon的打印机的时候我选择了这样的架构:CUPS+cnijfilter-source-3.30-1.tar.gz.

1.配置Linux内核



make menuconfig 选上USB打印机选项: Device Drivers --->


[*] USB support ---> <*> USB Printer support

2.交叉编译CUPS 1.3.9


#!/bin/sh  
  
 
  
 
    
  
 
  
 
   #  
   1 
   .下载源码  
  
 
  
 
   wget http: 
   //www.cups.org/software/1.3.9/cups-1.3.9-source.tar.gz &&  
  
 
  
 
    
  
 
  
 
   #  
   2 
   .解压并打开  
  
 
  
 
   tar xvzf cups- 
   1.3 
   . 
   9 
   -source.tar.gz && cd cups- 
   1.3 
   . 
   9 
   &&  
  
 
  
 
    
  
 
  
 
   #  
   3 
   .配置  
  
 
  
 
   ./configure --host=arm-linux --target=arm-linux --build=i686-linux CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar --disable-gnutls --disable-gssapi --disable-dbus --prefix=/ &&  
  
 
  
 
    
  
 
  
 
   #  
   4 
   .修改Makefile使其不编译man  
  
 
  
 
   sed -i  
   '22s/locale man monitor/locale monitor/' 
   ./Makefile &&  
  
 
  
 
    
  
 
  
 
   #  
   5 
   .编译并安装  
  
 
  
 
   make && make install DSTROOT=/work/rootfs/rootfs_qtopia_qt4 &&  
  
 
  
 
    
  
 
  
 
   echo  
   "cups build install ok!"



3.交叉编译ghostscript 8.15




#!/bin/sh  
  
 
  
 
   #  
   1 
   .下载源码  
  
 
  
 
   wget http: 
   //iweb.dl.sourceforge.net/project/ghostscript/GPL%20Ghostscript/8.15/ghostscript-8.15.tar.gz &&  
  
 
  
 
    
  
 
  
 
   #  
   2 
   .解压源码  
  
 
  
 
   tar xvzf ghostscript- 
   8.15 
   .tar.gz &&  
  
 
  
 
    
  
 
  
 
   #  
   3 
   .分别拷贝为PC版本和ARM版本  
  
 
  
 
   cp ghostscript- 
   8.15 
   ghostscript- 
   8.15 
   -arm -r && mv ghostscript- 
   8.15 
   ghostscript- 
   8.15 
   -pc &&  
  
 
  
 
    
  
 
  
 
   #  
   4 
   .编译PC版本  
  
 
  
 
   cd ghostscript- 
   8.15 
   -pc && ./configure && make && cd ../ &&  
  
 
  
 
    
  
 
  
 
   #  
   5 
   .配置arm版本  
  
 
  
 
   cd ghostscript- 
   8.15 
   -arm && ./configure --host=arm-linux &&  
  
 
  
 
    
  
 
  
 
   #  
   6 
   .修改Makefile中STDLIBS=-lm 为STDLIBS=-lm - 
   static 
  
 
  
 
   sed -i  
   '257s/STDLIBS=-lm/STDLIBS=-lm -static/' 
   ./Makefile &&  
  
 
  
 
    
  
 
  
 
   #  
   7 
   .拷贝PC版本工具  
  
 
  
 
   mkdir obj && cp ../ghostscript- 
   8.15 
   -pc/obj/genarch ../ghostscript- 
   8.15 
   -pc/obj/genconf ../ghostscript- 
   8.15 
   -pc/obj/echogs ./obj/ &&  
  
 
  
 
    
  
 
  
 
   #  
   8 
   .编译  
  
 
  
 
   make &&  
  
 
  
 
    
  
 
  
 
   #  
   9 
   .安装(这个版本不支持make install的DESTDIR指定根目录所以要手动拷贝,以后要调整目录)  
  
 
  
 
   DESTDIR=/work/rootfs/rootfs_qtopia_qt4  
  
 
  
 
   mkdir -p ${DESTDIR}/usr/local/share/ghostscript/ 
   8.15 
   / &&  
  
 
  
 
   cp -r lib ${DESTDIR}/usr/local/share/ghostscript/ 
   8.15 
   / &&  
  
 
  
 
   cp -r Resource ${DESTDIR}/usr/local/share/ghostscript/ 
   8.15 
   / &&  
  
 
  
 
   cp bin/gs ${DESTDIR}/bin/




3.交叉编译kerberos 5.1.9




#!/bin/sh  
  
 
  
 
    
  
 
  
 
   #  
   1 
   .下载源码 项目地址:http: 
   //web.mit.edu/~kerberos/dist/historic.html  
  
 
  
 
   wget http: 
   //web.mit.edu/~kerberos/dist/krb5/1.9/krb5-1.9-signed.tar &&  
  
 
  
 
    
  
 
  
 
   #  
   2 
   .解压  
  
 
  
 
   tar xvf krb5- 
   1.9 
   -signed.tar && tar xvzf krb5- 
   1.9 
   .tar.gz &&  
  
 
  
 
    
  
 
  
 
   #  
   3 
   .进入源码目录  
  
 
  
 
   cd krb5- 
   1.9 
   /src &&  
  
 
  
 
    
  
 
  
 
   #  
   4 
   .配置  
  
 
  
 
   ./configure CC=arm-linux-gcc --host=arm-linux ||  
  
 
  
 
    
  
 
  
 
   echo krb5_cv_attr_constructor_destructor=yes>linux-cache &&  
  
 
  
 
   ./configure CC=arm-linux-gcc --host=arm-linux ||  
  
 
  
 
    
  
 
  
 
    
  
 
  
 
   echo krb5_cv_attr_constructor_destructor=yes>linux-cache &&  
  
 
  
 
   ./configure CC=arm-linux-gcc --host=arm-linux --cache-file=linux-cache ||  
  
 
  
 
    
  
 
  
 
   echo ac_cv_func_regcomp=yes>>linux-cache &&  
  
 
  
 
   ./configure CC=arm-linux-gcc --host=arm-linux --cache-file=linux-cache ||  
  
 
  
 
    
  
 
  
 
   echo ac_cv_printf_positional=yes>>linux-cache &&  
  
 
  
 
   ./configure CC=arm-linux-gcc --host=arm-linux --cache-file=linux-cache &&  
  
 
  
 
    
  
 
  
 
    
  
 
  
 
   #  
   3 
   .注释一行代码 Fix:Don't know how to  
   do 
   unload-time finalization  
   for 
   this 
   configuration.  
  
 
  
 
   sed -i  
   '397s/^/\/\//g' 
   ./include/k5-platform.h &&  
  
 
  
 
    
  
 
  
 
   #  
   7 
   .编译并安装  
  
 
  
 
   make && make install DSTROOT=/work/rootfs/rootfs_qtopia_qt4 &&  
  
 
  
 
    
  
 
  
 
   echo  
   "krb5 build install ok!"




4.交叉编译gutenprint 5.2.9



#!/bin/sh  
  
 
  
 
    
  
 
  
 
   #  
   1 
   .下载源码 项目地址:http: 
   //sourceforge.net/projects/gimp-print/files/gutenprint-5.2/5.2.9/  
  
 
  
 
   wget http: 
   //softlayer-ams.dl.sourceforge.net/project/gimp-print/gutenprint-5.2/5.2.9/gutenprint-5.2.9.tar.bz2 &&  
  
 
  
 
    
  
 
  
 
   #  
   2 
   .解压  
  
 
  
 
   tar xvjf gutenprint- 
   5.2 
   . 
   9 
   .tar.bz2 &&  
  
 
  
 
    
  
 
  
 
   #  
   3 
   .分别拷贝为PC版本和ARM版本  
  
 
  
 
   cp -r gutenprint- 
   5.2 
   . 
   9 
   gutenprint- 
   5.2 
   . 
   9 
   -arm && mv gutenprint- 
   5.2 
   . 
   9 
   gutenprint- 
   5.2 
   . 
   9 
   -pc &&  
  
 
  
 
    
  
 
  
 
   #  
   4 
   .编译PC版本  
  
 
  
 
   cd gutenprint- 
   5.2 
   . 
   9 
   -pc && ./configure && make && cd ../ &&  
  
 
  
 
    
  
 
  
 
   #  
   5 
   .配置arm版本  
  
 
  
 
   cd gutenprint- 
   5.2 
   . 
   9 
   -arm && ./configure --host=arm-linux --target=arm-linux --build=i686-linux CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar --with-gimp2=no --without-gimp2 --enable-cups-ppds --enable-cups-level3-ppds --without-ghostscript --without-foomatic --disable-libgutenprintui2 &&  
  
 
  
 
    
  
 
  
 
   #  
   6 
   .拷贝PC版本工具  
  
 
  
 
   make || cp ../gutenprint- 
   5.2 
   . 
   9 
   -pc/src/xml/.libs/extract-strings ./src/xml/.libs/ &&  
  
 
  
 
    
  
 
  
 
   #  
   7 
   .编译并安装  
  
 
  
 
   make && make install DSTROOT=/work/rootfs/rootfs_qtopia_qt4 &&  
  
 
  
 
    
  
 
  
 
   echo  
   "gutenprint build install ok!"




5.交叉编译hpijs-2.1.4



#!/bin/sh  
  
 
  
 
    
  
 
  
 
   #  
   1 
   .下载源码 项目地址:http: 
   //sourceforge.net/projects/hpinkjet/files/  
  
 
  
 
   wget http: 
   //superb-dca2.dl.sourceforge.net/project/hpinkjet/hpijs/2.1.4/hpijs-2.1.4.tar.gz  
  
 
  
 
    
  
 
  
 
   #  
   2 
   .解压源码  
  
 
  
 
   tar xvzf hpijs- 
   2.1 
   . 
   4 
   .tar.gz && cd hpijs- 
   2.1 
   . 
   4 
  
 
  
 
    
  
 
  
 
   #  
   3 
   .配置  
  
 
  
 
   ./configure --host=arm-linux --target=arm-linux --build=i686-linux CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar  
  
 
  
 
    
  
 
  
 
   #  
   4 
   .修正语法错误 dj3320.cpp第 
   403 
   行和registry.cpp第 
   249 
   行 开头的 
   char 
   改为 
   const 
   char 
  
 
  
 
   sed -i  
   '249s/\tchar\t/\tconst char\t/' 
   registry.cpp  
  
 
  
 
   sed -i  
   '403s/ char/ const char/' 
   dj3320.cpp  
  
 
  
 
    
  
 
  
 
   #  
   5 
   .编译并安装  
  
 
  
 
   make && make install DESTDIR=/work/rootfs/rootfs_qtopia_qt4




6.启动各个模块

以上是我编译的源码所有记录,它们每个都是可以单独运行验证的。

启动cups:$ /etc/init.d/cups start

CUPS可以将/etc/cups/cupsd.conf的日志级别LogLevel设置为debug,这样如果启动失败会将原因打印到/var/log/cups/error_log中。我没有遇到什么大的bug,遇到的都是缺少目录问题。

第三阶段

预留