立即注册
查看: 1275|回复: 1

基于FETMX6UL-C实现USB与网络打印

发表于 2021-2-7 10:23:10 | 显示全部楼层 |阅读模式 来自 河北省保定市
基于FETMX6UL-C实现USB与网络打印
本文主要以惠普P1008型号的打印机为示例,来进行方案细节阐述。
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.下载源码官网地址:https://github.com/ArtifexSoftware/ghostpdl-downloads/releases下载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.dlcd ../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.patch0002-Do-not-use-genstrings.patch0003-Sanitize-the-installation-process.patch0004-Remove-PIE-flags-from-the-build.patch0005-Fix-static-linking-with-GnuTLS.patch

2. 交叉编译cups./configure -host=arm-linuxmake -j16make 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原理分析  
[2]. cups-wiki简介
[3]. foo2zjs 简介
[4]. cups命令行打印和选项配置

已绑定手机
发表于 2022-6-26 08:07:03 | 显示全部楼层 来自 浙江省杭州市
学习一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表