From a596ee8b2ab5a39b3942fc1331c9f7a48f1ff4ca Mon Sep 17 00:00:00 2001 From: Nicholas G Date: Fri, 16 Jul 2021 14:23:51 -0400 Subject: [PATCH] Updated functions for pico-sdk 1.2.0, updated ReadMe --- README.md | 15 +++++++++++-- build_uf2/Pico_Game_Controller.uf2 | Bin 70144 -> 71168 bytes src/pico_game_controller.c | 16 ++++++++----- src/tusb_config.h | 35 ++++++++++++++++++++++------- src/usb_descriptors.c | 32 ++++++++++++++------------ 5 files changed, 68 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 87b69c2..6b210f3 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,29 @@ # Pico-Game-Controller -WIP code for a rhythm game controller using a Raspberry Pi Pico. Intended for SDVX but is capable of handling 11 buttons, 11 LEDs, and 2 encoders. +WIP code for a rhythm game controller using a Raspberry Pi Pico. Intended for SDVX but is capable of handling 11 buttons, 11 LEDs, and 2 encoders. Currently working/fixed: + - Gamepad mode - untested on EAC - default boot mode - Keyboard & Mouse Mode - limited to 6KRO - hold btn-a to enter kb mode - HID LEDs with Reactive LED fallback - untested - sdvx/iidx spoof - untested on EAC - 1000hz polling -- Fix 0-~71% encoder rollover in gamepad mode, uint32 max val isn't divisible evenly by ppr*4 for joystick - thanks friends +- Fix 0-~71% encoder rollover in gamepad mode, uint32 max val isn't divisible evenly by ppr\*4 for joystick - thanks friends - Switch and LED pins are now staggered for easier wiring TODO: + - Store last mode in flash memory https://www.raspberrypi.org/forums/viewtopic.php?t=305570 - nkro - debounce - split input updating into pi pico's second core? + +How to Use: + +- For basic flashing, see README in build_uf2 +- Otherwise, setup the C++ environment for the Pi Pico as per https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf +- Build pico-examples directory once to ensure all the tinyusb and other libraries are there. You might have to move the pico-sdk folder into pico-examples/build for it to play nice. +- Move pico-sdk back outside to the same level directory as Pico-Game-Controller. +- Open Pico-Game-Controller in VSCode(assuming this is setup for the Pi Pico) and see if everything builds. +- Tweakable parameters: Pinout, bindings in pico_game_controller.c, USB device reporting as SDVX/IIDX(con_mode) in usb_descriptors.c diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index 0f2cb55b1aa836ca1936c7a115b223e2318f87f7..05ecc1ae13b63bb1bacc8969038ab8f9348f4e18 100644 GIT binary patch delta 19583 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 delta 18600 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 E4M;`RegFUf diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index 8f93b73..a4be11a 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -1,8 +1,8 @@ /* - * Pico SDVX + * Pico Game Controller * @author SpeedyPotato * - * Based off dev_hid_composite, mdxtinkernick/pico_encoders, and + * Based off tinyusb's hid_composite, mdxtinkernick/pico_encoders, and * Drewol/rp2040-gamecon */ @@ -343,9 +343,11 @@ int main(void) { // Invoked when received GET_REPORT control request // Application must fill buffer report's content and return its length. // Return zero will cause the stack to STALL request -uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, - uint8_t *buffer, uint16_t reqlen) { +uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, + hid_report_type_t report_type, uint8_t* buffer, + uint16_t reqlen) { // TODO not Implemented + (void)itf; (void)report_id; (void)report_type; (void)buffer; @@ -356,8 +358,10 @@ uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, // Invoked when received SET_REPORT control request or // received data on OUT endpoint ( Report ID = 0, Type = 0 ) -void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, - uint8_t const *buffer, uint16_t bufsize) { +void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, + hid_report_type_t report_type, uint8_t const* buffer, + uint16_t bufsize) { + (void)itf; if (report_id == 2 && report_type == HID_REPORT_TYPE_OUTPUT && buffer[0] == 2 && bufsize >= sizeof(lights_report)) // light data { diff --git a/src/tusb_config.h b/src/tusb_config.h index 42d7783..071ae69 100644 --- a/src/tusb_config.h +++ b/src/tusb_config.h @@ -34,21 +34,40 @@ extern "C" { // COMMON CONFIGURATION //-------------------------------------------------------------------- -// defined by compiler flags for flexibility +// defined by board.mk #ifndef CFG_TUSB_MCU #error CFG_TUSB_MCU must be defined #endif -#if CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX || \ - CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || CFG_TUSB_MCU == OPT_MCU_NUC505 || \ - CFG_TUSB_MCU == OPT_MCU_CXD56 -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED) +// RHPort number used for device can be defined by board.mk, default to port 0 +#ifndef BOARD_DEVICE_RHPORT_NUM +#define BOARD_DEVICE_RHPORT_NUM 0 +#endif + +// RHPort max operational speed can defined by board.mk +// Default to Highspeed for MCU with internal HighSpeed PHY (can be port +// specific), otherwise FullSpeed +#ifndef BOARD_DEVICE_RHPORT_SPEED +#if (CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX || \ + CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || CFG_TUSB_MCU == OPT_MCU_NUC505 || \ + CFG_TUSB_MCU == OPT_MCU_CXD56) +#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_HIGH_SPEED #else -#define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE +#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_FULL_SPEED +#endif +#endif + +// Device mode with rhport and speed defined by board.mk +#if BOARD_DEVICE_RHPORT_NUM == 0 +#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED) +#elif BOARD_DEVICE_RHPORT_NUM == 1 +#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED) +#else +#error "Incorrect RHPort configuration" #endif #ifndef CFG_TUSB_OS -#define CFG_TUSB_OS OPT_OS_PICO +#define CFG_TUSB_OS OPT_OS_NONE #endif // CFG_TUSB_DEBUG is defined by compiler in DEBUG build @@ -84,7 +103,7 @@ extern "C" { #define CFG_TUD_VENDOR 0 // HID buffer size Should be sufficient to hold ID (if any) + Data -#define CFG_TUD_HID_BUFSIZE 16 +#define CFG_TUD_HID_EP_BUFSIZE 16 #ifdef __cplusplus } diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c index 3c52b6d..aa96807 100644 --- a/src/usb_descriptors.c +++ b/src/usb_descriptors.c @@ -48,7 +48,6 @@ //--------------------------------------------------------------------+ // Device Descriptors //--------------------------------------------------------------------+ - tusb_desc_device_t const desc_device = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, @@ -70,8 +69,8 @@ tusb_desc_device_t const desc_device = { // Invoked when received GET DEVICE DESCRIPTOR // Application return pointer to descriptor -uint8_t const *tud_descriptor_device_cb(void) { - return (uint8_t const *)&desc_device; +uint8_t const* tud_descriptor_device_cb(void) { + return (uint8_t const*)&desc_device; } //--------------------------------------------------------------------+ @@ -87,7 +86,10 @@ uint8_t const desc_hid_report[] = { // Invoked when received GET HID REPORT DESCRIPTOR // Application return pointer to descriptor // Descriptor contents must exist long enough for transfer to complete -uint8_t const *tud_hid_descriptor_report_cb(void) { return desc_hid_report; } +uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf) { + (void)itf; + return desc_hid_report; +} //--------------------------------------------------------------------+ // Configuration Descriptor @@ -105,16 +107,16 @@ uint8_t const desc_configuration[] = { TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), - // Interface number, string index, protocol, report descriptor len, EP In & - // Out address, size & polling interval - TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_PROTOCOL_NONE, - sizeof(desc_hid_report), EPNUM_HID, CFG_TUD_HID_BUFSIZE, - 1)}; + // Interface number, string index, protocol, report descriptor len, EP In + // address, size & polling interval + TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, + sizeof(desc_hid_report), EPNUM_HID, + CFG_TUD_HID_EP_BUFSIZE, 1)}; // Invoked when received GET CONFIGURATION DESCRIPTOR // Application return pointer to descriptor // Descriptor contents must exist long enough for transfer to complete -uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { +uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { (void)index; // for multiple configurations return desc_configuration; } @@ -127,7 +129,7 @@ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { #define iidx_prod "beatmania IIDX controller premium model" // array of pointer to string descriptors -char const *string_desc_arr[] = { +char const* string_desc_arr[] = { (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) "Konami Amusement", // 1: Manufacturer con_mode ? iidx_prod : sdvx_prod, // 2: Product @@ -139,7 +141,7 @@ static uint16_t _desc_str[32]; // Invoked when received GET STRING DESCRIPTOR request // Application return pointer to descriptor, whose contents must exist long // enough for transfer to complete -uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) { +uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { (void)langid; uint8_t chr_count; @@ -148,17 +150,19 @@ uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) { memcpy(&_desc_str[1], string_desc_arr[0], 2); chr_count = 1; } else { - // Convert ASCII string into UTF-16 + // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors. + // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) return NULL; - const char *str = string_desc_arr[index]; + const char* str = string_desc_arr[index]; // Cap at max char chr_count = strlen(str); if (chr_count > 31) chr_count = 31; + // Convert ASCII string into UTF-16 for (uint8_t i = 0; i < chr_count; i++) { _desc_str[1 + i] = str[i]; }