switch2: Read user calibration data

This commit is contained in:
Vicki Pfau
2025-09-24 17:35:55 -07:00
committed by Sam Lantinga
parent f3a9f66292
commit ed2cdceb66

View File

@@ -355,25 +355,24 @@ static bool HIDAPI_DriverSwitch2_InitUSB(SDL_HIDAPI_Device *device)
flash_read_command[12] = 0x80; flash_read_command[12] = 0x80;
res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command)); res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command));
if (res < 0) { if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request calibration data: %d", res); SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request factory calibration data: %d", res);
} else { } else {
res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data)); res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data));
if (res < 0) { if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read calibration data: %d", res); SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read factory calibration data: %d", res);
} else { } else {
ParseStickCalibration(&ctx->left_stick, &calibration_data[0x38]); ParseStickCalibration(&ctx->left_stick, &calibration_data[0x38]);
} }
} }
flash_read_command[12] = 0xC0; flash_read_command[12] = 0xC0;
res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command)); res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command));
if (res < 0) { if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request calibration data: %d", res); SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request factory calibration data: %d", res);
} else { } else {
res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data)); res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data));
if (res < 0) { if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read calibration data: %d", res); SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read factory calibration data: %d", res);
} else { } else {
ParseStickCalibration(&ctx->right_stick, &calibration_data[0x38]); ParseStickCalibration(&ctx->right_stick, &calibration_data[0x38]);
} }
@@ -384,11 +383,11 @@ static bool HIDAPI_DriverSwitch2_InitUSB(SDL_HIDAPI_Device *device)
flash_read_command[13] = 0x31; flash_read_command[13] = 0x31;
res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command)); res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command));
if (res < 0) { if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read calibration data: %d", res); SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request factory calibration data: %d", res);
} else { } else {
res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data)); res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data));
if (res < 0) { if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read calibration data: %d", res); SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read factory calibration data: %d", res);
} else { } else {
ctx->left_trigger_max = calibration_data[0x10]; ctx->left_trigger_max = calibration_data[0x10];
ctx->right_trigger_max = calibration_data[0x11]; ctx->right_trigger_max = calibration_data[0x11];
@@ -396,6 +395,34 @@ static bool HIDAPI_DriverSwitch2_InitUSB(SDL_HIDAPI_Device *device)
} }
} }
flash_read_command[12] = 0x40;
flash_read_command[13] = 0xC0;
flash_read_command[14] = 0x1F;
res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command));
if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request user calibration data: %d", res);
} else {
res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data));
if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request user calibration data: %d", res);
} else if (calibration_data[0x10] == 0xb2 && calibration_data[0x11] == 0xa1) {
ParseStickCalibration(&ctx->left_stick, &calibration_data[0x12]);
}
}
flash_read_command[12] = 0x80;
res = SendBulkData(ctx, flash_read_command, sizeof(flash_read_command));
if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't request user calibration data: %d", res);
} else {
res = RecvBulkData(ctx, calibration_data, sizeof(calibration_data));
if (res < 0) {
SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, "Couldn't read user calibration data: %d", res);
} else if (calibration_data[0x10] == 0xb2 && calibration_data[0x11] == 0xa1) {
ParseStickCalibration(&ctx->right_stick, &calibration_data[0x12]);
}
}
return true; return true;
} }