You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
1.8 KiB
115 lines
1.8 KiB
/* |
|
* Copyright (c) 2019 Manivannan Sadhasivam |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#include <zephyr/kernel.h> |
|
|
|
#include <timer.h> |
|
|
|
static void timer_work_handler(struct k_work *work); |
|
K_WORK_DEFINE(timer_work, timer_work_handler); |
|
|
|
static uint32_t saved_time; |
|
/* TODO: Use Non-volatile memory for backup */ |
|
static volatile uint32_t backup_reg[2]; |
|
|
|
static void timer_work_handler(struct k_work *work) |
|
{ |
|
TimerIrqHandler(); |
|
} |
|
|
|
static void timer_callback(struct k_timer *_timer) |
|
{ |
|
ARG_UNUSED(_timer); |
|
|
|
k_work_submit(&timer_work); |
|
} |
|
|
|
K_TIMER_DEFINE(lora_timer, timer_callback, NULL); |
|
|
|
void RtcBkupWrite(uint32_t data0, uint32_t data1) |
|
{ |
|
backup_reg[0] = data0; |
|
backup_reg[1] = data1; |
|
} |
|
|
|
void RtcBkupRead(uint32_t *data0, uint32_t *data1) |
|
{ |
|
*data0 = backup_reg[0]; |
|
*data1 = backup_reg[1]; |
|
} |
|
|
|
uint32_t RtcGetCalendarTime(uint16_t *milliseconds) |
|
{ |
|
int64_t now = k_uptime_get(); |
|
|
|
*milliseconds = now % MSEC_PER_SEC; |
|
|
|
/* Return in seconds */ |
|
return now / MSEC_PER_SEC; |
|
} |
|
|
|
uint32_t RtcGetTimerValue(void) |
|
{ |
|
return k_uptime_get_32(); |
|
} |
|
|
|
uint32_t RtcGetTimerElapsedTime(void) |
|
{ |
|
return (k_uptime_get_32() - saved_time); |
|
} |
|
|
|
uint32_t RtcGetMinimumTimeout(void) |
|
{ |
|
return 1; |
|
} |
|
|
|
void RtcStopAlarm(void) |
|
{ |
|
k_timer_stop(&lora_timer); |
|
} |
|
|
|
void RtcSetAlarm(uint32_t timeout) |
|
{ |
|
k_timer_start(&lora_timer, K_MSEC(timeout), K_NO_WAIT); |
|
} |
|
|
|
uint32_t RtcSetTimerContext(void) |
|
{ |
|
saved_time = k_uptime_get_32(); |
|
|
|
return saved_time; |
|
} |
|
|
|
/* For us, 1 tick = 1 milli second. So no need to do any conversion here */ |
|
uint32_t RtcGetTimerContext(void) |
|
{ |
|
return saved_time; |
|
} |
|
|
|
void DelayMsMcu(uint32_t ms) |
|
{ |
|
k_sleep(K_MSEC(ms)); |
|
} |
|
|
|
uint32_t RtcMs2Tick(uint32_t milliseconds) |
|
{ |
|
return milliseconds; |
|
} |
|
|
|
uint32_t RtcTick2Ms(uint32_t tick) |
|
{ |
|
return tick; |
|
} |
|
|
|
void BoardCriticalSectionBegin(uint32_t *mask) |
|
{ |
|
*mask = irq_lock(); |
|
} |
|
|
|
void BoardCriticalSectionEnd(uint32_t *mask) |
|
{ |
|
irq_unlock(*mask); |
|
}
|
|
|