基于FETMX6UL-C實現USB與網絡打印

原創 2020-03-07 18:42:00 iMX6UL 網絡打印

基于FETMX6UL-C實現USB與網絡打印 


本文主要以惠普P1008型號的打印機為示例,來進行方案細節闡述。
1. 現狀需求概述

目前,打印機驅動大多數是在windows與linux發行版上提供了支持。直接移植到嵌入式上不太現實,故而了解打印機的原理的前提下,移植必要的驅動到ARM平臺。

因客戶只打印PDF,本文采用ghostscript+foo2xqx(惠普驅動),這種最簡單的方案進行具體說明。

 2. 打印機原理 

各種類型的文檔經由一個(或一些)轉換程序轉換成用戶正在使用的打印機可以認識的格式,即用各種類型的打印機語言描述的流,系統將這個流直接發送到打印機端口,由打印機對其進行解釋并形成硬拷貝。


基于FETMX6UL-C實現USB與網絡打印

 

▼目前大多數Linux系統以下面的流程,來實現文檔到打印機語言的轉換。


基于FETMX6UL-C實現USB與網絡打印

 

普通文本文件和各種類型的圖形由適當的轉換程序轉換成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


基于FETMX6UL-C實現USB與網絡打印 

<圖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.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原理分析  

[2]. cups-wiki簡介

[3]. foo2zjs 簡介 

[4]. cups命令行打印和選項配置 


相關產品 >

  • FETMX6UL-C核心板 商業級

    飛凌嵌入式商業級iMX6UL核心板采用NXP公司ARM Cortex-A7 i.MX6UL處理器,板載512MB DDR3內存和4GB高速eMMC存儲器。飛凌嵌入式級imx6ul核心板體積小巧并具有成本優勢,為了更好的讓客戶進行二次開發,飛凌提供了iMX6UL的PCB文件,包含底板的原理圖和PCB文件,提供了i.MX6UL核心板數據手冊,IMX6UL核心板硬件手冊;為了適應不同應用環境,飛凌IMX6UL核心板兼容IMX6ULL并同時具備工業級、商業級兩種不同的配置。

    了解詳情
    FETMX6UL-C核心板 商業級
  • OKMX6UL-C開發板

    飛凌嵌入式專注imx6系列imx6ul開發板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統研發、設計和生產,i.mx6UL系列產品現已暢銷全國,作為恩智浦imx6ul,imx6ul開發板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。

    了解詳情
    OKMX6UL-C開發板

推薦閱讀 換一批 換一批