Android無法自動(dòng)創(chuàng)建USB打印機(jī)節(jié)點(diǎn)/dev/usb/lp0
一、問題分析
當(dāng)把USB打印機(jī)插入Android設(shè)備后,在系統(tǒng)/dev目錄下并沒有打印機(jī)節(jié)點(diǎn)(/dev/usb/lp0)產(chǎn)生。
第一反應(yīng)是查看打印機(jī)設(shè)備,接入裝有Ubuntu的PC,正常:有/dev/usb/lp0
第二反應(yīng)是查看打印機(jī)驅(qū)動(dòng)信息:
[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機(jī)顯示信息關(guān)鍵部分都一樣。
驅(qū)動(dòng)正常,問題在于系統(tǒng)無法創(chuàng)建節(jié)點(diǎn)。那么就手動(dòng)創(chuàng)建一下!
二、問題初步解決
在嵌入式Linux系統(tǒng)下,可以通過mdev創(chuàng)建設(shè)備節(jié)點(diǎn)。mdev是通過掃描系統(tǒng)/sys/class/目錄獲取設(shè)備信息,進(jìn)而在/dev/下創(chuàng)建節(jié)點(diǎn)。通過:
ls /sys/class/
可以發(fā)現(xiàn),系統(tǒng)中是有打印機(jī)設(shè)備的信息的:
/sys/class/usbmisc
那么就可以執(zhí)行下:
busybox mdev -s
再次查看/dev/,驚喜的發(fā)現(xiàn):/dev/usb/lp0,有了!
三、問題根本解決
經(jīng)過以上探測(cè),我們知道:
1、驅(qū)動(dòng)正常
2、系統(tǒng)中有打印機(jī)設(shè)備信息
那么問題就是:系統(tǒng)無法自動(dòng)為我們創(chuàng)建打印機(jī)節(jié)點(diǎn)/dev/usb/lp0
1,在Linux下, 跟熱插拔相關(guān)的可以在/etc/init.d/rcS腳本中添加如下:
echo /system/bin/mdev > /proc/sys/kernel/hotplug
/system/bin/mdev -s
2,但是,在Android中,跟設(shè)備節(jié)點(diǎn)創(chuàng)建相關(guān)的在文件:
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文件中添加如下打印信息:

我們發(fā)現(xiàn), USB打印機(jī)信息如下:
uevent->subsystem = "usbmisc"
uevent->device_name = "usb/lp0"
而代碼在找不到"usbmisc" 處理邏輯后直接return了。
至此,解決方案就出來了:
添加處理uevent->subsystem = "usbmisc"的代碼:
else if(!strncmp(uevent->subsystem,"usbmisc",7)){
if(!strncmp(uevent->device_name,"usb/lp",6)){
base = "/dev/usb/";
make_dir(base,0755);
}
}

編譯, 燒寫,重啟,插入,Ok!
四、 測(cè)試
節(jié)點(diǎn)/dev/usb/lp0是有了,能不能用,還得測(cè)試呀,我們是用打印機(jī),不是看著節(jié)點(diǎn)好玩。
通過echo命令往/dev/usb/lp0輸出字符,可以打?。?/p>
echo "111" > /dev/usb/lp0
