summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-08-27 21:19:43 +0800
committersakumisu <[email protected]>2025-09-01 20:03:45 +0800
commite2791c7d04b0a224f55f944d6d0ffef2d2380c3a (patch)
tree548782c8f299973d3387829dbcf5566cf1196a1b
parent7902c1c352b32f2facf67a9da919bc26c39ceec6 (diff)
refactor(core/usbh_core): refactor devaddr allocation, use auto increment
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--core/usbh_core.c34
-rw-r--r--core/usbh_core.h2
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 */
};