本文主要以惠普 P1008 型号的打印机为示例, 硬件选择飞凌 IMX6UL 开发板平台来进行方案细节阐述.
1. 现状需求概述
目前, 打印机驱动大多数是在 Windows 与 Linux 发行版上提供了支持. 直接移植到嵌入式上不太现实, 故而了解打印机的原理的前提下, 移植必要的驱动到 ARM 平台.
因客户只打印 PDF, 本文采用 ghostscript+foo2xqx(惠普驱动), 这种最简单的方案进行具体说明.
2. 打印机原理
各种类型的文档经由一个 (或一些) 转换程序转换成用户正在使用的打印机可以认识的格式, 即用各种类型的打印机语言描述的流, 系统将这个流直接发送到打印机端口, 由打印机对其进行解释并形成硬拷贝.
▼目前大多数 Linux 系统以下面的流程, 来实现文档到打印机语言的转换.
普通文本文件和各种类型的图形由适当的转换程序转换成 PostScript 文件, 有些应用程序将其输出直接写成 PostScript 文件, 这些 PostScript 文件经由一个作为打印机过滤器的应用程序 Ghostscript 转换成打印机语言.
因此, 如果系统的打印系统已经配置成使用 Ghostsript 作为打印过滤器, 应用程序要实现的就是输出合乎程序要求和语法的 PostScript 文件.
实现流程说明:
? 在打印过程中, 通常是应用程序产生输出并以管道的方式传送给 lpr 或者直接应用 lpr 打印一个文件.
? lpr 与打印机后台服务程序通过网络进行连接并进行通信, 传送相应的打印数据和打印选项.
? 打印机后台服务程序将在相应的 spooler 目录存储打印信息, 在输出设备可以利用的情况下将打印任务送给打印设备.
3. 打印环境搭建
修改 drivers/usb/Kconfig 中将 #source "drivers/usb/class/Kconfig" 前的 #去掉
? 静态配置如图所示
make menuconfig?Device Drivers?USB Support?USB Printer support
<图 1 内核配置支持 USB 打印>
? 动态加载
如果不想改变当前开发板的内核, 可以将 usb 打印编译成模块, 然后动态加载进去. 编译后的模块为 usblp.ko. 然后下载到开发板上执行如下命令加载进去:
# insmod usblp.ko
将打印机与开发板通过 USB 连接, 然后打开打印机的电源就会在开发板上出现 / dev/usb/lp0 设备文件.
2 交叉编译 Ghostscript
# 1. 下载源码
官网地址:
下载 ghostscript 版本
* 注明: 网上很多交叉编译方法, 此处不再展开
3 交叉编译 foo2xqx 具体细节如下
- #1. 下载 foo2zjs 源码
- wget http://foo2zjs.rkkda.com/foo2zjs.tar.gz &&
- # 2. 解压源码
- tar zxvf foo2zjs.tar.gz &&
- # 3. 分别拷贝为 PC 版本和 ARM 版本
- cp foo2zjs foo2zjs-ARM -r &&
- mv foo2zjs foo2zjs-x86 &&
- # 4. 编译 PC 版本
- cd foo2zjs-x86 &&
- make &&
- cd ../ &&
- # 5. 编译 ARM 版本
- cd foo2zjs-ARM &&
- source ~/poky/toolchain/environment-setup-cortexa7hf-neon-poky-Linux-gnueabi
修改 Makefile 文件, 注释掉
- # @if ! type $(CC)>/dev/null 2>&1; then \
- ...
- fi
- # @if [ "`ls $(MACOSX_stdio) 2> /dev/null`" != "" ]; then \
- ....
- fi
- # @if ! type gs>/dev/null 2>&1; then \
- ...
- fi
- # @if ! type dc>/dev/null 2>&1; then \
- ...
- fi
- # @if ! dc -V>/dev/null 2>&1; then \
- ...
- fi
- #ifeq ($(UNAME),Darwin)
- # @if ! type gsed>/dev/null 2>&1; then \
- ...
- fi
- #endif
编译
- make -j32&&
- # 6. 使用编译出来的 getweb 程序, 得到对应打印机的固件程序: sihp1006.img
- ./getweb P1008 &&
- # 7. 用 x86 gcc 编译的 arm2hpdl 工具将 sihp1006.img 转化为 sihp1006.dl
- cd ../foo2zjs-x86 &&
- ./arm2hpdl ../foo2zjs-ARM/sihp1006.img> ../foo2zjs-ARM/sihp1006.dl &&
- cd ../ &&
- # 8. 将生成的 sihp1006.dl 和 foo2zjs 拷贝至目标板的文件系统中
- cp foo2zjs-ARM/sihp1006.dl /usr/share/cups/sihp1006.dl &&
- cp foo2zjs-ARM/foo2zjs /usr/share/cups/foo2zjs &
4 交叉编译 cups
1. ARM 下移植 cups
下载 cups 源码, 地址 https://github.com/apple/cups/releases 中的 cups-2.3b7-source.tar.gz
按照 cups 补丁文件, 修改源码(根据 buildroot 中补丁文件进行修改).
- 0001-Remove-man-from-BUILDDIRS-in-configure.patch
- 0002-Do-not-use-genstrings.patch
- 0003-Sanitize-the-installation-process.patch
- 0004-Remove-PIE-flags-from-the-build.patch
- 0005-Fix-static-linking-with-GnuTLS.patch
2. 交叉编译 cups
- ./configure -host=ARM-Linux
- make -j16
- make install DSTROOT=/usb-printers/cups-2.3b7/install
安装完成之后可看到 etc include lib usr var 文件夹. 移植到嵌入式板卡中.
5 打印 PDF
具体细节如下
- #1. 加载打印机固件
- cat /usr/share/cups/sihp1006.dl> /dev/usb/lp0
此时打印机有响声
- #2. 通过 gs 将 PDF 转换为 test.pbm
- ./bin/gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE -sPAPERSIZE=a4 -r600x600 -sDEVICE=pbmraw -sOutputFile=test.pbm /tiger.PDF
- #3. 打印测试
- ./foo2xqx -p9 -r600x600 /test.pbm> /dev/usb/lp0
- #4. 将打印机设置为共享
使用 cups
配置文件为:/etc/cups/cupsd.conf 修改配置文件中
LogLevel warn 修改为 LogLevel debug
在
- # Restrict access to the server...
- <Location />
- Order allow,deny
- </Location>
的第 3 行之后添加 Allow 192.168.1.0/24, 同时在 < Location /admin> <Location /admin/conf > 中也添加上 Allow 192.168.1.0/24(具体根据打印机的使用环境进行 IP 配置).
开启 cups 服务:/etc/init.d/cups start
修改 / etc/cups/cups-file.conf 将 Systemgroup 中 lpadmin 去掉. 或者将当前用户加入 lpadmin.
将打印机设置为共享打印机:
$lpstat -t 查看当前打印机的状态
$lpoptions -d printer 将打印机设置为默认打印机
$lpdamin -d printer -o printer-is-shared=true 将打印机设置为共享. 假设此打印机的 IP 地址为 192.168.1.108
#5. 局域网打印
局域网其他板卡, 也移植 cups, 通过局域网进行打印
$lp test.PDF -h 192.168.1.108:631 即可通过网络进行打印.
参考资料:
[1]. Linux 打印系统 CUPS 原理分析 https://www.linuxidc.com/Linux/2010-12/30698.htm
[2]. cups-wiki 简介
[3]. foo2zjs 简介 http://foo2zjs.rkkda.com/
[4]. cups 命令行打印和选项配置 https://www.cups.org/doc/options.html
来源: http://www.bubuko.com/infodetail-3475285.html