2015年1月19日

網樂通 - HPLIP、CUPS、SANE Scanner Server - HP Color LaserJet CM1015,功敗垂成

前言:
去年過年的目標,現在重新開始,但目前仍舊失敗,
失敗原因在HPLIP部份程式碼沒有OpenSource。
目前我還在努力,看有沒有辦法把沒有OpenSource的部份自己實做出來。

功能目標:
在網樂通上,透過USB連接HP Color LaserJet CM1015,
達成掃描功能,並進一步做到掃描伺服器。
也許會問,列印呢?列印都沒達成,做什麼掃描?
事實上,透過p910nd,應該是能夠輕鬆做到列印,只是還沒實際印過而已。

實做目標:
在網樂通上實做出SANE + HPLIP,透過網樂通直接下指令掃描,
或透過SANE Scanner Server,網路掃描。

HPLIP、CUPS、SANE需求:

事實上,HPLIP依賴CUPS和SANE,
除非單純build HPIJS,否則CUPS是必要的(掃描功能也需要),
如果要使用掃描功能,SANE是必要的。

而CUPS、SANE、HPLIP這三者,都需要libusb,它們都使用libusb當作USB溝通的底層。
libusb可以使用libusb1.0或libusb,我這邊使用libusb1.0。

SANE還需要jpeg library,tiff library可以裝也可以不裝。
相依關係如圖:


實做平台:
最終使用 網樂通Debian wheezy。

我實際上sh4twbox、archlinux、debian這3個平台都嘗試移植,
但sh4twbox、archlinux都遇到問題,導致移植失敗。

網樂通移植平台限制:
sh4twbox:
sh4twbox是我原本最期望使用的平台,也是我花費最多心力的平台,
同樣,最後功敗垂成。

sh4twbox的本體實際上是STLinux,但因為原廠不再支援STLinux 2.3,
會發現STLinux 2.4版的libc使用的是2.14版,
但網樂通上的libc是2.10版,
網樂通和開發環境的版本不合,會導致CrossCompiler編譯的程式,執行時可能會有問題。
另外,STLinux 2.4 CrossCompiler環境,原廠並沒有把libtool和pkg-config的路徑問題做修正,
因此裝在CrossCompiler環境的library,經常會link到host的x86 library,
造成過程經常出現問題。

最後我的解決方法:
針對pkg-config和libtool問題,
針對configure出錯時,直接修改configure,讓它指定到正確的路徑,
同時使用CFLAGS、CPPFLAGS、CXXFLAGS、LIBS這些環境變數,
強制指定正確library的路徑和正確include的路徑。

針對libc版本不合的問題,
我注意到ST Linux 2.4 CrossCompiler的路徑中,有提供static library,
我強制將shared library( .so檔案)改名,讓程式和library編譯時強制使用靜態編譯,
編譯出來後,在網樂通上執行看看,看有沒有link到shared library。

這方式最終看起來,好像能動,但Debug異常麻煩,不確定問題在哪。

archlinux:
我按照網路上的教學安裝gcc,網路上說需要另外下載gcc,覆蓋掉archlinux套件安裝的版本,
我照著做,但在編譯時,會出現錯誤,上網Google結果都是要你重新安裝gcc,
這我懷疑網上版的gcc和系統的部份library可能不合,後續放棄沒繼續了。

Debian:
不愧是Debian,套件夠完整,但系統也實在是肥很多。
光下指令,就能感受到反應速度明顯比archlinux、sh4twbox慢,
很可能預設啟動的service太多造成的。

但Debian最大的好處是,套件庫齊全,針對CUPS、HPLIP、SANE的編譯,
相依的library幾乎都直接有套件裝,不需要另外自己編譯,
就library編譯部份省去不少功夫,但網樂通本地編譯,
真的是等.....等......等......等......等.....

過程:
Debian上需要另外編譯CUPS、SANE、HPLIP的主要原因是:
1. 這幾個套件在Debian上沒有提供套件
2. 這幾個程式的相依套件庫太多,很多相依套件在sh4平台上沒有提供,這尤其發生在HPLIP上

因此,我編譯時,只使用幾個功能,相依套件盡量少,最後使用下面這些:
  • libjpeg-dev
  • libtiff-dev
  • libusb-dev
  • libusb-1.0-0-dev 
  • libtool
  • pkg-config
  • gcc
  • g++
編譯按順序如下:
SANE:
1.
下載sane-backends Source Code並解壓縮,這邊我使用sane-backends-1.0.24版。

2.
./configure --prefix=/usr/local/sane-backends --enable-libusb_1_0

3.
make

4.
make install

CUPS:
1.
下載CUPS Soruce Code並解壓縮,這邊我使用CUPS-1.7.5版。

2.
./configure --prefix=/usr/local/cups --disable-gssapi --without-perl --without-java --disable-gnutls --enable-libusb --disable-dbus --disable-openssl --enable-libusb --disable-dbus --disable-pam --disable-avahi --with-python=no

