xref: /rkdeveloptool/RKScan.cpp (revision 76af099afcbcafd97801028de2ba3421d3c12865)
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