void handleUsbEvent(struct uevent *evt) { pid_t pid; const char *devtype = evt->devtype; char *p,*cmd = NULL, path[0x60] = {0}; char *argv_rc[] = { NULL, NULL, NULL }; int ret,status; char buffer[256]; //如下判断设备类型,和是否为add模式。 进行相应操作 if(!strcmp(evt->action, "add") && !strcmp(devtype, "usb_device")) { /*call usb mode switch function*/ ALOGI("event { '%s', '%s', '%s', '%s', %d, %d }\n", evt->action, evt->path, evt->subsystem, evt->firmware, evt->major, evt->minor); p = strstr(evt->path,"usb"); if(p == NULL) { return; } p += sizeof("usb"); /*如果是usb控制器则上报类似如下path: /devices/platform/sw-ehci.1/usb* 如果是外设插入则上报类似如下path: /devices/platform/sw-ehci.1/usb1/1-1/1-1.7 */ p = strchr(p,'-'); if(p == NULL) { return; } strcat(path,"/sys"); strcat(path,evt->path); ALOGI("path : '%s'\n",path); ret = read_vid_pid(path); if((ret < 0)||(usb_pid == NULL)||(usb_vid == NULL)) { return; } // add for zoomdata,StrongRising 3g dongle if(!strncmp(usb_vid,"8888",4)&& !strncmp(usb_pid, "6500",4)) sleep(8); asprintf(&cmd, "source %s%s_%s &","/system/etc/usb_modeswitch.sh /system/etc/usb_modeswitch.d/",usb_vid,usb_pid); ALOGI("cmd=%s", cmd); ret = system(cmd); ALOGI("excute ret:%d,err:%s\n",ret,strerror(errno)); } return; }
void handleUsbEvent(struct uevent *evt) { const char *devtype = evt->devtype; char *p, *cmd = NULL, path[0x60] = {0}; int ret,status; char buffer[256] = {0}; char oldVid[PROPERTY_VALUE_MAX] = {0}; char oldPid[PROPERTY_VALUE_MAX] = {0}; //SLOGI("event {'%s', '%s', '%s', '%s', %d, %d}", evt->action, evt->path, evt->subsystem, evt->firmware, evt->major, evt->minor); if(!strcmp(evt->action, "add") && !strcmp(devtype, "usb_device")) { SLOGI("event {'%s', '%s', '%s', '%s', %d, %d}", evt->action, evt->path, evt->subsystem, evt->firmware, evt->major, evt->minor); p = strstr(evt->path,"usb"); if(!p) return; p += sizeof("usb"); p = strchr(p,'-'); if(!p) return; strcat(path,"/sys"); strcat(path,evt->path); SLOGI("path : '%s'", path); ret = read_vid_pid(path); if((ret < 0) || (!usb_pid[0]) || (!usb_vid[0])) return; // add for zoomdata,StrongRising 3g dongle if(!strncasecmp(usb_vid,"8888",4) && !strncasecmp(usb_pid, "6500",4)) sleep(8); // work around for various dongles -- bartoszj else if (!strncasecmp(usb_vid,"0bda",4)) // Skip REALTEK vendor id { SLOGI("Internal wifi module detected, skipping..."); return; } else if(!strncasecmp(usb_vid,"12d1",4) && !strncasecmp(usb_pid,"1506",4)) { SLOGI("Probably HUAWEI E3276s connected...Adding manually to option drv..."); addmanually(usb_vid, usb_pid); } else if((!strncasecmp(usb_vid,"19d2",4) && !strncasecmp(usb_pid,"1515",4)) || (!strncasecmp(usb_vid,"19d2",4) && !strncasecmp(usb_pid,"1514",4))) { SLOGI("Probably ZTE MF195 connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"19d2",4) && !strncasecmp(usb_pid,"1506",4)) { SLOGI("Probably ZTE MF398u1 connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"19d2",4) && !strncasecmp(usb_pid,"0167",4)) { SLOGI("Probably ZTE MF821 connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"0421",4) && !strncasecmp(usb_pid,"061e",4)) { SLOGI("Probably NOKIA CS-11 connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"0421",4) && !strncasecmp(usb_pid,"0638",4)) { SLOGI("Probably NOKIA 21M-02 connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"0af0",4) && !strncasecmp(usb_pid,"d157",4)) { SLOGI("Probably OPTION ICON 515M connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"12d1",4) && !strncasecmp(usb_pid,"1411",4)) { SLOGI("HUAWEI E510 connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } else if(!strncasecmp(usb_vid,"2001",4) && (!strncasecmp(usb_pid,"7d01",4) || !strncasecmp(usb_pid,"7d02",4) || !strncasecmp(usb_pid,"7d03",4))) { SLOGI("A D-Link MODEM connected...Adding manually to option drv..."); addmanually(usb_vid,usb_pid); } property_get("gsm.ril.switch.vid",oldVid,""); property_get("gsm.ril.switch.pid",oldPid,""); switchcount++; if(!strncasecmp(oldVid,"19d2",4) && !strncasecmp(oldPid,"f006",4) && !strncasecmp(usb_pid,"2000",4)) { SLOGI("Probably ZTE K3570-Z connected...Reseting..."); switchcount--; strcpy(oldVid, ""); strcpy(oldPid, ""); } if((strcmp(oldVid, "") && strcmp(oldPid, "")) || (strcmp(oldPid, "") && strncasecmp(oldPid, usb_pid, 4))) { SLOGI("Old device was %s_%s\n",oldVid, oldPid); SLOGI("Device already switched, skipping..."); //addmanually(usb_vid,usb_pid); } else { char fname[255] = {0}; sprintf(fname,"/system/etc/usb_modeswitch.d/%s_%s",usb_vid, usb_pid); FILE * f = fopen(fname,"r"); if(!f) SLOGI("Warning! Configuration file doesn't exist for %s_%s!",usb_vid, usb_pid); else fclose(f); SLOGI("Switching device..."); property_set("gsm.ril.switch.running","1"); asprintf(&cmd, "usb_modeswitch -W -I -v %s -p %s -c %s &",usb_vid, usb_pid, fname); ret = system(cmd); free(cmd); if(!strcmp(oldPid, "")) { SLOGI("Setting envs to %s and %s",usb_vid,usb_pid); property_set("gsm.ril.switch.vid",usb_vid); property_set("gsm.ril.switch.pid",usb_pid); } sleep(2); property_set("gsm.ril.switch.running","0"); } } if(!strcmp(evt->action, "remove") && !strcmp(devtype, "usb_device")) { SLOGI("event {'%s', '%s', '%s', '%s', %d, %d}", evt->action, evt->path, evt->subsystem, evt->firmware, evt->major, evt->minor); property_get("gsm.ril.switch.pid", oldPid, ""); property_get("gsm.ril.switch.pid", oldVid, ""); if((strncasecmp(usb_pid, oldPid, 4) && strcmp(oldPid, "")) || switchcount > 1) { SLOGI("Clearing envs", usb_vid, usb_pid); property_set("gsm.ril.switch.vid",""); property_set("gsm.ril.switch.pid",""); switchcount = 0; } } }