From 860f849fb02d68c151c007dc9d5cb4fcb5da5d0b Mon Sep 17 00:00:00 2001 From: h1562075881 <1562075881@qq.com> Date: Sat, 19 Nov 2022 17:20:26 +0800 Subject: [PATCH 1/3] Fix the problem that the nRF52840 dongle was not recognized when calling the function 'EnumSerialPorts' in 'src\common\platform\win\serial_port_enum.cpp' Signed-off-by: h1562075881 <1562075881@qq.com> --- src/common/platform/win/serial_port_enum.cpp | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/common/platform/win/serial_port_enum.cpp b/src/common/platform/win/serial_port_enum.cpp index f41c1ae06..ffa2d2b83 100755 --- a/src/common/platform/win/serial_port_enum.cpp +++ b/src/common/platform/win/serial_port_enum.cpp @@ -76,6 +76,9 @@ #include "serial_port_enum.h" #define MAX_BUFFER_SIZE 1000 +#define NORDIC_SEMICONDUCTOR_VID "1915" +#define NORDIC_SEMICONDUCTOR_PID "C00A" +#define NRF52_DONGLE_VID_PID "VID_1915&PID_C00A" /* * listComPorts.c -- list COM ports @@ -93,6 +96,45 @@ * VID 0403 / PID 6001 - Arduino Diecimila * */ + +char *GetSerialNumber(char *vidpidstr) +{ + char serialNumber[512] = {0}; + + DISPATCH_OBJ(wmiSvc); + DISPATCH_OBJ(colDevices); + + dhInitialize(TRUE); + dhToggleExceptions(FALSE); + + dhGetObject(L"winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2", NULL, &wmiSvc); + dhGetValue(L"%o", &colDevices, wmiSvc, L".ExecQuery(%S)", + L"Select * From Win32_PnPEntity WHERE Name LIKE '%USB Composite Device%'"); + + FOR_EACH(objDevice, colDevices, NULL) + { + char *str1 = NULL; + + dhGetValue(L"%s", &str1, objDevice, L".DeviceID"); + + if (str1 != nullptr && strstr(str1, vidpidstr) != nullptr) + { + strcpy(serialNumber, str1 + strlen(vidpidstr) + 5); + + } + + dhFreeString(str1); + + } + NEXT(objDevice); + SAFE_RELEASE(colDevices); + SAFE_RELEASE(wmiSvc); + + dhUninitialize(TRUE); + return serialNumber; + +} + std::list EnumSerialPorts() { std::list descs; @@ -139,6 +181,22 @@ std::list EnumSerialPorts() } descs.push_back(resultItem); } + else if (strstr(pnpid, NRF52_DONGLE_VID_PID) != nullptr) + { + //"USB\\VID_1915&PID_C00A&MI_01\\6&1C397515&0&0001" + char *next_token = NULL; + auto comname = strtok_s(match, "()", &next_token); + SerialPortDesc resultItem = {}; + resultItem.comName = comname; + resultItem.manufacturer = manu; + resultItem.pnpId = pnpid; + resultItem.serialNumber = GetSerialNumber(NRF52_DONGLE_VID_PID); + resultItem.vendorId = NORDIC_SEMICONDUCTOR_VID; + resultItem.productId = NORDIC_SEMICONDUCTOR_PID; + + descs.push_back(resultItem); + + } dhFreeString(manu); } From bbc9bb628be6b78ae8cefe6b2fc5ad26e7675973 Mon Sep 17 00:00:00 2001 From: h1562075881 <1562075881@qq.com> Date: Sat, 3 Dec 2022 16:35:55 +0800 Subject: [PATCH 2/3] Fix the problem that when two nrf52840 dongles are inserted, the serial numbers read are the same Signed-off-by: h1562075881 <1562075881@qq.com> --- src/common/platform/win/serial_port_enum.cpp | 296 ++++++++++++------- 1 file changed, 185 insertions(+), 111 deletions(-) diff --git a/src/common/platform/win/serial_port_enum.cpp b/src/common/platform/win/serial_port_enum.cpp index ffa2d2b83..1859cc541 100755 --- a/src/common/platform/win/serial_port_enum.cpp +++ b/src/common/platform/win/serial_port_enum.cpp @@ -67,18 +67,28 @@ #include #include -#include "disphelper.h" +//#include "disphelper.h" #include "stdafx.h" -#include "enumser.h" -#include "jlinkid_reg_lookup.h" +//#include "enumser.h" +//#include "jlinkid_reg_lookup.h" #include "serial_port_enum.h" -#define MAX_BUFFER_SIZE 1000 -#define NORDIC_SEMICONDUCTOR_VID "1915" -#define NORDIC_SEMICONDUCTOR_PID "C00A" -#define NRF52_DONGLE_VID_PID "VID_1915&PID_C00A" +#include +#include +#include +#include +#include + +#pragma comment(lib, "Setupapi.lib") + + +#define SEGGER_VENDOR_ID "1366" +#define NXP_VENDOR_ID "0D28" +#define NORDIC_SEMICONDUCTOR_VENDOR_ID "1915" +#define NRF52_CONNECTIVITY_DONGLE_PID "C00A" + /* * listComPorts.c -- list COM ports @@ -90,126 +100,190 @@ * * Uses DispHealper : http://disphelper.sourceforge.net/ * - * Notable VIDs & PIDs combos: - * VID 0403 - FTDI + * ********************************** + * * * * * Notable VIDs & PIDs combos: + * VID 0403 / PID 6001 - FTDI FT232 * - * VID 0403 / PID 6001 - Arduino Diecimila + * VID 2341 / PID 0043 - Arduino Diecimila * + * * * * * Enable VIDs & PIDs combos: + * VID 1366 / PID 0105 - SEGGER JLink V9 + * + * VID 0D28 - NXP + * + * VIP 1915 / PID C00A - Nordic nrf52 dongle */ -char *GetSerialNumber(char *vidpidstr) -{ - char serialNumber[512] = {0}; - - DISPATCH_OBJ(wmiSvc); - DISPATCH_OBJ(colDevices); - - dhInitialize(TRUE); - dhToggleExceptions(FALSE); - - dhGetObject(L"winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2", NULL, &wmiSvc); - dhGetValue(L"%o", &colDevices, wmiSvc, L".ExecQuery(%S)", - L"Select * From Win32_PnPEntity WHERE Name LIKE '%USB Composite Device%'"); - - FOR_EACH(objDevice, colDevices, NULL) - { - char *str1 = NULL; - - dhGetValue(L"%s", &str1, objDevice, L".DeviceID"); - - if (str1 != nullptr && strstr(str1, vidpidstr) != nullptr) - { - strcpy(serialNumber, str1 + strlen(vidpidstr) + 5); - - } - - dhFreeString(str1); - - } - NEXT(objDevice); - SAFE_RELEASE(colDevices); - SAFE_RELEASE(wmiSvc); - - dhUninitialize(TRUE); - return serialNumber; - -} std::list EnumSerialPorts() { std::list descs; - - DISPATCH_OBJ(wmiSvc); - DISPATCH_OBJ(colDevices); - - dhInitialize(TRUE); - dhToggleExceptions(FALSE); - - dhGetObject(L"winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2", nullptr, &wmiSvc); - dhGetValue(L"%o", &colDevices, wmiSvc, L".ExecQuery(%S)", - L"Select * from Win32_PnPEntity WHERE Name LIKE '%COM%'"); - - FOR_EACH(objDevice, colDevices, NULL) + + GUID Guids[16] = {0}; + GUID PortsGUIDs[8] = {0}; + GUID ModemsGUIDs[8] = {0}; + DWORD ports_guids_size, modems_guids_size; + BOOL ret = + SetupDiClassGuidsFromName("Ports", PortsGUIDs, sizeof(PortsGUIDs), &ports_guids_size); + if (ret == FALSE) + return descs; + ret = SetupDiClassGuidsFromName("Modem", ModemsGUIDs, sizeof(ModemsGUIDs), &modems_guids_size); + if (ret == FALSE) + return descs; + + for (DWORD i = 0; i < ports_guids_size; i++) + Guids[i] = PortsGUIDs[i]; + for (DWORD i = 0; i < modems_guids_size; i++) + Guids[i + ports_guids_size] = ModemsGUIDs[i]; + + for (DWORD i = 0; i < ports_guids_size + modems_guids_size; i++) { - char *name = nullptr; - char *pnpid = nullptr; - char *manu = nullptr; - char *match; - - dhGetValue(L"%s", &name, objDevice, L".Name"); - dhGetValue(L"%s", &pnpid, objDevice, L".PnPDeviceID"); + SP_DEVINFO_DATA devinfo = {0}; + devinfo.cbSize = sizeof(devinfo); + + HDEVINFO p_hdi = SetupDiGetClassDevs(&Guids[i], NULL, NULL, DIGCF_PRESENT); + for (int j = 0; TRUE == SetupDiEnumDeviceInfo(p_hdi, j, &devinfo); j++) + { + DWORD dwPropertyRegDataType, dwSize; + char szData[512] = {0}; + + //read friendlyname + BOOL ret = SetupDiGetDeviceRegistryProperty(p_hdi, &devinfo, SPDRP_FRIENDLYNAME, + &dwPropertyRegDataType, (BYTE *)szData, + sizeof(szData), &dwSize); + if (TRUE == ret && strstr(szData, "(COM") != nullptr) + { + SerialPortDesc resultItem = {""}; + std::string s = szData; + + std::regex pattern(".*\\((COM[0-9]+)\\).*"); + std::smatch match_result; + if (regex_match(s, match_result, pattern)) + { + resultItem.comName = match_result.str(1); + } + else + { + continue; + } - if (name != nullptr && ((match = strstr(name, "(COM")) != nullptr)) - { // look for "(COM23)" - // 'Manufacturuer' can be null, so only get it if we need it - dhGetValue(L"%s", &manu, objDevice, L".Manufacturer"); + // read manufacturer + memset(szData, 0, sizeof(szData)); + if (TRUE == SetupDiGetDeviceRegistryProperty(p_hdi, &devinfo, SPDRP_MFG, + &dwPropertyRegDataType, (BYTE *)szData, + sizeof(szData), &dwSize)) + { + resultItem.manufacturer = szData; + } - if ((strcmp("SEGGER", manu) == 0) || (_stricmp("arm", manu) == 0) || - (_stricmp("mbed", manu) == 0)) - { - char *next_token = NULL; - auto comname = strtok_s(match, "()", &next_token); - SerialPortDesc resultItem = {}; - resultItem.comName = comname; - resultItem.manufacturer = manu; - resultItem.pnpId = pnpid; - - string jlinkId = portNameToJlinkId(string(comname)); - if (jlinkId != "") + // read HardwareID + memset(szData, 0, sizeof(szData)); + if (FALSE == + SetupDiGetDeviceInstanceId(p_hdi, &devinfo, szData, sizeof(szData), &dwSize)) { - resultItem.serialNumber = jlinkId; + memset(szData, 0, sizeof(szData)); + if (FALSE == SetupDiGetDeviceRegistryProperty( + p_hdi, &devinfo, SPDRP_HARDWAREID, &dwPropertyRegDataType, + (BYTE *)szData, sizeof(szData), &dwSize)) + { + memset(szData, 0, sizeof(szData)); + } } - descs.push_back(resultItem); - } - else if (strstr(pnpid, NRF52_DONGLE_VID_PID) != nullptr) - { - //"USB\\VID_1915&PID_C00A&MI_01\\6&1C397515&0&0001" - char *next_token = NULL; - auto comname = strtok_s(match, "()", &next_token); - SerialPortDesc resultItem = {}; - resultItem.comName = comname; - resultItem.manufacturer = manu; - resultItem.pnpId = pnpid; - resultItem.serialNumber = GetSerialNumber(NRF52_DONGLE_VID_PID); - resultItem.vendorId = NORDIC_SEMICONDUCTOR_VID; - resultItem.productId = NORDIC_SEMICONDUCTOR_PID; - - descs.push_back(resultItem); + resultItem.pnpId = szData; + // get vid, pid, serial number + if (strnicmp(szData, "USB", 3) == 0) + { + //"USB\\VID_1915&PID_C00A&MI_01\\6&142BFA11&0&0001" + std::string s = szData; + std::regex pattern(".+VID_([0-9a-fA-F]{4})(&PID_([0-9a-fA-F]{4}))?(&MI_(\\d{" + "2}))?(\\\\(.*))?"); + std::smatch match_result; + if (regex_match(s, match_result, pattern)) + { + // get vid + resultItem.vendorId = match_result.str(1); + // get pid + resultItem.productId = match_result.str(3); + + // get serial nubmer + if (match_result[7].matched && + regex_match(match_result.str(7), std::regex("^\\w+$"))) + { + resultItem.serialNumber = match_result.str(7); + } + else + { // read parent serial nubmer + memset(szData, 0, sizeof(szData)); + DWORD devinst; + CONFIGRET status = + CM_Get_Parent(&devinst, devinfo.DevInst, CM_LOCATE_DEVNODE_NORMAL); + if (status == CR_SUCCESS) + { + status = CM_Get_Device_ID(devinst, szData, sizeof(szData), + CM_LOCATE_DEVNODE_NORMAL); + if (status == CR_SUCCESS) + { + std::string s = szData; + resultItem.serialNumber = + s.substr(s.find_last_of("\\") + 1, + s.length() - s.find_last_of("\\") - 1); + } + } + } + } + //remove segger serial number zeros + if (resultItem.vendorId == SEGGER_VENDOR_ID && + resultItem.serialNumber.length() > 0) + { + std::regex pattern("[0]*([1-9][0-9]+)"); + std::smatch match_result; + if (regex_match(resultItem.serialNumber, match_result, pattern)) + { + resultItem.serialNumber = match_result.str(1); + } + } + } + else if (strnicmp(szData, "FTDIBUS", 7) == 0) + { + //"FTDIBUS\\VID_0403+PID_6001+AB0MH7ATA\\0000" + std::string s = szData; + std::regex pattern(".+VID_([0-9a-fA-F]{4})\\+PID_([0-9a-fA-F]{4})(\\+(\\w+))?(\\\\(.*))?"); + std::smatch match_result; + if (regex_match(s, match_result, pattern)) + { + // get vid + resultItem.vendorId = match_result.str(1); + // get pid + resultItem.productId = match_result.str(2); + // get serial nubmer + resultItem.serialNumber = match_result.str(4); + } + } + //read locationid + /*memset(szData, 0, sizeof(szData)); + if (TRUE == SetupDiGetDeviceRegistryProperty(p_hdi, &devinfo, SPDRP_LOCATION_PATHS, + &dwPropertyRegDataType, (BYTE *)szData, + sizeof(szData), &dwSize)) + { + + }*/ + + if ((resultItem.vendorId == SEGGER_VENDOR_ID || + resultItem.vendorId == NXP_VENDOR_ID || + resultItem.vendorId == NORDIC_SEMICONDUCTOR_VENDOR_ID) && + (resultItem.manufacturer == "SEGGER" || + strnicmp(resultItem.manufacturer.c_str(), "arm", 3) == 0 || + strnicmp(resultItem.manufacturer.c_str(), "mbed", 4) == 0 || + resultItem.productId == NRF52_CONNECTIVITY_DONGLE_PID) + ) + { + descs.push_back(resultItem); + } } - - dhFreeString(manu); } - - dhFreeString(name); - dhFreeString(pnpid); + SetupDiDestroyDeviceInfoList(p_hdi); } - NEXT(objDevice); - - SAFE_RELEASE(colDevices); - SAFE_RELEASE(wmiSvc); - - dhUninitialize(TRUE); return descs; -} +} \ No newline at end of file From 38d6d5665a7fe5b5846d0ab80646d69ea7b903ce Mon Sep 17 00:00:00 2001 From: h1562075881 <1562075881@qq.com> Date: Wed, 14 Dec 2022 11:12:23 +0800 Subject: [PATCH 3/3] Modify the default download path of nrf5 sdk source code Signed-off-by: h1562075881 <1562075881@qq.com> --- hex/cmake/util.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hex/cmake/util.cmake b/hex/cmake/util.cmake index a8cfa695b..347cf3fe5 100644 --- a/hex/cmake/util.cmake +++ b/hex/cmake/util.cmake @@ -155,11 +155,11 @@ function(nrf_prepare_sdk) #message(STATUS "FILENAME: ${nrf_prepare_sdk_FILENAME}") #message(STATUS "SHA512: ${nrf_prepare_sdk_SHA512}") - if(NOT DEFINED ENV{TMP}) - message(FATAL_ERROR "Temporary directory not set, not able to proceed.") - endif() + #if(NOT DEFINED ENV{TMP}) + #message(FATAL_ERROR "Temporary directory not set, not able to proceed.") + #endif() - set(SDKS_DIRECTORY "$ENV{TMP}/pc-ble-driver/sdks") + set(SDKS_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/sdks") file(TO_CMAKE_PATH "${SDKS_DIRECTORY}" SDKS_DIRECTORY) set(SDK_DIRECTORY "${SDKS_DIRECTORY}/v${nrf_prepare_sdk_SDK_VERSION}") set(SDK_VERSION "${nrf_prepare_sdk_SDK_VERSION}")