1
0
mirror of https://github.com/whowechina/chu_pico.git synced 2025-02-17 18:49:18 +01:00

NKRO interface added

This commit is contained in:
whowechina 2023-09-10 21:28:45 +08:00
parent 9f369d0a2a
commit 2f9b7afee1
4 changed files with 96 additions and 59 deletions

View File

@ -202,27 +202,29 @@ 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)
{
if (report_type == HID_REPORT_TYPE_OUTPUT) {
if (report_id == REPORT_ID_LED_SLIDER_16) {
rgb_set_brg(0, buffer, bufsize / 3);
} else if (report_id == REPORT_ID_LED_SLIDER_15) {
rgb_set_brg(16, buffer, bufsize / 3);
} else if (report_id == REPORT_ID_LED_TOWER_6) {
rgb_set_brg(31, buffer, bufsize / 3);
}
last_hid_time = time_us_64();
return;
}
if (report_type == HID_REPORT_TYPE_FEATURE) {
if (report_id == REPORT_ID_LED_COMPRESSED) {
uint8_t buf[(48 + 45 + 6) * 3];
unsigned int olen = sizeof(buf);
if (lzfx_decompress(buffer + 1, buffer[0], buf, &olen) == 0) {
rgb_set_brg(0, buf, olen / 3);
if (itf == 1) {
if (report_type == HID_REPORT_TYPE_OUTPUT) {
if (report_id == REPORT_ID_LED_SLIDER_16) {
rgb_set_brg(0, buffer, bufsize / 3);
} else if (report_id == REPORT_ID_LED_SLIDER_15) {
rgb_set_brg(16, buffer, bufsize / 3);
} else if (report_id == REPORT_ID_LED_TOWER_6) {
rgb_set_brg(31, buffer, bufsize / 3);
}
last_hid_time = time_us_64();
return;
}
if (report_type == HID_REPORT_TYPE_FEATURE) {
if (report_id == REPORT_ID_LED_COMPRESSED) {
uint8_t buf[(48 + 45 + 6) * 3];
unsigned int olen = sizeof(buf);
if (lzfx_decompress(buffer + 1, buffer[0], buf, &olen) == 0) {
rgb_set_brg(0, buf, olen / 3);
}
}
last_hid_time = time_us_64();
return;
}
last_hid_time = time_us_64();
return;
}
}

View File

@ -96,7 +96,7 @@ extern "C" {
#endif
//------------- CLASS -------------//
#define CFG_TUD_HID 2
#define CFG_TUD_HID 3
#define CFG_TUD_CDC 1
#define CFG_TUD_MSC 0
#define CFG_TUD_MIDI 0

View File

@ -75,17 +75,20 @@ uint8_t const* tud_descriptor_device_cb(void) {
//--------------------------------------------------------------------+
uint8_t const desc_hid_report_joy[] = {
GAMECON_REPORT_DESC_JOYSTICK,
CHUPICO_REPORT_DESC_JOYSTICK,
};
uint8_t const desc_hid_report_led[] = {
GAMECON_LED_HEADER,
GAMECON_REPORT_DESC_LED_SLIDER_16,
GAMECON_REPORT_DESC_LED_SLIDER_15,
GAMECON_REPORT_DESC_LED_TOWER_6,
GAMECON_REPORT_DESC_LED_COMPRESSED,
GAMECON_LED_FOOTER
CHUPICO_LED_HEADER,
CHUPICO_REPORT_DESC_LED_SLIDER_16,
CHUPICO_REPORT_DESC_LED_SLIDER_15,
CHUPICO_REPORT_DESC_LED_TOWER_6,
CHUPICO_REPORT_DESC_LED_COMPRESSED,
CHUPICO_LED_FOOTER
};
uint8_t const desc_hid_report_nkro[] = {
CHUPICO_REPORT_DESC_NKRO,
};
// Invoked when received GET HID REPORT DESCRIPTOR
@ -93,24 +96,28 @@ uint8_t const desc_hid_report_led[] = {
// Descriptor contents must exist long enough for transfer to complete
uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf)
{
if (itf == 0) {
return desc_hid_report_joy;
switch (itf) {
case 0:
return desc_hid_report_joy;
case 1:
return desc_hid_report_led;
case 2:
return desc_hid_report_nkro;
default:
return NULL;
}
else if (itf == 1) {
return desc_hid_report_led;
}
return NULL;
}
//--------------------------------------------------------------------+
// Configuration Descriptor
//--------------------------------------------------------------------+
enum { ITF_NUM_HID, ITF_NUM_LED, ITF_NUM_CDC, ITF_NUM_CDC_DATA, ITF_NUM_TOTAL };
enum { ITF_NUM_JOY, ITF_NUM_LED, ITF_NUM_NKRO, ITF_NUM_CDC, ITF_NUM_CDC_DATA, ITF_NUM_TOTAL };
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN * 2 + TUD_CDC_DESC_LEN)
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN * 3 + TUD_CDC_DESC_LEN)
#define EPNUM_HID 0x84
#define EPNUM_JOY 0x84
#define EPNUM_LED 0x85
#define EPNUM_KEY 0x86
#define EPNUM_CDC_NOTIF 0x81
#define EPNUM_CDC_OUT 0x02
#define EPNUM_CDC_IN 0x82
@ -119,22 +126,24 @@ uint8_t const desc_configuration_joy[] = {
// Config number, interface count, string index, total length, attribute,
// power in mA
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN,
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 200),
// Interface number, string index, protocol, report descriptor len, EP In
// address, size & polling interval
TUD_HID_DESCRIPTOR(ITF_NUM_HID, 4, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_joy), EPNUM_HID,
TUD_HID_DESCRIPTOR(ITF_NUM_JOY, 4, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_joy), EPNUM_JOY,
CFG_TUD_HID_EP_BUFSIZE, 1),
TUD_HID_DESCRIPTOR(ITF_NUM_LED, 5, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_led), EPNUM_LED,
CFG_TUD_HID_EP_BUFSIZE, 4),
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 6, EPNUM_CDC_NOTIF,
8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64)
TUD_HID_DESCRIPTOR(ITF_NUM_NKRO, 6, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_nkro), EPNUM_KEY,
CFG_TUD_HID_EP_BUFSIZE, 1),
TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 7, EPNUM_CDC_NOTIF,
8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64)
};
// Invoked when received GET CONFIGURATION DESCRIPTOR
@ -156,6 +165,7 @@ const char *string_desc_arr[] = {
"123456", // 3: Serials, should use chip ID
"Chu Pico Joystick",
"Chu Pico LED",
"Chu Pico NKRO",
"Chu Pico Serial Port",
};

