Browse Source

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

main
PaulStoffregen 7 years ago
parent
commit
1259027ebc
2 changed files with 7 additions and 1 deletions
  1. +4
    -1
      USBHost_t36.h
  2. +3
    -0
      enumeration.cpp

+ 4
- 1
USBHost_t36.h View File



// 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;

+ 3
- 0
enumeration.cpp View File



// 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;
// 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
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;

Loading…
Cancel
Save