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