设计说明
源代码位于:
-
RTC V1.0: drivers/rtc/artinchip-rtc.c
-
RTC V0.1: drivers/rtc/artinchip-rtc-v0.1.c
Linux 提供了一个 RTC 子系统(简称 RTC Core),使得在用户空间可以通过 /dev/watchdogX 来访问 Watchdog 控制器。为了更方便查看硬件状态和参数设置,本驱动另外扩展了几个 sysfs 节点。 整个软件框架如 Linux RTC 子系统架构图 所示:

RTC V1.0控制器可以适配到通用的 RTC 时间、闹钟接口,其他非标准的特性有:
- Alarm 的中断输出:
是否有输出完全由板级电路的设计决定,软件上只需要使能中断信号即可。在 DTS 中提供了一个 bool 类型的参数方便用户配置“alarm-io-output”。。
- 时钟校准参数:
控制器支持±975ppm 的校准范围,用户需要配置 DTS 中的参数
clock-rate
。详见 RTC 自定义参数 。
- 精准驱动能力
为了节省功耗,可以降低 32K 时钟的驱动能力到刚好够用,扫描方法见 驱动能力扫描
- 8bit 寄存器的读写在驱动设计时将 8bit 数据的拆解、打包进行封装,可以尽量减少对代码的干扰,封装如下:
#define RTC_WRITEL(val, reg) \ do { \ writeb((val) & 0xFF, (reg)); \ writeb(((val) >> 8) & 0xFF, (reg) + 0x4); \ writeb(((val) >> 16) & 0xFF, (reg) + 0x8); \ writeb(((val) >> 24) & 0xFF, (reg) + 0xC); \ } while (0) #define RTC_READL(reg) (readb(reg) | (readb((reg) + 0x4) << 8) \ | (readb((reg) + 0x8) << 16) \ | (readb((reg) + 0xC) << 24))