1. 程式人生 > >android中usb裝置驅動不能自動建立裝置節點

android中usb裝置驅動不能自動建立裝置節點

除錯一個usb驅動,發現在android下無法自動建立裝置節點,手動建立裝置節點可以正常訪問硬體。後來發現是在init程序裡面對一些usb裝置進行了過濾。

system/core/init/devices.c 中的下面函式中。

static void handle_generic_device_event(struct uevent *uevent)
{
    char *base;
    const char *name;
    char devpath[96] = {0};
    char **links = NULL;

    name = parse_device_name(uevent, 64);
    if (!name)
        return;

    if (!strncmp(uevent->subsystem, "usb", 3)) {
         if (!strcmp(uevent->subsystem, "usb")) {
             /* This imitates the file system that would be created
              * if we were using devfs instead.
              * Minors are broken up into groups of 128, starting at "001"
              */
             int bus_id = uevent->minor / 128 + 1;
             int device_id = uevent->minor % 128 + 1;
             /* build directories */
             mkdir("/dev/bus", 0755);
             mkdir("/dev/bus/usb", 0755);
             snprintf(devpath, sizeof(devpath), "/dev/bus/usb/%03d", bus_id);
             mkdir(devpath, 0755);
             snprintf(devpath, sizeof(devpath), "/dev/bus/usb/%03d/%03d", bus_id, device_id);
         } else {
             /* ignore other USB events */
             return;
         }
     } else if (!strncmp(uevent->subsystem, "graphics", 8)) {
         base = "/dev/graphics/";
         mkdir(base, 0755);
     } else if (!strncmp(uevent->subsystem, "oncrpc", 6)) {
         base = "/dev/oncrpc/";
         mkdir(base, 0755);
     } else if (!strncmp(uevent->subsystem, "adsp", 4)) {
         base = "/dev/adsp/";
         mkdir(base, 0755);
     } else if (!strncmp(uevent->subsystem, "msm_camera", 10)) {
         base = "/dev/msm_camera/";
         mkdir(base, 0755);
     } else if(!strncmp(uevent->subsystem, "input", 5)) {
         base = "/dev/input/";
         mkdir(base, 0755);
     } else if(!strncmp(uevent->subsystem, "mtd", 3)) {
         base = "/dev/mtd/";
         mkdir(base, 0755);
     } else if(!strncmp(uevent->subsystem, "sound", 5)) {
         base = "/dev/snd/";
         mkdir(base, 0755);
     } else if(!strncmp(uevent->subsystem, "misc", 4) &&
                 !strncmp(name, "log_", 4)) {
         base = "/dev/log/";
         mkdir(base, 0755);
         name += 4;
     } else
         base = "/dev/";
     links = get_character_device_symlinks(uevent);

     if (!devpath[0])
         snprintf(devpath, sizeof(devpath), "%s%s", base, name);

     handle_device(uevent->action, devpath, uevent->path, 0,
             uevent->major, uevent->minor, links);
}
若要自動生成,修改修改相應程式碼即可。

比如我要在/dev下生成名為testdev的裝置節點,那麼我需要新增下面的程式碼:

if(!strncmp(name, "testdev", 7))
    base = "/dev/";