Skip to content

Commit

Permalink
Getting x360 back up to working, fixing some small bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
arntsonl committed Sep 23, 2024
1 parent 64cf57d commit fdddfc2
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
11 changes: 7 additions & 4 deletions src/drivers/xinput/XInputAuthUSBListener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,13 @@ void XInputAuthUSBListener::xmount(uint8_t dev_addr, uint8_t instance, uint8_t c
// Get Xbox Security Method 3 (XSM3)
uint8_t recvBuf[0xB2];
tuh_descriptor_get_string_sync(xinput_dev_addr, 4, 0x0409, recvBuf, 0xB2);
auth_dongle_get_serial();
// If our dongle has remounted for any reason, trigger a re-auth (Magicboots X360)
if ( xinputAuthData->hasInitAuth == true ) {
if ( auth_dongle_init_challenge() == true) {
if ( auth_dongle_init_challenge() == true) {
auth_dongle_wait(XSM360AuthRequest::XSM360_INIT_AUTH);
}
} else {
auth_dongle_get_serial();
}
xinputAuthData->dongle_ready = true;
}
Expand All @@ -79,6 +80,7 @@ void XInputAuthUSBListener::unmount(uint8_t dev_addr) {
// Do not reset dongle_ready on unmount (Magic-X will remount but still be ready)
if ( dev_addr == xinput_dev_addr ) {
xinputAuthData->dongle_ready = false;
dongleAuthState = DONGLE_AUTH_STATE::DONGLE_AUTH_IDLE;
}
}

Expand Down Expand Up @@ -147,6 +149,7 @@ void XInputAuthUSBListener::process() {
break;
}
dongleAuthState = DONGLE_AUTH_STATE::DONGLE_AUTH_IDLE;
wait_count = 0;
}
// TIMEOUT after 60 attempts
if ( wait_count == 60 ) {
Expand Down Expand Up @@ -190,7 +193,7 @@ bool XInputAuthUSBListener::auth_dongle_data_reply(uint8_t replyLen) {
xfer_result_t user_result;
if ( xinputh_vendor_report(TUSB_DIR_IN,
XSM360AuthRequest::XSM360_RESPOND_CHALLENGE, TU_U16(X360_WVALUE_CONTROLLER_DATA, replyLen-6),
xinputAuthData->passthruBufferLen, xinputAuthData->passthruBuffer, (uintptr_t)&user_result) == false
replyLen, xinputAuthData->passthruBuffer, (uintptr_t)&user_result) == false
|| user_result != xfer_result_t::XFER_RESULT_SUCCESS) {
return false;
}
Expand All @@ -204,7 +207,7 @@ bool XInputAuthUSBListener::auth_dongle_challenge_verify() {
xfer_result_t user_result;
if ( xinputh_vendor_report(TUSB_DIR_OUT,
XSM360AuthRequest::XSM360_VERIFY_AUTH, X360_WVALUE_CONSOLE_DATA,
xinputAuthData->passthruBufferLen, xinputAuthData->passthruBuffer, (uintptr_t)&user_result) == false
X360_AUTHLEN_CHALLENGE, xinputAuthData->passthruBuffer, (uintptr_t)&user_result) == false
|| user_result != xfer_result_t::XFER_RESULT_SUCCESS) {
return false;
}
Expand Down
7 changes: 3 additions & 4 deletions src/drivers/xinput/XInputDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,7 @@ static void xinput_reset(uint8_t rhport) {
(void)rhport;
}

static uint16_t xinput_open(uint8_t rhport, tusb_desc_interface_t const *itf_descriptor, uint16_t max_length)
{
static uint16_t xinput_open(uint8_t rhport, tusb_desc_interface_t const *itf_descriptor, uint16_t max_length) {
uint16_t driver_length = 0;
// Xbox 360 Vendor USB Interfaces: Control, Audio, Plug-in, Security
if ( TUSB_CLASS_VENDOR_SPECIFIC == itf_descriptor->bInterfaceClass) {
Expand Down Expand Up @@ -322,7 +321,7 @@ uint16_t XInputDriver::get_report(uint8_t report_id, hid_report_type_t report_ty
bool XInputDriver::vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {
// Do nothing if we have no auth driver
if ( xAuthDriver == nullptr || !xAuthDriver->available() ) {
return true;
return false;
}

uint16_t len = 0;
Expand All @@ -333,7 +332,7 @@ bool XInputDriver::vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_co
switch (request->bRequest) {
case XSM360_GET_SERIAL:
// Stall if we don't have a dongle ready
if ( xinputAuthData->dongle_ready == false ) {
if ( xinputAuthData->dongle_ready == false ) {
return false;
}
len = X360_AUTHLEN_DONGLE_SERIAL;
Expand Down

0 comments on commit fdddfc2

Please sign in to comment.