xref: /rkdeveloptool/RKScan.cpp (revision 0783503f9ff39dc516f8ef95b6cb70a7171c5061)
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)
GetDEVICE_COUNTS()1076af099aSliuyi int CRKScan::GetDEVICE_COUNTS()
1176af099aSliuyi {
1276af099aSliuyi 	return m_list.size();
1376af099aSliuyi }
1476af099aSliuyi 
GetMSC_TIMEOUT()1576af099aSliuyi UINT CRKScan::GetMSC_TIMEOUT()
1676af099aSliuyi {
1776af099aSliuyi 	return m_waitMscSecond;
1876af099aSliuyi }
1976af099aSliuyi 
GetRKUSB_TIMEOUT()2076af099aSliuyi UINT CRKScan::GetRKUSB_TIMEOUT()
2176af099aSliuyi {
2276af099aSliuyi 	return m_waitRKusbSecond;
2376af099aSliuyi }
2476af099aSliuyi 
SetMSC_TIMEOUT(UINT value)2576af099aSliuyi void CRKScan::SetMSC_TIMEOUT(UINT value)
2676af099aSliuyi {
2776af099aSliuyi 	m_waitMscSecond = value;
2876af099aSliuyi }
2976af099aSliuyi 
SetRKUSB_TIMEOUT(UINT value)3076af099aSliuyi void CRKScan::SetRKUSB_TIMEOUT(UINT value)
3176af099aSliuyi {
3276af099aSliuyi 	m_waitRKusbSecond = value;
3376af099aSliuyi }
3476af099aSliuyi 
CRKScan(UINT uiMscTimeout,UINT uiRKusbTimeout)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 }
FindRockusbVidPid(ENUM_RKDEVICE_TYPE type,USHORT & usVid,USHORT & usPid)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 }
AddRockusbVidPid(USHORT newVid,USHORT newPid,USHORT oldVid,USHORT oldPid)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 
SetVidPid(USHORT mscVid,USHORT mscPid)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 }
FindWaitSetPos(const RKDEVICE_CONFIG_SET & waitDeviceSet,USHORT vid,USHORT pid)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 }
FindConfigSetPos(RKDEVICE_CONFIG_SET & devConfigSet,USHORT vid,USHORT pid)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 }
EnumerateUsbDevice(RKDEVICE_DESC_SET & list,UINT & uiTotalMatchDevices)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 
FreeDeviceList(RKDEVICE_DESC_SET & list)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 }
IsRockusbDevice(ENUM_RKDEVICE_TYPE & type,USHORT vid,USHORT pid)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 }
Search(UINT type)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 }
MutexWait(UINT_VECTOR & vecExistedDevice,STRUCT_RKDEVICE_DESC & device,ENUM_RKUSB_TYPE usbType,USHORT usVid,USHORT usPid)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 
MutexWaitPrepare(UINT_VECTOR & vecExistedDevice,DWORD uiOfflineDevice)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 
Wait(STRUCT_RKDEVICE_DESC & device,ENUM_RKUSB_TYPE usbType,USHORT usVid,USHORT usPid)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 }
GetPos(UINT locationID)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 }
GetDevice(STRUCT_RKDEVICE_DESC & device,int pos)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 
SetLogObject(CRKLog * pLog)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 }
~CRKScan()61276af099aSliuyi CRKScan::~CRKScan()
61376af099aSliuyi {
61476af099aSliuyi 	FreeDeviceList(m_list);
61576af099aSliuyi 	if (m_log) {
61676af099aSliuyi 		delete m_log;
61776af099aSliuyi 		m_log = NULL;
61876af099aSliuyi 	}
61976af099aSliuyi }
620