本文主要以飞凌嵌入式iMX6UL系列FETMX6UL核心板+惠普P1008型号的打印机为示例,来进行方案细节阐述。

  1. 现状需求概述

目前,打印机驱动大多数是在windows与linux发行版上提供了支持。直接移植到嵌入式上不太现实,故而了解打印机的原理的前提下,移植必要的驱动到ARM平台。

因客户只打印PDF,本文采用ghostscript+foo2xqx(惠普驱动),这种最简单的方案进行具体说明。

  1. 打印机原理

各种类型的文档经由一个(或一些)转换程序转换成用户正在使用的打印机可以认识的格式,即用各种类型的打印机语言描述的流,系统将这个流直接发送到打印机端口,由打印机对其进行解释并形成硬拷贝。

▼目前大多数Linux系统以下面的流程,来实现文档到打印机语言的转换。

普通文本文件和各种类型的图形由适当的转换程序转换成PostScript文件,有些应用程序将其输出直接写成PostScript文件,这些PostScript文件经由一个作为打印机过滤器的应用程序Ghostscript转换成打印机语言。

因此,如果系统的打印系统已经配置成使用Ghostsript作为打印过滤器,应用程序要实现的就是输出合乎程序要求和语法的PostScript文件。

实现流程说明:

❶ 在打印过程中,通常是应用程序产生输出并以管道的方式传送给lpr或者直接应用lpr打印一个文件。

❷ lpr与打印机后台服务程序通过网络进行连接并进行通信,传送相应的打印数据和打印选项。

❸ 打印机后台服务程序将在相应的spooler目录存储打印信息,在输出设备可以利用的情况下将打印任务送给打印设备。

  1. 打印环境搭建

修改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

2.1.下载源码

官网地址:https://github.com/ArtifexSoftware/ghostpdl-downloads/releases

下载ghostscript版本

*注明:网上很多交叉编译方法,此处不再展开

3、交叉编译foo2xqx具体细节如下

3.1. 下载foo2zjs源码

wget http://foo2zjs.rkkda.com/foo2zjs.tar.gz &&

3.2.解压源码

tar zxvf foo2zjs.tar.gz &&

3.3.分别拷贝为PC版本和ARM版本

cp foo2zjs foo2zjs-arm -r &&

mv foo2zjs foo2zjs-x86 &&

3.4.编译PC版本

cd foo2zjs-x86 &&

make &&

cd …/ &&

3.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&&

3.6.使用编译出来的getweb程序, 得到对应打印机的固件程序: sihp1006.img

./getweb P1008 &&

3.7.用x86 gcc编译的arm2hpdl工具将sihp1006.img转化为sihp1006.dl

cd …/foo2zjs-x86 &&

./arm2hpdl …/foo2zjs-arm/sihp1006.img > …/foo2zjs-arm/sihp1006.dl &&

cd …/ &&

3.8.将生成的sihp1006.dl和foo2zjs拷贝至目标板的文件系统中

cp foo2zjs-arm/sihp1006.dl /usr/share/cups/sihp1006.dl &&

cp foo2zjs-arm/foo2zjs /usr/share/cups/foo2zjs &

4/交叉编译cups

4.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

4.2.交叉编译cups

./configure -host=arm-linux

make -j16

make install DSTROOT=/usb-printers/cups-2.3b7/install

安装完成之后可看到etc include lib usr var文件夹。移植到嵌入式板卡中。

5、打印pdf

具体细节如下

5.1.加载打印机固件

cat /usr/share/cups/sihp1006.dl > /dev/usb/lp0

此时打印机有响声

5.2.通过gs将pdf转换为test.pbm

./bin/gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE -sPAPERSIZE=a4 -r600x600 -sDEVICE=pbmraw -sOutputFile=test.pbm /tiger.pdf

5.3.打印测试

./foo2xqx -p9 -r600x600 /test.pbm > /dev/usb/lp0

5.4.将打印机设置为共享

使用cups

配置文件为:/etc/cups/cupsd.conf修改配置文件中

LogLevel warn 修改为LogLevel debug

#5Restrict 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.5. 局域网打印

局域网其他板卡,也移植cups,通过局域网进行打印

$lp test.pdf -h 192.168.1.108:631即可通过网络进行打印。

参考资料:

[1]. Linux打印系统CUPS原理分析

[2]. cups-wiki简介

[3]. foo2zjs 简介

[4]. cups命令行打印和选项配置

