Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.
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.
 
 
 
 
 
 

65 lines
1.4 KiB

/*
* Copyright (c) 2024 Michael Hope
*
* SPDX-License-Identifier: Apache-2.0
*/
#define DT_DRV_COMPAT wch_systick
#include <zephyr/device.h>
#include <zephyr/drivers/timer/system_timer.h>
#include <zephyr/irq.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/util.h>
#include <hal_ch32fun.h>
#define STK_SWIE BIT(31)
#define STK_STRE BIT(3)
#define STK_STCLK BIT(2)
#define STK_STIE BIT(1)
#define STK_STE BIT(0)
#define STK_CNTIF BIT(0)
#define CYCLES_PER_SEC sys_clock_hw_cycles_per_sec()
#define CYCLES_PER_TICK (CYCLES_PER_SEC / CONFIG_SYS_CLOCK_TICKS_PER_SEC)
#define SYSTICK ((SysTick_Type *)(DT_INST_REG_ADDR(0)))
static volatile uint32_t ch32v00x_systick_count;
static void ch32v00x_systick_irq(const void *unused)
{
ARG_UNUSED(unused);
SYSTICK->SR = 0;
ch32v00x_systick_count += CYCLES_PER_TICK; /* Track cycles. */
sys_clock_announce(1); /* Poke the scheduler. */
}
uint32_t sys_clock_cycle_get_32(void)
{
return ch32v00x_systick_count + SYSTICK->CNT;
}
uint32_t sys_clock_elapsed(void)
{
return 0;
}
static int ch32v00x_systick_init(void)
{
IRQ_CONNECT(DT_INST_IRQN(0), 0, ch32v00x_systick_irq, NULL, 0);
SYSTICK->SR = 0;
SYSTICK->CMP = CYCLES_PER_TICK;
SYSTICK->CNT = 0;
SYSTICK->CTLR = STK_STRE | STK_STCLK | STK_STIE | STK_STE;
irq_enable(DT_INST_IRQN(0));
return 0;
}
SYS_INIT(ch32v00x_systick_init, PRE_KERNEL_2, CONFIG_SYSTEM_CLOCK_INIT_PRIORITY);