forked from xuos/xiuos
Modify OS Abstract layer
This commit is contained in:
parent
b3fdaef640
commit
7472a6de3d
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue