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