1. 程式人生 > >Android無法自動建立USB印表機節點/dev/usb/lp0

Android無法自動建立USB印表機節點/dev/usb/lp0

Android: 4.4.4

一、問題分析

當把USB印表機插入Android裝置後,在系統/dev目錄下並沒有印表機節點(/dev/usb/lp0)產生。

第一反應是檢視印表機裝置,接入裝有Ubuntu的PC,正常:有/dev/usb/lp0

第二反應是檢視印表機驅動資訊:

[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 
也正常。和PC機顯示資訊關鍵部分都一樣。

驅動正常,問題在於系統無法建立節點。那麼就手動建立一下!

二、問題初步解決

在嵌入式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中,跟裝置節點建立相關的在檔案:
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")) {
			....
		}
	}
}
通過在devices.c檔案中新增如下列印資訊:


我們發現, 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