From df2e9e2566464f78bf5f35ee86bde23149b4deba Mon Sep 17 00:00:00 2001 From: CrazyRedMachine Date: Fri, 24 Sep 2021 23:44:33 +0200 Subject: [PATCH] Pocket SDVX Pico Configuration --- README.md | 2 +- build_uf2/Pico_Game_Controller.uf2 | Bin 74240 -> 74240 bytes build_uf2/README.md | 4 ++- src/controller_config.h | 17 +++++----- src/pico_game_controller.c | 16 ++++++++- src/usb_descriptors.c | 52 ++++++++++++----------------- src/usb_descriptors.h | 12 +++---- 7 files changed, 55 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index a209486..3615336 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Pico-Game-Controller -Code for a keyboard or game controller using a Raspberry Pi Pico. Capable of handling 11 buttons, 10 LEDs, 1 WS2812B RGB strip, and 2 encoders. Developed with SDVX and IIDX in mind - see branches release/pocket-sdvx-pico and release/pocket-iidx for preconfigured versions. +This branch was developed with SDVX in mind. Capable of handling 7 LEDs, 1 WS2812B RGB strip, and 2 encoders. Demo of this firmware running on Pocket SDVX Pico, purchasable at https://discord.gg/MmuKd73XbY diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index c95ea122bd3ed281b1222377a5e843902a7942b3..3d1fce8e9749df78a73cf3ae974f0d79c865f69b 100644 GIT binary patch delta 6241 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 P@&Zh!Rm$|$M}qzb5`6}O delta 6387 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 REACTIVE_TIMEOUT_MAX) { if (!gpio_get(SW_GPIO[i])) { gpio_put(LED_GPIO[i], 1); @@ -128,6 +128,20 @@ void update_lights() { gpio_put(LED_GPIO[i], 1); } } + /* start button sw_val index is offset by two with respect to LED_GPIO */ + if (reactive_timeout_count >= REACTIVE_TIMEOUT_MAX) { + if (!gpio_get(SW_GPIO[LED_GPIO_SIZE + 1])) { + gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 1); + } else { + gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 0); + } + } else { + if (lights_report.lights.buttons[LED_GPIO_SIZE - 1] == 0) { + gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 0); + } else { + gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 1); + } + } } } diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c index 3ce3276..0c0aaaa 100644 --- a/src/usb_descriptors.c +++ b/src/usb_descriptors.c @@ -34,10 +34,6 @@ * Auto ProductID layout's Bitmap: * [MSB] HID | MSC | CDC [LSB] */ -#define _PID_MAP(itf, n) ((CFG_TUD_##itf) << (n)) -#define USB_PID \ - (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | \ - _PID_MAP(MIDI, 3) | _PID_MAP(VENDOR, 4)) //--------------------------------------------------------------------+ // Device Descriptors @@ -51,8 +47,8 @@ tusb_desc_device_t const desc_device_joy = { .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - .idVendor = 0xCafe, - .idProduct = USB_PID, + .idVendor = 0x1ccf, + .idProduct = 0x101c, .bcdDevice = 0x0100, .iManufacturer = 0x01, @@ -70,8 +66,8 @@ tusb_desc_device_t const desc_device_key = { .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - .idVendor = 0xCafe, - .idProduct = USB_PID, + .idVendor = 0x1ccf, + .idProduct = 0x101c, .bcdDevice = 0x0100, .iManufacturer = 0x01, @@ -92,14 +88,12 @@ uint8_t const* tud_descriptor_device_cb(void) { uint8_t const desc_hid_report_joy[] = { GAMECON_REPORT_DESC_JOYSTICK(HID_REPORT_ID(REPORT_ID_JOYSTICK)), - GAMECON_REPORT_DESC_LIGHTS(HID_REPORT_ID(REPORT_ID_LIGHTS)) -}; + GAMECON_REPORT_DESC_LIGHTS(HID_REPORT_ID(REPORT_ID_LIGHTS))}; uint8_t const desc_hid_report_key[] = { GAMECON_REPORT_DESC_LIGHTS(HID_REPORT_ID(REPORT_ID_LIGHTS)), GAMECON_REPORT_DESC_NKRO(HID_REPORT_ID(REPORT_ID_KEYBOARD)), - TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE)) -}; + TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE))}; // Invoked when received GET HID REPORT DESCRIPTOR // Application return pointer to descriptor @@ -131,7 +125,6 @@ uint8_t const desc_configuration_joy[] = { sizeof(desc_hid_report_joy), EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 1)}; - uint8_t const desc_configuration_key[] = { // Config number, interface count, string index, total length, attribute, // power in mA @@ -159,25 +152,22 @@ uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { // array of pointer to string descriptors char const* string_desc_arr[] = { (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) - "SpeedyPotato", // 1: Manufacturer - "Pico Game Controller", // 2: Product + "Konami Amusement", // 1: Manufacturer + "SOUND VOLTEX controller", // 2: Product "123456", // 3: Serials, should use chip ID - "Button 1", - "Button 2", - "Button 3", - "Button 4", - "Button 5", - "Button 6", - "Button 7", - "Button 8", - "Button 9", - "Button 10", - "Red 1", - "Green 1", - "Blue 1", - "Red 2", - "Green 2", - "Blue 2", + "BT-A", + "BT-B", + "BT-C", + "BT-D", + "FX-L", + "FX-R", + "Start", + "Left R", + "Left G", + "Left B", + "Right R", + "Right G", + "Right B", }; static uint16_t _desc_str[64]; diff --git a/src/usb_descriptors.h b/src/usb_descriptors.h index 9d30995..d9b601c 100644 --- a/src/usb_descriptors.h +++ b/src/usb_descriptors.h @@ -2,8 +2,8 @@ #define USB_DESCRIPTORS_H_ #include "common/tusb_common.h" -#include "device/usbd.h" #include "controller_config.h" +#include "device/usbd.h" enum { REPORT_ID_JOYSTICK = 1, @@ -27,10 +27,10 @@ enum { HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \ __VA_ARGS__ HID_USAGE_PAGE(HID_USAGE_PAGE_BUTTON), HID_USAGE_MIN(1), \ - HID_USAGE_MAX(SW_GPIO_SIZE), \ - HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), HID_REPORT_COUNT(SW_GPIO_SIZE), \ - HID_REPORT_SIZE(1), HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ - HID_REPORT_COUNT(1), HID_REPORT_SIZE(16 - SW_GPIO_SIZE), /*Padding*/\ + HID_USAGE_MAX(SW_GPIO_SIZE), HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(1), \ + HID_REPORT_COUNT(SW_GPIO_SIZE), HID_REPORT_SIZE(1), \ + HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), HID_REPORT_COUNT(1), \ + HID_REPORT_SIZE(16 - SW_GPIO_SIZE), /*Padding*/ \ HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_LOGICAL_MIN(0x00), \ HID_LOGICAL_MAX_N(0x00ff, 2), \ @@ -45,7 +45,7 @@ enum { __VA_ARGS__ HID_REPORT_COUNT(LED_GPIO_SIZE + (WS2812B_LED_ZONES * 3)), \ HID_REPORT_SIZE(8), HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \ HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), HID_STRING_MINIMUM(4), \ - HID_STRING_MAXIMUM(16), HID_USAGE_MIN(1), HID_USAGE_MAX(16), \ + HID_STRING_MAXIMUM(16), HID_USAGE_MIN(1), HID_USAGE_MAX(13), \ HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), HID_REPORT_COUNT(1), \ HID_REPORT_SIZE(8), /*Padding*/ \ HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \