一、问题及问题分析
Android设备接入USB打印机,在驱动正常的情况下,却无法创建/dev/usb/lp0节点。
何以确定驱动是正常的?
接上USB打印机,在/sys/class/usbmisc/有打印机的信息
执行mdev -s命令,就会生成/dev/usb/lp0节点
接下来,通过echo命令往/dev/usb/lp0输出字符,可以打印
echo "test" > /dev/usb/lp0
至此可以确定,问题不在驱动。
问题仅仅是lp0节点没有创建。
谁负责lp0节点的创建呢?
init进程:
system/core/init/devices.cpp
static void handle_generic_device_event(struct uevent uevent)
{
if (!strncmp(uevent->subsystem, "usb", 3)) {
if (!strcmp(uevent->subsystem, "usb")) {
....
} else {
/ ignore other USB events */
return;
}
}
}
USB设备属于热插拔设备,设备的插入/移除都会产生相应的事件并上报。但上述代码在检测到uevent->subsystem不是"usb"后就直接退出了,,,而通过前述访问sysfs我们知道,USB打印的uevent->subsystem是"usbmisc"。
二、解决问题
现在我们找到了问题的原因,解决起来就容易了: