From fdf6c03c577ca231f121c3794ec385c3ee5ae4d6 Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Wed, 19 Feb 2025 18:16:47 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9650=E7=89=88=E6=9C=AC=E7=9A=84?= =?utf8?q?time=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/porting/systick/systick_porting.c | 140 +++++++++--------- 1 file changed, 69 insertions(+), 71 deletions(-) diff --git a/code/sdk/drivers/chips/brandy/porting/systick/systick_porting.c b/code/sdk/drivers/chips/brandy/porting/systick/systick_porting.c index 43c93e676..6d7bba3a5 100755 --- a/code/sdk/drivers/chips/brandy/porting/systick/systick_porting.c +++ b/code/sdk/drivers/chips/brandy/porting/systick/systick_porting.c @@ -6,74 +6,72 @@ * History: \n * 2022-08-01, Create file. \n */ -#include "systick_porting.h" -#include "systick.h" -#include "hal_systick_v150.h" -#include "platform_core.h" - -#define writel(addr, d) (*(volatile uint32_t*)(uintptr_t)(addr) = (uint32_t)(d)) -static uintptr_t g_systick_base_addr = (uintptr_t)SYSTICK_BASE_ADDR; - -uintptr_t systick_porting_base_addr_get(void) -{ - return g_systick_base_addr; -} - -void systick_port_register_hal_funcs(void) -{ - hal_systick_register_funcs(hal_systick_v150_funcs_get()); -} - -void systick_port_unregister_hal_funcs(void) -{ - hal_systick_unregister_funcs(); -} - -void systick_port_cali_xclk(void) -{ - writel(0x5702c028, 1); // XO: 32Khz, XCLK -} - -#ifdef SUPPORT_RC_CALIBRATION -volatile uint64_t g_pre_systick_count = 0; -volatile uint64_t g_pre_systick_msec = 0; - -uint64_t uapi_systick_get_time(systick_time_t time_type) -{ - volatile uint64_t now_count = 0; - volatile uint64_t ret_time = 0; - volatile uint64_t cost_msec = 0; - - uint32_t irq_sts = osal_irq_lock(); - uint64_t pre_count = g_pre_systick_count; - uint64_t pre_msec = g_pre_systick_msec; - uint64_t rc_clk = CLOCK_32K_CALI_FREQ; - if (g_pre_systick_count == 0) { - pre_count = uapi_systick_get_count(); - pre_msec = (pre_count * OS_SYS_MS_PER_SECOND) / rc_clk; - g_pre_systick_count = pre_count; - } else { - now_count = uapi_systick_get_count(); - cost_msec = ((now_count - pre_count) * OS_SYS_MS_PER_SECOND) / rc_clk; - pre_msec = pre_msec + cost_msec; - - g_pre_systick_msec = pre_msec; - g_pre_systick_count += (cost_msec * rc_clk / OS_SYS_MS_PER_SECOND); - } - osal_irq_restore(irq_sts); - - switch (time_type) { - case SYSTICK_TIME_S: - ret_time = (uint64_t)(pre_msec / OS_SYS_MS_PER_SECOND); - break; - case SYSTICK_TIME_US: - ret_time = (uint64_t)(pre_msec * OS_SYS_US_PER_MS); - break; - default: - ret_time = (uint64_t)(pre_msec); - break; - } - - return ret_time; -} -#endif \ No newline at end of file + #include "systick_porting.h" + #include "systick.h" + #include "hal_systick_v150.h" + #include "platform_core.h" + + #define writel(addr, d) (*(volatile uint32_t*)(uintptr_t)(addr) = (uint32_t)(d)) + static uintptr_t g_systick_base_addr = (uintptr_t)SYSTICK_BASE_ADDR; + + uintptr_t systick_porting_base_addr_get(void) + { + return g_systick_base_addr; + } + + void systick_port_register_hal_funcs(void) + { + hal_systick_register_funcs(hal_systick_v150_funcs_get()); + } + + void systick_port_unregister_hal_funcs(void) + { + hal_systick_unregister_funcs(); + } + + void systick_port_cali_xclk(void) + { + writel(0x5702c028, 1); // XO: 32Khz, XCLK + } + + #ifdef SUPPORT_RC_CALIBRATION + volatile uint64_t g_pre_systick_count = 0; + volatile uint64_t g_pre_systick_us = 0; + uint64_t uapi_systick_get_time(systick_time_t time_type) + { + volatile uint64_t now_count = 0; + volatile uint64_t ret_time = 0; + volatile uint64_t cost_us = 0; + + uint32_t irq_sts = osal_irq_lock(); + uint64_t pre_count = g_pre_systick_count; + uint64_t pre_us = g_pre_systick_us; + uint64_t rc_clk = CLOCK_32K_CALI_FREQ; + if (g_pre_systick_count == 0) { + pre_count = uapi_systick_get_count(); + g_pre_systick_us = (pre_count * (OS_SYS_US_PER_MS * OS_SYS_MS_PER_SECOND)) / rc_clk; + g_pre_systick_count = pre_count; + } else { + now_count = uapi_systick_get_count(); + cost_us = ((now_count - pre_count) * (OS_SYS_US_PER_MS * OS_SYS_MS_PER_SECOND)) / rc_clk; + pre_us = pre_us + cost_us; + g_pre_systick_us = pre_us; + g_pre_systick_count = now_count; + } + osal_irq_restore(irq_sts); + + switch (time_type) { + case SYSTICK_TIME_S: + ret_time = (uint64_t)(pre_us / (OS_SYS_US_PER_MS * OS_SYS_MS_PER_SECOND)); + break; + case SYSTICK_TIME_MS: + ret_time = (uint64_t)(pre_us / OS_SYS_US_PER_MS); + break; + default: + ret_time = (uint64_t)(pre_us); + break; + } + + return ret_time; + } + #endif \ No newline at end of file -- 2.17.1