anroid USB类设备无法自动生成节点解决

在调试USB设备发现一个比较怪异的现象,为什么没有自动生成设备节点。

这里想到第一个解决办法,mdev

插上usb后使用命令 busybox mdev -s 发现设备节点在应该出现的位置出现了。

那么想到一个解决办法,当热插拔时间出现后自动嗲用mdev -s

ln  -s busybox mdev
echo /system/bin/mdev > /proc/sys/kernel/hotplug

这里echo /system/bin/mdev > /proc/sys/kernel/hotplug我们写入到init.rc 


发现写入init.rc后出现了怪异的问题,一些USB设备发生奇奇怪怪的问题,似乎不能正常工作了,

最后分析愿意在于权限的问题,mdev加载的权限默认似乎是0660,这里当然可以参考mdev的手册使用配置文件解决权限的问题。


然后转念一想,安卓本身是通过vold来管理设备的,为什么要给自己增加麻烦?


设备创建相关的代码是在 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")) {
             xxxxxxxxxxxxxx
 	 else{
               return ;
          }
}else if (!strncmp(uevent->subsystem, "graphics", 8)) {
}else{}
handle_device(uevent->action, devpath, uevent->path, 0, uevent->major, uevent->minor, links);
}

这里代码就具体罗列了,我们先在函数里打印一下USB插入后的信息

ERROR("uevent->subsystem = %s\n", uevent->subsystem);
ERROR("uevent->device_name = %s\n", uevent->device_name);

这里打印用INFO是打印不出来level需要大于3才能打印,为了避免麻烦就直接用ERROR打印

增加代码,然后重新编译后烧入,因为init程序比较麻烦,因为分区的原因。

然后我们cat /proc/kmsg中发现了一些关键信息。

uevent-subsysname =usbmisc 

uevent->device_name =usb/lp0

这里打印信息很多usb类的其他设备节点生不出都是这个subsysname字段的匹配,默认的处理方法是return了

所以,我增加了一些usbmisc的处理,因为不知道还有什么设备需要处理就单独为这个设备增加一下

else if (!strncmp(uevent->subsystem, "usbmisc", 7)) {
           if(!strncmp(uevent->device_name, "usb/lp", 6)){
                         base = "/dev/usb/";  
                         mkdir(base, 0755);  
                         ERROR("usblp...go...\n");
            } 

最后当usb插入时,成功的创建了/dev/usb/lp0 


关于权限的问题,只要在uevent.init.rc 文件加入一条信息即可。

你可能感兴趣的:(andriod)