176af099aSliuyi /* 276af099aSliuyi * (C) Copyright 2017 Fuzhou Rockchip Electronics Co., Ltd 376af099aSliuyi * Seth Liu 2017.03.01 476af099aSliuyi * 576af099aSliuyi * SPDX-License-Identifier: GPL-2.0+ 676af099aSliuyi */ 776af099aSliuyi 876af099aSliuyi #include "RKScan.h" 976af099aSliuyi #define BUSID(id) ((id & 0x0000FF00) >> 8) 1076af099aSliuyi int CRKScan::GetDEVICE_COUNTS() 1176af099aSliuyi { 1276af099aSliuyi return m_list.size(); 1376af099aSliuyi } 1476af099aSliuyi 1576af099aSliuyi UINT CRKScan::GetMSC_TIMEOUT() 1676af099aSliuyi { 1776af099aSliuyi return m_waitMscSecond; 1876af099aSliuyi } 1976af099aSliuyi 2076af099aSliuyi UINT CRKScan::GetRKUSB_TIMEOUT() 2176af099aSliuyi { 2276af099aSliuyi return m_waitRKusbSecond; 2376af099aSliuyi } 2476af099aSliuyi 2576af099aSliuyi void CRKScan::SetMSC_TIMEOUT(UINT value) 2676af099aSliuyi { 2776af099aSliuyi m_waitMscSecond = value; 2876af099aSliuyi } 2976af099aSliuyi 3076af099aSliuyi void CRKScan::SetRKUSB_TIMEOUT(UINT value) 3176af099aSliuyi { 3276af099aSliuyi m_waitRKusbSecond = value; 3376af099aSliuyi } 3476af099aSliuyi 3576af099aSliuyi CRKScan::CRKScan(UINT uiMscTimeout, UINT uiRKusbTimeout) 3676af099aSliuyi { 3776af099aSliuyi DEVICE_COUNTS.setContainer(this); 3876af099aSliuyi DEVICE_COUNTS.getter(&CRKScan::GetDEVICE_COUNTS); 3976af099aSliuyi 4076af099aSliuyi MSC_TIMEOUT.setContainer(this); 4176af099aSliuyi MSC_TIMEOUT.getter(&CRKScan::GetMSC_TIMEOUT); 4276af099aSliuyi MSC_TIMEOUT.setter(&CRKScan::SetMSC_TIMEOUT); 4376af099aSliuyi 4476af099aSliuyi RKUSB_TIMEOUT.setContainer(this); 4576af099aSliuyi RKUSB_TIMEOUT.getter(&CRKScan::GetRKUSB_TIMEOUT); 4676af099aSliuyi RKUSB_TIMEOUT.setter(&CRKScan::SetRKUSB_TIMEOUT); 4776af099aSliuyi 4876af099aSliuyi m_waitMscSecond = uiMscTimeout; 4976af099aSliuyi m_waitRKusbSecond = uiRKusbTimeout; 5076af099aSliuyi m_log = NULL; 5176af099aSliuyi m_list.clear(); 5276af099aSliuyi m_deviceConfigSet.clear(); 5376af099aSliuyi m_deviceMscConfigSet.clear(); 5476af099aSliuyi } 5576af099aSliuyi bool CRKScan::FindRockusbVidPid(ENUM_RKDEVICE_TYPE type, USHORT &usVid, USHORT &usPid) 5676af099aSliuyi { 5776af099aSliuyi UINT i; 5876af099aSliuyi bool bRet = false; 5976af099aSliuyi for (i = 0; i < m_deviceConfigSet.size(); i++) { 6076af099aSliuyi if (m_deviceConfigSet[i].emDeviceType == type) { 6176af099aSliuyi usVid = m_deviceConfigSet[i].usVid; 6276af099aSliuyi usPid = m_deviceConfigSet[i].usPid; 6376af099aSliuyi bRet = true; 6476af099aSliuyi break; 6576af099aSliuyi } 6676af099aSliuyi } 6776af099aSliuyi return bRet; 6876af099aSliuyi } 6976af099aSliuyi void CRKScan::AddRockusbVidPid(USHORT newVid, USHORT newPid, USHORT oldVid, USHORT oldPid) 7076af099aSliuyi { 7176af099aSliuyi if ((newVid == 0) || (newPid == 0) || (oldVid == 0) || (oldPid == 0)) { 7276af099aSliuyi return; 7376af099aSliuyi } 7476af099aSliuyi STRUCT_DEVICE_CONFIG config; 7576af099aSliuyi unsigned int i; 7676af099aSliuyi for (i = 0; i < m_deviceConfigSet.size(); i++) { 7776af099aSliuyi if ((m_deviceConfigSet[i].usVid == oldVid) && (m_deviceConfigSet[i].usPid == oldPid)) { 7876af099aSliuyi config.usVid = newVid; 7976af099aSliuyi config.usPid = newPid; 8076af099aSliuyi config.emDeviceType = m_deviceConfigSet[i].emDeviceType; 8176af099aSliuyi break; 8276af099aSliuyi } 8376af099aSliuyi } 8476af099aSliuyi if (i < m_deviceConfigSet.size()) 8576af099aSliuyi m_deviceConfigSet.push_back(config); 8676af099aSliuyi } 8776af099aSliuyi 8876af099aSliuyi void CRKScan::SetVidPid(USHORT mscVid, USHORT mscPid) 8976af099aSliuyi { 9076af099aSliuyi STRUCT_DEVICE_CONFIG config; 9176af099aSliuyi m_deviceConfigSet.clear(); 9276af099aSliuyi 9376af099aSliuyi config.emDeviceType = RK27_DEVICE; 9476af099aSliuyi config.usPid = 0x3201; 9576af099aSliuyi config.usVid = 0x071B; 9676af099aSliuyi m_deviceConfigSet.push_back(config); 9776af099aSliuyi 9876af099aSliuyi config.emDeviceType = RK28_DEVICE; 9976af099aSliuyi config.usPid = 0x3228; 10076af099aSliuyi config.usVid = 0x071B; 10176af099aSliuyi m_deviceConfigSet.push_back(config); 10276af099aSliuyi 10376af099aSliuyi config.emDeviceType = RKNANO_DEVICE; 10476af099aSliuyi config.usPid = 0x3226; 10576af099aSliuyi config.usVid = 0x071B; 10676af099aSliuyi m_deviceConfigSet.push_back(config); 10776af099aSliuyi 10876af099aSliuyi config.emDeviceType = RKCROWN_DEVICE; 10976af099aSliuyi config.usPid = 0x261A; 11076af099aSliuyi config.usVid = 0x2207; 11176af099aSliuyi m_deviceConfigSet.push_back(config); 11276af099aSliuyi 11376af099aSliuyi config.emDeviceType = RK281X_DEVICE; 11476af099aSliuyi config.usPid = 0x281A; 11576af099aSliuyi config.usVid = 0x2207; 11676af099aSliuyi m_deviceConfigSet.push_back(config); 11776af099aSliuyi 11876af099aSliuyi config.emDeviceType = RKCAYMAN_DEVICE; 11976af099aSliuyi config.usPid = 0x273A; 12076af099aSliuyi config.usVid = 0x2207; 12176af099aSliuyi m_deviceConfigSet.push_back(config); 12276af099aSliuyi 12376af099aSliuyi config.emDeviceType = RK29_DEVICE; 12476af099aSliuyi config.usPid = 0x290A; 12576af099aSliuyi config.usVid = 0x2207; 12676af099aSliuyi m_deviceConfigSet.push_back(config); 12776af099aSliuyi 12876af099aSliuyi config.emDeviceType = RKPANDA_DEVICE; 12976af099aSliuyi config.usPid = 0x282B; 13076af099aSliuyi config.usVid = 0x2207; 13176af099aSliuyi m_deviceConfigSet.push_back(config); 13276af099aSliuyi 13376af099aSliuyi config.emDeviceType = RKSMART_DEVICE; 13476af099aSliuyi config.usPid = 0x262C; 13576af099aSliuyi config.usVid = 0x2207; 13676af099aSliuyi m_deviceConfigSet.push_back(config); 13776af099aSliuyi 13876af099aSliuyi config.emDeviceType = RK292X_DEVICE; 13976af099aSliuyi config.usPid = 0x292A; 14076af099aSliuyi config.usVid = 0x2207; 14176af099aSliuyi m_deviceConfigSet.push_back(config); 14276af099aSliuyi 14376af099aSliuyi config.emDeviceType = RK30_DEVICE; 14476af099aSliuyi config.usPid = 0x300A; 14576af099aSliuyi config.usVid = 0x2207; 14676af099aSliuyi m_deviceConfigSet.push_back(config); 14776af099aSliuyi 14876af099aSliuyi config.emDeviceType = RK30B_DEVICE; 14976af099aSliuyi config.usPid = 0x300B; 15076af099aSliuyi config.usVid = 0x2207; 15176af099aSliuyi m_deviceConfigSet.push_back(config); 15276af099aSliuyi 15376af099aSliuyi config.emDeviceType = RK31_DEVICE; 15476af099aSliuyi config.usPid = 0x310B; 15576af099aSliuyi config.usVid = 0x2207; 15676af099aSliuyi m_deviceConfigSet.push_back(config); 15776af099aSliuyi 158*21545e35SKaspter Ju config.emDeviceType = RK31_DEVICE; 159*21545e35SKaspter Ju config.usPid = 0x310C; 160*21545e35SKaspter Ju config.usVid = 0x2207; 161*21545e35SKaspter Ju m_deviceConfigSet.push_back(config); 162*21545e35SKaspter Ju 16376af099aSliuyi config.emDeviceType = RK32_DEVICE; 16476af099aSliuyi config.usPid = 0x320A; 16576af099aSliuyi config.usVid = 0x2207; 16676af099aSliuyi m_deviceConfigSet.push_back(config); 16776af099aSliuyi 16876af099aSliuyi m_deviceMscConfigSet.clear(); 16976af099aSliuyi 17076af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 17176af099aSliuyi config.usPid = 0x3203; 17276af099aSliuyi config.usVid = 0x071B; 17376af099aSliuyi m_deviceMscConfigSet.push_back(config); 17476af099aSliuyi 17576af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 17676af099aSliuyi config.usPid = 0x3205; 17776af099aSliuyi config.usVid = 0x071B; 17876af099aSliuyi m_deviceMscConfigSet.push_back(config); 17976af099aSliuyi 18076af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 18176af099aSliuyi config.usPid = 0x2910; 18276af099aSliuyi config.usVid = 0x0BB4; 18376af099aSliuyi m_deviceMscConfigSet.push_back(config); 18476af099aSliuyi 18576af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 18676af099aSliuyi config.usPid = 0x0000; 18776af099aSliuyi config.usVid = 0x2207; 18876af099aSliuyi m_deviceMscConfigSet.push_back(config); 18976af099aSliuyi 19076af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 19176af099aSliuyi config.usPid = 0x0010; 19276af099aSliuyi config.usVid = 0x2207; 19376af099aSliuyi m_deviceMscConfigSet.push_back(config); 19476af099aSliuyi 19576af099aSliuyi if ((mscVid != 0) || (mscPid != 0)) { 19676af099aSliuyi if (FindConfigSetPos(m_deviceMscConfigSet, mscVid, mscPid) == -1) { 19776af099aSliuyi config.emDeviceType = RKNONE_DEVICE; 19876af099aSliuyi config.usPid = mscPid; 19976af099aSliuyi config.usVid = mscVid; 20076af099aSliuyi m_deviceMscConfigSet.push_back(config); 20176af099aSliuyi } 20276af099aSliuyi } 20376af099aSliuyi } 20476af099aSliuyi int CRKScan::FindWaitSetPos(const RKDEVICE_CONFIG_SET &waitDeviceSet, USHORT vid, USHORT pid) 20576af099aSliuyi { 20676af099aSliuyi int pos=-1; 20776af099aSliuyi UINT i; 20876af099aSliuyi for ( i = 0; i < waitDeviceSet.size(); i++ ) { 20976af099aSliuyi if ( (vid == waitDeviceSet[i].usVid) && (pid == waitDeviceSet[i].usPid) ) { 21076af099aSliuyi pos = i; 21176af099aSliuyi break; 21276af099aSliuyi } 21376af099aSliuyi } 21476af099aSliuyi return pos; 21576af099aSliuyi } 21676af099aSliuyi int CRKScan::FindConfigSetPos(RKDEVICE_CONFIG_SET &devConfigSet, USHORT vid, USHORT pid) 21776af099aSliuyi { 21876af099aSliuyi int pos = -1; 21976af099aSliuyi UINT i; 22076af099aSliuyi for ( i = 0; i < devConfigSet.size(); i++ ) { 22176af099aSliuyi if ( (vid == devConfigSet[i].usVid) && (pid == devConfigSet[i].usPid) ) { 22276af099aSliuyi pos = i; 22376af099aSliuyi break; 22476af099aSliuyi } 22576af099aSliuyi } 22676af099aSliuyi return pos; 22776af099aSliuyi } 22876af099aSliuyi void CRKScan::EnumerateUsbDevice(RKDEVICE_DESC_SET &list, UINT &uiTotalMatchDevices) 22976af099aSliuyi { 23076af099aSliuyi STRUCT_RKDEVICE_DESC desc; 23176af099aSliuyi struct libusb_device_descriptor descriptor; 23276af099aSliuyi int ret,i,cnt; 23376af099aSliuyi 23476af099aSliuyi uiTotalMatchDevices = 0; 23576af099aSliuyi libusb_device **pDevs = NULL; 23676af099aSliuyi libusb_device *dev; 23776af099aSliuyi ret = libusb_get_device_list(NULL, &pDevs); 23876af099aSliuyi if (ret < 0) { 23976af099aSliuyi if (m_log) 24076af099aSliuyi m_log->Record("Error:EnumerateUsbDevice-->get_device_list failed,err=%d!", ret); 24176af099aSliuyi return; 24276af099aSliuyi } 24376af099aSliuyi cnt = ret; 24476af099aSliuyi for (i = 0; i < cnt; i++) { 24576af099aSliuyi dev = pDevs[i]; 24676af099aSliuyi if (dev) { 24776af099aSliuyi ret = libusb_get_device_descriptor (dev, &descriptor); 24876af099aSliuyi if (ret < 0) { 24976af099aSliuyi libusb_free_device_list(pDevs, 1); 25076af099aSliuyi if (m_log) 25176af099aSliuyi m_log->Record("Error:EnumerateUsbDevice-->get_device_descriptor failed,err=%d!", ret); 25276af099aSliuyi return; 25376af099aSliuyi } 25476af099aSliuyi desc.emDeviceType = RKNONE_DEVICE; 25576af099aSliuyi desc.emUsbType = RKUSB_NONE; 25676af099aSliuyi desc.pUsbHandle = (void *)dev; 25776af099aSliuyi desc.usbcdUsb = descriptor.bcdUSB; 25876af099aSliuyi desc.usVid = descriptor.idVendor; 25976af099aSliuyi desc.usPid = descriptor.idProduct; 26076af099aSliuyi desc.uiLocationID = libusb_get_bus_number(dev); 26176af099aSliuyi desc.uiLocationID <<= 8; 26276af099aSliuyi desc.uiLocationID += libusb_get_port_number(dev); 26376af099aSliuyi libusb_ref_device(dev); 26476af099aSliuyi uiTotalMatchDevices++; 26576af099aSliuyi list.push_back(desc); 26676af099aSliuyi } 26776af099aSliuyi 26876af099aSliuyi } 26976af099aSliuyi libusb_free_device_list(pDevs, 1); 27076af099aSliuyi 27176af099aSliuyi } 27276af099aSliuyi 27376af099aSliuyi void CRKScan::FreeDeviceList(RKDEVICE_DESC_SET &list) 27476af099aSliuyi { 27576af099aSliuyi device_list_iter iter; 27676af099aSliuyi for (iter = list.begin(); iter != list.end(); iter++) { 27776af099aSliuyi if ((*iter).pUsbHandle) { 27876af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 27976af099aSliuyi (*iter).pUsbHandle = NULL; 28076af099aSliuyi } 28176af099aSliuyi } 28276af099aSliuyi list.clear(); 28376af099aSliuyi } 28476af099aSliuyi bool CRKScan::IsRockusbDevice(ENUM_RKDEVICE_TYPE &type, USHORT vid, USHORT pid) 28576af099aSliuyi { 28676af099aSliuyi int iPos; 28776af099aSliuyi iPos = FindConfigSetPos(m_deviceConfigSet, vid, pid); 28876af099aSliuyi if (iPos != -1) { 28976af099aSliuyi type = m_deviceConfigSet[iPos].emDeviceType; 29076af099aSliuyi return true; 29176af099aSliuyi } 29276af099aSliuyi if (vid == 0x2207) { 29376af099aSliuyi if ((pid >> 8) > 0) { 29476af099aSliuyi type = RKNONE_DEVICE; 29576af099aSliuyi return true; 29676af099aSliuyi } 29776af099aSliuyi } 29876af099aSliuyi return false; 29976af099aSliuyi } 30076af099aSliuyi int CRKScan::Search(UINT type) 30176af099aSliuyi { 30276af099aSliuyi device_list_iter iter,new_iter; 30376af099aSliuyi ENUM_RKDEVICE_TYPE devType; 30476af099aSliuyi UINT uiTotalDevice; 30576af099aSliuyi int iPos; 30676af099aSliuyi 30776af099aSliuyi FreeDeviceList(m_list); 30876af099aSliuyi EnumerateUsbDevice( m_list, uiTotalDevice ); 30976af099aSliuyi 31076af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 31176af099aSliuyi if( (iPos = FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid)) != -1 ) { 31276af099aSliuyi (*iter).emDeviceType = RKNONE_DEVICE; 31376af099aSliuyi iter++; 31476af099aSliuyi continue; 31576af099aSliuyi } else if (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid) ) { 31676af099aSliuyi (*iter).emDeviceType = devType; 31776af099aSliuyi iter++; 31876af099aSliuyi continue; 31976af099aSliuyi } else { 32076af099aSliuyi if ((*iter).pUsbHandle) { 32176af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 32276af099aSliuyi (*iter).pUsbHandle = NULL; 32376af099aSliuyi } 32476af099aSliuyi iter = m_list.erase(iter); 32576af099aSliuyi uiTotalDevice--; 32676af099aSliuyi } 32776af099aSliuyi } 32876af099aSliuyi 32976af099aSliuyi if (m_list.size() <= 0) { 33076af099aSliuyi return 0; 33176af099aSliuyi } 33276af099aSliuyi 33376af099aSliuyi if ( (type & RKUSB_MASKROM) == 0 ) { 33476af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 33576af099aSliuyi if( (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid)) && (((*iter).usbcdUsb & 0x1) == 0) ) { 33676af099aSliuyi if ((*iter).pUsbHandle) { 33776af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 33876af099aSliuyi (*iter).pUsbHandle = NULL; 33976af099aSliuyi } 34076af099aSliuyi iter = m_list.erase(iter); 34176af099aSliuyi uiTotalDevice--; 34276af099aSliuyi } else { 34376af099aSliuyi iter++; 34476af099aSliuyi continue; 34576af099aSliuyi } 34676af099aSliuyi } 34776af099aSliuyi } 34876af099aSliuyi if (m_list.size() <= 0) { 34976af099aSliuyi return 0; 35076af099aSliuyi } 35176af099aSliuyi 35276af099aSliuyi if ( (type & RKUSB_LOADER) == 0 ) { 35376af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 35476af099aSliuyi if( (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid)) && (((*iter).usbcdUsb & 0x1) == 1) ) { 35576af099aSliuyi if ((*iter).pUsbHandle) { 35676af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 35776af099aSliuyi (*iter).pUsbHandle = NULL; 35876af099aSliuyi } 35976af099aSliuyi iter = m_list.erase(iter); 36076af099aSliuyi uiTotalDevice--; 36176af099aSliuyi } else { 36276af099aSliuyi iter++; 36376af099aSliuyi continue; 36476af099aSliuyi } 36576af099aSliuyi } 36676af099aSliuyi } 36776af099aSliuyi if (m_list.size() <= 0) { 36876af099aSliuyi return 0; 36976af099aSliuyi } 37076af099aSliuyi 37176af099aSliuyi if ( (type & RKUSB_MSC) == 0 ) { 37276af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); ) { 37376af099aSliuyi if(FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid) != -1) { 37476af099aSliuyi if ((*iter).pUsbHandle) { 37576af099aSliuyi libusb_unref_device((libusb_device *)((*iter).pUsbHandle)); 37676af099aSliuyi (*iter).pUsbHandle = NULL; 37776af099aSliuyi } 37876af099aSliuyi iter = m_list.erase(iter); 37976af099aSliuyi uiTotalDevice--; 38076af099aSliuyi } else { 38176af099aSliuyi iter++; 38276af099aSliuyi continue; 38376af099aSliuyi } 38476af099aSliuyi } 38576af099aSliuyi } 38676af099aSliuyi if (m_list.size() <= 0) { 38776af099aSliuyi return 0; 38876af099aSliuyi } 38976af099aSliuyi 39076af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); iter++ ) { 39176af099aSliuyi if (FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid) != -1) { 39276af099aSliuyi (*iter).emUsbType = RKUSB_MSC; 39376af099aSliuyi } else { 39476af099aSliuyi USHORT usTemp; 39576af099aSliuyi usTemp = (*iter).usbcdUsb; 39676af099aSliuyi usTemp= usTemp & 0x1; 39776af099aSliuyi if ( usTemp == 0 ) 39876af099aSliuyi (*iter).emUsbType = RKUSB_MASKROM; 39976af099aSliuyi else 40076af099aSliuyi (*iter).emUsbType = RKUSB_LOADER; 40176af099aSliuyi } 40276af099aSliuyi } 40376af099aSliuyi return m_list.size(); 40476af099aSliuyi } 40576af099aSliuyi bool CRKScan::MutexWait(UINT_VECTOR &vecExistedDevice, STRUCT_RKDEVICE_DESC &device, ENUM_RKUSB_TYPE usbType, USHORT usVid, USHORT usPid) 40676af099aSliuyi { 40776af099aSliuyi device_list_iter iter; 40876af099aSliuyi int uiWaitSecond; 40976af099aSliuyi int iFoundCount = 0; 41076af099aSliuyi UINT iRet,i; 41176af099aSliuyi bool bFound = false; 41276af099aSliuyi if (usbType == RKUSB_MSC) 41376af099aSliuyi uiWaitSecond = m_waitMscSecond; 41476af099aSliuyi else 41576af099aSliuyi uiWaitSecond = m_waitRKusbSecond; 41676af099aSliuyi time_t tmInit, tmNow; 41776af099aSliuyi time(&tmInit); 41876af099aSliuyi device.uiLocationID = 0; 41976af099aSliuyi while( difftime(time(&tmNow), tmInit) <= uiWaitSecond ) { 42076af099aSliuyi iRet = Search(RKUSB_MASKROM | RKUSB_LOADER | RKUSB_MSC); 42176af099aSliuyi if ( iRet == vecExistedDevice.size() + 1 ) { 42276af099aSliuyi for (i = 0; i < vecExistedDevice.size(); i++) { 42376af099aSliuyi for (iter = m_list.begin(); iter != m_list.end(); ) { 42476af099aSliuyi if ((*iter).uiLocationID == vecExistedDevice[i]) { 42576af099aSliuyi iter = m_list.erase(iter); 42676af099aSliuyi } else 42776af099aSliuyi iter++; 42876af099aSliuyi } 42976af099aSliuyi } 43076af099aSliuyi if (m_list.size() != 1) { 43176af099aSliuyi device.uiLocationID = 0; 43276af099aSliuyi iFoundCount = 0; 43376af099aSliuyi } else { 43476af099aSliuyi iter = m_list.begin(); 43576af099aSliuyi if (device.uiLocationID == 0) { 43676af099aSliuyi iFoundCount++; 43776af099aSliuyi device.uiLocationID = (*iter).uiLocationID; 43876af099aSliuyi } else { 43976af099aSliuyi if (device.uiLocationID == (*iter).uiLocationID) { 44076af099aSliuyi iFoundCount++; 44176af099aSliuyi } else { 44276af099aSliuyi device.uiLocationID = 0; 44376af099aSliuyi iFoundCount = 0; 44476af099aSliuyi } 44576af099aSliuyi } 44676af099aSliuyi } 44776af099aSliuyi } else { 44876af099aSliuyi device.uiLocationID = 0; 44976af099aSliuyi iFoundCount = 0; 45076af099aSliuyi } 45176af099aSliuyi if (iFoundCount >= 10) { 45276af099aSliuyi bFound = true; 45376af099aSliuyi break; 45476af099aSliuyi } 45576af099aSliuyi } 45676af099aSliuyi if (!bFound) { 45776af099aSliuyi return false; 45876af099aSliuyi } 45976af099aSliuyi bFound = Wait(device, usbType, usVid, usPid); 46076af099aSliuyi return bFound; 46176af099aSliuyi } 46276af099aSliuyi 46376af099aSliuyi bool CRKScan::MutexWaitPrepare(UINT_VECTOR &vecExistedDevice, DWORD uiOfflineDevice) 46476af099aSliuyi { 46576af099aSliuyi int iRet, iRet2; 46676af099aSliuyi device_list_iter iter; 46776af099aSliuyi time_t timeInit, timeNow; 46876af099aSliuyi time(&timeInit); 46976af099aSliuyi iRet = iRet2 =0; 47076af099aSliuyi while ((time(&timeNow) - timeInit) <= 3) { 47176af099aSliuyi iRet = Search(RKUSB_MASKROM | RKUSB_LOADER | RKUSB_MSC); 47276af099aSliuyi usleep(20000); 47376af099aSliuyi iRet2 = Search(RKUSB_MASKROM | RKUSB_LOADER | RKUSB_MSC); 47476af099aSliuyi if (iRet2 == iRet) { 47576af099aSliuyi break; 47676af099aSliuyi } 47776af099aSliuyi } 47876af099aSliuyi if ((iRet <= 0) || (iRet2 != iRet)) { 47976af099aSliuyi return false; 48076af099aSliuyi } 48176af099aSliuyi vecExistedDevice.clear(); 48276af099aSliuyi bool bFound = false; 48376af099aSliuyi for ( iter = m_list.begin(); iter != m_list.end(); iter++ ) { 48476af099aSliuyi if ((*iter).uiLocationID != uiOfflineDevice) { 48576af099aSliuyi vecExistedDevice.push_back((*iter).uiLocationID); 48676af099aSliuyi } else 48776af099aSliuyi bFound = true; 48876af099aSliuyi } 48976af099aSliuyi if (!bFound) { 49076af099aSliuyi return false; 49176af099aSliuyi } 49276af099aSliuyi return true; 49376af099aSliuyi 49476af099aSliuyi } 49576af099aSliuyi 49676af099aSliuyi bool CRKScan::Wait(STRUCT_RKDEVICE_DESC &device, ENUM_RKUSB_TYPE usbType, USHORT usVid, USHORT usPid) 49776af099aSliuyi { 49876af099aSliuyi RKDEVICE_DESC_SET deviceList; 49976af099aSliuyi ENUM_RKUSB_TYPE curDeviceType; 50076af099aSliuyi ENUM_RKDEVICE_TYPE devType; 50176af099aSliuyi device_list_iter iter; 50276af099aSliuyi UINT totalDevice; 50376af099aSliuyi int uiWaitSecond; 50476af099aSliuyi int iFoundCount = 0; 50576af099aSliuyi bool bRet = false; 50676af099aSliuyi if (usbType == RKUSB_MSC) 50776af099aSliuyi uiWaitSecond = m_waitMscSecond; 50876af099aSliuyi else 50976af099aSliuyi uiWaitSecond = m_waitRKusbSecond; 51076af099aSliuyi time_t tmInit, tmNow; 51176af099aSliuyi time(&tmInit); 51276af099aSliuyi while( difftime(time(&tmNow), tmInit) <= uiWaitSecond ) { 51376af099aSliuyi FreeDeviceList(deviceList); 51476af099aSliuyi EnumerateUsbDevice(deviceList, totalDevice); 51576af099aSliuyi for ( iter = deviceList.begin(); iter != deviceList.end(); iter++ ) { 51676af099aSliuyi if ((BUSID((*iter).uiLocationID) != BUSID(device.uiLocationID)) || 51776af099aSliuyi ((BUSID((*iter).uiLocationID) == BUSID(device.uiLocationID)) && ((*iter).uiLocationID >= device.uiLocationID))) { 51876af099aSliuyi if ((usVid != 0) || (usPid != 0)) { 51976af099aSliuyi if ( ((*iter).usVid != usVid) || ((*iter).usPid != usPid) ) 52076af099aSliuyi continue; 52176af099aSliuyi } 52276af099aSliuyi if (IsRockusbDevice(devType, (*iter).usVid, (*iter).usPid)) { 52376af099aSliuyi if ( ((*iter).usbcdUsb & 0x0001) == 0 ) 52476af099aSliuyi curDeviceType = RKUSB_MASKROM; 52576af099aSliuyi else 52676af099aSliuyi curDeviceType = RKUSB_LOADER; 52776af099aSliuyi } else if ( FindConfigSetPos(m_deviceMscConfigSet, (*iter).usVid, (*iter).usPid) != -1 ) { 52876af099aSliuyi curDeviceType = RKUSB_MSC; 52976af099aSliuyi } else 53076af099aSliuyi curDeviceType = RKUSB_NONE; 53176af099aSliuyi 53276af099aSliuyi if ( curDeviceType == usbType ) { 53376af099aSliuyi iFoundCount++; 53476af099aSliuyi break; 53576af099aSliuyi } 53676af099aSliuyi } 53776af099aSliuyi } 53876af099aSliuyi if ( iter == deviceList.end() ) { 53976af099aSliuyi iFoundCount = 0; 54076af099aSliuyi } 54176af099aSliuyi if ( iFoundCount >= 8 ) { 54276af099aSliuyi device.usVid = (*iter).usVid; 54376af099aSliuyi device.usPid = (*iter).usPid; 54476af099aSliuyi device.uiLocationID = (*iter).uiLocationID; 54576af099aSliuyi device.pUsbHandle= (*iter).pUsbHandle; 54676af099aSliuyi device.emUsbType = usbType; 54776af099aSliuyi device.usbcdUsb = (*iter).usbcdUsb; 54876af099aSliuyi libusb_ref_device((libusb_device *)device.pUsbHandle); 54976af099aSliuyi 55076af099aSliuyi if (usbType == RKUSB_MSC) { 55176af099aSliuyi device.emDeviceType = RKNONE_DEVICE; 55276af099aSliuyi } else { 55376af099aSliuyi if (IsRockusbDevice(devType, device.usVid, device.usPid)) 55476af099aSliuyi device.emDeviceType = devType; 55576af099aSliuyi } 55676af099aSliuyi bRet = true; 55776af099aSliuyi break; 55876af099aSliuyi } 55976af099aSliuyi usleep(50000); 56076af099aSliuyi } 56176af099aSliuyi 56276af099aSliuyi FreeDeviceList(deviceList); 56376af099aSliuyi return bRet; 56476af099aSliuyi } 56576af099aSliuyi int CRKScan::GetPos(UINT locationID) 56676af099aSliuyi { 56776af099aSliuyi device_list_iter iter; 56876af099aSliuyi int pos = 0; 56976af099aSliuyi bool bFound = false; 57076af099aSliuyi for (iter = m_list.begin(); iter != m_list.end(); iter++) { 57176af099aSliuyi if (locationID == (*iter).uiLocationID) { 57276af099aSliuyi bFound=true; 57376af099aSliuyi break; 57476af099aSliuyi } 57576af099aSliuyi pos++; 57676af099aSliuyi } 57776af099aSliuyi return (bFound ? pos : -1); 57876af099aSliuyi } 57976af099aSliuyi bool CRKScan::GetDevice(STRUCT_RKDEVICE_DESC &device, int pos) 58076af099aSliuyi { 58176af099aSliuyi if ( (pos < 0) || (pos >= (int)m_list.size()) ) { 58276af099aSliuyi return false; 58376af099aSliuyi } 58476af099aSliuyi device_list_iter iter; 58576af099aSliuyi for (iter = m_list.begin(); iter != m_list.end(); iter++) { 58676af099aSliuyi if (pos == 0) { 58776af099aSliuyi break; 58876af099aSliuyi } 58976af099aSliuyi pos--; 59076af099aSliuyi } 59176af099aSliuyi device.usVid = (*iter).usVid; 59276af099aSliuyi device.usPid = (*iter).usPid; 59376af099aSliuyi device.emDeviceType = (*iter).emDeviceType; 59476af099aSliuyi device.emUsbType = (*iter).emUsbType; 59576af099aSliuyi device.uiLocationID = (*iter).uiLocationID; 59676af099aSliuyi device.pUsbHandle= (*iter).pUsbHandle; 59776af099aSliuyi device.usbcdUsb = (*iter).usbcdUsb; 59876af099aSliuyi return true; 59976af099aSliuyi } 60076af099aSliuyi 60176af099aSliuyi bool CRKScan::SetLogObject(CRKLog *pLog) 60276af099aSliuyi { 60376af099aSliuyi if (pLog) { 60476af099aSliuyi if (m_log) { 60576af099aSliuyi delete m_log; 60676af099aSliuyi } 60776af099aSliuyi m_log = pLog; 60876af099aSliuyi } else 60976af099aSliuyi return false; 61076af099aSliuyi return true; 61176af099aSliuyi } 61276af099aSliuyi CRKScan::~CRKScan() 61376af099aSliuyi { 61476af099aSliuyi FreeDeviceList(m_list); 61576af099aSliuyi if (m_log) { 61676af099aSliuyi delete m_log; 61776af099aSliuyi m_log = NULL; 61876af099aSliuyi } 61976af099aSliuyi } 620