| 244 | } |
| 245 | |
| 246 | rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg) |
| 247 | { |
| 248 | rt_base_t level; |
| 249 | |
| 250 | /* parameter check */ |
| 251 | RT_ASSERT(timer != RT_NULL); |
| 252 | |
| 253 | level = rt_spin_lock_irqsave(&_spinlock); |
| 254 | switch (cmd) |
| 255 | { |
| 256 | |
| 257 | case RT_TIMER_CTRL_GET_TIME: |
| 258 | *(unsigned long *)arg = timer->delay_cnt; |
| 259 | break; |
| 260 | |
| 261 | case RT_TIMER_CTRL_SET_TIME: |
| 262 | RT_ASSERT((*(unsigned long *)arg) < (_HRTIMER_MAX_CNT / 2)); |
| 263 | timer->delay_cnt = *(unsigned long *)arg; |
| 264 | timer->timeout_cnt = *(unsigned long *)arg + rt_ktime_cputimer_getcnt(); |
| 265 | break; |
| 266 | |
| 267 | case RT_TIMER_CTRL_SET_ONESHOT: |
| 268 | timer->flag &= ~RT_TIMER_FLAG_PERIODIC; |
| 269 | break; |
| 270 | |
| 271 | case RT_TIMER_CTRL_SET_PERIODIC: |
| 272 | timer->flag |= RT_TIMER_FLAG_PERIODIC; |
| 273 | break; |
| 274 | |
| 275 | case RT_TIMER_CTRL_GET_STATE: |
| 276 | if (timer->flag & RT_TIMER_FLAG_ACTIVATED) |
| 277 | { |
| 278 | /*timer is start and run*/ |
| 279 | *(rt_uint32_t *)arg = RT_TIMER_FLAG_ACTIVATED; |
| 280 | } |
| 281 | else |
| 282 | { |
| 283 | /*timer is stop*/ |
| 284 | *(rt_uint32_t *)arg = RT_TIMER_FLAG_DEACTIVATED; |
| 285 | } |
| 286 | break; |
| 287 | |
| 288 | case RT_TIMER_CTRL_GET_REMAIN_TIME: |
| 289 | *(unsigned long *)arg = timer->timeout_cnt; |
| 290 | break; |
| 291 | case RT_TIMER_CTRL_GET_FUNC: |
| 292 | arg = (void *)timer->timeout_func; |
| 293 | break; |
| 294 | |
| 295 | case RT_TIMER_CTRL_SET_FUNC: |
| 296 | timer->timeout_func = (void (*)(void *))arg; |
| 297 | break; |
| 298 | |
| 299 | case RT_TIMER_CTRL_GET_PARM: |
| 300 | *(void **)arg = timer->parameter; |
| 301 | break; |
| 302 | |
| 303 | case RT_TIMER_CTRL_SET_PARM: |
no test coverage detected