From 7c4640b3dcbcc3852b240ce343b2df3b6c0d7086 Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Tue, 1 Apr 2025 17:04:39 +0200 Subject: [PATCH] Add the ability to use different cypress windows drivers --- CMakeLists.txt | 11 ++++-- .../cypress_shared_communications.hpp | 0 .../cypress_shared_driver_comms.hpp | 10 +++--- .../cypress_shared_libusb_comms.hpp | 0 .../cypress_shared_communications.cpp | 0 .../cypress_shared_driver_comms.cpp | 36 ++++++++++++++----- .../cypress_shared_libusb_comms.cpp | 0 .../Nisetro/cypress_nisetro_acquisition.cpp | 8 +++-- 8 files changed, 46 insertions(+), 19 deletions(-) rename include/CaptureDeviceSpecific/{Nisetro => CypressShared}/cypress_shared_communications.hpp (100%) rename include/CaptureDeviceSpecific/{Nisetro => CypressShared}/cypress_shared_driver_comms.hpp (93%) rename include/CaptureDeviceSpecific/{Nisetro => CypressShared}/cypress_shared_libusb_comms.hpp (100%) rename source/CaptureDeviceSpecific/{Nisetro => CypressShared}/cypress_shared_communications.cpp (100%) rename source/CaptureDeviceSpecific/{Nisetro => CypressShared}/cypress_shared_driver_comms.cpp (96%) rename source/CaptureDeviceSpecific/{Nisetro => CypressShared}/cypress_shared_libusb_comms.cpp (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ecbe1b..1066a81 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,8 @@ set(USE_FTD2XX_FOR_NEW_DS_LOOPY ${NEW_DS_LOOPY_SUPPORT}) set(USE_LIBUSB_FOR_NEW_DS_LOOPY ${NEW_DS_LOOPY_SUPPORT}) set(USE_FTD3XX_FOR_N3DSXL_LOOPY ${N3DSXL_LOOPY_SUPPORT}) set(USE_LIBUSB_FOR_N3DSXL_LOOPY ${N3DSXL_LOOPY_SUPPORT}) -set(USE_LIBUSB_SUPPORT ${IS_DEVICES_SUPPORT} OR ${OLD_DS_3DS_LOOPY_SUPPORT} OR ${USE_LIBUSB_FOR_NEW_DS_LOOPY} OR ${CYPRESS_NISETRO_SUPPORT} OR ${USE_LIBUSB_FOR_N3DSXL_LOOPY}) +set(USE_CYPRESS_USB_SUPPORT ${CYPRESS_NISETRO_SUPPORT}) +set(USE_LIBUSB_SUPPORT ${IS_DEVICES_SUPPORT} OR ${OLD_DS_3DS_LOOPY_SUPPORT} OR ${USE_LIBUSB_FOR_NEW_DS_LOOPY} OR ${USE_LIBUSB_FOR_N3DSXL_LOOPY} OR ${USE_CYPRESS_USB_SUPPORT}) if(NOT (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")) #Performance outside of Windows is very bad for the official drivers... set(USE_FTD2XX_FOR_NEW_DS_LOOPY 0) @@ -303,6 +304,7 @@ set(SOURCE_CPP_DEVICE_FILES_BASE_PATH "source/CaptureDeviceSpecific") set(SOURCE_CPP_IS_DEVICES_FILES_BASE_PATH "${SOURCE_CPP_DEVICE_FILES_BASE_PATH}/ISDevices") set(SOURCE_CPP_FTD2_FILES_BASE_PATH "${SOURCE_CPP_DEVICE_FILES_BASE_PATH}/DSCapture_FTD2") set(SOURCE_CPP_FTD3_FILES_BASE_PATH "${SOURCE_CPP_DEVICE_FILES_BASE_PATH}/3DSCapture_FTD3") +set(SOURCE_CPP_CYPRESS_USB_FILES_BASE_PATH "${SOURCE_CPP_DEVICE_FILES_BASE_PATH}/CypressShared") set(SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH "${SOURCE_CPP_DEVICE_FILES_BASE_PATH}/Nisetro") if(N3DSXL_LOOPY_SUPPORT) list(APPEND SOURCE_CPP_EXTRA_FILES ${SOURCE_CPP_FTD3_FILES_BASE_PATH}/3dscapture_ftd3_shared.cpp ${SOURCE_CPP_FTD3_FILES_BASE_PATH}/3dscapture_ftd3_compatibility.cpp) @@ -355,8 +357,11 @@ if(OLD_DS_3DS_LOOPY_SUPPORT) list(APPEND EXTRA_CXX_FLAGS "-DUSE_DS_3DS_USB") endif() endif() +if(USE_CYPRESS_USB_SUPPORT) + list(APPEND SOURCE_CPP_EXTRA_FILES ${SOURCE_CPP_CYPRESS_USB_FILES_BASE_PATH}/cypress_shared_driver_comms.cpp ${SOURCE_CPP_CYPRESS_USB_FILES_BASE_PATH}/cypress_shared_libusb_comms.cpp ${SOURCE_CPP_CYPRESS_USB_FILES_BASE_PATH}/cypress_shared_communications.cpp) +endif() if(CYPRESS_NISETRO_SUPPORT) - list(APPEND SOURCE_CPP_EXTRA_FILES ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_shared_driver_comms.cpp ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_shared_libusb_comms.cpp ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_shared_communications.cpp ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_nisetro_communications.cpp ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_nisetro_acquisition.cpp ${TOOLS_DATA_DIR}/nisetro_ds_fw.cpp) + list(APPEND SOURCE_CPP_EXTRA_FILES ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_nisetro_communications.cpp ${SOURCE_CPP_CYPRESS_NISETRO_DEVICES_FILES_BASE_PATH}/cypress_nisetro_acquisition.cpp ${TOOLS_DATA_DIR}/nisetro_ds_fw.cpp) if(MSVC) list(APPEND EXTRA_CXX_FLAGS "/DUSE_CYNI_USB") else() @@ -522,7 +527,7 @@ endif() if(USE_FTD2XX_FOR_NEW_DS_LOOPY) target_link_libraries(${OUTPUT_NAME} PRIVATE ${ftd2xx_BINARY_DIR}/${FTD2XX_SUBFOLDER}/${FTD2XX_LIB}) endif() -target_include_directories(${OUTPUT_NAME} PRIVATE ${EXTRA_INCLUDE_DIRECTORIES} ${TOOLS_DATA_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include/Menus ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/ISDevices ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/Nisetro ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/3DSCapture_FTD3 ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/DSCapture_FTD2) +target_include_directories(${OUTPUT_NAME} PRIVATE ${EXTRA_INCLUDE_DIRECTORIES} ${TOOLS_DATA_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include/Menus ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/ISDevices ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/Nisetro ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/CypressShared ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/3DSCapture_FTD3 ${CMAKE_SOURCE_DIR}/include/CaptureDeviceSpecific/DSCapture_FTD2) target_compile_features(${OUTPUT_NAME} PRIVATE cxx_std_20) target_compile_options(${OUTPUT_NAME} PRIVATE ${EXTRA_CXX_FLAGS}) diff --git a/include/CaptureDeviceSpecific/Nisetro/cypress_shared_communications.hpp b/include/CaptureDeviceSpecific/CypressShared/cypress_shared_communications.hpp similarity index 100% rename from include/CaptureDeviceSpecific/Nisetro/cypress_shared_communications.hpp rename to include/CaptureDeviceSpecific/CypressShared/cypress_shared_communications.hpp diff --git a/include/CaptureDeviceSpecific/Nisetro/cypress_shared_driver_comms.hpp b/include/CaptureDeviceSpecific/CypressShared/cypress_shared_driver_comms.hpp similarity index 93% rename from include/CaptureDeviceSpecific/Nisetro/cypress_shared_driver_comms.hpp rename to include/CaptureDeviceSpecific/CypressShared/cypress_shared_driver_comms.hpp index 9bc2907..151d180 100644 --- a/include/CaptureDeviceSpecific/Nisetro/cypress_shared_driver_comms.hpp +++ b/include/CaptureDeviceSpecific/CypressShared/cypress_shared_driver_comms.hpp @@ -6,8 +6,12 @@ #include "utils.hpp" #include "cypress_shared_communications.hpp" -void cypress_driver_list_devices(std::vector& devices_list, bool* not_supported_elems, int* curr_serial_extra_id_cypress, std::vector &device_descriptions); -void cypress_driver_find_used_serial(const cy_device_usb_device* usb_device_desc, bool* found, size_t num_free_fw_ids, int &curr_serial_extra_id); +enum CypressWindowsDriversEnum { CYPRESS_WINDOWS_DEFAULT_USB_DRIVER }; + +void cypress_driver_list_devices(std::vector& devices_list, bool* not_supported_elems, int* curr_serial_extra_id_cypress, std::vector &device_descriptions, CypressWindowsDriversEnum driver); +void cypress_driver_find_used_serial(const cy_device_usb_device* usb_device_desc, bool* found, size_t num_free_fw_ids, int &curr_serial_extra_id, CypressWindowsDriversEnum driver); +cy_device_device_handlers* cypress_driver_find_by_serial_number(const cy_device_usb_device* usb_device_desc, std::string wanted_serial_number, int &curr_serial_extra_id, CaptureDevice* new_device, CypressWindowsDriversEnum driver); +cy_device_device_handlers* cypress_driver_serial_reconnection(CaptureDevice* device); void cypress_nisetro_driver_end_connection(cy_device_device_handlers* handlers); int cypress_driver_ctrl_transfer_in(cy_device_device_handlers* handlers, uint8_t* buffer, size_t inner_size, uint16_t value, uint16_t index, uint16_t request_code, int* num_read); int cypress_driver_ctrl_transfer_out(cy_device_device_handlers* handlers, uint8_t* buffer, size_t inner_size, uint16_t value, uint16_t index, uint16_t request_code, int* num_read); @@ -17,8 +21,6 @@ int cypress_driver_ctrl_bulk_out(cy_device_device_handlers* handlers, const cy_d void cypress_driver_pipe_reset_bulk_in(cy_device_device_handlers* handlers, const cy_device_usb_device* usb_device_desc); void cypress_driver_pipe_reset_ctrl_bulk_in(cy_device_device_handlers* handlers, const cy_device_usb_device* usb_device_desc); void cypress_driver_pipe_reset_ctrl_bulk_out(cy_device_device_handlers* handlers, const cy_device_usb_device* usb_device_desc); -cy_device_device_handlers* cypress_driver_serial_reconnection(CaptureDevice* device); -cy_device_device_handlers* cypress_driver_find_by_serial_number(const cy_device_usb_device* usb_device_desc, std::string wanted_serial_number, int &curr_serial_extra_id, CaptureDevice* new_device); int cypress_driver_async_in_start(cy_device_device_handlers* handlers, const cy_device_usb_device* usb_device_desc, uint8_t* buf, int length, cy_async_callback_data* cb_data); void cypress_driver_start_thread(std::thread* thread_ptr, bool* usb_thread_run, std::vector &cb_data_vector, cy_device_device_handlers* handlers); void cypress_driver_close_thread(std::thread* thread_ptr, bool* usb_thread_run, std::vector cb_data_vector); diff --git a/include/CaptureDeviceSpecific/Nisetro/cypress_shared_libusb_comms.hpp b/include/CaptureDeviceSpecific/CypressShared/cypress_shared_libusb_comms.hpp similarity index 100% rename from include/CaptureDeviceSpecific/Nisetro/cypress_shared_libusb_comms.hpp rename to include/CaptureDeviceSpecific/CypressShared/cypress_shared_libusb_comms.hpp diff --git a/source/CaptureDeviceSpecific/Nisetro/cypress_shared_communications.cpp b/source/CaptureDeviceSpecific/CypressShared/cypress_shared_communications.cpp similarity index 100% rename from source/CaptureDeviceSpecific/Nisetro/cypress_shared_communications.cpp rename to source/CaptureDeviceSpecific/CypressShared/cypress_shared_communications.cpp diff --git a/source/CaptureDeviceSpecific/Nisetro/cypress_shared_driver_comms.cpp b/source/CaptureDeviceSpecific/CypressShared/cypress_shared_driver_comms.cpp similarity index 96% rename from source/CaptureDeviceSpecific/Nisetro/cypress_shared_driver_comms.cpp rename to source/CaptureDeviceSpecific/CypressShared/cypress_shared_driver_comms.cpp index 983b146..27ea606 100644 --- a/source/CaptureDeviceSpecific/Nisetro/cypress_shared_driver_comms.cpp +++ b/source/CaptureDeviceSpecific/CypressShared/cypress_shared_driver_comms.cpp @@ -139,6 +139,15 @@ struct PACKED CYPRESS_SET_TRANSFER_SIZE_INFO { static GUID cypress_driver_guid = {.Data1 = 0xae18aa60, .Data2 = 0x7f6a, .Data3 = 0x11d4, .Data4 = {0x97, 0xdd, 0x0, 0x1, 0x2, 0x29, 0xb9, 0x59}}; +static GUID* get_driver_guid(CypressWindowsDriversEnum driver) { + switch(driver) { + case CYPRESS_WINDOWS_DEFAULT_USB_DRIVER: + return &cypress_driver_guid; + default: + return NULL; + } +} + static bool cypress_driver_process_async_transfers(std::vector *cb_data_vector, cy_device_device_handlers* handlers) { bool found = false; for (int i = 0; i < cb_data_vector->size(); i++) { @@ -425,10 +434,13 @@ cy_device_device_handlers* cypress_driver_serial_reconnection(CaptureDevice* dev return final_handlers; } -void cypress_driver_list_devices(std::vector &devices_list, bool* not_supported_elems, int *curr_serial_extra_id_cypress, std::vector &device_descriptions) { +void cypress_driver_list_devices(std::vector &devices_list, bool* not_supported_elems, int *curr_serial_extra_id_cypress, std::vector &device_descriptions, CypressWindowsDriversEnum driver) { #ifdef _WIN32 + GUID* to_check_guid = get_driver_guid(driver); + if(to_check_guid == NULL) + return; HDEVINFO DeviceInfoSet = SetupDiGetClassDevs( - &cypress_driver_guid, + to_check_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); @@ -437,7 +449,7 @@ void cypress_driver_list_devices(std::vector &devices_list, bool* ZeroMemory(&DeviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA)); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); uint32_t i = 0; - while(SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, &cypress_driver_guid, i++, &DeviceInterfaceData)) { + while(SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, to_check_guid, i++, &DeviceInterfaceData)) { std::string path = cypress_driver_get_device_path(DeviceInfoSet, &DeviceInterfaceData); if (path == "") continue; @@ -466,11 +478,14 @@ void cypress_driver_list_devices(std::vector &devices_list, bool* #endif } -cy_device_device_handlers* cypress_driver_find_by_serial_number(const cy_device_usb_device* usb_device_desc, std::string wanted_serial_number, int &curr_serial_extra_id, CaptureDevice* new_device) { +cy_device_device_handlers* cypress_driver_find_by_serial_number(const cy_device_usb_device* usb_device_desc, std::string wanted_serial_number, int &curr_serial_extra_id, CaptureDevice* new_device, CypressWindowsDriversEnum driver) { cy_device_device_handlers* final_handlers = NULL; #ifdef _WIN32 + GUID* to_check_guid = get_driver_guid(driver); + if(to_check_guid == NULL) + return final_handlers; HDEVINFO DeviceInfoSet = SetupDiGetClassDevs( - &cypress_driver_guid, + to_check_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); @@ -479,7 +494,7 @@ cy_device_device_handlers* cypress_driver_find_by_serial_number(const cy_device_ ZeroMemory(&DeviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA)); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); uint32_t i = 0; - while(SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, &cypress_driver_guid, i++, &DeviceInterfaceData)) { + while(SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, to_check_guid, i++, &DeviceInterfaceData)) { std::string path = cypress_driver_get_device_path(DeviceInfoSet, &DeviceInterfaceData); if (path == "") continue; @@ -596,10 +611,13 @@ void cypress_driver_pipe_reset_ctrl_bulk_out(cy_device_device_handlers* handlers #endif } -void cypress_driver_find_used_serial(const cy_device_usb_device* usb_device_desc, bool* found, size_t num_free_fw_ids, int &curr_serial_extra_id) { +void cypress_driver_find_used_serial(const cy_device_usb_device* usb_device_desc, bool* found, size_t num_free_fw_ids, int &curr_serial_extra_id, CypressWindowsDriversEnum driver) { #ifdef _WIN32 + GUID* to_check_guid = get_driver_guid(driver); + if(to_check_guid == NULL) + return; HDEVINFO DeviceInfoSet = SetupDiGetClassDevs( - &cypress_driver_guid, + to_check_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); @@ -608,7 +626,7 @@ void cypress_driver_find_used_serial(const cy_device_usb_device* usb_device_desc ZeroMemory(&DeviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA)); DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); uint32_t i = 0; - while(SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, &cypress_driver_guid, i++, &DeviceInterfaceData)) { + while(SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, to_check_guid, i++, &DeviceInterfaceData)) { std::string path = cypress_driver_get_device_path(DeviceInfoSet, &DeviceInterfaceData); if (path == "") continue; diff --git a/source/CaptureDeviceSpecific/Nisetro/cypress_shared_libusb_comms.cpp b/source/CaptureDeviceSpecific/CypressShared/cypress_shared_libusb_comms.cpp similarity index 100% rename from source/CaptureDeviceSpecific/Nisetro/cypress_shared_libusb_comms.cpp rename to source/CaptureDeviceSpecific/CypressShared/cypress_shared_libusb_comms.cpp diff --git a/source/CaptureDeviceSpecific/Nisetro/cypress_nisetro_acquisition.cpp b/source/CaptureDeviceSpecific/Nisetro/cypress_nisetro_acquisition.cpp index b4593b4..b61f39c 100644 --- a/source/CaptureDeviceSpecific/Nisetro/cypress_nisetro_acquisition.cpp +++ b/source/CaptureDeviceSpecific/Nisetro/cypress_nisetro_acquisition.cpp @@ -25,6 +25,8 @@ #define MAX_ERRORS_ALLOWED 100 #define NUM_CONSECUTIVE_NEEDED_OUTPUT 6 +#define NISETRO_CYPRESS_USB_WINDOWS_DRIVER CYPRESS_WINDOWS_DEFAULT_USB_DRIVER + static void cypress_device_read_frame_cb(void* user_data, int transfer_length, int transfer_status); static int get_cypress_device_status(CypressDeviceCaptureReceivedData* cypress_device_capture_recv_data); static void error_cypress_device_status(CypressDeviceCaptureReceivedData* cypress_device_capture_recv_data, int error_val); @@ -35,7 +37,7 @@ static cy_device_device_handlers* usb_find_by_serial_number(const cyni_device_us final_handlers = cypress_libusb_serial_reconnection(get_cy_usb_info(usb_device_desc), wanted_serial_number, curr_serial_extra_id, new_device); if(final_handlers == NULL) - final_handlers = cypress_driver_find_by_serial_number(get_cy_usb_info(usb_device_desc), wanted_serial_number, curr_serial_extra_id, new_device); + final_handlers = cypress_driver_find_by_serial_number(get_cy_usb_info(usb_device_desc), wanted_serial_number, curr_serial_extra_id, new_device, NISETRO_CYPRESS_USB_WINDOWS_DRIVER); return final_handlers; } @@ -46,7 +48,7 @@ static int usb_find_free_fw_id(const cyni_device_usb_device* usb_device_desc) { for(int i = 0; i < num_free_fw_ids; i++) found[i] = false; cypress_libusb_find_used_serial(get_cy_usb_info(usb_device_desc), found, num_free_fw_ids, curr_serial_extra_id); - cypress_driver_find_used_serial(get_cy_usb_info(usb_device_desc), found, num_free_fw_ids, curr_serial_extra_id); + cypress_driver_find_used_serial(get_cy_usb_info(usb_device_desc), found, num_free_fw_ids, curr_serial_extra_id, NISETRO_CYPRESS_USB_WINDOWS_DRIVER); for(int i = 0; i < num_free_fw_ids; i++) if(!found[i]) @@ -120,7 +122,7 @@ void list_devices_cyni_device(std::vector &devices_list, std::vec if(no_access_elems[i]) no_access_list.emplace_back(usb_devices_to_check[i]->vid, usb_devices_to_check[i]->pid); if(any_not_supported) - cypress_driver_list_devices(devices_list, not_supported_elems, curr_serial_extra_id_cyni_device, usb_devices_to_check); + cypress_driver_list_devices(devices_list, not_supported_elems, curr_serial_extra_id_cyni_device, usb_devices_to_check, NISETRO_CYPRESS_USB_WINDOWS_DRIVER); delete[] curr_serial_extra_id_cyni_device; delete[] no_access_elems;