提交 ae02afc8 编写于 作者: Z zhushengle

fix: tick timer时钟频率赋值修改为运行时赋值

    OS_SYS_CLOCK 宏由产品定义,该宏可能为函数,在编译时赋值无法覆盖该场景

Close #I4PGUR
Signed-off-by: Nzhushengle <zhushengle@huawei.com>
Change-Id: I60e3f4fcd8f94b26c23cc88e0622408a24fbebe2
上级 3c19b017
......@@ -58,7 +58,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = OS_TIMER_IRQ_NUM,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -73,6 +73,9 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 intSave = LOS_IntLock();
UINT32 value;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
READ_UINT32(value, OS_TIMER_CLK_PWD_ADDR);
value &= ~(OS_TIMER_32K_CLK_BIT);
WRITE_UINT32(value, OS_TIMER_CLK_PWD_ADDR);
......
......@@ -43,7 +43,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -58,6 +58,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -41,7 +41,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -56,6 +56,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTick_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
UINT32 ret;
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -61,7 +61,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = TIM_INT_NUM,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -82,6 +82,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
{
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
SysTick->LOAD = (OS_CYCLE_PER_TICK - 1);
SysTick->VAL = 0;
SysTick->CTRL |= (CORETIM_SOURCE | CORETIM_ENABLE | CORETIM_INTMASK);
......
......@@ -53,7 +53,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = SysTimer_IRQn,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -65,6 +65,9 @@ STATIC ArchTickTimer g_archTickTimer = {
STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
{
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
SysTick_Config(SYSTICK_TICK_CONST);
ECLIC_DisableIRQ(SysTimer_IRQn);
ECLIC_SetLevelIRQ(SysTimer_IRQn, configKERNEL_INTERRUPT_PRIORITY);
......
......@@ -45,7 +45,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = RISCV_MACH_TIMER_IRQ,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,12 +57,16 @@ STATIC ArchTickTimer g_archTickTimer = {
STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
{
ArchTickTimer *tick = &g_archTickTimer;
UINT32 period = (UINT32)LOSCFG_BASE_CORE_TICK_RESPONSE_MAX;
UINT32 ret = LOS_HwiCreate(RISCV_MACH_TIMER_IRQ, 0x1, 0, handler, period);
if (ret != LOS_OK) {
return ret;
}
tick->freq = OS_SYS_CLOCK;
WRITE_UINT32(0xffffffff, MTIMERCMP + 4); /* The high 4 bits of mtimer */
WRITE_UINT32(period, MTIMERCMP);
WRITE_UINT32(0x0, MTIMERCMP + 4); /* The high 4 bits of mtimer */
......
......@@ -43,7 +43,7 @@ STATIC VOID SysTickLock(VOID);
STATIC VOID SysTickUnlock(VOID);
STATIC ArchTickTimer g_archTickTimer = {
.freq = OS_SYS_CLOCK,
.freq = 0,
.irqNum = OS_TICK_INT_NUM,
.init = SysTickStart,
.getCycle = SysTickCycleGet,
......@@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler)
{
ArchTickTimer *tick = &g_archTickTimer;
tick->freq = OS_SYS_CLOCK;
#if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1)
#if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1)
OsSetVector(tick->irqNum, handler, NULL);
......
......@@ -104,7 +104,7 @@ LITE_OS_SEC_TEXT UINT64 LOS_SysCycleGet(VOID)
#endif
}
LITE_OS_SEC_TEXT STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick)
STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick)
{
if (tick == NULL) {
return LOS_ERRNO_SYS_PTR_NULL;
......@@ -120,9 +120,9 @@ LITE_OS_SEC_TEXT STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick)
return LOS_ERRNO_TICK_CFG_INVALID;
}
if (tick->init == NULL || tick->reload == NULL ||
tick->lock == NULL || tick->unlock == NULL ||
tick->getCycle == NULL) {
if ((tick->init == NULL) || (tick->reload == NULL) ||
(tick->lock == NULL) || (tick->unlock == NULL) ||
(tick->getCycle == NULL)) {
return LOS_ERRNO_SYS_HOOK_IS_NULL;
}
......@@ -136,26 +136,43 @@ LITE_OS_SEC_TEXT STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick)
LITE_OS_SEC_TEXT_INIT UINT32 OsTickTimerInit(VOID)
{
UINT32 ret;
UINT32 intSave;
HWI_PROC_FUNC tickHandler = (HWI_PROC_FUNC)OsTickHandler;
g_sysTickTimer = LOS_SysTickTimerGet();
if ((g_sysTickTimer->init == NULL) || (g_sysTickTimer->reload == NULL) ||
(g_sysTickTimer->lock == NULL) || (g_sysTickTimer->unlock == NULL) ||
(g_sysTickTimer->getCycle == NULL)) {
return LOS_ERRNO_SYS_HOOK_IS_NULL;
}
ret = TickTimerCheck(g_sysTickTimer);
if (g_sysTickTimer->tickHandler != NULL) {
tickHandler = g_sysTickTimer->tickHandler;
}
intSave = LOS_IntLock();
ret = g_sysTickTimer->init(tickHandler);
if (ret != LOS_OK) {
PRINT_ERR("Tick timer param check failed, Error 0x%x\n", ret);
LOS_IntRestore(intSave);
return ret;
}
if ((g_sysTickTimer->freq == 0) || (g_sysTickTimer->freq < LOSCFG_BASE_CORE_TICK_PER_SECOND)) {
LOS_IntRestore(intSave);
return LOS_ERRNO_SYS_CLOCK_INVALID;
}
if (g_sysTickTimer->irqNum > (INT32)LOSCFG_PLATFORM_HWI_LIMIT) {
LOS_IntRestore(intSave);
return LOS_ERRNO_TICK_CFG_INVALID;
}
g_sysClock = g_sysTickTimer->freq;
g_cyclesPerTick = g_sysTickTimer->freq / LOSCFG_BASE_CORE_TICK_PER_SECOND;
g_sysTimerIsInit = TRUE;
if (g_sysTickTimer->tickHandler != NULL) {
tickHandler = g_sysTickTimer->tickHandler;
}
ret = g_sysTickTimer->init(tickHandler);
if (ret == LOS_OK) {
g_sysTimerIsInit = TRUE;
}
return ret;
LOS_IntRestore(intSave);
return LOS_OK;
}
LITE_OS_SEC_TEXT UINT32 LOS_TickTimerRegister(const ArchTickTimer *timer, const HWI_PROC_FUNC tickHandler)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册