使用外部RTC

rk3568的pmu rk809提供了内部RTC,edge2断电后,内部rtc无法保存系统时间。为了断电后能保存系统时间,edge2提供了外部rtc HYM8563和纽扣电池座,安装纽扣电池后,edge2可以保存系统时间。

简介

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

  • 可计时基于 32.768kHz 晶体的秒,分,小时,星期,天,月和年

  • 宽工作电压范围:1.0~5.5V

  • 低休眠电流:典型值为 0.25μA(VDD =3.0V, TA =25°C)

  • 内部集成振荡电容

  • 漏极开路中断引脚

接口使用

Linux 提供了三种用户空间调用接口。在edge2中对应的路径为:

  • SYSFS接口:/sys/class/rtc/rtc1/

  • PROCFS接口: /proc/driver/rtc

  • IOCTL接口: /dev/rtc1

    SYSFS接口

    可以直接使用 cathwclock操作 /sys/class/rtc/rtc0/ 下面的接口。

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

    # cat /sys/class/rtc/rtc1/date
    2021-10-14
    # cat /sys/class/rtc/rtc1/time
    10:30:15
    

PROCFS 接口

打印 rtc 相关的信息:

# cat /proc/driver/rtc
rtc_time    : 10:33:58
rtc_date    : 2021-10-14
alrm_time    : 11:06:00
alrm_date    : 2021-10-14
alarm_IRQ    : no
alrm_pending    : no
update IRQ enabled    : no
periodic IRQ enabled    : no
periodic IRQ frequency    : 1
max user IRQ frequency    : 64
24hr        : yes

IOCTL接口

可以使用 ioctl或者hwclock命令 控制 /dev/rtc1

# hwclock -f /dev/rtc1
Thu Oct 14 10:36:21 2021  0.000000 seconds

FAQs

Q1: 开发板上电后时间不同步?

A1: 检查一下 rtc 纽扣电池是否正确接入。

RTC驱动

[备注]:Mixtile发布的Android和Debian系统已经在内核配置好了RTC功能,用户可以忽略以下内容。如果你打算自己编译Android或Debian系统,请按照以下内容去配置RTC驱动。

kernel DTS配置参考: kernel/arch/arm64/boot/dts/rockchip/mixtile-edge2-evb.dtsi

&i2c3 {
        status = "okay";
    hym8563: hym8563@51 {
        compatible = "haoyu,hym8563";
        reg = <0x51>;
        pinctrl-names = "default";
        pinctrl-0 = <&rtc_int>;
        interrupt-parent = <&gpio0>;
        interrupts = <RK_PD3 IRQ_TYPE_LEVEL_LOW>;
        status = "okay";
    };
};

&pinctrl {
    rtc {
        rtc_int: rtc-int {
            rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>;
        };
    };
}

驱动参考:kernel/drivers/rtc/rtc-hym8563.c

RTC生效

由于kernel中默认使用rk809内部rtc,如果使能外部rtc HYM8563,并且使能系统时间同步HYM8563的时间,需要对系统作出如下修改。

kernel修改

  • dts修改

参考 RTC驱动 章节

  • config修改

修改文件为:

kernel/arch/arm64/configs/mixtile_edge2_defconfig

添加如下配置

CONFIG_RTC_DRV_HYM8563=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc1"
CONFIG_RTC_SYSTOHC_DEVICE="rtc1"

编译kernel,参考 编译kernel 章节

下载boot.img,参考 固件升级 章节

android修改

由于外部rtc HYM8563在kernel中以节点/dev/rtc1存在于系统中,android需要获得/dev/rtc1的权限。

修改文件1:device/rockchip/rk356x/mixtile_edge2/init.mixtile_edge2.rc

增加如下配置:

on boot
    chown system system /dev/rtc1
    chmod 0640 /dev/rtc1

修改文件2: device/rockchip/rk356x/mixtile_edge2/sepolicy/genfs_contexts

增加如下配置:

genfscon sysfs /devices/platform/fe5c0000.i2c/i2c-3/3-0051/power/wakeup     u:object_r:sysfs_wakeup:s0
genfscon sysfs /devices/platform/fe5c0000.i2c/i2c-3/3-0051/rtc/rtc1/hctosys  u:object_r:sysfs_hctosys:s0

编译android,参考 编译android 章节

下载super.img,参考 固件升级 章节