first commit for chrg

This commit is contained in:
wmano
2025-08-16 22:58:22 +08:00
commit 52a3ed5862
2306 changed files with 1021208 additions and 0 deletions
+130
View File
@@ -0,0 +1,130 @@
#include "drv_timer.h"
static struct drv_timer_t *timerHead;
void drv_timer_start (struct drv_timer_t *timer)
{
ASSERT(timer != NULL);
timer->start = 1;
}
void drv_timer_restart (struct drv_timer_t *timer)
{
ASSERT(timer != NULL);
timer->start = 0;
timer->time_temp = 0;
timer->period = timer->period_temp;
timer->start = 1;
}
void drv_timer_pause (struct drv_timer_t *timer)
{
ASSERT(timer != NULL);
timer->start = 0;
timer->time_temp = 0;
return;
}
void drv_timer_detach (struct drv_timer_t *timer)
{
struct drv_timer_t **now_target;
struct drv_timer_t *entry;
ASSERT(timer != NULL);
for (now_target = &timerHead; *now_target; ) {
entry = *now_target;
if (entry == timer) {
*now_target = entry->next;
return;
} else {
now_target = &entry->next;
}
}
return;
}
static void drv_timer_attach (struct drv_timer_t *timer)
{
struct drv_timer_t *target;
for (target = timerHead; target != NULL; target = target->next) {
if (target == timer) {
return;
}
}
timer->next = timerHead;
timerHead = timer;
}
// call in tick interrupt
void drv_timer_handler (uint8_t ms)
{
struct drv_timer_t *timer;
for (timer = timerHead; timer != NULL; timer = timer->next) {
if (timer->start) {
timer->time_temp += ms;
if (timer->time_temp >= timer->timeout) {
timer->time_temp = 0;
if ((timer->type & TIMER_TYPE_HARDWARE) != 0) {
if (timer->timerCallback) {
timer->timerCallback(timer->user_data);
}
if ((timer->type & TIMER_ONE_SHOT) != 0) {
--timer->period;
if (timer->period == 0) {
drv_timer_pause(timer);
}
}
} else {
timer->timeout_flag = 1;
}
}
}
}
}
void drv_timer_linkUserData (struct drv_timer_t *timer, void *user_data)
{
ASSERT(timer != NULL);
timer->user_data = user_data;
}
void drv_timer_init (struct drv_timer_t *timer,
void (*timerCallback)(void *user_data),
uint32_t timeout,
uint16_t period)
{
ASSERT(timer != NULL);
timer->period = period;
timer->timeout = timeout;
timer->type = TIMER_TYPE_HARDWARE;
timer->timerCallback = timerCallback;
timer->time_temp = 0;
timer->period_temp = period;
if (period == 0) {
timer->type |= TIMER_PERIODIC;
} else {
timer->type |= TIMER_ONE_SHOT;
}
drv_timer_attach(timer);
}