Modify OS Abstract layer

This commit is contained in:
xj 2024-06-15 20:52:26 -07:00
parent b3fdaef640
commit 7472a6de3d
2 changed files with 181 additions and 7 deletions

View File

@ -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);
}

View File

@ -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