Skip to content

Commit 0385061

Browse files
committed
hid works with esp32 by moving arguments into constructor
1 parent 611608f commit 0385061

File tree

3 files changed

+92
-20
lines changed

3 files changed

+92
-20
lines changed

examples/HID/hid_composite/hid_composite.ino

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,29 @@ uint8_t const desc_hid_report[] =
5050
};
5151

5252
// USB HID object
53-
Adafruit_USBD_HID usb_hid;
53+
// Note: For ESP32 these values cannot be changed after this declaration
54+
// desc report, desc len, protocol, interval, use out endpoint
55+
Adafruit_USBD_HID usb_hid(desc_hid_report, sizeof(desc_hid_report), HID_ITF_PROTOCOL_NONE, 2, false);
5456

5557
// the setup function runs once when you press reset or power the board
5658
void setup()
5759
{
58-
usb_hid.setPollInterval(2);
59-
usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report));
60-
//usb_hid.setStringDescriptor("TinyUSB HID Composite");
60+
// Following function has no affect on ESP32
61+
// usb_hid.setPollInterval(2);
62+
// usb_hid.setReportDescriptor();
63+
// usb_hid.setStringDescriptor("TinyUSB HID Composite");
6164

6265
usb_hid.begin();
6366

6467
// Set up button, pullup opposite to active state
6568
pinMode(pin, activeState ? INPUT_PULLDOWN : INPUT_PULLUP);
6669

6770
Serial.begin(115200);
68-
Serial.println("Adafruit TinyUSB HID Composite example");
6971

7072
// wait until device mounted
7173
while( !TinyUSBDevice.mounted() ) delay(1);
74+
75+
Serial.println("Adafruit TinyUSB HID Composite example");
7276
}
7377

7478
void loop()

src/arduino/hid/Adafruit_USBD_HID.cpp

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,62 @@
3333

3434
uint8_t const _ascii2keycode[128][2] = {HID_ASCII_TO_KEYCODE};
3535

36+
// TODO multiple instances
3637
static Adafruit_USBD_HID *_hid_dev = NULL;
3738

39+
40+
#ifdef ARDUINO_ARCH_ESP32
41+
static uint16_t hid_load_descriptor(uint8_t * dst, uint8_t * itf)
42+
{
43+
// uint8_t str_index = tinyusb_add_string_descriptor("TinyUSB HID");
44+
uint8_t str_index = 0;
45+
46+
TU_VERIFY (_hid_dev);
47+
48+
uint8_t ep_in = tinyusb_get_free_in_endpoint();
49+
TU_VERIFY (ep_in != 0);
50+
51+
uint8_t ep_out = 0;
52+
if (_hid_dev->isOutEndpointEnabled())
53+
{
54+
ep_out = tinyusb_get_free_out_endpoint();
55+
TU_VERIFY (ep_out != 0);
56+
}
57+
58+
uint16_t const desc_len = _hid_dev->makeItfDesc(*itf, 0x80 | ep_in, ep_out, dst, TUD_HID_INOUT_DESC_LEN);
59+
60+
*itf+=1;
61+
return desc_len;
62+
}
63+
#endif
64+
3865
//------------- IMPLEMENTATION -------------//
39-
Adafruit_USBD_HID::Adafruit_USBD_HID(void) {
40-
_interval_ms = 10;
41-
_protocol = HID_ITF_PROTOCOL_NONE;
4266

43-
_out_endpoint = false;
67+
Adafruit_USBD_HID::Adafruit_USBD_HID(void) :
68+
Adafruit_USBD_HID(NULL, 0, HID_ITF_PROTOCOL_NONE, 4, false) {
69+
70+
}
71+
72+
Adafruit_USBD_HID::Adafruit_USBD_HID(uint8_t const *desc_report, uint16_t len, uint8_t protocol, uint8_t interval_ms, bool has_out_endpoint)
73+
{
74+
_interval_ms = interval_ms;
75+
_protocol = protocol;
76+
77+
_out_endpoint = has_out_endpoint;
4478
_mouse_button = 0;
4579

46-
_desc_report = NULL;
47-
_desc_report_len = 0;
80+
_desc_report = desc_report;
81+
_desc_report_len = len;
4882

4983
_get_report_cb = NULL;
5084
_set_report_cb = NULL;
85+
86+
#ifdef ARDUINO_ARCH_ESP32
87+
// ESP32 requires setup configuration descriptor wihtin constructor
88+
_hid_dev = this;
89+
uint16_t const desc_len = makeItfDesc(0, EPIN, EPOUT, NULL, 0);
90+
tinyusb_enable_interface(USB_INTERFACE_HID, desc_len, hid_load_descriptor);
91+
#endif
5192
}
5293

5394
void Adafruit_USBD_HID::setPollInterval(uint8_t interval_ms) {
@@ -58,6 +99,10 @@ void Adafruit_USBD_HID::setBootProtocol(uint8_t protocol) {
5899
_protocol = protocol;
59100
}
60101

102+
bool Adafruit_USBD_HID::isOutEndpointEnabled(void) {
103+
return _out_endpoint;
104+
}
105+
61106
void Adafruit_USBD_HID::enableOutEndpoint(bool enable) {
62107
_out_endpoint = enable;
63108
}
@@ -74,18 +119,17 @@ void Adafruit_USBD_HID::setReportCallback(get_report_callback_t get_report,
74119
_set_report_cb = set_report;
75120
}
76121

77-
uint16_t Adafruit_USBD_HID::getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
78-
uint16_t bufsize) {
122+
uint16_t Adafruit_USBD_HID::makeItfDesc(uint8_t itfnum, uint8_t ep_in, uint8_t ep_out, uint8_t *buf, uint16_t bufsize)
123+
{
79124
if (!_desc_report_len) {
80125
return 0;
81126
}
82127

83-
// usb core will automatically update endpoint number
84128
uint8_t const desc_inout[] = {
85-
TUD_HID_INOUT_DESCRIPTOR(itfnum, 0, _protocol, _desc_report_len, EPIN,
86-
EPOUT, CFG_TUD_HID_EP_BUFSIZE, _interval_ms)};
129+
TUD_HID_INOUT_DESCRIPTOR(itfnum, 0, _protocol, _desc_report_len, ep_in,
130+
ep_out, CFG_TUD_HID_EP_BUFSIZE, _interval_ms)};
87131
uint8_t const desc_in_only[] = {
88-
TUD_HID_DESCRIPTOR(itfnum, 0, _protocol, _desc_report_len, EPIN,
132+
TUD_HID_DESCRIPTOR(itfnum, 0, _protocol, _desc_report_len, ep_in,
89133
CFG_TUD_HID_EP_BUFSIZE, _interval_ms)};
90134

91135
uint8_t const *desc;
@@ -99,18 +143,31 @@ uint16_t Adafruit_USBD_HID::getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
99143
len = sizeof(desc_in_only);
100144
}
101145

102-
if (bufsize < len) {
103-
return 0;
146+
// null buffer is used to get the length of descriptor only
147+
if (buf) {
148+
if (bufsize < len) {
149+
return 0;
150+
}
151+
152+
memcpy(buf, desc, len);
104153
}
105154

106-
memcpy(buf, desc, len);
107155
return len;
108156
}
109157

158+
uint16_t Adafruit_USBD_HID::getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
159+
uint16_t bufsize) {
160+
// usb core will automatically update endpoint number
161+
return makeItfDesc(itfnum, EPIN, EPOUT, buf, bufsize);
162+
}
163+
110164
bool Adafruit_USBD_HID::begin(void) {
165+
166+
#ifndef ARDUINO_ARCH_ESP32
111167
if (!TinyUSBDevice.addInterface(*this)) {
112168
return false;
113169
}
170+
#endif
114171

115172
_hid_dev = this;
116173
return true;

src/arduino/hid/Adafruit_USBD_HID.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,18 @@ class Adafruit_USBD_HID : public Adafruit_USBD_Interface {
3838
uint16_t bufsize);
3939

4040
Adafruit_USBD_HID(void);
41+
Adafruit_USBD_HID(uint8_t const *desc_report, uint16_t len,
42+
uint8_t protocol = HID_ITF_PROTOCOL_NONE,
43+
uint8_t interval_ms = 4,
44+
bool has_out_endpoint = false
45+
);
4146

4247
void setPollInterval(uint8_t interval_ms);
4348
void setBootProtocol(uint8_t protocol); // 0: None, 1: Keyboard, 2:Mouse
49+
4450
void enableOutEndpoint(bool enable);
51+
bool isOutEndpointEnabled(void);
52+
4553
void setReportDescriptor(uint8_t const *desc_report, uint16_t len);
4654
void setReportCallback(get_report_callback_t get_report,
4755
set_report_callback_t set_report);
@@ -73,6 +81,9 @@ class Adafruit_USBD_HID : public Adafruit_USBD_Interface {
7381
virtual uint16_t getInterfaceDescriptor(uint8_t itfnum, uint8_t *buf,
7482
uint16_t bufsize);
7583

84+
// internal use only
85+
uint16_t makeItfDesc(uint8_t itfnum, uint8_t ep_in, uint8_t ep_out, uint8_t *buf, uint16_t bufsize);
86+
7687
private:
7788
uint8_t _interval_ms;
7889
uint8_t _protocol;

0 commit comments

Comments
 (0)