Skip to content

Commit 9256e6b

Browse files
authored
Merge pull request #3302 from xiongyihui/main
support to get HID OUT report
2 parents 9e722c8 + f0bb963 commit 9256e6b

File tree

5 files changed

+57
-22
lines changed

5 files changed

+57
-22
lines changed

shared-bindings/usb_hid/Device.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@ STATIC mp_obj_t usb_hid_device_send_report(mp_obj_t self_in, mp_obj_t buffer) {
5858
}
5959
MP_DEFINE_CONST_FUN_OBJ_2(usb_hid_device_send_report_obj, usb_hid_device_send_report);
6060

61+
//| last_received_report: bytes
62+
//| """The HID OUT report as a `bytes`. (read-only). `None` if nothing received."""
63+
//|
64+
STATIC mp_obj_t usb_hid_device_obj_get_last_received_report(mp_obj_t self_in) {
65+
usb_hid_device_obj_t *self = MP_OBJ_TO_PTR(self_in);
66+
if (self->out_report_buffer == 0) {
67+
return mp_const_none;
68+
}
69+
return mp_obj_new_bytes(self->out_report_buffer, self->out_report_length);
70+
}
71+
MP_DEFINE_CONST_FUN_OBJ_1(usb_hid_device_get_last_received_report_obj, usb_hid_device_obj_get_last_received_report);
72+
73+
const mp_obj_property_t usb_hid_device_last_received_report_obj = {
74+
.base.type = &mp_type_property,
75+
.proxy = {(mp_obj_t)&usb_hid_device_get_last_received_report_obj,
76+
(mp_obj_t)&mp_const_none_obj,
77+
(mp_obj_t)&mp_const_none_obj},
78+
};
79+
6180
//| usage_page: int
6281
//| """The usage page of the device as an `int`. Can be thought of a category. (read-only)"""
6382
//|
@@ -95,9 +114,10 @@ const mp_obj_property_t usb_hid_device_usage_obj = {
95114
};
96115

97116
STATIC const mp_rom_map_elem_t usb_hid_device_locals_dict_table[] = {
98-
{ MP_ROM_QSTR(MP_QSTR_send_report), MP_ROM_PTR(&usb_hid_device_send_report_obj) },
99-
{ MP_ROM_QSTR(MP_QSTR_usage_page), MP_ROM_PTR(&usb_hid_device_usage_page_obj)},
100-
{ MP_ROM_QSTR(MP_QSTR_usage), MP_ROM_PTR(&usb_hid_device_usage_obj)},
117+
{ MP_ROM_QSTR(MP_QSTR_send_report), MP_ROM_PTR(&usb_hid_device_send_report_obj) },
118+
{ MP_ROM_QSTR(MP_QSTR_last_received_report), MP_ROM_PTR(&usb_hid_device_last_received_report_obj) },
119+
{ MP_ROM_QSTR(MP_QSTR_usage_page), MP_ROM_PTR(&usb_hid_device_usage_page_obj)},
120+
{ MP_ROM_QSTR(MP_QSTR_usage), MP_ROM_PTR(&usb_hid_device_usage_obj)},
101121
};
102122

103123
STATIC MP_DEFINE_CONST_DICT(usb_hid_device_locals_dict, usb_hid_device_locals_dict_table);

shared-module/usb_hid/Device.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,17 @@ uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type,
8484

8585
// Callbacks invoked when receive Set_Report request through control endpoint
8686
void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) {
87+
if (report_type == HID_REPORT_TYPE_INVALID) {
88+
report_id = buffer[0];
89+
buffer++;
90+
bufsize--;
91+
} else if (report_type != HID_REPORT_TYPE_OUTPUT) {
92+
return;
93+
}
94+
8795
usb_hid_device_obj_t* hid_device = get_hid_device(report_id);
8896

89-
if ( report_type == HID_REPORT_TYPE_OUTPUT ) {
90-
// Check if it is Keyboard device
91-
if (hid_device->usage_page == HID_USAGE_PAGE_DESKTOP &&
92-
hid_device->usage == HID_USAGE_DESKTOP_KEYBOARD) {
93-
// This is LED indicator (CapsLock, NumLock)
94-
// TODO Light up some LED here
95-
}
97+
if (hid_device && hid_device->out_report_length >= bufsize) {
98+
memcpy(hid_device->out_report_buffer, buffer, bufsize);
9699
}
97100
}

shared-module/usb_hid/Device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ typedef struct {
4343
uint8_t report_length;
4444
uint8_t usage_page;
4545
uint8_t usage;
46+
uint8_t* out_report_buffer;
47+
uint8_t out_report_length;
4648
} usb_hid_device_obj_t;
4749

4850

tools/gen_usb_descriptor.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ def strings_in_order(cls):
546546
};
547547
""")
548548

549-
c_file.write("\n");
549+
c_file.write("\n")
550550

551551
hid_descriptor_length = len(bytes(combined_hid_report_descriptor))
552552

@@ -604,12 +604,18 @@ def strings_in_order(cls):
604604
static uint8_t {name}_report_buffer[{report_length}];
605605
""".format(name=name.lower(), report_length=hid_report_descriptors.HID_DEVICE_DATA[name].report_length))
606606