基于iMX6UL实现USB与网络打印相关推荐

  1. 基于OHCI的USB主机 —— 结束语

    从去年11月份开始连载的<基于OHCI的USB主机>系列总算告一段落了,到UFI命令层为止,所有USB主机的底层处理就结束了,再上面就是磁盘读写.文件系统.文件读写和应用系统了.这些上层应 ...

  2. 基于OHCI的USB主机 —— 前言

    很久以前,大概是前年年底吧,因为公司项目的要求,我做了基于OHCI的USB主机访问U盘的程序,用来把系统中产生的一些数据保存到U盘中.本来做的时候就想把其中的一些经验体会发表的,可是工作实在是太忙,而 ...

  3. 基于libUSB的USB设备固件更新程序(下载数据)(转)

    源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...

  4. 基于Linux的USB 主/从设备之间通讯的三种方式

    转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...

  5. 基于Linux的USB主/从设备之间的三种通信方式-转

    随着简单易用的接口日益流行,在中添加对USB接口的支持已成为大势所趋.本文通过介绍中支持USB的各种模块和库,分析了在Linux上利用USB实现高速串口和以太网连接等通信方式的具体方法. 通用串行总线 ...

  6. 基于FPGA的USB高速数据采集系统(免做上位机)

    本篇分享基于FPGA的USB高速数据采集系统,上位机软件采用赛普拉斯官方提供的上位机软件,实现前端AD的采集,经过FPGA处理之后通过USB传输到上位机,将数据保存下来,然后通过MATLAB可以将AD ...

  7. 基于STM32的USB CAN收发器开发与设计

    基于STM32的USB CAN收发器开发与设计 一.文章适合人群: 小型化企业,节约设备的购买投入: 有特殊功能需求的个人或企业(例如离线升级,数据抓包盒等): 技术开发爱好者. 二.USB CAN开 ...

  8. 基于WMI获取USB设备信息(即获取插即用设备信息)System.Management.ManagementObjectSearcher--ManagementObjectCollection

    基于WMI获取USB设备信息(即获取插即用设备信息)System.Management.ManagementObjectSearcher--ManagementObjectCollection 获取P ...

  9. linux配置usb主从_基于Linux的USB主/从设备之间的三种通信方式

    随着简单易用的USB接口日益流行,在嵌入式系统中添加对USB接口的支持已成为大势所趋.本文通过介绍Linux中支持USB的各种模块和库,分析了在Linux上利用USB实现高速串口和以太网连接等通信方式 ...

最新文章

  1. 极大似然估计的理解与应用
  2. python3 RSA加解密
  3. PyODPS学习:使用DataFrame实现SQL的IF判断
  4. 在Win7 64位注册ActiveX控件
  5. Spark _07_补充部分算子【二】
  6. java jconsole_java中jconsole命令的学习
  7. [BZOJ 1588] [HNOI 2002] 营业额统计
  8. hat怎么安装mysql_Red Hat Enterprise Linux中怎么安装Mysql+apache+php+zend
  9. php gif 切成一帧,GIF动画帧提取器 如何截取gif的每一帧图片
  10. Android 源码获取-----在Windows环境下通过Git得到Android源代码
  11. c32语言,c32rtomb转换为什么编码?
  12. Open Inventor Coin3D
  13. win7怎么设置悬浮桌面便签
  14. 台电xh80平板android刷机 G2N8
  15. vb.net 简单取摄像头图片_简单的BP网络识别液晶字符
  16. ARM学习day6-->看门狗定时器
  17. 美国立卫生研究院投巨资奖励大数据挖掘
  18. .lib不是有效的Win32应用程序
  19. 响应式 BootStrap 媒体查询 栅格 组件 scss
  20. tumblr_使用Google Analytics(分析)获取有关您的Tumblr博客的详细统计信息

热门文章

  1. windows7旗舰版32位JAVA安装_oracle安装—Windows7旗舰版32位安装oracle10g方法
  2. Dynamics CRM 附件功能
  3. Opencv2.4.9源码分析——SURF
  4. 大数据-zookeeper
  5. Linux 更改只读文件方法
  6. 09EL表达式和JSTL标签库
  7. 对于Imbalance Data的总结
  8. 华为路由器DCHP服务配置实验
  9. Java web连接数据库实现登录功能 ; jsp连接MySQL或SQL server数据库的jar包也在这里哦!
  10. 财神爷商训---范蠡