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