Android无法自动创建USB打印机节点/dev/usb/lp0

【Android无法自动创建USB打印机节点/dev/usb/lp0】行是知之始,知是行之成。这篇文章主要讲述Android无法自动创建USB打印机节点/dev/usb/lp0相关的知识,希望能为你提供帮助。
本文转载自:http://blog.csdn.net/u013686019/article/details/50165059
[html]  view plain  copy  

  1. android:  4.4.4   
一、问题分析当把USB打印机插入Android设备后,在系统/dev目录下并没有打印机节点(/dev/usb/lp0)产生。
第一反应是查看打印机设备,接入装有Ubuntu的PC,正常:有/dev/usb/lp0
第二反应是查看打印机驱动信息:
 
[html]  view plain  copy  
  1. [178931.515572]  usb  1-1:  new  full-speed  USB  device  number  40  using  xhci_hcd   
  2. [178931.644906]  usb  1-1:  New  USB  device  found,  idVendor=0483,  idProduct=5720   
  3. [178931.644909]  usb  1-1:  New  USB  device  strings:  Mfr=1,  Product=2,  SerialNumber=3   
  4. [178931.644911]  usb  1-1:  Product:  SPRT  Printer   
  5. [178931.644912]  usb  1-1:  Manufacturer:  Spirit   
  6. [178931.644913]  usb  1-1:  SerialNumber:  11101800002   
  7. [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/下创建节点。通过:
 
[html]  view plain  copy  
  1. ls  /sys/class/   
可以发现,系统中是有打印机设备的信息的:
 
 
[html]  view plain  copy  
  1. /sys/class/usbmisc   
那么就可以执行下:
 
 
[html]  view plain  copy  
  1. busybox  mdev  -s   
再次查看/dev/,惊喜的发现:/dev/usb/lp0,有了!
 
 
三、问题根本解决经过以上探测,我们知道:
1、驱动正常
2、系统中有打印机设备信息
那么问题就是:系统无法自动为我们创建打印机节点/dev/usb/lp0
 
在Linux下, 跟热插拔相关的可以在/etc/init.d/rcS脚本中添加如下:
 
[html]  view plain  copy  
  1. echo  /system/bin/mdev  >   /proc/sys/kernel/hotplug   
  2.   /system/bin/mdev  -s   
但是,在Android中,跟设备节点创建相关的在文件:
[cpp]  view plain  copy  
  1. system/core/init/devices.c   
  2. static  void  handle_generic_device_event(struct  uevent  *uevent)   
  3. {   
  4.         if  (!strncmp(uevent-> subsystem,  "usb",  3))  {   
  5.                 if  (!strcmp(uevent-> subsystem,  "usb"))  {   
  6.                         ....   
  7.                 }   
  8.         }   
  9. }   
通过在devices.c文件中添加如下打印信息:
 
Android无法自动创建USB打印机节点/dev/usb/lp0

文章图片

我们发现, USB打印机信息如下:
 
[html]  view plain  copy  
  1. uevent-> subsystem  =  "usbmisc"   
  2. uevent-> device_name  =  "usb/lp0"   
而代码在找不到"usbmisc"  处理逻辑后直接return了。
 
 
至此,解决方案就出来了:
添加处理uevent-> subsystem = "usbmisc"的代码:
Android无法自动创建USB打印机节点/dev/usb/lp0

文章图片

编译, 烧写,重启,插入,Ok!
四、 测试节点/dev/usb/lp0是有了,能不能用,还得测试呀,我们是用打印机,不是看着节点好玩。
通过echo命令往/dev/usb/lp0输出字符,可以打印:
 
[html]  view plain  copy  
  1. echo  "111"  >   /dev/usb/lp0   
Android无法自动创建USB打印机节点/dev/usb/lp0

文章图片


    推荐阅读