android中usb裝置驅動不能自動建立裝置節點
阿新 • • 發佈:2019-02-14
除錯一個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/";