数字IC设计|ARMv8通用定时器简介

前言 基于网上资料对相关概念做整理汇总,部分内容引用自文后文章。


1 Generic timer一 内容引用自文章“Linux时间子系统之(十七):ARM generic timer驱动代码分析”,链接放在文后。
1.1 system counter ARM generic timer相关的硬件block如下图所示(用绿色标记):
数字IC设计|ARMv8通用定时器简介
文章图片


ARM generic timer的硬件block主要是SOC上的System counter(多个process共享,用来记录时间的流逝)以及附着在各个processor上的Timer(用于触发timer event)组成,其他的generic timer的硬件电路主要是用来进行交流generic time event的。例如各个processor中的timer和system counter外设进行交互,各个processor中的timer进行信息交互。System counter的功能很简单,就是计算输入时钟已经过了多少个clock,开始的时候是0,每一个clock,System counter会加一。System counter的counter value需要分发到各个timer中,也就是说,从各个timer的角度看,system counter value应该是一致的。Timer其实就是定时器,它可以定义一段指定的时间,当时间到了,就会assert一个外部的输出信号(可以输出到GIC,作为一个interrupt source)。
从power domain来看,ARM generic timer分成两个部分:System counter和各个Multiprocessor系统中的Timer_x、接口电路等。之所以这么分原因很明显:功耗方面(电源管理)的考量。在power saving mode下,可以shutdown各个processor系统的供电,但是可以保持system counter的供电,这样,至少系统时间可以保持住。
和power domain类似,clock domain也是不同的,system counter和processor工作在不同的clock下,软件修改了CPU的频率也不会影响system counter的工作节奏,从而也不会改变timer的行为。

1.2 物理计数器 各个cpu的timer是根据system counter的值来触发timer event的,因此,系统中一定有一个机制让System counter的值广播到各个CPU的timer HW block上,同时运行在各个processor上的软件可以通过接口获取System counter的值。
处理器可以通过CNTPCT寄存器来获取system counter的当前值,我们称之physical counter。
有physical就有virtual,processor可以通过CNTVCT寄存器访问virtual counter,不过,对于不支持security extension和virtualization extension的系统,virtual counter和physical counter是一样的值。
1.3 Timers
系统中每个processor都会附着多个timer,具体如下:
(1)对于不支持security extension的SOC(不支持security extension也就意味着 不支持virtualization extension),timer实际上有两个,一个是physical timer,另外一个是virtual timer。虽然有两个,不过从行为上看,virtual timer和physical timer行为一致
(2)对于支持security extension但不支持virtualization extension的SOC,每个cpu有三个timer:Non-secure physical timer,Secure physical timer和virtual timer
(3)对于支持virtualization extension的SOC,每个cpu有四个timer:Non-secure PL1 physical timer,Secure PL1 physical timer,Non-secure PL2 physical timer和virtual timer
每个timer都会有三个寄存器(我们用physical timer为例描述):
(1)64-bit CompareValue register。该寄存器配合system counter可以实现一个64 bit unsigned upcounter。如果physical counter - CompareValue >= 0的话,触发中断。也就是说,CompareValue register其实就是一个64比特的upcounter,设定为一个比当前system counter要大的值,随着system counter的不断累加,当system counter value触及CompareValue register设定的值的时候,便会向GIC触发中断。
(2)32-bit TimerValue register。该寄存器配合system counter可以实现一个32 bit signed downcounter(有的时候,使用downcounter会让软件逻辑更容易,看ARM generic timer的设计人员考虑的多么周到)。开始的时候,我们可以设定TimerValue寄存器的值为1000(假设我们想down count 1000,然后触发中断),向该寄存器写入1000实际上也就是设定了CompareValue register的值是system counter值加上1000。随着system counter的值不断累加,TimerValue register的值在递减,当值<=0的时候,便会向GIC触发中断
(3)32-bit控制寄存器。该寄存器主要对timer进行控制,具体包括:enable或是disable该timer,mask或者unmask该timer的output signal(timer interrupt)
各个processor的各个Timer都可以产生中断,因此它和GIC有接口。当然,由于timer的中断是属于各个CPU的,因此使用PPI类型的中断,具体可以参考GIC文档。当然,如果让timer触发中断,当然要确保该timer是enable并且是umask的。


2 Generic timer 引用文章“ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer”,链接放在文后。
2.1 概述 数字IC设计|ARMv8通用定时器简介
文章图片

2.2 完整的generic timer组件 数字IC设计|ARMv8通用定时器简介
文章图片

2.3 System Counter 数字IC设计|ARMv8通用定时器简介
文章图片

数字IC设计|ARMv8通用定时器简介
文章图片


2.4AArch64 generic timer 2.4.1 Physical counter(包含system connter的count值)
数字IC设计|ARMv8通用定时器简介
文章图片

2.4.2 多个定时器
数字IC设计|ARMv8通用定时器简介
文章图片








参考

1、作者 博文
Arm通用计时器简介
【ARMv8】通用定时器总结
ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer
Linux时间子系统之(十七):ARM generic timer驱动代码分析
Linux 驱动开发 三十四:Linux 内核定时器原理
ARM A64架构 DEBUG 学习(二)


【数字IC设计|ARMv8通用定时器简介】

    推荐阅读