View File

@ -6,6 +6,7 @@
enum {
REPORT_ID_JOYSTICK = 1,
REPORT_ID_NKRO = 2,
REPORT_ID_LED_SLIDER_16 = 4,
REPORT_ID_LED_SLIDER_15 = 5,
REPORT_ID_LED_TOWER_6 = 6,
@ -22,7 +23,7 @@ enum {
// Joystick Report Descriptor Template - Based off Drewol/rp2040-gamecon
// Button Map | X | Y
#define GAMECON_REPORT_DESC_JOYSTICK \
#define CHUPICO_REPORT_DESC_JOYSTICK \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_JOYSTICK), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
@ -54,52 +55,47 @@ enum {
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END
#define GAMECON_LED_HEADER \
#define CHUPICO_LED_HEADER \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), HID_USAGE(0x00), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
HID_REPORT_COUNT(1), HID_REPORT_SIZE(8), \
HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE)
#define GAMECON_LED_FOOTER \
#define CHUPICO_LED_FOOTER \
HID_COLLECTION_END
// Slider First 16 LEDs (48 rgb zones, BRG order)
#define GAMECON_REPORT_DESC_LED_SLIDER_16 \
#define CHUPICO_REPORT_DESC_LED_SLIDER_16 \
HID_REPORT_ID(REPORT_ID_LED_SLIDER_16) \
HID_REPORT_COUNT(48), HID_REPORT_SIZE(8), \
HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \
HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \
HID_USAGE_MIN(1), HID_USAGE_MAX(48), \
HID_STRING_MINIMUM(7), HID_STRING_MAXIMUM(54), \
HID_STRING_MINIMUM(8), HID_STRING_MAXIMUM(55), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE)
// Slider Remaining 15 LEDs (45 rgb zones, BRG order)
#define GAMECON_REPORT_DESC_LED_SLIDER_15 \
#define CHUPICO_REPORT_DESC_LED_SLIDER_15 \
HID_REPORT_ID(REPORT_ID_LED_SLIDER_15) \
HID_REPORT_COUNT(45), HID_REPORT_SIZE(8), \
HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \
HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \
HID_USAGE_MIN(49), HID_USAGE_MAX(93), \
HID_STRING_MINIMUM(7), HID_STRING_MAXIMUM(51), /* Delta to previous */ \
HID_STRING_MINIMUM(8), HID_STRING_MAXIMUM(52), /* Delta to previous */ \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE)
// Tower LEDs (18 rgb zones, BRG order)
#define GAMECON_REPORT_DESC_LED_TOWER_6 \
#define CHUPICO_REPORT_DESC_LED_TOWER_6 \
HID_REPORT_ID(REPORT_ID_LED_TOWER_6) \
HID_REPORT_COUNT(18), HID_REPORT_SIZE(8), \
HID_LOGICAL_MIN(0x00), HID_LOGICAL_MAX_N(0x00ff, 2), \
HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \
HID_USAGE_MIN(94), HID_USAGE_MAX(111), \
HID_STRING_MINIMUM(7), HID_STRING_MAXIMUM(24), /* Delta to previous */ \
HID_STRING_MINIMUM(8), HID_STRING_MAXIMUM(25), /* Delta to previous */ \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE)
/*
HID_STRING_MINIMUM(56), HID_STRING_MAXIMUM(100), \
HID_STRING_MINIMUM(101), HID_STRING_MAXIMUM(117), \
*/
// LEDs Compressed
#define GAMECON_REPORT_DESC_LED_COMPRESSED \
#define CHUPICO_REPORT_DESC_LED_COMPRESSED \
HID_REPORT_ID(REPORT_ID_LED_COMPRESSED) \
HID_USAGE_PAGE(HID_USAGE_PAGE_ORDINAL), \
HID_USAGE(0x00), \
@ -107,4 +103,33 @@ enum {
HID_REPORT_SIZE(8), HID_REPORT_COUNT(63), \
HID_FEATURE(HID_DATA | HID_VARIABLE | HID_ABSOLUTE)
#define CHUPICO_REPORT_DESC_NKRO \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_KEYBOARD), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
/* Padding for Boot Protocol */ \
HID_REPORT_COUNT(8), \
HID_REPORT_SIZE(8), \
HID_INPUT(HID_CONSTANT), \
/* Full Keyboard Bitmap */ \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(0), \
HID_USAGE_MAX_N(255, 2), \
HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \
HID_REPORT_SIZE(1), \
HID_REPORT_COUNT_N(256, 2), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
/* Output that we don't care */ \
HID_USAGE_PAGE(HID_USAGE_PAGE_LED), \
HID_USAGE_MIN(1), \
HID_USAGE_MAX(5), \
HID_REPORT_COUNT(5), \
HID_REPORT_SIZE(1), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_REPORT_COUNT(1), \
HID_REPORT_SIZE(3), \
HID_OUTPUT(HID_CONSTANT), \
HID_COLLECTION_END
#endif /* USB_DESCRIPTORS_H_ */