3.
make

4.
make install

HPLIP:
1.
下載hplip Source Code並解壓縮,這邊我使用hplip-3.14.10版。

2.
設定環境變數
export CPPFLAGS="-I/usr/local/sane-backends/include -I/usr/local/cups/include"
export LIBS="-L/usr/local/sane-backends/lib -lsane -L/usr/local/cups/lib -lcups"


3.

將SANE、CUPS Library加入系統參考路徑中

修改/etc/ld.so.conf.d/libc.conf,修改如下:

# libc default configuration /usr/local/lib /usr/local/cups/lib /usr/local/sane-backends/lib

執行ldconfig

4.
./configure --prefix=/usr/local/hplip --enable-lite-build --disable-doc-build --disable-gui-build --disable-fax-build --disable-dbus-build --disable-cups11-build --disable-qt4 --disable-network-build

5.
make

6.
make install

上述HPLIP編譯,會編譯HPLIP的列印和掃描功能,其他功能全部不裝。

7.
複製HPLIP的hpaio檔案到sane-backends中,如下:
cp -v /usr/local/hplip/lib/sane/libsane-hpaio.* /usr/local/sane-backends/lib/sane/

8.
將hpaio加入到sane-backends的搜尋檔案中
編輯/usr/local/sane-backends/etc/sane.d/dll.conf
最後面加入
hpaio

9.
複製HPLIP的model資訊
從HPLIP的Source Code目錄中複製data到/usr/local/hplip/share/hplip/data
類似如下:
cp -v -R /usr/local/printer_system/hplip-3.14.10/data /usr/local/hplip/share/hplip/data

10.
將HPLIP的library路徑加入到系統參考路徑中,如下修改:
修改/etc/ld.so.conf.d/libc.conf,修改如下:
# libc default configuration
/usr/local/lib
/usr/local/cups/lib
/usr/local/sane-backends/lib
/usr/local/hplip/lib

執行ldconfig

到此安裝完成,接著要Debug。

除錯方法:
針對SANE,可以如下除錯:
1.
設定環境變數,如下:
export SANE_DEBUG_DLL="255"

2.
執行/usr/local/sane-backends/bin/sane-find-scanner
如果找到Scanner,表示SANE這關過了,
如果沒找到,請直接跳到第5步驟,看syslog。

3.
執行/usr/local/sane-backends/bin/scanimage -L
如果找到Scanner,表示HPLIP第1關過了,
如果沒找到,請直接跳到第5步驟,看syslog。

4.
執行/usr/local/sane-backends/bin/scanimage > /tmp/image.img,
如果/tmp/image.img有檔案產生,表示HPLIP一切正常,
如果有問題,會顯示錯誤。

5.
過程中有錯誤,可以看/var/log/syslog,裡面會列出錯誤原因。

功敗垂成:
我家的HP事務機是HP Color LaserJet CM1015,參考:

它提到這段話:
Driver Plugin Information:
This printer REQUIRES a downloadable driver plug-in. Use hp-setup to install the printer, and to download and install the plug-in. In general, required driver plugins are required for printing support. Driver plug-ins are released under a proprietary (non-open) license and are not part of the HPLIP tarball release.

這台事務機的Linux Driver需要HP的Driver Plugin,
而Driver Plugin我也手動安裝了,
但關鍵問題是,Driver Plugin裡面包裹了4個Close Code Library,
這4個Close Code Library並非全部都需要,這跟HP印表機、掃描器、事務機型號相關,
更明確的說,這4個是4個不同的Protocol需要的library,
以我的CM1015而言,CM1015需要的是bb_soap這個library。

因為這4個library只提供x86 32bits和64bits版本,
因此無法使用在網樂通上,也無法使用在ARM平台上,
相關討論參考:

展望:
HP Color LaserJet CM1015是舊式的HP事務機,
這表示它的protocol相對單純,
目前我透過在HPLIP Source Code加上printf的方式(在libsane-hpaio和hpmud),
在x86機器上呼叫scanimage後,查看呼叫過程,
試圖拆解bb_soap內的功能,
事實上從libsane-hpaio的程式碼看起來,
bb_soap內其實只有下列function,分別是:
  • bb_open()
  • bb_close()
  • bb_get_parameters()
  • bb_is_paper_in_adf()
  • bb_start_scan()
  • bb_end_scan()
  • bb_get_image_data()
  • bb_end_page()
我目前應該已經解開bb_open()、bb_close()、bb_start_scan(),
有成功看到掃描器動作,
但我目前不清楚收到的資料哪些部份才是圖像,
圖像和後續bb_get_image_data()、bb_end_scan()、bb_end_page()的行為還不清楚,
我相信,
如果我能成功破譯這些function動作,
修改HPLIP Source Code後,就能讓網樂通成為掃描列印伺服器。

參考資料:

沒有留言: