Description
Calling usb.Task()
results in a 5 second blocking delay. This makes it hard to use USB host with
other devices that need regular polling. For example, if data is
streaming in to Serial1 at 115200 bits/s, the incoming data will not
be processed for up to 5 seconds.
This can be seen by adding timing output to the KeyboardController and MouseController examples. For example, the following prints "delta millis 5000
" when there is no keyboard or
mouse input:
void loop() {
uint32_t delta, startMillis = millis();
// Process USB tasks
usb.Task();
delta = millis() - startMillis;
if (delta > 10) {
Serial.print("delta millis ");
Serial.println(delta);
}
}
The problem is the input endpoint property defaults to wait until timeout which is 5 seconds. The proposed solution is to set the EpInfo.bmNakPower
to USB_NAK_NOWAIT
. This means if a single NAK is received, input operations return with an error instead of waiting for 5 seconds.
With this change usb.Task()
returns in <= 10 ms when there is no input from the device.
hidboot.h
@@ -464,6 +464,7 @@ void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint32_t conf, uint32_t iface, uint3
epInfo[index].deviceEpNum = (pep->bEndpointAddress & 0x0F);
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
epInfo[index].epAttribs = 0;
+ epInfo[index].bmNakPower = USB_NAK_NOWAIT;
TRACE_USBHOST(printf("HIDBoot::EndpointXtract : Found new endpoint\r\n");)
TRACE_USBHOST(printf("HIDBoot::EndpointXtract : deviceEpNum: %lu\r\n", epInfo[index].deviceEpNum);)
Additional context
A pull request has been submitted with this change: #6