4.5.19. RTC 测试

4.5.19.1. 测试原理

RTC(Real-Time Clock,实时时钟)在系统掉电纽扣电池经 PMIC VRTC 引脚供电维持计时,用于记录年月日时分秒,并系统启动硬件时间同步到 Linux 系统时钟。

时间同步工作原理:

  • 掉电期间:RTC 由 PMIC VRTC 独立供电,持续维护硬件时间(年月日时分秒),与系统电源状态无关

  • 系统启动时:内核 RTC 驱动读取 RTC 硬件寄存器,将硬件时间作为初始值写入 Linux 系统时钟(CLOCK_REALTIME),完成 RTC → 系统时钟 的首次同步

闹钟工作原理:

  • 软件通过 /sys/class/rtc/rtc0/wakealarm 设置闹钟(相对时间+10,或绝对 epoch)

  • 到期后 PMIC 内部置位 ALARM_F,并通过 ALARM_N 引脚发出中断通知 CPU

  • 内核驱动收到中断清除 wakealarm,用户态可通过 /proc/interrupts 查看 IRQ 计数变化

4.5.19.2. 准备工作

驱动确认

确保内核加载 HPU3501 RTC 驱动,有如下打印:

# dmesg | grep rtc
[    0.589787] hpu3501 2-001c: Found hpu3501-rtc node, register rtc
[    0.593254] hpu3501-rtc hpu3501-rtc.1.auto: registered as rtc0
[    0.594082] hpu3501-rtc hpu3501-rtc.1.auto: setting system clock to 2026-06-10T11:34:32 UTC (1749555272)

确认设备节点存在:

# ls /dev/rtc0
/dev/rtc0

脚本路径

测试脚本位于开发板以下路径:

/app/platform_samples/chip_base_test/15_rtc_test/rtc_test.sh

脚本使用说明

rtc_test.sh 支持通过 -h 参数查看帮助信息:

# ./rtc_test.sh --help

usage: ./rtc_test.sh <command>

commands:
  info                      show RTC hardware information
  read                      read hardware RTC time
  setsys <datetime>         set system time
                              example: ./rtc_test.sh setsys "2025-06-09 14:30:00"
  setrtc <datetime>         set RTC time (system time also updated)
                              example: ./rtc_test.sh setrtc "2025-06-09 14:30:00"
  alarm [-s seconds]        set RTC alarm and verify by interrupt count
                              default: 10s

examples:
  ./rtc_test.sh info
  ./rtc_test.sh read
  ./rtc_test.sh setsys "2025-06-09 14:30:00"
  ./rtc_test.sh setrtc "2025-06-09 14:30:00"
  ./rtc_test.sh alarm -s 10

参数说明如下:

命令 说明
info 查看 RTC 硬件信息(设备节点、驱动、当前时间、闹钟 IRQ 等)
read 读取硬件 RTC 时间
setsys <datetime> 设置系统时间(date -s),格式"2025-06-09 14:30:00"
setrtc <datetime> 设置 RTC 时间(date -s + hwclock -w,系统时间同步更新)
alarm [-s seconds] 设置 RTC 闹钟通过中断计数验证,默认 10 秒
-h / --help 显示帮助

4.5.19.3. 测试方法

查看 RTC 信息

# ./rtc_test.sh info

========================================
RTC Hardware Info
========================================
Device node : /dev/rtc0                                          # RTC 设备节点
Sysfs path  : /sys/class/rtc/rtc0                                # sysfs 接口路径
Name        : hpu3501-rtc hpu3501-rtc.1.auto                     # 设备名称
Date        : 2025-06-09                                         # RTC 日期(sysfs)
Time        : 14:30:00                                           # RTC 时间(sysfs)
Since epoch : 1749479400 sec                                     # 自 Unix 纪元起的秒数
Wakealarm   :                                                    # 闹钟设置;空表示未设置
Driver      : hpu3501-rtc                                        # 内核驱动名
Hwclock     : Mon Jun  9 14:30:00 2025  0.000000 seconds         # hwclock 读取的硬件 RTC 时间
System date : Mon Jun  9 14:30:00 UTC 2025                     # 当前系统时间
Alarm IRQ   :  46:          0          0          0          0          0          0          0          0  gpio-dwapb   1 Edge      hpu3501_alarm_irq  # 闹钟中断行及计数
========================================

读取 RTC 时间

# ./rtc_test.sh read

Hardware RTC: Mon Jun  9 14:30:05 2025  0.000000 seconds

设置系统时间

修改系统时钟,不影响硬件 RTC:

# ./rtc_test.sh setsys "2025-06-09 14:30:00"

Set datetime : 2025-06-09 14:30:00
System time  : Mon Jun  9 14:30:00 UTC 2025
PASS: system time set

设置 RTC 时间

同时更新系统时间硬件 RTC(掉电保持):

# ./rtc_test.sh setrtc "2025-06-09 14:30:00"

Set datetime : 2025-06-09 14:30:00
Hardware RTC : Mon Jun  9 14:30:00 2025  0.000000 seconds
System time  : Mon Jun  9 14:30:00 UTC 2025
PASS: RTC time set

RTC 闹钟测试

设置相对闹钟 -s 10,可通过查看中断计数是否增加,来确认。

# ./rtc_test.sh alarm -s 10

========================================
RTC Alarm Test
========================================
Alarm delay : 10s
IRQ line    :  46:  0  0  0  0  0  0  0  0  gpio-dwapb  1 Edge  hpu3501_alarm_irq
IRQ before  : 0
Set at      : 2025-06-09 14:29:50
Waiting for alarm (delay 10s, max wait 15s) ...
  countdown:  1s left | IRQ +1
Trigger at  : 2025-06-09 14:30:00
Latency     : 10.052s (set -> trigger)
Error       : +0.052s
IRQ after   : 1
========================================
PASS: RTC alarm interrupt detected (+1), latency 10.052s

输出说明:

说明
Alarm delay 设置相对闹钟秒数(-s
Waiting for alarm delay:预计闹钟触发等待时间;max wait:脚本最长等待时间(delay + 5s 余量)
IRQ line /proc/interrupts 中 RTC 闹钟对应中断
IRQ before / after 测试前后 IRQ 计数;after > before 表示闹钟中断触发
Set at 闹钟设置时刻(系统时间)
Trigger at 闹钟触发时刻(系统时间)
Latency 设置触发实际耗时(秒,精确毫秒)
Error 耗时误差 = Latency − Alarm delay
countdown 距 Alarm delay 的剩余秒数(与 delay 对齐,非 max wait)

4.5.19.4. 测试指标

测试 命令 合格标准
设备识别 info /dev/rtc0 存在,驱动 probe 成功,IRQ 行可见
时间 read 返回合法 RTC 时间
系统时间 setsys 系统时间设定值一致
设 RTC 时间 setrtc RTC 与系统时间设定值一致(允许 ±2 s 稳定延迟)
闹钟 alarm IRQ 计数 +1,wakealarm 清空,Latency ≈ Alarm delay(Error 建议 ≤ ±1 s)

通过准则: 必测项(info / read / setsys / setrtc / alarm)全部 PASS 则 RTC 功能测试通过。