1 /** @file osa_zephyr.c
2 *
3 * @brief OS Zephyr interaction API
4 *
5 * Copyright 2008-2024 NXP
6 *
7 * SPDX-License-Identifier: BSD-3-Clause
8 *
9 */
10 #include <inttypes.h>
11 #include <stdio.h>
12 #include <osa.h>
13 #include <wmlog.h>
14
15 /*** Timer Management ***/
timer_callback_work_handler(struct k_work * item)16 static void timer_callback_work_handler(struct k_work *item)
17 {
18 struct timer_data *ptimer = CONTAINER_OF(item, struct timer_data, work);
19
20 ptimer->callback(ptimer);
21 }
22
timer_callback(struct k_timer * tmr)23 static void timer_callback(struct k_timer *tmr)
24 {
25 int ret;
26 struct timer_data *ptimer = k_timer_user_data_get(tmr);
27
28 ret = k_work_submit(&ptimer->work);
29 if (ret < 0)
30 {
31 printk("timer[%p] submit to system queue fail ret %d\r\n", (void *)ptimer, ret);
32 }
33 }
34
OSA_TimerCreate(osa_timer_handle_t timerHandle,osa_timer_tick ticks,void (* call_back)(osa_timer_arg_t),void * cb_arg,osa_timer_t reload,osa_timer_activate_t activate)35 osa_status_t OSA_TimerCreate(osa_timer_handle_t timerHandle,
36 osa_timer_tick ticks,
37 void (*call_back)(osa_timer_arg_t),
38 void *cb_arg,
39 osa_timer_t reload,
40 osa_timer_activate_t activate)
41 {
42 osa_status_t status = KOSA_StatusSuccess;
43
44 assert(timerHandle != NULL);
45
46 struct timer_data *ptimer = (struct timer_data *)timerHandle;
47
48 ptimer->reload_options = reload;
49 ptimer->period = ticks;
50 ptimer->callback = call_back;
51 ptimer->user_arg = cb_arg;
52 k_timer_init(&ptimer->timer, timer_callback, NULL);
53 k_timer_user_data_set(&ptimer->timer, ptimer);
54
55 /* put callback in system work queue thread to avoid non-isr operations in isr context */
56 k_work_init(&ptimer->work, timer_callback_work_handler);
57
58 if (activate == OSA_TIMER_AUTO_ACTIVATE)
59 {
60 if (ptimer->reload_options == KOSA_TimerOnce)
61 {
62 k_timer_start(&ptimer->timer, K_TICKS(ptimer->period), K_NO_WAIT);
63 }
64 else
65 {
66 k_timer_start(&ptimer->timer, K_TICKS(ptimer->period), K_TICKS(ptimer->period));
67 }
68 }
69
70 return status;
71 }
72
OSA_TimerActivate(osa_timer_handle_t timerHandle)73 osa_status_t OSA_TimerActivate(osa_timer_handle_t timerHandle)
74 {
75 osa_status_t status = KOSA_StatusSuccess;
76
77 assert(timerHandle != NULL);
78
79 struct timer_data *ptimer = (struct timer_data *)timerHandle;
80
81 if (ptimer->reload_options == KOSA_TimerOnce)
82 {
83 k_timer_start(&ptimer->timer, K_TICKS(ptimer->period), K_NO_WAIT);
84 }
85 else
86 {
87 k_timer_start(&ptimer->timer, K_TICKS(ptimer->period), K_TICKS(ptimer->period));
88 }
89
90 return status;
91 }
92
OSA_TimerChange(osa_timer_handle_t timerHandle,osa_timer_tick ntime,osa_timer_tick block_time)93 osa_status_t OSA_TimerChange(osa_timer_handle_t timerHandle, osa_timer_tick ntime, osa_timer_tick block_time)
94
95 {
96 osa_status_t status = KOSA_StatusSuccess;
97
98 assert(timerHandle != NULL);
99
100 struct timer_data *ptimer = (struct timer_data *)timerHandle;
101
102 ptimer->period = ntime;
103
104 return status;
105 }
106
OSA_TimerIsRunning(osa_timer_handle_t timerHandle)107 bool OSA_TimerIsRunning(osa_timer_handle_t timerHandle)
108 {
109 int ret;
110
111 assert(timerHandle != NULL);
112
113 struct timer_data *ptimer = (struct timer_data *)timerHandle;
114
115 ret = k_timer_remaining_ticks(&ptimer->timer);
116
117 return ret == 0 ? false : true;
118 }
119
OSA_TimerGetContext(osa_timer_handle_t timerHandle)120 void *OSA_TimerGetContext(osa_timer_handle_t timerHandle)
121 {
122 assert(timerHandle != NULL);
123
124 struct timer_data *ptimer = (struct timer_data *)(void *)(uint32_t *)(*(uint32_t *)timerHandle);
125
126 return ptimer->user_arg;
127 }
128
OSA_TimerReset(osa_timer_handle_t timerHandle)129 osa_status_t OSA_TimerReset(osa_timer_handle_t timerHandle)
130 {
131 assert(timerHandle != NULL);
132
133 return OSA_TimerActivate(timerHandle);
134 }
135
OSA_TimerDeactivate(osa_timer_handle_t timerHandle)136 osa_status_t OSA_TimerDeactivate(osa_timer_handle_t timerHandle)
137 {
138 osa_status_t status = KOSA_StatusSuccess;
139
140 assert(timerHandle != NULL);
141
142 struct timer_data *ptimer = (struct timer_data *)timerHandle;
143
144 k_timer_stop(&ptimer->timer);
145
146 return status;
147 }
148
OSA_TimerDestroy(osa_timer_handle_t timerHandle)149 osa_status_t OSA_TimerDestroy(osa_timer_handle_t timerHandle)
150 {
151 osa_status_t status = KOSA_StatusSuccess;
152
153 assert(timerHandle != NULL);
154
155 struct timer_data *ptimer = (struct timer_data *)timerHandle;
156
157 k_timer_stop(&ptimer->timer);
158 k_work_cancel(&ptimer->work);
159
160 return status;
161 }
162
163 void (*g_os_tick_hooks[MAX_CUSTOM_HOOKS])(void) = {NULL};
164 void (*g_os_idle_hooks[MAX_CUSTOM_HOOKS])(void) = {NULL};
165
166 /** The FreeRTOS Tick hook function. */
vApplicationTickHook(void)167 void vApplicationTickHook(void)
168 {
169 int i;
170
171 for (i = 0; i < MAX_CUSTOM_HOOKS; i++)
172 {
173 if (g_os_tick_hooks[i] != NULL)
174 {
175 g_os_tick_hooks[i]();
176 }
177 }
178 }
179
vApplicationIdleHook(void)180 void vApplicationIdleHook(void)
181 {
182 int i;
183 for (i = 0; i < MAX_CUSTOM_HOOKS; i++)
184 {
185 if (g_os_idle_hooks[i] != NULL)
186 {
187 g_os_idle_hooks[i]();
188 }
189 }
190 }
191
OSA_SetupIdleFunction(void (* func)(void))192 int OSA_SetupIdleFunction(void (*func)(void))
193 {
194 return 0;
195 }
196
OSA_RemoveIdleFunction(void (* func)(void))197 int OSA_RemoveIdleFunction(void (*func)(void))
198 {
199 return 0;
200 }
201
OSA_ThreadSelfComplete(osa_task_handle_t taskHandle)202 void OSA_ThreadSelfComplete(osa_task_handle_t taskHandle)
203 {
204 //return 0;
205 }
206
OSA_MsgQWaiting(osa_msgq_handle_t msgqHandle)207 uint32_t OSA_MsgQWaiting(osa_msgq_handle_t msgqHandle)
208 {
209 return 0;
210 }
211