diff --git a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.c b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.c index f4a220235..d6db75b04 100644 --- a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.c +++ b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.c @@ -11,6 +11,7 @@ History: Author: AIIT XUOS Lab Modification: re-develop usb_hc_malloc, usb_hc_malloc_align and usb_hc_free functions *************************************************/ +struct usb_mem_pool usb_mem_pool; void *usb_hc_malloc(size_t size){ @@ -54,13 +55,81 @@ void usb_hc_free(void* ptr){ free(ptr); } +int usb_mem_pool_init(){ + int rc, count; + uintptr_t phy_addr, vir_addr; -usb_dir_page_t usb_alloc_dir_page(int len, int flag, int headroom_len){ - return NULL; + memset(&usb_mem_pool, 0, sizeof(usb_mem_pool)); + + count = 0; + while(count < MEM_POOL_SIZE){ + rc = naive_mmap(&vir_addr, &phy_addr, 4096, true); + + if(rc != 0) + goto mmap_error; + + usb_mem_pool.pages[count].vir_addr = vir_addr; + usb_mem_pool.pages[count].phy_addr = phy_addr; + + count++; + } + + return 0; + +mmap_error: + return -1; + +} + +usb_mem_page_t usb_alloc_mem_page(){ + usb_mem_page_t selected_page; + int header, tail; + + header = usb_mem_pool.header; + tail = usb_mem_pool.tail; + + +/* + * Check whether the memory pool is full or not. + */ + + if((tail + 1) % MEM_POOL_SIZE == header) + return NULL; + + selected_page = &usb_mem_pool.pages[tail]; + tail++; + + if(tail == MEM_POOL_SIZE) + tail = 0; + + usb_mem_pool.tail = tail; + + return selected_page; } -void usb_free_dir_page(usb_dir_page_t page){ +void usb_free_mem_page(usb_mem_page_t page){ + usb_mem_page_t selected_page; + int header, tail; + header = usb_mem_pool.header; + tail = usb_mem_pool.tail; + +/* + * Check whether the memory pool is full or not. + */ + if((header + 1) % MEM_POOL_SIZE == tail) + return; + + selected_page = &usb_mem_pool.pages[header]; + selected_page->vir_addr = page->vir_addr; + selected_page->phy_addr = page->phy_addr; + + header++; + + if(header == MEM_POOL_SIZE) + header = 0; + + usb_mem_pool.header = header; } \ No newline at end of file diff --git a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.h b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.h index 5be052e2d..a6d593160 100644 --- a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.h +++ b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/mem/usb_mem.h @@ -26,9 +26,13 @@ Modification: Use usb_malloc, usb_free and usb_align functions #include #include #include "usb_config.h" +#include "usyscall.h" + #define USB_MEM_ALIGNX __attribute__((aligned(CONFIG_USB_ALIGN_SIZE))) +#define MEM_POOL_SIZE 128 + void *usb_hc_malloc(size_t size); void usb_hc_free(); void *usb_hc_malloc_align(size_t align, size_t size); @@ -37,19 +41,25 @@ void *usb_hc_malloc_align(size_t align, size_t size); #define usb_free(ptr) usb_hc_free(ptr) #define usb_align(align, size) usb_hc_malloc_align(align, size) -struct usb_dir_page{ - uint64_t vir_addr; - uint64_t phy_addr; - uint32_t size; - uint32_t len; - uint32_t flag; - uint32_t headroom_len; -}__PACKED; +struct usb_mem_page{ + uintptr_t vir_addr; + uintptr_t phy_addr; -typedef struct usb_dir_page *usb_dir_page_t; +}; -usb_dir_page_t usb_alloc_dir_page(int len, int flag, int headroom_len); -void usb_free_dir_page(usb_dir_page_t page); +struct usb_mem_pool{ + int header; + int tail; + struct usb_mem_page pages[MEM_POOL_SIZE]; +}; + +typedef struct usb_mem_page *usb_mem_page_t; +typedef struct usb_mem_pool *usb_mem_pool_t; + +int usb_mem_pool_init(); +void usb_mem_pool_destory(); +usb_mem_page_t usb_alloc_mem_page(); +void usb_free_mem_page(usb_mem_page_t page);