rtc

Android RTC 时钟

allwinner rockchip

Posted by LXG on April 4, 2023

Linux内核 RTC时间架构

全志软件架构

a133_rtc

全志RTC驱动

sun50iw10p1.dtsi


                rtc: rtc@07000000 {
                        compatible = "allwinner,sunxi-rtc";
                        device_type = "rtc";
                        wakeup-source;                                   // 表示RTC是具备休眠唤醒能力的中断唤醒源
                        auto_switch;                                     // 支持RTC使用的32k时钟源硬件自动切换
                        reg = <0x0 0x07000000 0x0 0x200>;                // RTC寄存器基地址和映射范围
                        interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
                        gpr_offset = <0x100>;                            // RTC通用寄存器的偏移
                        gpr_len    = <8>;
                        gpr_cur_pos = <6>;                               // RTC通用寄存器的个数
                };

全志查看RTC寄存器


ceres-c3:/ # echo 0x07000000,0x07000200 > /sys/class/sunxi_dump/dump                                                                                                                                                           
ceres-c3:/ # cat /sys/class/sunxi_dump/dump                                                                                                                                                                                    

0x0000000007000000: 0x00004011 0x00000001 0x0000000f 0x7a000000
0x0000000007000010: 0x00004bfe 0x000a350e 0x00000000 0x00000000
0x0000000007000020: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000030: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000040: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000050: 0x00000001 0x00000000 0x00000000 0x00000000
0x0000000007000060: 0x00000001 0x00000000 0x00000000 0x00000000
0x0000000007000070: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000080: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000090: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070000a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070000b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070000c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070000d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070000e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070000f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000100: 0x00000000 0x00000000 0x00000000 0x0000b00f
0x0000000007000110: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000120: 0x20000000 0x00000000 0x00000000 0x00000000
0x0000000007000130: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000140: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000150: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000160: 0x083f10f7 0x00000043 0x00000000 0x00000000
0x0000000007000170: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000180: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000190: 0x00000004 0x00000000 0x00000000 0x00000000
0x00000000070001a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070001b0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070001c0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070001d0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070001e0: 0x00000000 0x00000000 0x00000000 0x00000000
0x00000000070001f0: 0x00000000 0x00000000 0x00000000 0x00000000
0x0000000007000200: 0x00000000

查看硬件RTC时间

Linux时间有两个, 系统时间(Wall Time), RTC时间, 上电–>RTC驱动加载–>从RTC同步时间到WT时间


1|ceres-c3:/ # hwclock --show 
Thu Apr  6 10:55:57 2023  0.000000 seconds

查看Linux内核维护的时间


ceres-c3:/ $ date
Mon Apr  3 17:41:05 CST 2023

A133 RTC 原理图

a133_rtc_hardware

BAT54C

BAT54C

BAT54C是一款正向电压为520mV的半导体二极管

  • VCC-RTC 是正常供电电源 1.8V
  • J13 是电池供电电源 3V (随着时间会有衰减),实际上1.8V的电池即可满足要求

当电源供电时,电压大的二极管导通,当电池供电时,下边的二极管导通

瑞芯微 RTC 架构

linux_rtc_arch

  • Hardware:提供时间信息(time&alarm),通过一定的接口(比如I2C)和RTC Driver进行交互
  • Driver: 完成硬件的访问功能,提供访问接口,以驱动的形式驻留在系统
  • class.c:驱动注册方式由class.c:文件提供。驱动注册成功后会构建rtc_device结构体表征的rtc设备,并把rtc芯片的操作方式存放到rtc设备的ops成员中
  • interface.c:文件屏蔽硬件相关的细节,向上提供统一的获取/设置时间或Alarm的接口
  • rtc-lib.c:文件提供通用的时间操作函数,如rtc_time_to_tm、rtc_valid_tm等
  • rtc-dev.c:文件在/dev/目录下创建设备节点供应用层访问,如open、read、ioctl等,访问方式填充到file_operations结构体中
  • hctosys.c/rtc-sys.c/rtc-proc.c:将硬件时钟写给 wall time

RK3288 HYM8563 原理图

HYM8563 是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。

HYM8563.pdf

rk3288_rtc_hardware

调试

RTC 使用-firefly

HYM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断 输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为 400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增

  • 可计时基于 32.768kHz 晶体的秒,分,小时,星期,天,月和年
  • 宽工作电压范围:1.0~5.5V
  • 低休眠电流:典型值为 0.25μA(VDD =3.0V, TA =25°C)
  • 内部集成振荡电容
  • 漏极开路中断引脚

kernel-5.10/drivers/rtc/rtc-hym8563.c

Linux 提供了三种用户空间调用接口。在 ROC-RK3588-RT开发板中对应的路径为:

  • SYSFS接口:/sys/class/rtc/rtc0/
  • PROCFS接口: /proc/driver/rtc
  • IOCTL接口: /dev/rtc0

# cat /proc/driver/rtc
rtc_time        : 06:53:50
rtc_date        : 2022-06-21
alrm_time       : 06:55:05
alrm_date       : 2022-06-21
alarm_IRQ       : yes
alrm_pending    : no
update IRQ enabled      : no
periodic IRQ enabled    : no
periodic IRQ frequency  : 1
max user IRQ frequency  : 64
24hr            : yes

比如查看当前 RTC 的日期和时间:


# cat /sys/class/rtc/rtc0/date 
2022-06-21
# cat /sys/class/rtc/rtc0/time 
06:52:08

设置开机时间,如设置 120 秒后开机:


#120秒后定时开机
echo +120 >  /sys/class/rtc/rtc0/wakealarm
# 查看开机时间
cat /sys/class/rtc/rtc0/wakealarm
#关机
reboot -p