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