1 /*
2 * ===========================================================================================
3 *
4 * Filename: hal_sem.c
5 *
6 * Description: sem impl for hal driver.
7 *
8 * Version: Melis3.0
9 * Create: 2019-11-27 14:20:53
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 17:51:06
16 *
17 * ===========================================================================================
18 */
19
20 #include <hal_sem.h>
21 #include <rtdef.h>
22 #include <log.h>
23
hal_sem_create(unsigned int cnt)24 hal_sem_t hal_sem_create(unsigned int cnt)
25 {
26 return (hal_sem_t) rt_sem_create("hal_layer", cnt, RT_IPC_FLAG_FIFO);
27 }
28
hal_sem_delete(hal_sem_t sem)29 int hal_sem_delete(hal_sem_t sem)
30 {
31 if (sem == NULL)
32 {
33 __err("fatal error, parameter is invalid.");
34 return -1;
35 }
36
37 rt_sem_delete(sem);
38 return 0;
39 }
40
hal_sem_getvalue(hal_sem_t sem,int * val)41 int hal_sem_getvalue(hal_sem_t sem, int *val)
42 {
43 if (sem == NULL || val == NULL)
44 {
45 __err("fatal error, parameter is invalid.");
46 return -1;
47 }
48
49 rt_sem_control(sem, RT_IPC_CMD_GET_STATE, val);
50
51 return 0;
52 }
53
hal_sem_post(hal_sem_t sem)54 int hal_sem_post(hal_sem_t sem)
55 {
56 if (sem == NULL)
57 {
58 __err("fatal error, parameter is invalid.");
59 return -1;
60 }
61
62 // must be success.
63 rt_sem_release(sem);
64
65 return 0;
66 }
67
hal_sem_timedwait(hal_sem_t sem,int ticks)68 int hal_sem_timedwait(hal_sem_t sem, int ticks)
69 {
70 rt_err_t ret;
71
72 if (sem == NULL)
73 {
74 __err("fatal error, parameter is invalid.");
75 return -1;
76 }
77
78 ret = rt_sem_take(sem, ticks);
79 if (ret != RT_EOK)
80 {
81 // timeout.
82 return -2;
83 }
84
85 return 0;
86 }
87
hal_sem_trywait(hal_sem_t sem)88 int hal_sem_trywait(hal_sem_t sem)
89 {
90 rt_err_t ret;
91
92 if (sem == NULL)
93 {
94 __err("fatal error, parameter is invalid.");
95 return -1;
96 }
97
98 ret = rt_sem_trytake(sem);
99 if (ret != RT_EOK)
100 {
101 // timeout.
102 return -2;
103 }
104
105 return 0;
106 }
107
hal_sem_wait(hal_sem_t sem)108 int hal_sem_wait(hal_sem_t sem)
109 {
110 rt_err_t ret;
111
112 if (sem == NULL)
113 {
114 __err("fatal error, parameter is invalid.");
115 return -1;
116 }
117
118 ret = rt_sem_take(sem, RT_WAITING_FOREVER);
119 if (ret != RT_EOK)
120 {
121 // timeout.
122 return -2;
123 }
124
125 return 0;
126 }
127
hal_sem_clear(hal_sem_t sem)128 int hal_sem_clear(hal_sem_t sem)
129 {
130 rt_err_t ret;
131
132 if (sem == NULL)
133 {
134 __err("fatal error, parameter is invalid.");
135 return -1;
136 }
137
138 ret = rt_sem_control(sem, RT_IPC_CMD_RESET, NULL);
139 if (ret != RT_EOK) {
140 __err("rt_sem_control fail\n");
141 return -1;
142 }
143
144 return 0;
145 }
146