Edit online

设计说明

26 Nov 2024
Read time: 2 minute(s)

源码说明

源代码位于:
  • RTC V1.0: drivers/rtc/artinchip-rtc.c

  • RTC V0.1: drivers/rtc/artinchip-rtc-v0.1.c

模块架构

Linux 提供了一个 RTC 子系统,简称 RTC Core,使得在用户空间可以通过 /dev/watchdogX 来访问 RTC 控制器。为了更方便查看硬件状态和参数设置,本驱动另外扩展了几个 sysfs 节点。 整个软件框架如 Linux RTC 子系统架构 所示:


rtc_sw_system

1. Linux RTC 子系统架构

RTC V1.0 控制器可以适配到通用的 RTC 时间、闹钟接口,其他非标准的特性有:

  • Alarm 的中断输出:

    Alarm 的中断输出是否可用完全由板级电路的设计决定,软件上只需要使能中断信号即可。在 DTS 中提供了一个 boolean 类型的参数方便用户配置 alarm-io-output

  • 时钟校准:

    控制器支持 ±975 ppm 的校准范围。

    用户需要配置 DTS 中的参数 clock-rate,详见 RTC 自定义参数

  • 精准驱动能力

    为了节省功耗,可以降低 32K 时钟的驱动能力到刚好够用,扫描方法见 驱动能力扫描

  • 8-bit 寄存器的读写
    为了减少对代码的干扰,可以将 8-bit 数据的拆解、打包进行封装,示例如下:
    #define RTC_WRITEL(val, reg) \
        do { \
                RTC_WRITE_ENABLE; \
                writeb((val) & 0xFF, RTC_BASE + (reg)); \
                writeb(((val) >> 8) & 0xFF, RTC_BASE + (reg) + 0x4); \
                writeb(((val) >> 16) & 0xFF, RTC_BASE + (reg) + 0x8); \
                writeb(((val) >> 24) & 0xFF, RTC_BASE + (reg) + 0xC); \
                RTC_WRITE_DISABLE; \
        } while (0)
    
    #define RTC_READL(reg)  (readb(RTC_BASE + reg) \
                        | (readb((RTC_BASE + reg) + 0x4) << 8) \
                        | (readb((RTC_BASE + reg) + 0x8) << 16) \
                        | (readb((RTC_BASE + reg) + 0xC) << 24))