更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
arm_generic_timer.c
浏览该文件的文档.
1/*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include "los_hw_pri.h"
33#include "los_tick_pri.h"
34#include "los_sys_pri.h"
35#include "gic_common.h"
36
37#define STRING_COMB(x, y, z) x ## y ## z
38
39#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
40#define TIMER_REG(reg) STRING_COMB(TIMER_REG_, CNTPS, reg)
41#else
42#define TIMER_REG(reg) STRING_COMB(TIMER_REG_, CNTP, reg)
43#endif
44#define TIMER_REG_CTL TIMER_REG(_CTL) /* 32 bits */
45#define TIMER_REG_TVAL TIMER_REG(_TVAL) /* 32 bits */
46#define TIMER_REG_CVAL TIMER_REG(_CVAL) /* 64 bits */
47#define TIMER_REG_CT TIMER_REG(CT) /* 64 bits */
48
49#ifdef __LP64__
50
51#define TIMER_REG_CNTFRQ cntfrq_el0
52
53/* CNTP AArch64 registers */
54#define TIMER_REG_CNTP_CTL cntp_ctl_el0
55#define TIMER_REG_CNTP_TVAL cntp_tval_el0
56#define TIMER_REG_CNTP_CVAL cntp_cval_el0
57#define TIMER_REG_CNTPCT cntpct_el0
58
59/* CNTPS AArch64 registers */
60#define TIMER_REG_CNTPS_CTL cntps_ctl_el1
61#define TIMER_REG_CNTPS_TVAL cntps_tval_el1
62#define TIMER_REG_CNTPS_CVAL cntps_cval_el1
63#define TIMER_REG_CNTPSCT cntpct_el0
64
65#define READ_TIMER_REG32(reg) AARCH64_SYSREG_READ(reg)
66#define READ_TIMER_REG64(reg) AARCH64_SYSREG_READ(reg)
67#define WRITE_TIMER_REG32(reg, val) AARCH64_SYSREG_WRITE(reg, (UINT64)(val))
68#define WRITE_TIMER_REG64(reg, val) AARCH64_SYSREG_WRITE(reg, val)
69
70#else /* Aarch32 */
71
72#define TIMER_REG_CNTFRQ CP15_REG(c14, 0, c0, 0)
73
74/* CNTP AArch32 registers */
75#define TIMER_REG_CNTP_CTL CP15_REG(c14, 0, c2, 1)
76#define TIMER_REG_CNTP_TVAL CP15_REG(c14, 0, c2, 0)
77#define TIMER_REG_CNTP_CVAL CP15_REG64(c14, 2)
78#define TIMER_REG_CNTPCT CP15_REG64(c14, 0)
79
80/* CNTPS AArch32 registers are banked and accessed though CNTP */
81#define CNTPS CNTP
82
83#define READ_TIMER_REG32(reg) ARM_SYSREG_READ(reg)
84#define READ_TIMER_REG64(reg) ARM_SYSREG64_READ(reg)
85#define WRITE_TIMER_REG32(reg, val) ARM_SYSREG_WRITE(reg, val)
86#define WRITE_TIMER_REG64(reg, val) ARM_SYSREG64_WRITE(reg, val)
87
88#endif
89/*
90* 见于 << arm 架构参考手册>> B4.1.21 处 CNTFRQ寄存器表示系统计数器的时钟频率。
91* 这个寄存器是一个通用的计时器寄存器。
92* MRC p15, 0, <Rt>, c14, c0, 0 ; Read CNTFRQ into Rt
93* MCR p15, 0, <Rt>, c14, c0, 0 ; Write Rt to CNTFRQ
94*/
96{
97 return READ_TIMER_REG32(TIMER_REG_CNTFRQ);
98}
99
101{
102 WRITE_TIMER_REG32(TIMER_REG_CNTFRQ, freq);
103}
104
105STATIC_INLINE VOID TimerCtlWrite(UINT32 cntpCtl)
106{
107 WRITE_TIMER_REG32(TIMER_REG_CTL, cntpCtl);
108}
109
110STATIC_INLINE UINT64 TimerCvalRead(VOID)
111{
112 return READ_TIMER_REG64(TIMER_REG_CVAL);
113}
114
115STATIC_INLINE VOID TimerCvalWrite(UINT64 cval)
116{
117 WRITE_TIMER_REG64(TIMER_REG_CVAL, cval);
118}
119
120STATIC_INLINE VOID TimerTvalWrite(UINT32 tval)
121{
122 WRITE_TIMER_REG32(TIMER_REG_TVAL, tval);
123}
124
126{
127 UINT64 cntpct;
128
129 cntpct = READ_TIMER_REG64(TIMER_REG_CT);
130 return cntpct;
131}
132//硬时钟初始化
133LITE_OS_SEC_TEXT_INIT VOID HalClockInit(VOID)
134{
135 UINT32 ret;
136
137 g_sysClock = HalClockFreqRead();//读取CPU的时钟频率
138 ret = LOS_HwiCreate(OS_TICK_INT_NUM, MIN_INTERRUPT_PRIORITY, 0, OsTickHandler, 0);//创建硬中断定时器
139 if (ret != LOS_OK) {
140 PRINT_ERR("%s, %d create tick irq failed, ret:0x%x\n", __FUNCTION__, __LINE__, ret);
141 }
142}
143
144LITE_OS_SEC_TEXT_INIT VOID HalClockStart(VOID)
145{
146 HalIrqUnmask(OS_TICK_INT_NUM);
147
148 /* triggle the first tick */
149 TimerCtlWrite(0);
150 TimerTvalWrite(OS_CYCLE_PER_TICK);
151 TimerCtlWrite(1);
152}
153
155{
156 UINT64 cycles = (UINT64)usecs * g_sysClock / OS_SYS_US_PER_SECOND;
157 UINT64 deadline = HalClockGetCycles() + cycles;
158
159 while (HalClockGetCycles() < deadline) {
160 __asm__ volatile ("nop");
161 }
162}
163
164DEPRECATED UINT64 hi_sched_clock(VOID)
165{
166 return LOS_CurrNanosec();
167}
168
170{
171 UINT64 cval = TimerCvalRead();
172 UINT64 cycles = HalClockGetCycles();
173
174 return (UINT32)((cval > cycles) ? (cval - cycles) : 0);
175}
176
178{
179 HalIrqMask(OS_TICK_INT_NUM);
180 HalIrqClear(OS_TICK_INT_NUM);
181
182 TimerCtlWrite(0);
184 TimerCtlWrite(1);
185
186 HalIrqUnmask(OS_TICK_INT_NUM);
187 return cycles;
188}
STATIC_INLINE VOID TimerTvalWrite(UINT32 tval)
STATIC_INLINE VOID TimerCtlWrite(UINT32 cntpCtl)
LITE_OS_SEC_TEXT_INIT VOID HalClockStart(VOID)
UINT64 HalClockTickTimerReload(UINT64 cycles)
VOID HalClockFreqWrite(UINT32 freq)
UINT32 HalClockGetTickTimerCycles(VOID)
UINT32 HalClockFreqRead(VOID)
DEPRECATED UINT64 hi_sched_clock(VOID)
STATIC_INLINE VOID TimerCvalWrite(UINT64 cval)
UINT64 HalClockGetCycles(VOID)
LITE_OS_SEC_TEXT_INIT VOID HalClockInit(VOID)
STATIC_INLINE UINT64 TimerCvalRead(VOID)
VOID HalDelayUs(UINT32 usecs)
GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器 http://weharmonyos.com/blog/44....
VOID HalIrqUnmask(UINT32 vector)
撤销中断屏蔽
Definition: gic_v2.c:86
VOID HalIrqClear(UINT32 vector)
Definition: gic_v2.c:104
VOID HalIrqMask(UINT32 vector)
屏蔽中断
Definition: gic_v2.c:77
LITE_OS_SEC_DATA_INIT UINT32 g_sysClock
系统时钟,是绝大部分部件工作的时钟源,也是其他所有外设的时钟的来源
Definition: los_tick.c:40
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, HWI_PRIOR_T hwiPrio, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, HwiIrqParam *irqParam)
创建一个硬中断 中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时, handleIrq会调用该中断处理程序
Definition: los_hwi.c:429
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_CurrNanosec(VOID)
获取自系统启动以来的纳秒数
Definition: los_hw_tick.c:62
LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
Handle the system tick timeout.
Definition: los_tick.c:50
long unsigned int UINT64
Definition: los_typedef.h:66
unsigned int UINT32
Definition: los_typedef.h:57