2. Ingenic JZ47xx SoC 定时器/计数器单元硬件

Ingenic JZ47xx SoC 中的定时器/计数器单元 (TCU) 是一个多功能硬件模块。它具有多达八个通道,可用作计数器、定时器或 PWM。

  • JZ4725B、JZ4750 和 JZ4755 仅有六个 TCU 通道。其他 SoC 均有八个通道。

  • JZ4725B 引入了一个单独的通道,称为操作系统定时器 (OST)。它是一个 32 位可编程定时器。在 JZ4760B 及更高版本上,它是 64 位的。

  • 每个 TCU 通道都有自己的时钟,可以通过其 TCSR 寄存器将其重定向到三个不同的时钟源(pclk、ext、rtc)、进行门控或重新计时。

    • 看门狗 (watchdog) 和 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

interrupts

drivers/irqchip/irq-ingenic-tcu.c

定时器

drivers/clocksource/ingenic-timer.c

OST

drivers/clocksource/ingenic-ost.c

PWM

drivers/pwm/pwm-jz4740.c

watchdog

drivers/watchdog/jz4740_wdt.c

由于属于不同驱动程序和框架的 TCU 的各种功能可以从相同的寄存器进行控制,因此所有这些驱动程序都通过相同的 regmap 访问其寄存器。

有关 TCU 驱动程序设备树绑定的更多信息,请参阅 Documentation/devicetree/bindings/timer/ingenic,tcu.yaml。