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;
43uint8_t _dev_addr_pool[128];
44static volatile int _device_addr;
50void usbh_memory_init(
void)
52 if(
sizeof(TD_T) > MEM_POOL_UNIT_SIZE)
54 USB_error(
"TD_T - MEM_POOL_UNIT_SIZE too small!\n");
58 if(
sizeof(ED_T) > MEM_POOL_UNIT_SIZE)
60 USB_error(
"ED_T - MEM_POOL_UNIT_SIZE too small!\n");
65 _usbh_max_mem_used = 0L;
67 memset(_unit_used, 0,
sizeof(_unit_used));
72 memset(_dev_addr_pool, 0,
sizeof(_dev_addr_pool));
76uint32_t usbh_memory_used(
void)
78 printf(
"USB static memory: %d/%d, heap used: %d\n", _mem_pool_used, MEM_POOL_UNIT_NUM, _usbh_mem_used);
79 return _usbh_mem_used;
82static void memory_counter(
int size)
84 _usbh_mem_used += size;
85 if(_usbh_mem_used > _usbh_max_mem_used)
86 _usbh_max_mem_used = _usbh_mem_used;
89void * usbh_alloc_mem(
int size)
96 USB_error(
"usbh_alloc_mem failed! %d\n", size);
101 memory_counter(size);
105void usbh_free_mem(
void *p,
int size)
108 memory_counter(0 - size);
116UDEV_T * alloc_device(
void)
120 udev = malloc(
sizeof(*udev));
123 USB_error(
"alloc_device failed!\n");
126 memset(udev, 0,
sizeof(*udev));
127 memory_counter(
sizeof(*udev));
129 udev->next = g_udev_list;
134void free_device(UDEV_T *udev)
141 if(udev->cfd_buff !=
NULL)
142 usbh_free_mem(udev->cfd_buff, MAX_DESC_BUFF_SIZE);
147 if(g_udev_list == udev)
149 g_udev_list = g_udev_list->next;
158 d->next = udev->next;
166 memory_counter(-
sizeof(*udev));
169int alloc_dev_address(
void)
173 if(_device_addr >= 128)
178 if(_dev_addr_pool[_device_addr] == 0)
180 _dev_addr_pool[_device_addr] = 1;
184 if(_device_addr >= 128)
189void free_dev_address(
int dev_addr)
192 _dev_addr_pool[dev_addr] = 0;
199UTR_T * alloc_utr(UDEV_T *udev)
203 utr = malloc(
sizeof(*utr));
206 USB_error(
"alloc_utr failed!\n");
209 memory_counter(
sizeof(*utr));
210 memset(utr, 0,
sizeof(*utr));
212 mem_debug(
"[ALLOC] [UTR] - 0x%x\n", (
int)utr);
216void free_utr(UTR_T *utr)
221 mem_debug(
"[FREE] [UTR] - 0x%x\n", (
int)utr);
223 memory_counter(0 - (
int)
sizeof(*utr));
230ED_T * alloc_ohci_ED(
void)
235 for(i = 0; i < MEM_POOL_UNIT_NUM; i++)
237 if(_unit_used[i] == 0)
241 ed = (ED_T *)&_mem_pool[i];
242 memset(ed, 0,
sizeof(*ed));
243 mem_debug(
"[ALLOC] [ED] - 0x%x\n", (
int)ed);
247 USB_error(
"alloc_ohci_ED failed!\n");
251void free_ohci_ED(ED_T *ed)
255 for(i = 0; i < MEM_POOL_UNIT_NUM; i++)
257 if((uint32_t)&_mem_pool[i] == (uint32_t)ed)
259 mem_debug(
"[FREE] [ED] - 0x%x\n", (
int)ed);
265 USB_debug(
"free_ohci_ED - not found! (ignored in case of multiple UTR)\n");
271TD_T * alloc_ohci_TD(UTR_T *utr)
276 for(i = 0; i < MEM_POOL_UNIT_NUM; i++)
278 if(_unit_used[i] == 0)
282 td = (TD_T *)&_mem_pool[i];
284 memset(td, 0,
sizeof(*td));
286 mem_debug(
"[ALLOC] [TD] - 0x%x\n", (
int)td);
290 USB_error(
"alloc_ohci_TD failed!\n");
294void free_ohci_TD(TD_T *td)
298 for(i = 0; i < MEM_POOL_UNIT_NUM; i++)
300 if((uint32_t)&_mem_pool[i] == (uint32_t)td)
302 mem_debug(
"[FREE] [TD] - 0x%x\n", (
int)td);
308 USB_error(
"free_ohci_TD - not found!\n");
void *__dso_handle __attribute__((weak))
NuMicro peripheral access layer header file.
USB Host library header file.