607+
if hid_report_descriptors.HID_DEVICE_DATA[name].out_report_length > 0:
608+
c_file.write("""\
609+
static uint8_t {name}_out_report_buffer[{report_length}];
610+
""".format(name=name.lower(), report_length=hid_report_descriptors.HID_DEVICE_DATA[name].out_report_length))
611+
607612
# Write out table of device objects.
608613
c_file.write("""
609614
usb_hid_device_obj_t usb_hid_devices[] = {
610-
""");
615+
""")
611616
for name in args.hid_devices:
612617
device_data = hid_report_descriptors.HID_DEVICE_DATA[name]
618+
out_report_buffer = '{}_out_report_buffer'.format(name.lower()) if device_data.out_report_length > 0 else 'NULL'
613619
c_file.write("""\
614620
{{
615621
.base = {{ .type = &usb_hid_device_type }},
@@ -618,11 +624,15 @@ def strings_in_order(cls):
618624
.report_length = {report_length},
619625
.usage_page = {usage_page:#04x},
620626
.usage = {usage:#04x},
627+
.out_report_buffer = {out_report_buffer},
628+
.out_report_length = {out_report_length},
621629
}},
622630
""".format(name=name.lower(), report_id=report_ids[name],
623631
report_length=device_data.report_length,
624632
usage_page=device_data.usage_page,
625-
usage=device_data.usage))
633+
usage=device_data.usage,
634+
out_report_buffer=out_report_buffer,
635+
out_report_length=device_data.out_report_length))
626636
c_file.write("""\
627637
};
628638
""")

tools/hid_report_descriptors.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@
1818

1919
# Information about each kind of device
2020
# report_length does not include report ID in first byte, if present when sent.
21-
DeviceData = namedtuple('DeviceData', ('report_length', 'usage_page', 'usage'))
21+
DeviceData = namedtuple('DeviceData', ('report_length', 'out_report_length', 'usage_page', 'usage'))
2222
HID_DEVICE_DATA = {
23-
"KEYBOARD" : DeviceData(report_length=8, usage_page=0x01, usage=0x06), # Generic Desktop, Keyboard
24-
"MOUSE" : DeviceData(report_length=4, usage_page=0x01, usage=0x02), # Generic Desktop, Mouse
25-
"CONSUMER" : DeviceData(report_length=2, usage_page=0x0C, usage=0x01), # Consumer, Consumer Control
26-
"SYS_CONTROL" : DeviceData(report_length=1, usage_page=0x01, usage=0x80), # Generic Desktop, Sys Control
27-
"GAMEPAD" : DeviceData(report_length=6, usage_page=0x01, usage=0x05), # Generic Desktop, Game Pad
28-
"DIGITIZER" : DeviceData(report_length=5, usage_page=0x0D, usage=0x02), # Digitizers, Pen
29-
"XAC_COMPATIBLE_GAMEPAD" : DeviceData(report_length=3, usage_page=0x01, usage=0x05), # Generic Desktop, Game Pad
30-
"RAW" : DeviceData(report_length=64, usage_page=0xFFAF, usage=0xAF), # Vendor 0xFFAF "Adafruit", 0xAF
23+
"KEYBOARD" : DeviceData(report_length=8, out_report_length=1, usage_page=0x01, usage=0x06), # Generic Desktop, Keyboard
24+
"MOUSE" : DeviceData(report_length=4, out_report_length=0, usage_page=0x01, usage=0x02), # Generic Desktop, Mouse
25+
"CONSUMER" : DeviceData(report_length=2, out_report_length=0, usage_page=0x0C, usage=0x01), # Consumer, Consumer Control
26+
"SYS_CONTROL" : DeviceData(report_length=1, out_report_length=0, usage_page=0x01, usage=0x80), # Generic Desktop, Sys Control
27+
"GAMEPAD" : DeviceData(report_length=6, out_report_length=0, usage_page=0x01, usage=0x05), # Generic Desktop, Game Pad
28+
"DIGITIZER" : DeviceData(report_length=5, out_report_length=0, usage_page=0x0D, usage=0x02), # Digitizers, Pen
29+
"XAC_COMPATIBLE_GAMEPAD" : DeviceData(report_length=3, out_report_length=0, usage_page=0x01, usage=0x05), # Generic Desktop, Game Pad
30+
"RAW" : DeviceData(report_length=64, out_report_length=0, usage_page=0xFFAF, usage=0xAF), # Vendor 0xFFAF "Adafruit", 0xAF
3131
}
3232

3333
def keyboard_hid_descriptor(report_id):

0 commit comments

Comments
 (0)