Improve initial connection for FTD3 N3DSXL
Some checks failed
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:linux32 flags:32 name:Linux GCC 32 os:ubuntu-latest]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:linux64 flags:64 name:Linux GCC x64 os:ubuntu-latest]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:linuxarm32 flags:arm32 name:Linux GCC ARM 32 os:ubuntu-latest]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:linuxarm64 flags:arm64 name:Linux GCC ARM 64 os:ubuntu-latest]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:macos name:macOS Apple Silicon os:macos-14]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:win32 flags:-A Win32 -DCMAKE_PARALLEL_MSVC=TRUE name:Windows VS2022 Win32 os:windows-2022]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:win64 flags:-A x64 -DCMAKE_PARALLEL_MSVC=TRUE name:Windows VS2022 x64 os:windows-2022]) (push) Has been cancelled
CD / ${{ matrix.platform.name }} ${{ matrix.config.name }} (map[flags:-DBUILD_SHARED_LIBS=FALSE name:Static], map[artifact_name:winarm64 flags:-A ARM64 -DCMAKE_PARALLEL_MSVC=TRUE name:Windows VS2022 ARM os:windows-2022]) (push) Has been cancelled
CD / Create Pi Mono Setup (push) Has been cancelled
CD / Publishing (push) Has been cancelled

This commit is contained in:
Lorenzooone 2026-02-15 21:58:44 +01:00
parent 7cd299488e
commit b1a3f10728
2 changed files with 36 additions and 1 deletions

View File

@ -41,9 +41,12 @@ const size_t ftd3_num_vids = sizeof(ftd3_valid_vids) / sizeof(ftd3_valid_vids[0]
const uint16_t ftd3_valid_pids[] = {0x601e, 0x601f, 0x602a, 0x602b, 0x602c, 0x602d, 0x602f};
const size_t ftd3_num_pids = sizeof(ftd3_valid_pids) / sizeof(ftd3_valid_pids[0]);
// Should be different between two commands... Doesn't need to start from 0.
static int curr_cmd_id = 0;
#pragma pack(push, 1)
struct ftd3_command_preamble_data {
uint32_t unk;
uint32_t cmd_id;
uint8_t pipe;
uint8_t command;
uint16_t unk2;
@ -130,6 +133,7 @@ static int ftd3_libusb_send_command(libusb_device_handle* handle, uint8_t* data,
static int ftd3_libusb_send_ptr_data_command(libusb_device_handle* handle, uint8_t pipe, uint8_t command) {
ftd3_command_with_ptr_data command_with_ptr_data;
memset((uint8_t*)&command_with_ptr_data, 0, sizeof(ftd3_command_with_ptr_data));
command_with_ptr_data.preamble_data.cmd_id = curr_cmd_id++;
command_with_ptr_data.preamble_data.pipe = pipe;
command_with_ptr_data.preamble_data.command = command;
return ftd3_libusb_send_command(handle, (uint8_t*)&command_with_ptr_data, sizeof(ftd3_command_with_ptr_data));
@ -138,12 +142,17 @@ static int ftd3_libusb_send_ptr_data_command(libusb_device_handle* handle, uint8
static int ftd3_libusb_send_len_data_command(libusb_device_handle* handle, uint8_t pipe, uint8_t command, uint32_t length) {
ftd3_command_with_len_data command_with_len_data;
memset((uint8_t*)&command_with_len_data, 0, sizeof(ftd3_command_with_len_data));
command_with_len_data.preamble_data.cmd_id = curr_cmd_id++;
command_with_len_data.preamble_data.pipe = pipe;
command_with_len_data.preamble_data.command = command;
command_with_len_data.len = to_le(length);
return ftd3_libusb_send_command(handle, (uint8_t*)&command_with_len_data, sizeof(ftd3_command_with_len_data));
}
static int ftd3_libusb_send_create_abort_command(libusb_device_handle* handle) {
return ftd3_libusb_send_ptr_data_command(handle, FTD3_COMMAND_CREATE_PIPE_ID, FTD3_COMMAND_ABORT_ID);
}
static int ftd3_libusb_send_create_command(libusb_device_handle* handle) {
return ftd3_libusb_send_ptr_data_command(handle, FTD3_COMMAND_CREATE_PIPE_ID, FTD3_COMMAND_CREATE_ID);
}
@ -176,6 +185,24 @@ int ftd3_libusb_set_stream_pipe(ftd3_device_device_handlers* handlers, int pipe,
return ftd3_libusb_send_len_data_command((libusb_device_handle*)handlers->usb_handle, pipe, FTD3_COMMAND_SET_STREAM_PIPE_ID, (uint32_t)length);
}
static bool ftd3_libusb_setup_connection_initial_control_in(libusb_device_handle* handle) {
uint8_t tmp_buf[4];
int transferred = 0;
ftd3_device_device_handlers handlers;
handlers.usb_handle = handle;
int result = ftd3_libusb_ctrl_in(&handlers, FTD3_COMMAND_TIMEOUT, tmp_buf, sizeof(tmp_buf), 3, 1, 0x8000, &transferred);
if(result < 0)
return false;
if(transferred != sizeof(tmp_buf))
return false;
result = ftd3_libusb_ctrl_in(&handlers, FTD3_COMMAND_TIMEOUT, tmp_buf, sizeof(tmp_buf), 3, 1, 0x8400, &transferred);
if(result < 0)
return false;
if(transferred != sizeof(tmp_buf))
return false;
return true;
}
static bool ftd3_libusb_setup_connection(libusb_device_handle* handle, bool* claimed_cmd, bool* claimed_bulk) {
*claimed_cmd = false;
*claimed_bulk = false;
@ -190,10 +217,15 @@ static bool ftd3_libusb_setup_connection(libusb_device_handle* handle, bool* cla
if(result != LIBUSB_SUCCESS)
return false;
*claimed_cmd = true;
if(!ftd3_libusb_setup_connection_initial_control_in(handle))
return false;
result = libusb_claim_interface(handle, FTD3_BULK_INTERFACE);
if(result != LIBUSB_SUCCESS)
return false;
*claimed_bulk = true;
result = ftd3_libusb_send_create_abort_command(handle);
if(result < 0)
return false;
result = ftd3_libusb_send_create_command(handle);
if(result < 0)
return false;

View File

@ -137,6 +137,7 @@ static bool read_3ds_config_3d(bool print_failed, CaptureData* capture_data, Cap
buf[0] = 0x98;
buf[1] = 0x05;
buf[2] = 0x9F;
buf[3] = 0;
if(ftd3_is_error_compat(handlers, ftd3_write_pipe_compat(handlers, BULK_OUT, buf, 4, &transferred))) {
capture_error_print(print_failed, capture_data, "Write failed");
@ -158,6 +159,8 @@ static bool read_3ds_config_3d(bool print_failed, CaptureData* capture_data, Cap
buf[0] = 0x40;
buf[1] = 0;
buf[2] = 0;
buf[3] = 0;
if(ftd3_is_error_compat(handlers, ftd3_write_pipe_compat(handlers, BULK_OUT, buf, 4, &transferred))) {
capture_error_print(print_failed, capture_data, "Write failed");