1
0
mirror of https://github.com/whowechina/aic_pico.git synced 2025-02-17 19:09:24 +01:00

Support HID lights

This commit is contained in:
whowechina 2024-04-29 20:15:28 +08:00
parent d34bb01271
commit c6b0ebc392
7 changed files with 86 additions and 38 deletions

Binary file not shown.

View File

@ -201,6 +201,13 @@ void light_set_color_all(uint32_t color)
}
}
static uint64_t last_hid = 0;
void light_hid_light(uint8_t r, uint8_t g, uint8_t b)
{
light_set_color_all(rgb32(r, g, b, false));
last_hid = time_us_64();
}
void light_set_brg(unsigned index, const uint8_t *brg_array, size_t num)
{
if (index >= RGB_NUM) {
@ -246,7 +253,7 @@ void light_set_rainbow(bool enable)
void light_update()
{
if (rainbow) {
if (rainbow && (time_us_64() > last_hid + 1000000)) {
generate_color_wheel();
rainbow_update();
rainbow_fade();

View File

@ -20,6 +20,7 @@ uint32_t rgb32_from_hsv(uint8_t h, uint8_t s, uint8_t v);
void light_set_color(unsigned index, uint32_t color);
void light_set_color_all(uint32_t color);
void light_hid_light(uint8_t r, uint8_t g, uint8_t b);
void light_set_rainbow(bool enable);
void light_stimulate();

View File

@ -350,4 +350,10 @@ 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_id == REPORT_ID_LIGHTS) &&
(report_type == HID_REPORT_TYPE_OUTPUT)) {
if (bufsize >= 3) {
light_hid_light(buffer[0], buffer[1], buffer[2]);
}
}
}

View File

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

View File

@ -79,6 +79,10 @@ uint8_t const desc_hid_report_nkro[] = {
AIC_PICO_REPORT_DESC_NKRO,
};
uint8_t const desc_hid_report_light[] = {
AIC_PICO_REPORT_DESC_LIGHT,
};
// Invoked when received GET HID REPORT DESCRIPTOR
// Application return pointer to descriptor
// Descriptor contents must exist long enough for transfer to complete
@ -89,6 +93,8 @@ uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf)
return desc_hid_report_cardio;
case 1:
return desc_hid_report_nkro;
case 2:
return desc_hid_report_light;
default:
return NULL;
}
@ -97,15 +103,16 @@ uint8_t const* tud_hid_descriptor_report_cb(uint8_t itf)
// Configuration Descriptor
//--------------------------------------------------------------------+
enum { ITF_NUM_CARDIO, ITF_NUM_NKRO,
enum { ITF_NUM_CARDIO, ITF_NUM_NKRO, ITF_NUM_LIGHT,
ITF_NUM_CLI, ITF_NUM_CLI_DATA,
ITF_NUM_AIME, ITF_NUM_AIME_DATA,
ITF_NUM_TOTAL };
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN * 2 + TUD_CDC_DESC_LEN * 2)
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN * 3 + TUD_CDC_DESC_LEN * 2)
#define EPNUM_CARDIO 0x81
#define EPNUM_KEY 0x82
#define EPNUM_LIGHT 0x83
#define EPNUM_CLI_NOTIF 0x85
#define EPNUM_CLI_OUT 0x06
@ -131,10 +138,14 @@ uint8_t const desc_configuration_dev[] = {
sizeof(desc_hid_report_nkro), EPNUM_KEY,
CFG_TUD_HID_EP_BUFSIZE, 1),
TUD_CDC_DESCRIPTOR(ITF_NUM_CLI, 6, EPNUM_CLI_NOTIF,
TUD_HID_DESCRIPTOR(ITF_NUM_LIGHT, 6, HID_ITF_PROTOCOL_NONE,
sizeof(desc_hid_report_light), EPNUM_LIGHT,
CFG_TUD_HID_EP_BUFSIZE, 4),
TUD_CDC_DESCRIPTOR(ITF_NUM_CLI, 7, EPNUM_CLI_NOTIF,
8, EPNUM_CLI_OUT, EPNUM_CLI_IN, 64),
TUD_CDC_DESCRIPTOR(ITF_NUM_AIME, 7, EPNUM_AIME_NOTIF,
TUD_CDC_DESCRIPTOR(ITF_NUM_AIME, 8, EPNUM_AIME_NOTIF,
8, EPNUM_AIME_OUT, EPNUM_AIME_IN, 64),
};
@ -159,8 +170,12 @@ const char *string_desc_arr[] = {
serial_number_str, // 3: Serials, should use chip ID
"AIC Pico CardIO",
"AIC Pico Keypad",
"AIC Pico LED",
"AIC Pico CLI Port",
"AIC Pico AIME Port",
"AIC Pico Red Light",
"AIC Pico Green Light",
"AIC Pico Blue Light",
};
// Invoked when received GET STRING DESCRIPTOR request

View File

@ -7,6 +7,7 @@
enum {
REPORT_ID_EAMU = 1,
REPORT_ID_FELICA = 2,
REPORT_ID_LIGHTS = 3,
};
#define AIC_PICO_REPORT_DESC_CARDIO \
@ -28,38 +29,56 @@ enum {
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END
#define AIC_PICO_REPORT_DESC_NKRO \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_KEYBOARD), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
/* Modifier */ \
HID_REPORT_SIZE(1), \
HID_REPORT_COUNT(8), \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(224), \
HID_USAGE_MAX(231), \
HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
/* LED output that we don't care */ \
HID_REPORT_COUNT(5), \
HID_REPORT_SIZE(1), \
HID_USAGE_PAGE(HID_USAGE_PAGE_LED), \
HID_USAGE_MIN(1), \
HID_USAGE_MAX(5), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_REPORT_COUNT(1), \
HID_REPORT_SIZE(3), \
HID_OUTPUT(HID_CONSTANT), \
/* Full Keyboard Bitmap */ \
HID_REPORT_SIZE(1), \
HID_REPORT_COUNT(120), \
HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(0), \
HID_USAGE_MAX(119), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
#define AIC_PICO_REPORT_DESC_NKRO \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(HID_USAGE_DESKTOP_KEYBOARD), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
/* Modifier */ \
HID_REPORT_SIZE(1), \
HID_REPORT_COUNT(8), \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(224), \
HID_USAGE_MAX(231), \
HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
/* LED output that we don't care */ \
HID_REPORT_COUNT(5), \
HID_REPORT_SIZE(1), \
HID_USAGE_PAGE(HID_USAGE_PAGE_LED), \
HID_USAGE_MIN(1), \
HID_USAGE_MAX(5), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE),\
HID_REPORT_COUNT(1), \
HID_REPORT_SIZE(3), \
HID_OUTPUT(HID_CONSTANT), \
/* Full Keyboard Bitmap */ \
HID_REPORT_SIZE(1), \
HID_REPORT_COUNT(120), \
HID_LOGICAL_MIN(0), \
HID_LOGICAL_MAX(1), \
HID_USAGE_PAGE(HID_USAGE_PAGE_KEYBOARD), \
HID_USAGE_MIN(0), \
HID_USAGE_MAX(119), \
HID_INPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END
#define HID_STRING_MINIMUM(x) HID_REPORT_ITEM(x, 8, RI_TYPE_LOCAL, 1)
#define HID_STRING_MAXIMUM(x) HID_REPORT_ITEM(x, 9, RI_TYPE_LOCAL, 1)
#define AIC_PICO_REPORT_DESC_LIGHT \
HID_USAGE_PAGE(HID_USAGE_PAGE_DESKTOP), \
HID_USAGE(0x00), \
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
HID_REPORT_ID(REPORT_ID_LIGHTS) \
HID_REPORT_COUNT(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(9), HID_STRING_MAXIMUM(12), \
HID_USAGE_MIN(8), HID_USAGE_MAX(11), \
HID_OUTPUT(HID_DATA | HID_VARIABLE | HID_ABSOLUTE), \
HID_REPORT_COUNT(15), HID_REPORT_SIZE(8), \
HID_INPUT(HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE), \
HID_COLLECTION_END
#endif