diff --git a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.c b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.c index 521e041e6..3e5ef1157 100644 --- a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.c +++ b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.c @@ -16,6 +16,7 @@ Modification: rename the file name, and re-develop all OS abstract layer functio *************************************************/ #include "usb_osal.h" +#include "usb_mem.h" #include "libserial.h" #include "syscall.h" #include "usyscall.h" @@ -119,3 +120,146 @@ int usb_osal_mutex_give(usb_osal_mutex_t mutex){ } +osal_msg_queue_t osal_mq_create(const char *name, + size_t msg_size, + size_t max_msgs, + uint8_t flag){ + osal_msg_queue_t mq; + size_t buf_size; + +/* Unused now */ + (void *)name; + (void *)flag; + + + if(msg_size <= 0 || max_msgs <=0) + return NULL; + + mq = usb_malloc(sizeof(struct osal_msg_queue)); + + if(mq == NULL) + return NULL; + + buf_size = (sizeof(struct osal_mq_msg_header) + msg_size) * max_msgs; + + if(buf_size > MAX_MSG_QUEUE_BUF_SIZE){ + usb_free(mq); + return NULL; + } + + memset(mq, 0, sizeof(struct osal_msg_queue)); + + mq->data = usb_malloc(buf_size); + + if(mq->data == NULL){ + usb_free(mq); + return NULL; + } + + mq->mutex = usb_osal_mutex_create(); + + if(mq->mutex == NULL){ + usb_free(mq->data); + usb_free(mq); + return NULL; + } + + mq->msg_size = msg_size; + mq->max_msgs = max_msgs; + + return mq; +} + + + +void osal_mq_delete(osal_msg_queue_t mq){ + int mutex_id; + if(mq == NULL) + return; + + if(mq->data) + usb_free(mq->data); + + mutex_id = (int)(mq->mutex); + if(mutex_id > 0) + usb_osal_mutex_delete(mq->mutex); + + usb_free(mq); +} + + + +int osal_mq_send(osal_msg_queue_t mq, + void *msg, + size_t msg_len, + uint32_t timeout){ + return -1; +} + + + +int osal_mq_recv(osal_msg_queue_t mq, + void *msg, + size_t msg_len, + uint32_t timeout){ + uint16_t header, tail; + int mutex_id; + osal_mq_msg_header_t msg_header; + uint8_t *msg_buf; + size_t copy_len; + + if(mq == NULL || msg == NULL || msg_len == 0) + return -1; + + if(msg_len > mq->msg_size) + return -1; + + mutex_id = (int)(mq->mutex); + if(mutex_id <= 0) + return -1; + + usb_osal_sem_take(mq->mutex, timeout); + + header = mq->header; + tail = mq->tail; + +/* message queue is empty. */ + if(header == tail){ + usb_osal_sem_give(mq->mutex); + return 0; + } + + msg_header = (osal_mq_msg_header_t)(mq->data + (sizeof(struct osal_mq_msg_header) + mq->msg_size) * header); + msg_buf = (uint8_t *)(msg_header + 1); + copy_len = (msg_header->len > msg_len?msg_len:msg_header->len); + + + return -1; +} + + +usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs){ + osal_msg_queue_t mq; + mq = osal_mq_create("usb_mq", sizeof(uintptr_t *), max_msgs, 0); + return (usb_osal_mq_t)mq; +} + + +void usb_osal_mq_delete(usb_osal_mq_t mq){ + osal_msg_queue_t osal_mq; + osal_mq = (osal_msg_queue_t)mq; + + if(osal_mq != NULL) + osal_mq_delete(osal_mq); +} + + +int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout){ + return osal_mq_recv((osal_msg_queue_t)mq, addr, sizeof(uintptr_t *), timeout); +} + + + +int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr){ + return osal_mq_send((osal_msg_queue_t)mq, &addr, sizeof(uintptr_t *), 0); +} \ No newline at end of file diff --git a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.h b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.h index 5317bd35a..0d32449ed 100644 --- a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.h +++ b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/osal/usb_osal.h @@ -43,6 +43,7 @@ int usb_osal_mutex_take(usb_osal_mutex_t mutex); int usb_osal_mutex_give(usb_osal_mutex_t mutex); usb_osal_mq_t usb_osal_mq_create(uint32_t max_msgs); +void usb_osal_mq_delete(usb_osal_mq_t mq); int usb_osal_mq_send(usb_osal_mq_t mq, uintptr_t addr); int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout); @@ -56,14 +57,43 @@ void usb_osal_msleep(uint32_t delay); * Defination of the Message queue. */ - #if 1 +#define MAX_MSG_QUEUE_BUF_SIZE 65535 * 65535 + struct osal_msg_queue{ - uint16_t msg_size; - uint16_t max_msgs; - uint16_t cur; - uint16_t header; - uint16_t tail; + uint16_t msg_size; + uint16_t max_msgs; + uint16_t cur; + uint16_t header; + uint16_t tail; + void *msg_queue_head; + void *msg_queue_tail; + usb_osal_mutex_t *mutex; + uint8_t *data; }; -#endif + +typedef struct osal_msg_queue *osal_msg_queue_t; + +struct osal_mq_msg_header{ + uint16_t len; +}; + +typedef struct osal_mq_msg_header *osal_mq_msg_header_t; + +osal_msg_queue_t osal_mq_create(const char *name, + size_t msg_size, + size_t max_msgs, + uint8_t flag); + +void osal_mq_delete(osal_msg_queue_t mq); + +int osal_mq_send(osal_msg_queue_t mq, + void *msg, + size_t msg_len, + uint32_t timeout); + +int osal_mq_recv(osal_msg_queue_t mq, + void *msg, + size_t msg_len, + uint32_t timeout); #endif