Android無法自動建立USB印表機節點/dev/usb/lp0
阿新 • • 發佈:2019-01-05
Android: 4.4.4
一、問題分析
當把USB印表機插入Android裝置後,在系統/dev目錄下並沒有印表機節點(/dev/usb/lp0)產生。
第一反應是檢視印表機裝置,接入裝有Ubuntu的PC,正常:有/dev/usb/lp0
第二反應是檢視印表機驅動資訊:
也正常。和PC機顯示資訊關鍵部分都一樣。[178931.515572] usb 1-1: new full-speed USB device number 40 using xhci_hcd [178931.644906] usb 1-1: New USB device found, idVendor=0483, idProduct=5720 [178931.644909] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [178931.644911] usb 1-1: Product: SPRT Printer [178931.644912] usb 1-1: Manufacturer: Spirit [178931.644913] usb 1-1: SerialNumber: 11101800002 [178931.645918] usblp 1-1:1.0: usblp0: USB Bidirectional printer dev 40 if 0 alt 0 proto 2 vid 0x0483 pid 0x5720
驅動正常,問題在於系統無法建立節點。那麼就手動建立一下!
二、問題初步解決
在嵌入式Linux系統下,可以通過mdev建立裝置節點。mdev是通過掃描系統/sys/class/目錄獲取裝置資訊,進而在/dev/下建立節點。通過:
ls /sys/class/
可以發現,系統中是有印表機裝置的資訊的:
/sys/class/usbmisc
那麼就可以執行下:
busybox mdev -s
再次檢視/dev/,驚喜的發現:/dev/usb/lp0,有了!
三、問題根本解決
經過以上探測,我們知道:
1、驅動正常
2、系統中有印表機裝置資訊
那麼問題就是:系統無法自動為我們建立印表機節點/dev/usb/lp0
在Linux下, 跟熱插拔相關的可以在/etc/init.d/rcS指令碼中新增如下:
echo /system/bin/mdev > /proc/sys/kernel/hotplug
/system/bin/mdev -s
但是,在Android中,跟裝置節點建立相關的在檔案:通過在devices.c檔案中新增如下列印資訊:system/core/init/devices.c static void handle_generic_device_event(struct uevent *uevent) { if (!strncmp(uevent->subsystem, "usb", 3)) { if (!strcmp(uevent->subsystem, "usb")) { .... } } }
我們發現, USB印表機資訊如下:
uevent->subsystem = "usbmisc"
uevent->device_name = "usb/lp0"
而程式碼在找不到"usbmisc" 處理邏輯後直接return了。
至此,解決方案就出來了:
新增處理uevent->subsystem = "usbmisc"的程式碼:
編譯, 燒寫,重啟,插入,Ok!
四、 測試
節點/dev/usb/lp0是有了,能不能用,還得測試呀,我們是用印表機,不是看著節點好玩。
通過echo命令往/dev/usb/lp0輸出字元,可以列印:
echo "111" > /dev/usb/lp0