1*76af099aSliuyi /* 2*76af099aSliuyi * (C) Copyright 2017 Fuzhou Rockchip Electronics Co., Ltd 3*76af099aSliuyi * Seth Liu 2017.03.01 4*76af099aSliuyi * 5*76af099aSliuyi * SPDX-License-Identifier: GPL-2.0+ 6*76af099aSliuyi */ 7*76af099aSliuyi 8*76af099aSliuyi #include "RKScan.h" 9*76af099aSliuyi #define BUSID(id) ((id & 0x0000FF00) >> 8) 10*76af099aSliuyi int CRKScan::GetDEVICE_COUNTS() 11*76af099aSliuyi { 12*76af099aSliuyi return m_list.size(); 13*76af099aSliuyi } 14*76af099aSliuyi 15*76af099aSliuyi UINT CRKScan::GetMSC_TIMEOUT() 16*76af099aSliuyi { 17*76af099aSliuyi return m_waitMscSecond; 18*76af099aSliuyi } 19*76af099aSliuyi 20*76af099aSliuyi UINT CRKScan::GetRKUSB_TIMEOUT() 21*76af099aSliuyi { 22*76af099aSliuyi return m_waitRKusbSecond; 23*76af099aSliuyi } 24*76af099aSliuyi 25*76af099aSliuyi void CRKScan::SetMSC_TIMEOUT(UINT value) 26*76af099aSliuyi { 27*76af099aSliuyi m_waitMscSecond = value; 28*76af099aSliuyi } 29*76af099aSliuyi 30*76af099aSliuyi void CRKScan::SetRKUSB_TIMEOUT(UINT value) 31*76af099aSliuyi { 32*76af099aSliuyi m_waitRKusbSecond = value; 33*76af099aSliuyi } 34*76af099aSliuyi 35*76af099aSliuyi CRKScan::CRKScan(UINT uiMscTimeout, UINT uiRKusbTimeout) 36*76af099aSliuyi { 37*76af099aSliuyi DEVICE_COUNTS.setContainer(this); 38*76af099aSliuyi DEVICE_COUNTS.getter(&CRKScan::GetDEVICE_COUNTS); 39*76af099aSliuyi 40*76af099aSliuyi MSC_TIMEOUT.setContainer(this); 41*76af099aSliuyi MSC_TIMEOUT.getter(&CRKScan::GetMSC_TIMEOUT); 42*76af099aSliuyi MSC_TIMEOUT.setter(&CRKScan::SetMSC_TIMEOUT); 43*76af099aSliuyi 44*76af099aSliuyi RKUSB_TIMEOUT.setContainer(this); 45*76af099aSliuyi RKUSB_TIMEOUT.getter(&CRKScan::GetRKUSB_TIMEOUT); 46*76af099aSliuyi RKUSB_TIMEOUT.setter(&CRKScan::SetRKUSB_TIMEOUT); 47*76af099aSliuyi 48*76af099aSliuyi m_waitMscSecond = uiMscTimeout; 49*76af099aSliuyi m_waitRKusbSecond = uiRKusbTimeout; 50*76af099aSliuyi m_log = NULL; 51*76af099aSliuyi m_list.clear(); 52*76af099aSliuyi m_deviceConfigSet.clear(); 53*76af099aSliuyi m_deviceMscConfigSet.clear(); 54*76af099aSliuyi } 55*76af099aSliuyi bool CRKScan::FindRockusbVidPid(ENUM_RKDEVICE_TYPE type, USHORT &usVid, USHORT &usPid) 56*76af099aSliuyi { 57*76af099aSliuyi UINT i; 58*76af099aSliuyi bool bRet = false; 59*76af099aSliuyi for (i = 0; i < m_deviceConfigSet.size(); i++) { 60*76af099aSliuyi if (m_deviceConfigSet[i].emDeviceType == type) { 61*76af099aSliuyi usVid = m_deviceConfigSet[i].usVid; 62*76af099aSliuyi usPid = m_deviceConfigSet[i].usPid; 63*76af099aSliuyi bRet = true; 64*76af099aSliuyi break; 65*76af099aSliuyi } 66*76af099aSliuyi } 67*76af099aSliuyi return bRet; 68*76af099aSliuyi } 69*76af099aSliuyi void CRKScan::AddRockusbVidPid(USHORT newVid, USHORT newPid, USHORT oldVid, USHORT oldPid) 70*76af099aSliuyi { 71*76af099aSliuyi if ((newVid == 0) || (newPid == 0) || (oldVid == 0) || (oldPid == 0)) { 72*76af099aSliuyi return; 73*76af099aSliuyi } 74*76af099aSliuyi STRUCT_DEVICE_CONFIG config; 75*76af099aSliuyi unsigned int i; 76*76af099aSliuyi for (i = 0; i < m_deviceConfigSet.size(); i++) { 77*76af099aSliuyi if ((m_deviceConfigSet[i].usVid == oldVid) && (m_deviceConfigSet[i].usPid == oldPid)) { 78*76af099aSliuyi config.usVid = newVid; 79*76af099aSliuyi config.usPid = newPid; 80*76af099aSliuyi config.emDeviceType = m_deviceConfigSet[i].emDeviceType; 81*76af099aSliuyi break; 82*76af099aSliuyi } 83*76af099aSliuyi } 84*76af099aSliuyi if (i < m_deviceConfigSet.size()) 85*76af099aSliuyi m_deviceConfigSet.push_back(config); 86*76af099aSliuyi } 87*76af099aSliuyi 88*76af099aSliuyi void CRKScan::SetVidPid(USHORT mscVid, USHORT mscPid) 89*76af099aSliuyi { 90*76af099aSliuyi STRUCT_DEVICE_CONFIG config; 91*76af099aSliuyi m_deviceConfigSet.clear(); 92*76af099aSliuyi 93*76af099aSliuyi config.emDeviceType = RK27_DEVICE; 94*76af099aSliuyi config.usPid = 0x3201; 95*76af099aSliuyi config.usVid = 0x071B; 96*76af099aSliuyi m_deviceConfigSet.push_back(config); 97*76af099aSliuyi 98*76af099aSliuyi config.emDeviceType = RK28_DEVICE; 99*76af099aSliuyi config.usPid = 0x3228; 100*76af099aSliuyi config.usVid = 0x071B; 101*76af099aSliuyi m_deviceConfigSet.push_back(config); 102*76af099aSliuyi 103*76af099aSliuyi config.emDeviceType = RKNANO_DEVICE; 104*76af099aSliuyi config.usPid = 0x3226; 105*76af099aSliuyi config.usVid = 0x071B; 106*76af099aSliuyi m_deviceConfigSet.push_back(config); 107*76af099aSliuyi 108*76af099aSliuyi config.emDeviceType = RKCROWN_DEVICE; 109*76af099aSliuyi config.usPid = 0x261A; 110*76af099aSliuyi config.usVid = 0x2207; 111*76af099aSliuyi m_deviceConfigSet.push_back(config); 112*76af099aSliuyi 113*76af099aSliuyi config.emDeviceType = RK281X_DEVICE; 114*76af099aSliuyi config.usPid = 0x281A; 115*76af099aSliuyi config.usVid = 0x2207; 116*76af099aSliuyi m_deviceConfigSet.push_back(config); 117*76af099aSliuyi 118*76af099aSliuyi config.emDeviceType = RKCAYMAN_DEVICE; 119*76af099aSliuyi config.usPid = 0x273A; 120*76af099aSliuyi config.usVid = 0x2207; 121*76af099aSliuyi m_deviceConfigSet.push_back(config); 122*76af099aSliuyi 123*76af099aSliuyi config.emDeviceType = RK29_DEVICE; 124*76af099aSliuyi config.usPid = 0x290A; 125*76af099aSliuyi config.usVid = 0x2207; 126*76af099aSliuyi m_deviceConfigSet.push_back(config); 127*76af099aSliuyi 128*76af099aSliuyi config.emDeviceType = RKPANDA_DEVICE; 129*76af099aSliuyi config.usPid = 0x282B; 130*76af099aSliuyi config.usVid = 0x2207; 131*76af099aSliuyi m_deviceConfigSet.push_back(config); 132*76af099aSliuyi 133*76af099aSliuyi config.emDeviceType = RKSMART_DEVICE; 134*76af099aSliuyi config.usPid = 0x262C; 135*76af099aSliuyi config.usVid = 0x2207; 136*76af099aSliuyi m_deviceConfigSet.push_back(config); 137*76af099aSliuyi 138*76af099aSliuyi config.emDeviceType = RK292X_DEVICE; 139*76af099aSliuyi config.usPid = 0x292A; 140*76af099aSliuyi config.usVid = 0x2207; 141*76af099aSliuyi m_deviceConfigSet.push_back(config); 142*76af099aSliuyi 143*76af099aSliuyi config.emDeviceType = RK30_DEVICE; 144*76af099aSliuyi config.usPid = 0x300A; 145*76af099aSliuyi config.usVid = 0x2207; 146*76af099aSliuyi m_deviceConfigSet.push_back(config); 147*76af099aSliuyi 148*76af099aSliuyi config.emDeviceType = RK30B_DEVICE; 149*76af099aSliuyi config.usPid = 0x300B; 150*76af099aSliuyi config.usVid = 0x2207; 151*76af099aSliuyi m_deviceConfigSet.push_back(config); 152*76af099aSliuyi 153*76af099aSliuyi config.emDeviceType = RK31_DEVICE; 154*76af099aSliuyi config.usPid = 0x310B; 155*76af099aSliuyi config.usVid = 0x2207; 156*76af099aSliuyi m_deviceConfigSet.push_back(config); 157*76af099aSliuyi 158*76af099aSliuyi config.emDeviceType = RK32_DEVICE; 159*76af099aSliuyi config.usPid = 0x320A; 160*76af099aSliuyi config.usVid = 0x2207; 161*76af099aSliuyi m_deviceConfigSet.push_back(config); 162*76af099aSliuyi 163*76af099aSliuyi m_deviceMscConfigSet.clear(); 164*76af099aSliuyi 165*76af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 166*76af099aSliuyi config.usPid = 0x3203; 167*76af099aSliuyi config.usVid = 0x071B; 168*76af099aSliuyi m_deviceMscConfigSet.push_back(config); 169*76af099aSliuyi 170*76af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 171*76af099aSliuyi config.usPid = 0x3205; 172*76af099aSliuyi config.usVid = 0x071B; 173*76af099aSliuyi m_deviceMscConfigSet.push_back(config); 174*76af099aSliuyi 175*76af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 176*76af099aSliuyi config.usPid = 0x2910; 177*76af099aSliuyi config.usVid = 0x0BB4; 178*76af099aSliuyi m_deviceMscConfigSet.push_back(config); 179*76af099aSliuyi 180*76af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 181*76af099aSliuyi config.usPid = 0x0000; 182*76af099aSliuyi config.usVid = 0x2207; 183*76af099aSliuyi m_deviceMscConfigSet.push_back(config); 184*76af099aSliuyi 185*76af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 186*76af099aSliuyi config.usPid = 0x0010; 187*76af099aSliuyi config.usVid = 0x2207; 188*76af099aSliuyi m_deviceMscConfigSet.push_back(config); 189*76af099aSliuyi 190*76af099aSliuyi if ((mscVid != 0) || (mscPid != 0)) { 191*76af099aSliuyi if (FindConfigSetPos(m_deviceMscConfigSet, mscVid, mscPid) == -1) { 192*76af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 193*76af099aSliuyi config.usPid = mscPid; 194*76af099aSliuyi config.usVid = mscVid; 195*76af099aSliuyi m_deviceMscConfigSet.push_back(config); 196*76af099aSliuyi } 197*76af099aSliuyi } 198*76af099aSliuyi } 199*76af099aSliuyi int CRKScan::FindWaitSetPos(const RKDEVICE_CONFIG_SET &waitDeviceSet, USHORT vid, USHORT pid) 200*76af099aSliuyi { 201*76af099aSliuyi int pos=-1; 202*76af099aSliuyi UINT i; 203*76af099aSliuyi for ( i = 0; i < waitDeviceSet.size(); i++ ) { 204*76af099aSliuyi if ( (vid == waitDeviceSet[i].usVid) && (pid == waitDeviceSet[i].usPid) ) { 205*76af099aSliuyi pos = i; 206*76af099aSliuyi break; 207*76af099aSliuyi } 208*76af099aSliuyi } 209*76af099aSliuyi return pos; 210*76af099aSliuyi } 211*76af099aSliuyi int CRKScan::FindConfigSetPos(RKDEVICE_CONFIG_SET &devConfigSet, USHORT vid, USHORT pid) 212*76af099aSliuyi { 213*76af099aSliuyi int pos = -1; 214*76af099aSliuyi UINT i; 215*76af099aSliuyi for ( i = 0; i < devConfigSet.size(); i++ ) { 216*76af099aSliuyi if ( (vid == devConfigSet[i].usVid) && (pid == devConfigSet[i].usPid) ) { 217*76af099aSliuyi pos = i; 218*76af099aSliuyi break; 219*76af099aSliuyi } 220*76af099aSliuyi } 221*76af099aSliuyi return pos; 222*76af099aSliuyi } 223*76af099aSliuyi void CRKScan::EnumerateUsbDevice(RKDEVICE_DESC_SET &list, UINT &uiTotalMatchDevices) 224*76af099aSliuyi { 225*76af099aSliuyi STRUCT_RKDEVICE_DESC desc; 226*76af099aSliuyi struct libusb_device_descriptor descriptor; 227*76af099aSliuyi int ret,i,cnt; 228*76af099aSliuyi 229*76af099aSliuyi uiTotalMatchDevices = 0; 230*76af099aSliuyi libusb_device **pDevs = NULL; 231*76af099aSliuyi libusb_device *dev; 232*76af099aSliuyi ret = libusb_get_device_list(NULL, &pDevs); 233*76af099aSliuyi if (ret < 0) { 234*76af099aSliuyi if (m_log) 235*76af099aSliuyi m_log->Record("Error:EnumerateUsbDevice-->get_device_list failed,err=%d!", ret); 236*76af099aSliuyi return; 237*76af099aSliuyi } 238*76af099aSliuyi cnt = ret; 239*76af099aSliuyi for (i = 0; i < cnt; i++) { 240*76af099aSliuyi dev = pDevs[i]; 241*76af099aSliuyi if (dev) { 242*76af099aSliuyi ret = libusb_get_device_descriptor (dev, &descriptor); 243*76af099aSliuyi if (ret < 0) { 244*76af099aSliuyi libusb_free_device_list(pDevs, 1); 245*76af099aSliuyi if (m_log) 246*76af099aSliuyi m_log->Record("Error:EnumerateUsbDevice-->get_device_descriptor failed,err=%d!", ret); 247*76af099aSliuyi return; 248*76af099aSliuyi } 249*76af099aSliuyi desc.emDeviceType = RKNONE_DEVICE; 250*76af099aSliuyi desc.emUsbType = RKUSB_NONE; 251*76af099aSliuyi desc.pUsbHandle = (void *)dev; 252*76af099aSliuyi desc.usbcdUsb = descriptor.bcdUSB; 253*76af099aSliuyi desc.usVid = descriptor.idVendor; 254*76af099aSliuyi desc.usPid = descriptor.idProduct; 255*76af099aSliuyi desc.uiLocationID = libusb_get_bus_number(dev); 256*76af099aSliuyi desc.uiLocationID <<= 8; 257*76af099aSliuyi desc.uiLocationID += libusb_get_port_number(dev); 258*76af099aSliuyi libusb_ref_device(dev); 259*76af099aSliuyi uiTotalMatchDevices++; 260*76af099aSliuyi list.push_back(desc); 261*76af099aSliuyi } 262*76af099aSliuyi 263*76af099aSliuyi } 264*76af099aSliuyi libusb_free_device_list(pDevs, 1); 265*76af099aSliuyi 266*76af099aSliuyi } 267*76af099aSliuyi 268*76af099aSliuyi void CRKScan::FreeDeviceList(RKDEVICE_DESC_SET &list) 269*76af099aSliuyi { 270*76af099aSliuyi device_list_iter iter; 271*76af099aSliuyi for (iter = list.begin(); iter != list.end(); iter++) { 272*76af099aSliuyi if ((*iter).pUsbHandle) { 273*76af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 274*76af099aSliuyi (*iter).pUsbHandle = NULL; 275*76af099aSliuyi } 276*76af099aSliuyi } 277*76af099aSliuyi list.clear(); 278*76af099aSliuyi } 279*76af099aSliuyi bool CRKScan::IsRockusbDevice(ENUM_RKDEVICE_TYPE &type, USHORT vid, USHORT pid) 280*76af099aSliuyi { 281*76af099aSliuyi int iPos; 282*76af099aSliuyi iPos = FindConfigSetPos(m_deviceConfigSet, vid, pid); 283*76af099aSliuyi if (iPos != -1) { 284*76af099aSliuyi type = m_deviceConfigSet[iPos].emDeviceType; 285*76af099aSliuyi return true; 286*76af099aSliuyi } 287*76af099aSliuyi if (vid == 0x2207) { 288*76af099aSliuyi if ((pid >> 8) > 0) { 289*76af099aSliuyi type = RKNONE_DEVICE; 290*76af099aSliuyi return true; 291*76af099aSliuyi } 292*76af099aSliuyi } 293*76af099aSliuyi return false; 294*76af099aSliuyi } 295*76af099aSliuyi int CRKScan::Search(UINT type) 296*76af099aSliuyi { 297*76af099aSliuyi device_list_iter iter,new_iter; 298*76af099aSliuyi ENUM_RKDEVICE_TYPE devType; 299*76af099aSliuyi UINT uiTotalDevice; 300*76af099aSliuyi int iPos; 301*76af099aSliuyi 302*76af099aSliuyi FreeDeviceList(m_list); 303*76af099aSliuyi EnumerateUsbDevice( m_list, uiTotalDevice ); 304*76af099aSliuyi 305*76af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 306*76af099aSliuyi if( (iPos = FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid)) != -1 ) { 307*76af099aSliuyi (*iter).emDeviceType = RKNONE_DEVICE; 308*76af099aSliuyi iter++; 309*76af099aSliuyi continue; 310*76af099aSliuyi } else if (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid) ) { 311*76af099aSliuyi (*iter).emDeviceType = devType; 312*76af099aSliuyi iter++; 313*76af099aSliuyi continue; 314*76af099aSliuyi } else { 315*76af099aSliuyi if ((*iter).pUsbHandle) { 316*76af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 317*76af099aSliuyi (*iter).pUsbHandle = NULL; 318*76af099aSliuyi } 319*76af099aSliuyi iter = m_list.erase(iter); 320*76af099aSliuyi uiTotalDevice--; 321*76af099aSliuyi } 322*76af099aSliuyi } 323*76af099aSliuyi 324*76af099aSliuyi if (m_list.size() <= 0) { 325*76af099aSliuyi return 0; 326*76af099aSliuyi } 327*76af099aSliuyi 328*76af099aSliuyi if ( (type & RKUSB_MASKROM) == 0 ) { 329*76af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 330*76af099aSliuyi if( (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid)) && (((*iter).usbcdUsb & 0x1) == 0) ) { 331*76af099aSliuyi if ((*iter).pUsbHandle) { 332*76af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 333*76af099aSliuyi (*iter).pUsbHandle = NULL; 334*76af099aSliuyi } 335*76af099aSliuyi iter = m_list.erase(iter); 336*76af099aSliuyi uiTotalDevice--; 337*76af099aSliuyi } else { 338*76af099aSliuyi iter++; 339*76af099aSliuyi continue; 340*76af099aSliuyi } 341*76af099aSliuyi } 342*76af099aSliuyi } 343*76af099aSliuyi if (m_list.size() <= 0) { 344*76af099aSliuyi return 0; 345*76af099aSliuyi } 346*76af099aSliuyi 347*76af099aSliuyi if ( (type & RKUSB_LOADER) == 0 ) { 348*76af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 349*76af099aSliuyi if( (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid)) && (((*iter).usbcdUsb & 0x1) == 1) ) { 350*76af099aSliuyi if ((*iter).pUsbHandle) { 351*76af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 352*76af099aSliuyi (*iter).pUsbHandle = NULL; 353*76af099aSliuyi } 354*76af099aSliuyi iter = m_list.erase(iter); 355*76af099aSliuyi uiTotalDevice--; 356*76af099aSliuyi } else { 357*76af099aSliuyi iter++; 358*76af099aSliuyi continue; 359*76af099aSliuyi } 360*76af099aSliuyi } 361*76af099aSliuyi } 362*76af099aSliuyi if (m_list.size() <= 0) { 363*76af099aSliuyi return 0; 364*76af099aSliuyi } 365*76af099aSliuyi 366*76af099aSliuyi if ( (type & RKUSB_MSC) == 0 ) { 367*76af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 368*76af099aSliuyi if(FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid) != -1) { 369*76af099aSliuyi if ((*iter).pUsbHandle) { 370*76af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 371*76af099aSliuyi (*iter).pUsbHandle = NULL; 372*76af099aSliuyi } 373*76af099aSliuyi iter = m_list.erase(iter); 374*76af099aSliuyi uiTotalDevice--; 375*76af099aSliuyi } else { 376*76af099aSliuyi iter++; 377*76af099aSliuyi continue; 378*76af099aSliuyi } 379*76af099aSliuyi } 380*76af099aSliuyi } 381*76af099aSliuyi if (m_list.size() <= 0) { 382*76af099aSliuyi return 0; 383*76af099aSliuyi } 384*76af099aSliuyi 385*76af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); iter++ ) { 386*76af099aSliuyi if (FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid) != -1) { 387*76af099aSliuyi (*iter).emUsbType = RKUSB_MSC; 388*76af099aSliuyi } else { 389*76af099aSliuyi USHORT usTemp; 390*76af099aSliuyi usTemp = (*iter).usbcdUsb; 391*76af099aSliuyi usTemp= usTemp & 0x1; 392*76af099aSliuyi if ( usTemp == 0 ) 393*76af099aSliuyi (*iter).emUsbType = RKUSB_MASKROM; 394*76af099aSliuyi else 395*76af099aSliuyi (*iter).emUsbType = RKUSB_LOADER; 396*76af099aSliuyi } 397*76af099aSliuyi } 398*76af099aSliuyi return m_list.size(); 399*76af099aSliuyi } 400*76af099aSliuyi bool CRKScan::MutexWait(UINT_VECTOR &vecExistedDevice, STRUCT_RKDEVICE_DESC &device, ENUM_RKUSB_TYPE usbType, USHORT usVid, USHORT usPid) 401*76af099aSliuyi { 402*76af099aSliuyi device_list_iter iter; 403*76af099aSliuyi int uiWaitSecond; 404*76af099aSliuyi int iFoundCount = 0; 405*76af099aSliuyi UINT iRet,i; 406*76af099aSliuyi bool bFound = false; 407*76af099aSliuyi if (usbType == RKUSB_MSC) 408*76af099aSliuyi uiWaitSecond = m_waitMscSecond; 409*76af099aSliuyi else 410*76af099aSliuyi uiWaitSecond = m_waitRKusbSecond; 411*76af099aSliuyi time_t tmInit, tmNow; 412*76af099aSliuyi time(&tmInit); 413*76af099aSliuyi device.uiLocationID = 0; 414*76af099aSliuyi while( difftime(time(&tmNow), tmInit) <= uiWaitSecond ) { 415*76af099aSliuyi iRet = Search(RKUSB_MASKROM | RKUSB_LOADER | RKUSB_MSC); 416*76af099aSliuyi if ( iRet == vecExistedDevice.size() + 1 ) { 417*76af099aSliuyi for (i = 0; i < vecExistedDevice.size(); i++) { 418*76af099aSliuyi for (iter = m_list.begin(); iter != m_list.end(); ) { 419*76af099aSliuyi if ((*iter).uiLocationID == vecExistedDevice[i]) { 420*76af099aSliuyi iter = m_list.erase(iter); 421*76af099aSliuyi } else 422*76af099aSliuyi iter++; 423*76af099aSliuyi } 424*76af099aSliuyi } 425*76af099aSliuyi if (m_list.size() != 1) { 426*76af099aSliuyi device.uiLocationID = 0; 427*76af099aSliuyi iFoundCount = 0; 428*76af099aSliuyi } else { 429*76af099aSliuyi iter = m_list.begin(); 430*76af099aSliuyi if (device.uiLocationID == 0) { 431*76af099aSliuyi iFoundCount++; 432*76af099aSliuyi device.uiLocationID = (*iter).uiLocationID; 433*76af099aSliuyi } else { 434*76af099aSliuyi if (device.uiLocationID == (*iter).uiLocationID) { 435*76af099aSliuyi iFoundCount++; 436*76af099aSliuyi } else { 437*76af099aSliuyi device.uiLocationID = 0; 438*76af099aSliuyi iFoundCount = 0; 439*76af099aSliuyi } 440*76af099aSliuyi } 441*76af099aSliuyi } 442*76af099aSliuyi } else { 443*76af099aSliuyi device.uiLocationID = 0; 444*76af099aSliuyi iFoundCount = 0; 445*76af099aSliuyi } 446*76af099aSliuyi if (iFoundCount >= 10) { 447*76af099aSliuyi bFound = true; 448*76af099aSliuyi break; 449*76af099aSliuyi } 450*76af099aSliuyi } 451*76af099aSliuyi if (!bFound) { 452*76af099aSliuyi return false; 453*76af099aSliuyi } 454*76af099aSliuyi bFound = Wait(device, usbType, usVid, usPid); 455*76af099aSliuyi return bFound; 456*76af099aSliuyi } 457*76af099aSliuyi 458*76af099aSliuyi bool CRKScan::MutexWaitPrepare(UINT_VECTOR &vecExistedDevice, DWORD uiOfflineDevice) 459*76af099aSliuyi { 460*76af099aSliuyi int iRet, iRet2; 461*76af099aSliuyi device_list_iter iter; 462*76af099aSliuyi time_t timeInit, timeNow; 463*76af099aSliuyi time(&timeInit); 464*76af099aSliuyi iRet = iRet2 =0; 465*76af099aSliuyi while ((time(&timeNow) - timeInit) <= 3) { 466*76af099aSliuyi iRet = Search(RKUSB_MASKROM | RKUSB_LOADER | RKUSB_MSC); 467*76af099aSliuyi usleep(20000); 468*76af099aSliuyi iRet2 = Search(RKUSB_MASKROM | RKUSB_LOADER | RKUSB_MSC); 469*76af099aSliuyi if (iRet2 == iRet) { 470*76af099aSliuyi break; 471*76af099aSliuyi } 472*76af099aSliuyi } 473*76af099aSliuyi if ((iRet <= 0) || (iRet2 != iRet)) { 474*76af099aSliuyi return false; 475*76af099aSliuyi } 476*76af099aSliuyi vecExistedDevice.clear(); 477*76af099aSliuyi bool bFound = false; 478*76af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); iter++ ) { 479*76af099aSliuyi if ((*iter).uiLocationID != uiOfflineDevice) { 480*76af099aSliuyi vecExistedDevice.push_back((*iter).uiLocationID); 481*76af099aSliuyi } else 482*76af099aSliuyi bFound = true; 483*76af099aSliuyi } 484*76af099aSliuyi if (!bFound) { 485*76af099aSliuyi return false; 486*76af099aSliuyi } 487*76af099aSliuyi return true; 488*76af099aSliuyi 489*76af099aSliuyi } 490*76af099aSliuyi 491*76af099aSliuyi bool CRKScan::Wait(STRUCT_RKDEVICE_DESC &device, ENUM_RKUSB_TYPE usbType, USHORT usVid, USHORT usPid) 492*76af099aSliuyi { 493*76af099aSliuyi RKDEVICE_DESC_SET deviceList; 494*76af099aSliuyi ENUM_RKUSB_TYPE curDeviceType; 495*76af099aSliuyi ENUM_RKDEVICE_TYPE devType; 496*76af099aSliuyi device_list_iter iter; 497*76af099aSliuyi UINT totalDevice; 498*76af099aSliuyi int uiWaitSecond; 499*76af099aSliuyi int iFoundCount = 0; 500*76af099aSliuyi bool bRet = false; 501*76af099aSliuyi if (usbType == RKUSB_MSC) 502*76af099aSliuyi uiWaitSecond = m_waitMscSecond; 503*76af099aSliuyi else 504*76af099aSliuyi uiWaitSecond = m_waitRKusbSecond; 505*76af099aSliuyi time_t tmInit, tmNow; 506*76af099aSliuyi time(&tmInit); 507*76af099aSliuyi while( difftime(time(&tmNow), tmInit) <= uiWaitSecond ) { 508*76af099aSliuyi FreeDeviceList(deviceList); 509*76af099aSliuyi EnumerateUsbDevice(deviceList, totalDevice); 510*76af099aSliuyi for ( iter = deviceList.begin(); iter != deviceList.end(); iter++ ) { 511*76af099aSliuyi if ((BUSID((*iter).uiLocationID) != BUSID(device.uiLocationID)) || 512*76af099aSliuyi ((BUSID((*iter).uiLocationID) == BUSID(device.uiLocationID)) && ((*iter).uiLocationID >= device.uiLocationID))) { 513*76af099aSliuyi if ((usVid != 0) || (usPid != 0)) { 514*76af099aSliuyi if ( ((*iter).usVid != usVid) || ((*iter).usPid != usPid) ) 515*76af099aSliuyi continue; 516*76af099aSliuyi } 517*76af099aSliuyi if (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid)) { 518*76af099aSliuyi if ( ((*iter).usbcdUsb & 0x0001) == 0 ) 519*76af099aSliuyi curDeviceType = RKUSB_MASKROM; 520*76af099aSliuyi else 521*76af099aSliuyi curDeviceType = RKUSB_LOADER; 522*76af099aSliuyi } else if ( FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid) != -1 ) { 523*76af099aSliuyi curDeviceType = RKUSB_MSC; 524*76af099aSliuyi } else 525*76af099aSliuyi curDeviceType = RKUSB_NONE; 526*76af099aSliuyi 527*76af099aSliuyi if ( curDeviceType == usbType ) { 528*76af099aSliuyi iFoundCount++; 529*76af099aSliuyi break; 530*76af099aSliuyi } 531*76af099aSliuyi } 532*76af099aSliuyi } 533*76af099aSliuyi if ( iter == deviceList.end() ) { 534*76af099aSliuyi iFoundCount = 0; 535*76af099aSliuyi } 536*76af099aSliuyi if ( iFoundCount >= 8 ) { 537*76af099aSliuyi device.usVid = (*iter).usVid; 538*76af099aSliuyi device.usPid = (*iter).usPid; 539*76af099aSliuyi device.uiLocationID = (*iter).uiLocationID; 540*76af099aSliuyi device.pUsbHandle= (*iter).pUsbHandle; 541*76af099aSliuyi device.emUsbType = usbType; 542*76af099aSliuyi device.usbcdUsb = (*iter).usbcdUsb; 543*76af099aSliuyi libusb_ref_device((libusb_device *)device.pUsbHandle); 544*76af099aSliuyi 545*76af099aSliuyi if (usbType == RKUSB_MSC) { 546*76af099aSliuyi device.emDeviceType = RKNONE_DEVICE; 547*76af099aSliuyi } else { 548*76af099aSliuyi if (IsRockusbDevice(devType, device.usVid, device.usPid)) 549*76af099aSliuyi device.emDeviceType = devType; 550*76af099aSliuyi } 551*76af099aSliuyi bRet = true; 552*76af099aSliuyi break; 553*76af099aSliuyi } 554*76af099aSliuyi usleep(50000); 555*76af099aSliuyi } 556*76af099aSliuyi 557*76af099aSliuyi FreeDeviceList(deviceList); 558*76af099aSliuyi return bRet; 559*76af099aSliuyi } 560*76af099aSliuyi int CRKScan::GetPos(UINT locationID) 561*76af099aSliuyi { 562*76af099aSliuyi device_list_iter iter; 563*76af099aSliuyi int pos = 0; 564*76af099aSliuyi bool bFound = false; 565*76af099aSliuyi for (iter = m_list.begin(); iter != m_list.end(); iter++) { 566*76af099aSliuyi if (locationID == (*iter).uiLocationID) { 567*76af099aSliuyi bFound=true; 568*76af099aSliuyi break; 569*76af099aSliuyi } 570*76af099aSliuyi pos++; 571*76af099aSliuyi } 572*76af099aSliuyi return (bFound ? pos : -1); 573*76af099aSliuyi } 574*76af099aSliuyi bool CRKScan::GetDevice(STRUCT_RKDEVICE_DESC &device, int pos) 575*76af099aSliuyi { 576*76af099aSliuyi if ( (pos < 0) || (pos >= (int)m_list.size()) ) { 577*76af099aSliuyi return false; 578*76af099aSliuyi } 579*76af099aSliuyi device_list_iter iter; 580*76af099aSliuyi for (iter = m_list.begin(); iter != m_list.end(); iter++) { 581*76af099aSliuyi if (pos == 0) { 582*76af099aSliuyi break; 583*76af099aSliuyi } 584*76af099aSliuyi pos--; 585*76af099aSliuyi } 586*76af099aSliuyi device.usVid = (*iter).usVid; 587*76af099aSliuyi device.usPid = (*iter).usPid; 588*76af099aSliuyi device.emDeviceType = (*iter).emDeviceType; 589*76af099aSliuyi device.emUsbType = (*iter).emUsbType; 590*76af099aSliuyi device.uiLocationID = (*iter).uiLocationID; 591*76af099aSliuyi device.pUsbHandle= (*iter).pUsbHandle; 592*76af099aSliuyi device.usbcdUsb = (*iter).usbcdUsb; 593*76af099aSliuyi return true; 594*76af099aSliuyi } 595*76af099aSliuyi 596*76af099aSliuyi bool CRKScan::SetLogObject(CRKLog *pLog) 597*76af099aSliuyi { 598*76af099aSliuyi if (pLog) { 599*76af099aSliuyi if (m_log) { 600*76af099aSliuyi delete m_log; 601*76af099aSliuyi } 602*76af099aSliuyi m_log = pLog; 603*76af099aSliuyi } else 604*76af099aSliuyi return false; 605*76af099aSliuyi return true; 606*76af099aSliuyi } 607*76af099aSliuyi CRKScan::~CRKScan() 608*76af099aSliuyi { 609*76af099aSliuyi FreeDeviceList(m_list); 610*76af099aSliuyi if (m_log) { 611*76af099aSliuyi delete m_log; 612*76af099aSliuyi m_log = NULL; 613*76af099aSliuyi } 614*76af099aSliuyi } 615