1 /*
2  * ===========================================================================================
3  *
4  *       Filename:  hal_mailbox.c
5  *
6  *    Description:  mbox impl.for hal.
7  *
8  *        Version:  Melis3.0
9  *         Create:  2019-11-27 17:32:09
10  *       Revision:  none
11  *       Compiler:  GCC:version 7.2.1 20170904 (release),ARM/embedded-7-branch revision 255204
12  *
13  *         Author:  caozilong@allwinnertech.com
14  *   Organization:  BU1-PSW
15  *  Last Modified:  2019-11-27 18:02:12
16  *
17  * ===========================================================================================
18  */
19 
20 #include <hal_queue.h>
21 #include <rtdef.h>
22 #include <rtthread.h>
23 #include <log.h>
24 
hal_mailbox_create(const char * name,unsigned int size)25 hal_mailbox_t hal_mailbox_create(const char *name, unsigned int size)
26 {
27     return rt_mb_create("hal_layer", size, RT_IPC_FLAG_FIFO);
28 }
29 
hal_mailbox_delete(hal_mailbox_t mailbox)30 int hal_mailbox_delete(hal_mailbox_t mailbox)
31 {
32     if (mailbox == NULL)
33     {
34         __err("fatal error, parameter is invalid.");
35         return -1;
36     }
37 
38     rt_mb_delete(mailbox);
39     return 0;
40 }
41 
hal_mailbox_send(hal_mailbox_t mailbox,unsigned int value)42 int hal_mailbox_send(hal_mailbox_t mailbox, unsigned int value)
43 {
44     rt_err_t ret;
45 
46     if (mailbox == NULL)
47     {
48         __err("fatal error, parameter is invalid.");
49         return -1;
50     }
51 
52     ret = rt_mb_send(mailbox, value);
53     if (ret != RT_EOK)
54     {
55         // timeout.
56         return -2;
57     }
58 
59     return 0;
60 }
61 
hal_mailbox_send_wait(hal_mailbox_t mailbox,unsigned int value,int timeout)62 int hal_mailbox_send_wait(hal_mailbox_t mailbox, unsigned int value, int timeout)
63 {
64     rt_err_t ret;
65 
66     if (mailbox == NULL)
67     {
68         __err("fatal error, parameter is invalid.");
69         return -1;
70     }
71 
72     ret = rt_mb_send_wait(mailbox, value, timeout);
73     if (ret != RT_EOK)
74     {
75         // timeout.
76         return -2;
77     }
78 
79     return 0;
80 }
81 
hal_mailbox_recv(hal_mailbox_t mailbox,unsigned int * value,int timeout)82 int hal_mailbox_recv(hal_mailbox_t mailbox, unsigned int *value, int timeout)
83 {
84     rt_err_t ret;
85 
86     if (mailbox == NULL || value == NULL)
87     {
88         __err("fatal error, parameter is invalid.");
89         return -1;
90     }
91 
92     ret = rt_mb_recv(mailbox, (rt_ubase_t *)value, timeout);
93     if (ret != RT_EOK)
94     {
95         // timeout.
96         return -2;
97     }
98 
99     return 0;
100 }
101 
hal_is_mailbox_empty(hal_mailbox_t mailbox)102 int hal_is_mailbox_empty(hal_mailbox_t mailbox)
103 {
104     rt_err_t ret = -1;
105     int arg;
106 
107     if (mailbox == NULL)
108     {
109         __err("fatal error, parameter is invalid.");
110         return -1;
111     }
112 
113     ret = rt_mb_control(mailbox, RT_IPC_CMD_GET_STATE, &arg);
114     if (ret != RT_EOK)
115         return -2;
116 
117     return (arg == 0)? 1: 0;
118 }
119 
hal_workqueue_create(const char * name,unsigned short stack_size,unsigned char priority)120 hal_workqueue *hal_workqueue_create(const char *name, unsigned short stack_size, unsigned char priority)
121 {
122     return rt_workqueue_create(name, stack_size, priority);
123 }
124 
hal_workqueue_dowork(hal_workqueue * queue,hal_work * work)125 int hal_workqueue_dowork(hal_workqueue *queue, hal_work *work)
126 {
127     int ret = 0;
128     ret = rt_workqueue_dowork(queue, work);
129     return ret;
130 }
131 
hal_queue_create(const char * name,unsigned int item_size,unsigned int queue_size)132 hal_queue_t hal_queue_create(const char *name, unsigned int item_size, unsigned int queue_size)
133 {
134     return rt_mq_create("hal_layer", item_size, queue_size, RT_IPC_FLAG_FIFO);
135 }
136 
hal_queue_delete(hal_queue_t queue)137 int hal_queue_delete(hal_queue_t queue)
138 {
139     if (queue == NULL)
140     {
141         __err("fatal error, parameter is invalid.");
142         return -1;
143     }
144 
145     rt_mq_delete(queue);
146     return 0;
147 
148 }
149 
hal_queue_send_wait(hal_queue_t queue,void * buffer,int timeout)150 int hal_queue_send_wait(hal_queue_t queue, void *buffer, int timeout)
151 {
152     rt_err_t ret;
153 
154     if (queue == NULL)
155     {
156         __err("fatal error, parameter is invalid.");
157         return -1;
158     }
159 
160     ret = rt_mq_send_wait(queue, buffer, queue->msg_size, timeout);
161     if (ret != RT_EOK)
162     {
163         return -2;
164     }
165 
166     return 0;
167 }
168 
hal_queue_send(hal_queue_t queue,void * buffer)169 int hal_queue_send(hal_queue_t queue, void *buffer)
170 {
171     return hal_queue_send_wait(queue, buffer, 0);
172 }
173 
hal_queue_recv(hal_queue_t queue,void * buffer,int timeout)174 int hal_queue_recv(hal_queue_t queue, void *buffer, int timeout)
175 {
176     rt_err_t ret;
177 
178     if (queue == NULL)
179     {
180         __err("fatal error, parameter is invalid.");
181         return -1;
182     }
183 
184     ret = rt_mq_recv(queue, buffer, queue->msg_size, timeout);
185     if (ret < 0)
186     {
187         return -2;
188     }
189 
190     return 0;
191 
192 }
193 
hal_is_queue_empty(hal_queue_t queue)194 int hal_is_queue_empty(hal_queue_t queue)
195 {
196     rt_err_t ret = -1;
197     int arg;
198 
199     if (queue == NULL)
200     {
201         __err("fatal error, parameter is invalid.");
202         return -1;
203     }
204 
205     ret = rt_mq_control(queue, RT_IPC_CMD_GET_STATE, &arg);
206     if (ret != RT_EOK)
207         return -2;
208 
209     return (arg == 0)? 1: 0;
210 }
211