From 14afa815bbe0c22f61ceb6e66b8aa5814afefe7f Mon Sep 17 00:00:00 2001 From: whowechina Date: Mon, 15 May 2023 23:00:08 +0800 Subject: [PATCH] Konami spoof mode support. --- Production/Firmware/iidx_pico.uf2 | Bin 93696 -> 94720 bytes doc/Firmware_manual.pptx | Bin 1257257 -> 1259791 bytes firmware/src/config.h | 1 + firmware/src/main.c | 20 ++++++++++++++++++++ firmware/src/usb_descriptors.c | 12 ++++++++++-- firmware/src/usb_descriptors.h | 4 ++++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Production/Firmware/iidx_pico.uf2 b/Production/Firmware/iidx_pico.uf2 index fd24782b0b87b751fa843b7a5bd155025fe9f070..e140d509c0ffd372f831d7c5885d732dbfca2f3a 100644 GIT binary patch delta 20843 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 xP;+;2^1aLTt1UM2{|7^cp2m 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 diff --git a/firmware/src/config.h b/firmware/src/config.h index 6f3019f..2f12e49 100644 --- a/firmware/src/config.h +++ b/firmware/src/config.h @@ -37,6 +37,7 @@ typedef struct __attribute ((packed)) { uint8_t e3; uint8_t e4; } effects; + bool konami; /* konami spoof */ } iidx_cfg_t; extern iidx_cfg_t *iidx_cfg; diff --git a/firmware/src/main.c b/firmware/src/main.c index 54ea01f..d7c164b 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -57,6 +57,24 @@ void boot_check() } } +void mode_check() +{ + uint16_t key1 = (1 << (button_num() - 1)); + uint16_t key2 = (1 << (button_num() - 2)); + uint16_t buttons = button_read(); + if (buttons & key1) { + iidx_cfg->konami = true; + save_request(); + } else if (buttons & key2) { + iidx_cfg->konami = false; + save_request(); + } + + if (iidx_cfg->konami) { + konami_mode(); + } +} + static bool request_core1_pause = false; static void pause_core1(bool pause) @@ -132,6 +150,8 @@ void init() setup_init(); config_init(); save_init(pause_core1); + + mode_check(); } int main(void) diff --git a/firmware/src/usb_descriptors.c b/firmware/src/usb_descriptors.c index d813e04..203f61e 100644 --- a/firmware/src/usb_descriptors.c +++ b/firmware/src/usb_descriptors.c @@ -42,7 +42,7 @@ //--------------------------------------------------------------------+ // Device Descriptors //--------------------------------------------------------------------+ -tusb_desc_device_t const desc_device_joy = { +tusb_desc_device_t desc_device_joy = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, .bcdUSB = 0x0200, @@ -127,7 +127,7 @@ uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { //--------------------------------------------------------------------+ // array of pointer to string descriptors -char const* string_desc_arr[] = { +const char *string_desc_arr[] = { (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) "WHowe" , // 1: Manufacturer "Pico IIDX Controller", // 2: Product @@ -185,3 +185,11 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { return _desc_str; } + +void konami_mode() +{ + desc_device_joy.idVendor = 0x1ccf; + desc_device_joy.idProduct = 0x8048; + string_desc_arr[1] = "Konami Amusement"; + string_desc_arr[2] = "beatmania IIDX controller premium model"; +} diff --git a/firmware/src/usb_descriptors.h b/firmware/src/usb_descriptors.h index a6efd8d..c6021d8 100644 --- a/firmware/src/usb_descriptors.h +++ b/firmware/src/usb_descriptors.h @@ -64,4 +64,8 @@ enum { HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), HID_USAGE_MIN(0), \ HID_USAGE_MAX(31 * 8 - 1), HID_INPUT(HID_VARIABLE), HID_COLLECTION_END + +/* Enable Konami spoof mode */ +void konami_mode(); + #endif /* USB_DESCRIPTORS_H_ */ \ No newline at end of file