IO4 can be turned off (to live with official IO4 board)

This commit is contained in:
whowechina 2024-09-18 21:56:38 +08:00
parent f6d5364954
commit 757496f8a0
8 changed files with 180 additions and 165 deletions

Binary file not shown.

View File

@ -61,10 +61,10 @@ static void disp_hid()
{ {
printf("[HID]\n"); printf("[HID]\n");
const char *nkro[] = {"off", "key1", "key2"}; const char *nkro[] = {"off", "key1", "key2"};
printf(" Joy: %s, NKRO: %s\n", mai_cfg->hid.joy ? "ON" : "OFF", printf(" IO4: %s, NKRO: %s\n", mai_cfg->hid.io4 ? "on" : "off",
mai_cfg->hid.nkro <= 2 ? nkro[mai_cfg->hid.nkro] : "key1"); mai_cfg->hid.nkro <= 2 ? nkro[mai_cfg->hid.nkro] : "key1");
if (mai_runtime.key_stuck) { if (mai_runtime.key_stuck) {
printf(" !!! Button stuck, force JOY only !!!\n"); printf(" !!! Button stuck, force IO4 only !!!\n");
} }
} }
@ -221,32 +221,35 @@ static void handle_stat(int argc, char *argv[])
static void handle_hid(int argc, char *argv[]) static void handle_hid(int argc, char *argv[])
{ {
const char *usage = "Usage: hid <joy|key1|key2>\n"; const char *usage = "Usage: hid <io4|key1|key2|off>\n";
if (argc != 1) { if (argc != 1) {
printf(usage); printf(usage);
return; return;
} }
const char *choices[] = {"joy", "key1", "key2"}; const char *choices[] = {"io4", "key1", "key2", "off"};
int match = cli_match_prefix(choices, 3, argv[0]); int match = cli_match_prefix(choices, count_of(choices), argv[0]);
if (match < 0) { if (match < 0) {
printf(usage); printf(usage);
return; return;
} }
switch (match) { switch (match) {
break;
case 1: case 1:
mai_cfg->hid.joy = 0; mai_cfg->hid.io4 = 0;
mai_cfg->hid.nkro = 1; mai_cfg->hid.nkro = 1;
break; break;
case 2: case 2:
mai_cfg->hid.joy = 0; mai_cfg->hid.io4 = 0;
mai_cfg->hid.nkro = 2; mai_cfg->hid.nkro = 2;
break; break;
case 3:
mai_cfg->hid.io4 = 0;
mai_cfg->hid.nkro = 0;
break;
case 0: case 0:
default: default:
mai_cfg->hid.joy = 1; mai_cfg->hid.io4 = 1;
mai_cfg->hid.nkro = 0; mai_cfg->hid.nkro = 0;
break; break;
} }

View File

@ -26,8 +26,8 @@ static mai_cfg_t default_cfg = {
.debounce_release = 2, .debounce_release = 2,
}, },
.hid = { .hid = {
.joy = 0, .io4 = 1,
.nkro = 1, .nkro = 0,
}, },
.rgb = { .rgb = {
.per_button = 1, .per_button = 1,

View File

@ -25,7 +25,7 @@ typedef struct __attribute__((packed)) {
int8_t zones[34]; int8_t zones[34];
} sense; } sense;
struct { struct {
uint8_t joy : 4; uint8_t io4 : 4;
uint8_t nkro : 4; uint8_t nkro : 4;
} hid; } hid;
struct { struct {

View File

@ -42,7 +42,7 @@ static uint16_t native_to_io4(uint16_t button)
static void report_usb_hid() static void report_usb_hid()
{ {
if (tud_hid_ready()) { if (tud_hid_ready()) {
if (mai_cfg->hid.joy || mai_runtime.key_stuck) { if (mai_cfg->hid.io4 || mai_runtime.key_stuck) {
static uint16_t last_buttons = 0; static uint16_t last_buttons = 0;
uint16_t buttons = button_read(); uint16_t buttons = button_read();
hid_joy.buttons[0] = native_to_io4(buttons); hid_joy.buttons[0] = native_to_io4(buttons);

View File

@ -145,6 +145,10 @@ void init()
save_init(board_id_32() ^ 0xcafe1111, &core1_io_lock); save_init(board_id_32() ^ 0xcafe1111, &core1_io_lock);
if (!mai_cfg->hid.io4) {
usb_descriptors_disable_io4();
}
touch_init(); touch_init();
button_init(); button_init();
rgb_init(); rgb_init();

View File

@ -157,13 +157,15 @@ uint8_t const* tud_descriptor_configuration_cb(uint8_t index) {
static char serial_number_str[24] = "123456\0"; static char serial_number_str[24] = "123456\0";
static char joy_name_string[128] = "I/O CONTROL BD;15257;01;90;1831;6679A;00;GOUT=14_ADIN=8,E_ROTIN=4_COININ=2_SWIN=2,E_UQ1=41,6;";
// array of pointer to string descriptors // array of pointer to string descriptors
static const char *string_desc_arr[] = { static const char *string_desc_arr[] = {
(const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409)
"SEGA", // 1: Manufacturer "SEGA", // 1: Manufacturer
"Mai Pico", // 2: Product "Mai Pico", // 2: Product
serial_number_str, // 3: Serials, use chip ID serial_number_str, // 3: Serials, use chip ID
"I/O CONTROL BD;15257;01;90;1831;6679A;00;GOUT=14_ADIN=8,E_ROTIN=4_COININ=2_SWIN=2,E_UQ1=41,6;", joy_name_string,
"Mai Pico NKRO", "Mai Pico NKRO",
"Mai Pico Command Line Port", "Mai Pico Command Line Port",
"Mai Pico Touch Port", "Mai Pico Touch Port",
@ -206,3 +208,8 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
return _desc_str; return _desc_str;
} }
void usb_descriptors_disable_io4()
{
strcpy(joy_name_string, "Mai Pico Joystick");
}

View File

@ -1,151 +1,152 @@
#ifndef USB_DESCRIPTORS_H_ #ifndef USB_DESCRIPTORS_H_
#define USB_DESCRIPTORS_H_ #define USB_DESCRIPTORS_H_
#include "common/tusb_common.h" #include "common/tusb_common.h"
#include "device/usbd.h" #include "device/usbd.h"
enum { enum {
REPORT_ID_JOYSTICK = 1, REPORT_ID_JOYSTICK = 1,
REPORT_ID_OUTPUT = 16, REPORT_ID_OUTPUT = 16,
}; };
// because they are missing from tusb_hid.h // because they are missing from tusb_hid.h
#define HID_STRING_INDEX(x) HID_REPORT_ITEM(x, 7, RI_TYPE_LOCAL, 1) #define HID_STRING_INDEX(x) HID_REPORT_ITEM(x, 7, RI_TYPE_LOCAL, 1)
#define HID_STRING_INDEX_N(x, n) HID_REPORT_ITEM(x, 7, RI_TYPE_LOCAL, n) #define HID_STRING_INDEX_N(x, n) HID_REPORT_ITEM(x, 7, RI_TYPE_LOCAL, n)
#define HID_STRING_MINIMUM(x) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, 1) #define HID_STRING_MINIMUM(x) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, 1)
#define HID_STRING_MINIMUM_N(x, n) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, n) #define HID_STRING_MINIMUM_N(x, n) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, n)
#define HID_STRING_MAXIMUM(x) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, 1) #define HID_STRING_MAXIMUM(x) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, 1)
#define HID_STRING_MAXIMUM_N(x, n) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, n) #define HID_STRING_MAXIMUM_N(x, n) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, n)
// Joystick Report Descriptor to Emulate IO4 // Joystick Report Descriptor to Emulate IO4
#define MAIPICO_REPORT_DESC_JOYSTICK \ #define MAIPICO_REPORT_DESC_JOYSTICK \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \ HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \
HID_REPORT_ID(REPORT_ID_JOYSTICK) \ HID_REPORT_ID(REPORT_ID_JOYSTICK) \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_X), \ HID_USAGE(HID_USAGE_DESKTOP_X), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_Y), \ HID_USAGE(HID_USAGE_DESKTOP_Y), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_X), \ HID_USAGE(HID_USAGE_DESKTOP_X), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_Y), \ HID_USAGE(HID_USAGE_DESKTOP_Y), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_X), \ HID_USAGE(HID_USAGE_DESKTOP_X), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_Y), \ HID_USAGE(HID_USAGE_DESKTOP_Y), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_X), \ HID_USAGE(HID_USAGE_DESKTOP_X), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_Y), \ HID_USAGE(HID_USAGE_DESKTOP_Y), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_RX), \ HID_USAGE(HID_USAGE_DESKTOP_RX), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_RY), \ HID_USAGE(HID_USAGE_DESKTOP_RY), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_RX), \ HID_USAGE(HID_USAGE_DESKTOP_RX), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_RY), \ HID_USAGE(HID_USAGE_DESKTOP_RY), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_SLIDER), \ HID_USAGE(HID_USAGE_DESKTOP_SLIDER), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(16), \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_SLIDER), \ HID_USAGE(HID_USAGE_DESKTOP_SLIDER), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(48), HID_REPORT_SIZE(1), \ HID_REPORT_COUNT(48), HID_REPORT_SIZE(1), \
HID_USAGE_MIN_N(1, 2), HID_USAGE_MAX_N(48, 2), \ HID_USAGE_MIN_N(1, 2), HID_USAGE_MAX_N(48, 2), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
\ \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(232), \ HID_REPORT_COUNT(1), HID_REPORT_SIZE(232), \
HID_INPUT(HID_CONSTANT | HID_ABSOLUTE), \ HID_INPUT(HID_CONSTANT | HID_ABSOLUTE), \
\ \
HID_USAGE_PAGE_N(0xffa0, 2), \ HID_USAGE_PAGE_N(0xffa0, 2), \
HID_USAGE(0x00), \ HID_USAGE(0x00), \
HID_REPORT_ID(REPORT_ID_OUTPUT) \ HID_REPORT_ID(REPORT_ID_OUTPUT) \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \
HID_USAGE(0x00), \ HID_USAGE(0x00), \
HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(255), \ HID_LOGICAL_MIN(0), HID_LOGICAL_MAX(255), \
HID_REPORT_COUNT(63), HID_REPORT_SIZE(8), \ HID_REPORT_COUNT(63), HID_REPORT_SIZE(8), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END, \ HID_COLLECTION_END, \
HID_COLLECTION_END HID_COLLECTION_END
#define MAIPICO_REPORT_DESC_NKRO \ #define MAIPICO_REPORT_DESC_NKRO \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \ HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_KEYBOARD), \ HID_USAGE(HID_USAGE_DESKTOP_KEYBOARD), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \ HID_COLLECTION(HID_COLLECTION_APPLICATION), \
/* Modifier */ \ /* Modifier */ \
HID_REPORT_SIZE(1), \ HID_REPORT_SIZE(1), \
HID_REPORT_COUNT(8), \ HID_REPORT_COUNT(8), \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \ HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(224), \ HID_USAGE_MIN(224), \
HID_USAGE_MAX(231), \ HID_USAGE_MAX(231), \
HID_LOGICAL_MIN(0), \ HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \ HID_LOGICAL_MAX(1), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
/* LED output that we don't care */ \ /* LED output that we don't care */ \
HID_REPORT_COUNT(5), \ HID_REPORT_COUNT(5), \
HID_REPORT_SIZE(1), \ HID_REPORT_SIZE(1), \
HID_USAGE_PAGE(HID_USAGE_PAGE_LED), \ HID_USAGE_PAGE(HID_USAGE_PAGE_LED), \
HID_USAGE_MIN(1), \ HID_USAGE_MIN(1), \
HID_USAGE_MAX(5), \ HID_USAGE_MAX(5), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_REPORT_COUNT(1), \ HID_REPORT_COUNT(1), \
HID_REPORT_SIZE(3), \ HID_REPORT_SIZE(3), \
HID_OUTPUT(HID_CONSTANT), \ HID_OUTPUT(HID_CONSTANT), \
/* Full Keyboard Bitmap */ \ /* Full Keyboard Bitmap */ \
HID_REPORT_SIZE(1), \ HID_REPORT_SIZE(1), \
HID_REPORT_COUNT(120), \ HID_REPORT_COUNT(120), \
HID_LOGICAL_MIN(0), \ HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \ HID_LOGICAL_MAX(1), \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \ HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(0), \ HID_USAGE_MIN(0), \
HID_USAGE_MAX(119), \ HID_USAGE_MAX(119), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \ HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END HID_COLLECTION_END
// HID_REPORT_ID(REPORT_ID_NKRO) // HID_REPORT_ID(REPORT_ID_NKRO)
#endif /* USB_DESCRIPTORS_H_ */ void usb_descriptors_disable_io4();
#endif /* USB_DESCRIPTORS_H_ */