2. 君正 JZ47xx SoC 的定时器/计数器单元硬件¶
君正 JZ47xx SoC 中的定时器/计数器单元 (TCU) 是一个多功能硬件块。 它具有多达八个通道,可用作计数器、定时器或 PWM。
JZ4725B、JZ4750、JZ4755 只有六个 TCU 通道。 其他 SoC 都有八个通道。
JZ4725B 引入了一个单独的通道,称为操作系统定时器 (OST)。 这是一个 32 位可编程定时器。 在 JZ4760B 及更高版本上,它是 64 位的。
每个 TCU 通道都有自己的时钟,可以通过其 TCSR 寄存器重新分配给三个不同的时钟(pclk、ext、rtc),进行门控和重新计时。
看门狗和 OST 硬件块还在其寄存器空间中具有相同格式的 TCSR 寄存器。
用于门控/取消门控的 TCU 寄存器也可以门控/取消门控看门狗和 OST 时钟。
每个 TCU 通道在以下两种模式之一中工作
模式 TCU1:通道无法在睡眠模式下工作,但更容易操作。
模式 TCU2:通道可以在睡眠模式下工作,但操作比 TCU1 通道稍微复杂一些。
每个 TCU 通道的模式取决于使用的 SoC
在最旧的 SoC(最高至 JZ4740)上,所有八个通道均以 TCU1 模式运行。
在 JZ4725B 上,通道 5 作为 TCU2 运行,其他通道作为 TCU1 运行。
在最新的 SoC(JZ4750 及更高版本)上,通道 1-2 作为 TCU2 运行,其他通道作为 TCU1 运行。
每个通道都可以生成中断。 某些通道共享一个中断线,某些通道不共享,这在 SoC 版本之间会发生变化
在较旧的 SoC(JZ4740 及更低版本)上,通道 0 和通道 1 具有自己的中断线;通道 2-7 共享最后一个中断线。
在 JZ4725B 上,通道 0 具有自己的中断;通道 1-5 共享一个中断线;OST 使用最后一个中断线。
在较新的 SoC(JZ4750 及更高版本)上,通道 5 具有自己的中断;通道 0-4 和(如果八个通道)6-7 都共享一个中断线;OST 使用最后一个中断线。
2.1. 实现¶
TCU 硬件的功能分布在多个驱动程序中
时钟 |
drivers/clk/ingenic/tcu.c |
中断 |
drivers/irqchip/irq-ingenic-tcu.c |
定时器 |
drivers/clocksource/ingenic-timer.c |
OST |
drivers/clocksource/ingenic-ost.c |
PWM |
drivers/pwm/pwm-jz4740.c |
看门狗 |
drivers/watchdog/jz4740_wdt.c |
由于属于不同驱动程序和框架的 TCU 的各种功能可以从相同的寄存器进行控制,因此所有这些驱动程序都通过相同的 regmap 访问其寄存器。
有关 TCU 驱动程序的设备树绑定的更多信息,请查看 Documentation/devicetree/bindings/timer/ingenic,tcu.yaml。