1
0
mirror of https://github.com/gdsports/USBHost_t36 synced 2024-11-28 20:02:14 -05:00

Disallow claim of USBDriver with non-NULL device, even if on available_drivers list

This commit is contained in:
PaulStoffregen 2017-09-10 01:53:50 -07:00
parent c2adf01769
commit 1259027ebc
2 changed files with 7 additions and 1 deletions

View File

@ -372,7 +372,10 @@ protected:
// The device this object instance is bound to. In words, this // The device this object instance is bound to. In words, this
// is the specific device this driver is using. When not bound // is the specific device this driver is using. When not bound
// to any device, this must be NULL. // to any device, this must be NULL. Drivers may set this to
// any non-NULL value if they are in a state where they do not
// wish to claim any device or interface (eg, if getting data
// from the HID parser).
Device_t *device; Device_t *device;
friend class USBHost; friend class USBHost;

View File

@ -292,6 +292,7 @@ void USBHost::claim_drivers(Device_t *dev)
// first check if any driver wishes to claim the entire device // first check if any driver wishes to claim the entire device
for (driver=available_drivers; driver != NULL; driver = driver->next) { for (driver=available_drivers; driver != NULL; driver = driver->next) {
if (driver->device != NULL) continue;
if (driver->claim(dev, 0, enumbuf + 9, enumlen - 9)) { if (driver->claim(dev, 0, enumbuf + 9, enumlen - 9)) {
if (prev) { if (prev) {
prev->next = driver->next; prev->next = driver->next;
@ -329,6 +330,7 @@ void USBHost::claim_drivers(Device_t *dev)
// found an interface, ask available drivers if they want it // found an interface, ask available drivers if they want it
prev = NULL; prev = NULL;
for (driver=available_drivers; driver != NULL; driver = driver->next) { for (driver=available_drivers; driver != NULL; driver = driver->next) {
if (driver->device != NULL) continue;
// TODO: should parse ahead and give claim() // TODO: should parse ahead and give claim()
// an accurate length. (end - p) is the rest // an accurate length. (end - p) is the rest
// of ALL descriptors, likely more interfaces // of ALL descriptors, likely more interfaces
@ -402,6 +404,7 @@ void USBHost::disconnect_Device(Device_t *dev)
for (USBDriver *p = dev->drivers; p; ) { for (USBDriver *p = dev->drivers; p; ) {
println("disconnect driver ", (uint32_t)p, HEX); println("disconnect driver ", (uint32_t)p, HEX);
p->disconnect(); p->disconnect();
p->device = NULL;
USBDriver *next = p->next; USBDriver *next = p->next;
p->next = available_drivers; p->next = available_drivers;
available_drivers = p; available_drivers = p;