diff options
| author | sakumisu <[email protected]> | 2025-08-27 21:19:43 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2025-09-01 20:03:45 +0800 |
| commit | e2791c7d04b0a224f55f944d6d0ffef2d2380c3a (patch) | |
| tree | 548782c8f299973d3387829dbcf5566cf1196a1b | |
| parent | 7902c1c352b32f2facf67a9da919bc26c39ceec6 (diff) | |
refactor(core/usbh_core): refactor devaddr allocation, use auto increment
Signed-off-by: sakumisu <[email protected]>
| -rw-r--r-- | core/usbh_core.c | 34 | ||||
| -rw-r--r-- | core/usbh_core.h | 2 |
2 files changed, 15 insertions, 21 deletions
diff --git a/core/usbh_core.c b/core/usbh_core.c index dc292e13..43ff7961 100644 --- a/core/usbh_core.c +++ b/core/usbh_core.c @@ -33,29 +33,27 @@ struct usbh_bus g_usbhost_bus[CONFIG_USBHOST_MAX_BUS]; static int usbh_allocate_devaddr(struct usbh_devaddr_map *devgen) { - uint8_t startaddr = devgen->next; - uint8_t devaddr; + uint8_t lastaddr = devgen->last; + uint8_t devaddr = lastaddr; int index; int bitno; for (;;) { - devaddr = devgen->next; - if (devgen->next >= 0x7f) { - devgen->next = 2; - } else { - devgen->next++; + devaddr++; + if (devaddr > 0x7f) { + devaddr = 2; + } + if (devaddr == lastaddr) { + return -USB_ERR_NOMEM; } index = devaddr >> 5; bitno = devaddr & 0x1f; - if ((devgen->alloctab[index] & (1 << bitno)) == 0) { - devgen->alloctab[index] |= (1 << bitno); + if ((devgen->alloctab[index] & (1ul << bitno)) == 0) { + devgen->alloctab[index] |= (1ul << bitno); + devgen->last = devaddr; return (int)devaddr; } - - if (startaddr == devaddr) { - return -USB_ERR_NOMEM; - } } } @@ -69,15 +67,11 @@ static int __usbh_free_devaddr(struct usbh_devaddr_map *devgen, uint8_t devaddr) bitno = devaddr & USB_DEV_ADDR_MARK_MASK; /* Free the address */ - if ((devgen->alloctab[index] |= (1 << bitno)) != 0) { - devgen->alloctab[index] &= ~(1 << bitno); + if ((devgen->alloctab[index] & (1ul << bitno)) != 0) { + devgen->alloctab[index] &= ~(1ul << bitno); } else { return -1; } - - if (devaddr < devgen->next) { - devgen->next = devaddr; - } } return 0; @@ -652,7 +646,7 @@ static void usbh_bus_init(struct usbh_bus *bus, uint8_t busid, uintptr_t reg_bas bus->hcd.reg_base = reg_base; /* devaddr 1 is for roothub */ - bus->devgen.next = 2; + bus->devgen.last = 0x7f; usb_slist_add_tail(&g_bus_head, &bus->list); } diff --git a/core/usbh_core.h b/core/usbh_core.h index 060c402e..f56aaf4e 100644 --- a/core/usbh_core.h +++ b/core/usbh_core.h @@ -150,7 +150,7 @@ struct usbh_devaddr_map { * alloctab[3]:addr from 96~127 * */ - uint8_t next; /* Next device address */ + uint8_t last; /* Last device address */ uint32_t alloctab[4]; /* Bit allocation table */ }; |
