23#define mem_debug printf
29#pragma data_alignment=32
30static uint8_t _mem_pool[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE];
32static uint8_t _mem_pool[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE]
__attribute__((aligned(32)));
34static uint8_t _unit_used[MEM_POOL_UNIT_NUM];
36static volatile int _usbh_mem_used;
37static volatile int _usbh_max_mem_used;
38static volatile int _mem_pool_used;
42uint8_t _dev_addr_pool[128];
43static volatile int _device_addr;
51void usbh_memory_init(
void)
53 if (
sizeof(TD_T) > MEM_POOL_UNIT_SIZE)
55 USB_error(
"TD_T - MEM_POOL_UNIT_SIZE too small!\n");
59 if (
sizeof(ED_T) > MEM_POOL_UNIT_SIZE)
61 USB_error(
"ED_T - MEM_POOL_UNIT_SIZE too small!\n");
66 _usbh_max_mem_used = 0L;
68 memset(_unit_used, 0,
sizeof(_unit_used));
74 memset(_dev_addr_pool, 0,
sizeof(_dev_addr_pool));
78uint32_t usbh_memory_used(
void)
80 printf(
"USB static memory: %d/%d, heap used: %d\n", _mem_pool_used, MEM_POOL_UNIT_NUM, _usbh_mem_used);
81 return _usbh_mem_used;
84static void memory_counter(
int size)
86 _usbh_mem_used += size;
87 if (_usbh_mem_used > _usbh_max_mem_used)
88 _usbh_max_mem_used = _usbh_mem_used;
91void * usbh_alloc_mem(
int size)
98 USB_error(
"usbh_alloc_mem failed! %d\n", size);
103 memory_counter(size);
107void usbh_free_mem(
void *p,
int size)
110 memory_counter(0-size);
118UDEV_T * alloc_device(
void)
122 udev = malloc(
sizeof(*udev));
125 USB_error(
"alloc_device failed!\n");
128 memset(udev, 0,
sizeof(*udev));
129 memory_counter(
sizeof(*udev));
131 udev->next = g_udev_list;
136void free_device(UDEV_T *udev)
143 if (udev->cfd_buff !=
NULL)
144 usbh_free_mem(udev->cfd_buff, MAX_DESC_BUFF_SIZE);
149 if (g_udev_list == udev)
151 g_udev_list = g_udev_list->next;
160 d->next = udev->next;
168 memory_counter(-
sizeof(*udev));
171int alloc_dev_address(
void)
175 if (_device_addr >= 128)
180 if (_dev_addr_pool[_device_addr] == 0)
182 _dev_addr_pool[_device_addr] = 1;
186 if (_device_addr >= 128)
191void free_dev_address(
int dev_addr)
194 _dev_addr_pool[dev_addr] = 0;
201UTR_T * alloc_utr(UDEV_T *udev)
205 utr = malloc(
sizeof(*utr));
208 USB_error(
"alloc_utr failed!\n");
211 memory_counter(
sizeof(*utr));
212 memset(utr, 0,
sizeof(*utr));
214 mem_debug(
"[ALLOC] [UTR] - 0x%x\n", (
int)utr);
218void free_utr(UTR_T *utr)
223 mem_debug(
"[FREE] [UTR] - 0x%x\n", (
int)utr);
225 memory_counter(0-(
int)
sizeof(*utr));
232ED_T * alloc_ohci_ED(
void)
234 uint32_t irq_state = __get_PRIMASK();
240 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
242 if (_unit_used[i] == 0)
247 __set_PRIMASK(irq_state);
249 ed = (ED_T *)&_mem_pool[i];
250 memset(ed, 0,
sizeof(*ed));
251 mem_debug(
"[ALLOC] [ED] - 0x%x\n", (
int)ed);
255 __set_PRIMASK(irq_state);
256 USB_error(
"alloc_ohci_ED failed!\n");
260void free_ohci_ED(ED_T *ed)
262 uint32_t irq_state = __get_PRIMASK();
267 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
269 if ((uint32_t)&_mem_pool[i] == (uint32_t)ed)
273 __set_PRIMASK(irq_state);
274 mem_debug(
"[FREE] [ED] - 0x%x\n", (
int)ed);
278 __set_PRIMASK(irq_state);
279 USB_debug(
"free_ohci_ED - not found! (ignored in case of multiple UTR)\n");
285TD_T * alloc_ohci_TD(UTR_T *utr)
287 uint32_t irq_state = __get_PRIMASK();
293 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
295 if (_unit_used[i] == 0)
300 __set_PRIMASK(irq_state);
302 td = (TD_T *)&_mem_pool[i];
303 memset(td, 0,
sizeof(*td));
305 mem_debug(
"[ALLOC] [TD] - 0x%x\n", (
int)td);
309 __set_PRIMASK(irq_state);
310 USB_error(
"alloc_ohci_TD failed!\n");
314void free_ohci_TD(TD_T *td)
316 uint32_t irq_state = __get_PRIMASK();
321 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
323 if ((uint32_t)&_mem_pool[i] == (uint32_t)td)
327 __set_PRIMASK(irq_state);
328 mem_debug(
"[FREE] [TD] - 0x%x\n", (
int)td);
332 __set_PRIMASK(irq_state);
333 USB_error(
"free_ohci_TD - not found!\n");
339QH_T * alloc_ehci_QH(
void)
341 uint32_t irq_state = __get_PRIMASK();
347 for (i = (_sidx+1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i+1) % MEM_POOL_UNIT_NUM)
349 if (_unit_used[i] == 0)
355 __set_PRIMASK(irq_state);
357 qh = (QH_T *)&_mem_pool[i];
358 memset(qh, 0,
sizeof(*qh));
359 mem_debug(
"[ALLOC] [QH] - 0x%x\n", (
int)qh);
365 __set_PRIMASK(irq_state);
366 USB_error(
"alloc_ehci_QH failed!\n");
369 qh->Curr_qTD = QTD_LIST_END;
370 qh->OL_Next_qTD = QTD_LIST_END;
371 qh->OL_Alt_Next_qTD = QTD_LIST_END;
372 qh->OL_Token = QTD_STS_HALT;
376void free_ehci_QH(QH_T *qh)
378 uint32_t irq_state = __get_PRIMASK();
383 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
385 if ((uint32_t)&_mem_pool[i] == (uint32_t)qh)
389 __set_PRIMASK(irq_state);
390 mem_debug(
"[FREE] [QH] - 0x%x\n", (
int)qh);
394 __set_PRIMASK(irq_state);
395 USB_debug(
"free_ehci_QH - not found! (ignored in case of multiple UTR)\n");
401qTD_T * alloc_ehci_qTD(UTR_T *utr)
403 uint32_t irq_state = __get_PRIMASK();
409 for (i = (_sidx+1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i+1) % MEM_POOL_UNIT_NUM)
411 if (_unit_used[i] == 0)
417 __set_PRIMASK(irq_state);
419 qtd = (qTD_T *)&_mem_pool[i];
420 memset(qtd, 0,
sizeof(*qtd));
421 qtd->Next_qTD = QTD_LIST_END;
422 qtd->Alt_Next_qTD = QTD_LIST_END;
423 qtd->Token = 0x1197B3F;
425 mem_debug(
"[ALLOC] [qTD] - 0x%x\n", (
int)qtd);
429 __set_PRIMASK(irq_state);
430 USB_error(
"alloc_ehci_qTD failed!\n");
434void free_ehci_qTD(qTD_T *qtd)
436 uint32_t irq_state = __get_PRIMASK();
441 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
443 if ((uint32_t)&_mem_pool[i] == (uint32_t)qtd)
447 __set_PRIMASK(irq_state);
448 mem_debug(
"[FREE] [qTD] - 0x%x\n", (
int)qtd);
452 __set_PRIMASK(irq_state);
453 USB_error(
"free_ehci_qTD 0x%x - not found!\n", (
int)qtd);
459iTD_T * alloc_ehci_iTD(
void)
461 uint32_t irq_state = __get_PRIMASK();
467 for (i = (_sidx+1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i+1) % MEM_POOL_UNIT_NUM)
469 if (i+2 >= MEM_POOL_UNIT_NUM)
472 if ((_unit_used[i] == 0) && (_unit_used[i+1] == 0))
474 _unit_used[i] = _unit_used[i+1] = 1;
478 __set_PRIMASK(irq_state);
480 itd = (iTD_T *)&_mem_pool[i];
481 memset(itd, 0,
sizeof(*itd));
482 mem_debug(
"[ALLOC] [iTD] - 0x%x\n", (
int)itd);
486 __set_PRIMASK(irq_state);
487 USB_error(
"alloc_ehci_iTD failed!\n");
491void free_ehci_iTD(iTD_T *itd)
493 uint32_t irq_state = __get_PRIMASK();
498 for (i = 0; i+1 < MEM_POOL_UNIT_NUM; i++)
500 if ((uint32_t)&_mem_pool[i] == (uint32_t)itd)
502 _unit_used[i] = _unit_used[i+1] = 0;
504 __set_PRIMASK(irq_state);
505 mem_debug(
"[FREE] [iTD] - 0x%x\n", (
int)itd);
509 __set_PRIMASK(irq_state);
510 USB_error(
"free_ehci_iTD 0x%x - not found!\n", (
int)itd);
516siTD_T * alloc_ehci_siTD(
void)
518 uint32_t irq_state = __get_PRIMASK();
524 for (i = (_sidx+1) % MEM_POOL_UNIT_NUM; i != _sidx; i = (i+1) % MEM_POOL_UNIT_NUM)
526 if (_unit_used[i] == 0)
532 __set_PRIMASK(irq_state);
534 sitd = (siTD_T *)&_mem_pool[i];
535 memset(sitd, 0,
sizeof(*sitd));
536 mem_debug(
"[ALLOC] [siTD] - 0x%x\n", (
int)sitd);
540 __set_PRIMASK(irq_state);
541 USB_error(
"alloc_ehci_siTD failed!\n");
545void free_ehci_siTD(siTD_T *sitd)
547 uint32_t irq_state = __get_PRIMASK();
552 for (i = 0; i < MEM_POOL_UNIT_NUM; i++)
554 if ((uint32_t)&_mem_pool[i] == (uint32_t)sitd)
558 __set_PRIMASK(irq_state);
559 mem_debug(
"[FREE] [siTD] - 0x%x\n", (
int)sitd);
563 __set_PRIMASK(irq_state);
564 USB_error(
"free_ehci_siTD 0x%x - not found!\n", (
int)sitd);
void *__dso_handle __attribute__((weak))
NuMicro peripheral access layer header file.
#define NULL
NULL pointer.
USB Host library header file.