基于FETMX6UL-C實現(xiàn)USB與網(wǎng)絡(luò)打印
本文主要以惠普P1008型號的打印機為示例,來進行方案細節(jié)闡述。
1. 現(xiàn)狀需求概述
目前,打印機驅(qū)動大多數(shù)是在windows與linux發(fā)行版上提供了支持。直接移植到嵌入式上不太現(xiàn)實,故而了解打印機的原理的前提下,移植必要的驅(qū)動到ARM平臺。
因客戶只打印PDF,本文采用ghostscript+foo2xqx(惠普驅(qū)動),這種最簡單的方案進行具體說明。
2. 打印機原理
各種類型的文檔經(jīng)由一個(或一些)轉(zhuǎn)換程序轉(zhuǎn)換成用戶正在使用的打印機可以認識的格式,即用各種類型的打印機語言描述的流,系統(tǒng)將這個流直接發(fā)送到打印機端口,由打印機對其進行解釋并形成硬拷貝。
▼目前大多數(shù)Linux系統(tǒng)以下面的流程,來實現(xiàn)文檔到打印機語言的轉(zhuǎn)換。
普通文本文件和各種類型的圖形由適當(dāng)?shù)霓D(zhuǎn)換程序轉(zhuǎn)換成PostScript文件,有些應(yīng)用程序?qū)⑵漭敵鲋苯訉懗蒔ostScript文件,這些PostScript文件經(jīng)由一個作為打印機過濾器的應(yīng)用程序Ghostscript轉(zhuǎn)換成打印機語言。
因此,如果系統(tǒng)的打印系統(tǒng)已經(jīng)配置成使用Ghostsript作為打印過濾器,應(yīng)用程序要實現(xiàn)的就是輸出合乎程序要求和語法的PostScript文件。
實現(xiàn)流程說明:
? 在打印過程中,通常是應(yīng)用程序產(chǎn)生輸出并以管道的方式傳送給lpr或者直接應(yīng)用lpr打印一個文件。
? lpr與打印機后臺服務(wù)程序通過網(wǎng)絡(luò)進行連接并進行通信,傳送相應(yīng)的打印數(shù)據(jù)和打印選項。
? 打印機后臺服務(wù)程序?qū)⒃谙鄳?yīng)的spooler目錄存儲打印信息,在輸出設(shè)備可以利用的情況下將打印任務(wù)送給打印設(shè)備。
3. 打印環(huán)境搭建
修改drivers/usb/Kconfig中將#source "drivers/usb/class/Kconfig"前的#去掉
? 靜態(tài)配置如圖所示
make menuconfig?Device Drivers?USB Support?USB Printer support
<圖1 內(nèi)核配置支持USB打印>
? 動態(tài)加載
如果不想改變當(dāng)前開發(fā)板的內(nèi)核,可以將usb打印編譯成模塊,然后動態(tài)加載進去。編譯后的模塊為usblp.ko。然后下載到開發(fā)板上執(zhí)行如下命令加載進去:
# insmod usblp.ko
將打印機與開發(fā)板通過USB連接,然后打開打印機的電源就會在開發(fā)板上出現(xiàn)/dev/usb/lp0設(shè)備文件。
2交叉編譯Ghostscript
# 1.下載源碼
官網(wǎng)地址:https://github.com/ArtifexSoftware/ghostpdl-downloads/releases
下載ghostscript版本
*注明:網(wǎng)上很多交叉編譯方法,此處不再展開
3交叉編譯foo2xqx具體細節(jié)如下
#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程序, 得到對應(yīng)打印機的固件程序: sihp1006.img
./getweb P1008 &&
# 7.用x86 gcc編譯的arm2hpdl工具將sihp1006.img轉(zhuǎn)化為sihp1006.dl
cd ../foo2zjs-x86 &&
./arm2hpdl ../foo2zjs-arm/sihp1006.img > ../foo2zjs-arm/sihp1006.dl &&
cd ../ &&
# 8.將生成的sihp1006.dl和foo2zjs拷貝至目標(biāo)板的文件系統(tǒng)中
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補丁文件,修改源碼(根據(jù)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
具體細節(jié)如下
#1.加載打印機固件
cat /usr/share/cups/sihp1006.dl > /dev/usb/lp0
此時打印機有響聲
#2.通過gs將pdf轉(zhuǎn)換為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.將打印機設(shè)置為共享
使用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(具體根據(jù)打印機的使用環(huán)境進行IP配置)。
開啟cups服務(wù):/etc/init.d/cups start
修改/etc/cups/cups-file.conf 將Systemgroup 中l(wèi)padmin 去掉。或者將當(dāng)前用戶加入lpadmin。
將打印機設(shè)置為共享打印機:
$lpstat -t查看當(dāng)前打印機的狀態(tài)
$lpoptions -d printer 將打印機設(shè)置為默認打印機
$lpdamin -d printer –o printer-is-shared=true 將打印機設(shè)置為共享。假設(shè)此打印機的IP地址為192.168.1.108
#5. 局域網(wǎng)打印
局域網(wǎng)其他板卡,也移植cups,通過局域網(wǎng)進行打印
$lp test.pdf -h 192.168.1.108:631即可通過網(wǎng)絡(luò)進行打印。
參考資料:
[1]. Linux打印系統(tǒng)CUPS原理分析
[2]. cups-wiki簡介
[3]. foo2zjs 簡介
[4]. cups命令行打印和選項配置
相關(guān)產(chǎn)品 >
-
FETMX6UL-C核心板 商業(yè)級
飛凌嵌入式商業(yè)級iMX6UL核心板采用NXP公司ARM Cortex-A7 i.MX6UL處理器,板載512MB DDR3內(nèi)存和4GB高速eMMC存儲器。飛凌嵌入式級imx6ul核心板體積小巧并具有成本優(yōu)勢,為了更好的讓客戶進行二次開發(fā),飛凌提供了iMX6UL的PCB文件,包含底板的原理圖和PCB文件,提供了i.MX6UL核心板數(shù)據(jù)手冊,IMX6UL核心板硬件手冊;為了適應(yīng)不同應(yīng)用環(huán)境,飛凌IMX6UL核心板兼容IMX6ULL并同時具備工業(yè)級、商業(yè)級兩種不同的配置。
-
OKMX6UL-C開發(fā)板
飛凌嵌入式專注imx6系列imx6ul開發(fā)板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統(tǒng)研發(fā)、設(shè)計和生產(chǎn),i.mx6UL系列產(chǎn)品現(xiàn)已暢銷全國,作為恩智浦imx6ul,imx6ul開發(fā)板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。
了解詳情