Exemplo n.º 1
0
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;     
}    
Exemplo n.º 2
0
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;
		}
	}
}