Skip to content

Commit

Permalink
Original Xbox controller implementation based on xid_driver from Ryze…
Browse files Browse the repository at this point in the history
…e119/ogx360_t4
  • Loading branch information
mikepparks committed Dec 15, 2023
1 parent 0bf8037 commit 115bc73
Show file tree
Hide file tree
Showing 24 changed files with 1,013 additions and 2 deletions.
2 changes: 2 additions & 0 deletions headers/gamepad.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "gamepad/descriptors/EgretDescriptors.h"
#include "gamepad/descriptors/AstroDescriptors.h"
#include "gamepad/descriptors/PSClassicDescriptors.h"
#include "gamepad/descriptors/XboxOriginalDescriptors.h"

#include "pico/stdlib.h"

Expand Down Expand Up @@ -84,6 +85,7 @@ class Gamepad {
EgretReport *getEgretReport();
AstroReport *getAstroReport();
PSClassicReport *getPSClassicReport();
XboxOriginalReport *getXboxOriginalReport();

/**
* @brief Check for a button press. Used by `pressed[Button]` helper methods.
Expand Down
13 changes: 13 additions & 0 deletions headers/gamepad/GamepadDescriptors.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "descriptors/EgretDescriptors.h"
#include "descriptors/AstroDescriptors.h"
#include "descriptors/PSClassicDescriptors.h"
#include "descriptors/XboxOriginalDescriptors.h"

#include "enums.pb.h"

Expand Down Expand Up @@ -68,6 +69,10 @@ static const uint8_t *getConfigurationDescriptor(uint16_t *size, InputMode mode)
*size = sizeof(psclassic_configuration_descriptor);
return psclassic_configuration_descriptor;

case INPUT_MODE_XBOXORIGINAL:
*size = sizeof(xboxoriginal_configuration_descriptor);
return xboxoriginal_configuration_descriptor;

default:
*size = sizeof(hid_configuration_descriptor);
return hid_configuration_descriptor;
Expand Down Expand Up @@ -118,6 +123,10 @@ static const uint8_t *getDeviceDescriptor(uint16_t *size, InputMode mode)
*size = sizeof(psclassic_device_descriptor);
return psclassic_device_descriptor;

case INPUT_MODE_XBOXORIGINAL:
*size = sizeof(xboxoriginal_device_descriptor);
return xboxoriginal_device_descriptor;

default:
*size = sizeof(hid_device_descriptor);
return hid_device_descriptor;
Expand Down Expand Up @@ -297,6 +306,10 @@ static const uint16_t *getStringDescriptor(uint16_t *size, InputMode mode, uint8
str = (char *)psclassic_string_descriptors[index];
break;

case INPUT_MODE_XBOXORIGINAL:
str = (char *)xboxoriginal_string_descriptors[index];
break;

default:
str = (char *)hid_string_descriptors[index];
break;
Expand Down
4 changes: 4 additions & 0 deletions headers/gamepad/GamepadState.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ using namespace std;
#include "gamepad/descriptors/EgretDescriptors.h"
#include "gamepad/descriptors/AstroDescriptors.h"
#include "gamepad/descriptors/PSClassicDescriptors.h"
#include "gamepad/descriptors/XboxOriginalDescriptors.h"

#define GAMEPAD_BUTTON_COUNT 14

Expand Down Expand Up @@ -172,6 +173,9 @@ inline uint16_t GetJoystickMidValue(uint8_t mode) {
case INPUT_MODE_PSCLASSIC:
return GAMEPAD_JOYSTICK_MID;

case INPUT_MODE_XBOXORIGINAL:
return GAMEPAD_JOYSTICK_MID;

default:
return GAMEPAD_JOYSTICK_MID;
}
Expand Down
23 changes: 23 additions & 0 deletions headers/gamepad/descriptors/XboxOriginalDescriptors.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

#include <stdint.h>
#include "xid_driver.h"

#define XboxOriginalReport USB_XboxGamepad_InReport_t

static const uint8_t xboxoriginal_string_language[] = { 0x09, 0x04 };
static const uint8_t xboxoriginal_string_manufacturer[] = "";
static const uint8_t xboxoriginal_string_product[] = "";
static const uint8_t xboxoriginal_string_version[] = "1.0";

static const uint8_t *xboxoriginal_string_descriptors[] __attribute__((unused)) =
{
xboxoriginal_string_language,
xboxoriginal_string_manufacturer,
xboxoriginal_string_product,
xboxoriginal_string_version
};

static const uint8_t *xboxoriginal_device_descriptor = (const uint8_t*)&XID_DESC_DEVICE;

static const uint8_t *xboxoriginal_configuration_descriptor = (const uint8_t*)&XID_DESC_CONFIGURATION;
3 changes: 2 additions & 1 deletion headers/gp2040.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ class GP2040 {
SET_INPUT_MODE_PCEMINI,
SET_INPUT_MODE_EGRET,
SET_INPUT_MODE_ASTRO,
SET_INPUT_MODE_PSCLASSIC
SET_INPUT_MODE_PSCLASSIC,
SET_INPUT_MODE_XBOXORIGINAL
};
BootAction getBootAction();

Expand Down
6 changes: 6 additions & 0 deletions lib/TinyUSB_Gamepad/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,16 @@ src/tusb_driver.cpp
src/usb_descriptors.cpp
src/xinput_driver.cpp
src/ps4_driver.cpp
src/xid_driver/xid_driver.c
src/xid_driver/xid.c
src/xid_driver/xid_gamepad.c
src/xid_driver/xid_remote.c
src/xid_driver/xid_steelbattalion.c
${PROTO_OUTPUT_DIR}/enums.pb.h
)
target_include_directories(TinyUSB_Gamepad PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}/src/xid_driver
${CMAKE_SOURCE_DIR}/headers
${CMAKE_SOURCE_DIR}/lib/CRC32/src
${CMAKE_SOURCE_DIR}/lib/mbedtls/include
Expand Down
29 changes: 28 additions & 1 deletion lib/TinyUSB_Gamepad/src/tusb_driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "hid_driver.h"
#include "xinput_driver.h"
#include "ps4_driver.h"
#include "xid_driver/xid_driver.h"

UsbMode usb_mode = USB_MODE_HID;
InputMode input_mode = INPUT_MODE_XINPUT;
Expand Down Expand Up @@ -60,6 +61,11 @@ bool send_report(void *report, uint16_t report_size)
{
static uint8_t previous_report[CFG_TUD_ENDPOINT0_SIZE] = { };

uint8_t xIndex = 0;
if (input_mode == INPUT_MODE_XBOXORIGINAL) {
xIndex = xid_get_index_by_type(0, XID_TYPE_GAMECONTROLLER);
}

bool sent = false;

if (tud_suspended())
Expand All @@ -69,13 +75,15 @@ bool send_report(void *report, uint16_t report_size)
{
switch (input_mode)
{
case INPUT_MODE_XBOXORIGINAL:
sent = xid_send_report(xIndex, report, report_size);
break;
case INPUT_MODE_XINPUT:
sent = send_xinput_report(report, report_size);
break;
case INPUT_MODE_KEYBOARD:
sent = send_keyboard_report(report);
break;

default:
sent = send_hid_report(0, report, report_size);
break;
Expand Down Expand Up @@ -108,6 +116,9 @@ const usbd_class_driver_t *usbd_app_driver_get_cb(uint8_t *driver_count)
case INPUT_MODE_PS4:
return &ps4_driver;

case INPUT_MODE_XBOXORIGINAL:
return xid_get_driver();

default:
return &hid_driver;
}
Expand Down Expand Up @@ -235,3 +246,19 @@ void tud_resume_cb(void)
{
usb_suspended = false;
}

// Vendor Controlled XFER occured
bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage,
tusb_control_request_t const *request)
{
bool ret = false;
switch (input_mode)
{
case INPUT_MODE_XBOXORIGINAL:
ret |= xid_get_driver()->control_xfer_cb(rhport, stage, request);
break;
default:
break;
}
return ret;
}
6 changes: 6 additions & 0 deletions lib/TinyUSB_Gamepad/src/usb_descriptors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ uint8_t const *tud_descriptor_device_cb(void)
case INPUT_MODE_PSCLASSIC:
return psclassic_device_descriptor;

case INPUT_MODE_XBOXORIGINAL:
return xboxoriginal_device_descriptor;

default:
return hid_device_descriptor;
}
Expand Down Expand Up @@ -151,6 +154,9 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index)
case INPUT_MODE_PSCLASSIC:
return psclassic_configuration_descriptor;

case INPUT_MODE_XBOXORIGINAL:
return xboxoriginal_configuration_descriptor;

default:
return hid_configuration_descriptor;
}
Expand Down
Loading

0 comments on commit 115bc73

Please sign in to comment.