联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话: QQ:1602036736

RK3566 android11 RTC-HYM8563移植

硬件

图片#B #S #R #60% #auto

设备树

RTC权限

diff --git a/sepolicy/vendor/genfs_contexts b/sepolicy/vendor/genfs_contexts
index 3c007b0..6ad427a 100644
--- a/sepolicy/vendor/genfs_contexts
+++ b/sepolicy/vendor/genfs_contexts
@@ -28,6 +28,10 @@ genfscon sysfs /devices/platform/ff3c0000.i2c/i2c-0/0-0020/rk808-rtc/rtc/rtc0/hc
 # for kernel 4.19
 genfscon debugfs /sync                                                                               u:object_r:debugfs_sw_sync:s0
 
+# 25-06.09 liguoyi RTC
+# rk356x RTC
+genfscon sysfs /devices/platform/fdd40000.i2c/i2c-0/0-0051/rtc/rtc0/hctosys                          u:object_r:sysfs_hctosys:s0
+
 # for usb grf
 genfscon sysfs /class/extcon/extcon0                                                                 u:object_r:sysfs_extcon:s0
 genfscon sysfs /devices/platform/rk-headset/extcon/extcon1/state                                     u:object_r:sysfs_extcon:s0

kernel

diff --git a/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi b/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi
index 35e6b660314d..2e64bdb0494b 100755
--- a/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi
@@ -206,8 +206,10 @@
 		pinctrl-0 = <&uart1m0_rtsn>;
 		pinctrl-1 = <&uart1_gpios>;
 		BT,reset_gpio    = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>;
-		BT,wake_gpio     = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>;
-		BT,wake_host_irq = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
+		// BT,wake_gpio     = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>;
+		// BT,wake_host_irq = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
+		BT,wake_gpio     = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;
 		status = "okay";
 	};
 
@@ -273,7 +275,14 @@
 
 &i2c0 {
 	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>;
+	};
 	vdd_cpu: tcs4525@1c {
 		compatible = "tcs,tcs452x";
 		reg = <0x1c>;
@@ -636,6 +645,12 @@
 			rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
+	
+	rtc{
+		rtc_int: rtc-int{
+			rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
 };
 

 

驱动配置

kenrnel目录下运行

make ARCH=arm64 menuconfig

依次进入目录(键盘上下键移动,回车进入)

Device Drivers --->
	Real Time Clock --->

在 Real Time Clock 下,打开 Haoyu Microelectronics HYM8563,并关闭 RK808 的RTC。按 Y 打开,按 N 关闭。

图片#B #S #R #60% #auto

完成后右键选择到 Save 然后一直保存。保存完成后,退出所有路径直到退出menuconfig界面。

因为我们刚刚保存的是.config每次编译的时候脚本都会去组合生产.config所以你的配置就会被覆盖掉,这也是很多小伙伴经常提问的为什么配置没生效,正确的方式是生成defconfig然后并覆盖到之前的arch/arm64/configs/下代替我们使用的defconfig

make ARCH=arm64 savedefconfig

图片#B #S #R #60% #auto

我们SDK使用的是rockchip_linux_defconfig,所以把生成的defconfig复制过去代替rockchip_linux_defconfig我用的是repo带git版本所有我就直接复制过去了,如果你没有git管理就先备份一个然后在代替过去,避免搞坏了回不去了。

mv defconfig arch/arm64/configs/rockchip_linux_defconfig

 

测试方法

测试rtc关机后时间是否同步

  1. 设置当前时间和自己手机同步

  2. 拔掉电源,等待几分钟开机

  3. 确认板子时间是否则和当前手机时间一致

其他查看rtc方法

同时在以下目录中也可以直接读取驱动相关的信息。

rk3568_r:/sys/class/rtc # ls 
rtc0
rk3568_r:/sys/class/rtc # cd rtc0 
rk3568_r:/sys/class/rtc/rtc0 # cd .. 
rk3568_r:/sys/class/rtc # ls -l 
total 0 
lrwxrwxrwx 1 root root 0 2021-01-01 12:00 rtc0 -> ../../devices/platform/fe5e0000.i2c/i2c-5/5-0051/rtc/rtc0 
rk3568_r:/sys/class/rtc # cd rtc0 
rk3568_r:/sys/class/rtc/rtc0 # ls 
date  device   max_user_freq  power        subsystem  uevent     wakeup8 dev   hctosys  name           since_epoch  time       wakealarm 
rk3568_r:/sys/class/rtc/rtc0 # cat name 
rtc-hym8563 5-0051 
rk3568_r:/sys/class/rtc/rtc0 # cat time 
03:04:57 
rk3568_r:/sys/class/rtc/rtc0 # cat hctosys 
1

遇到的问题

问题描述:测试rtc ,通过指令读取正常。使用指令保存 确认系统时间 和rtc 时间都一致后重启,系统时间和rtc 回到初始时间 ,并且未接网线来同步网络时间
图片#B #S #R #60% #auto

执行指令:
hwclock --show --rtc=/dev/rtc0 查看RTC0的时间
date 查看系统时间
date "2024-03-09 09:46:00" 写入系统时间
hwclock --systohc --rtc=/dev/rtc0 将系统时间写入硬件时钟,并指定硬件时钟设备为 /dev/rtc0

解决办法:
只能往后调时间,不能往前跳时间。该问题不建议解决。

通过在 android 系统的界面上设置时间我发现了个问题,如果往前设置时间就会出现重启后,时间不是上次设置的时间。
经过反复验证,发现如果时间设置有问题,系统时间就会变成编译时候时间点。如果把设置的时间点大于编译时间,重启后就是刚才设置的时间。

Android 11 系统中确实有一个机制,会比较系统时间和编译时间的大小,如果系统时间小于等于编译时间,系统会将时间自动设置为编译时间。这个机制是为了避免一些时间相关的问题,例如应用程序的过期问题、证书验证问题等等。
不过需要注意的是,这个机制针对的是系统级别的时间,而不是应用程序级别的时间。即使系统时间被设置为编译时间,应用程序仍然可以通过系统提供的 API 获取当前的真实时间。
文件路径:android源码\frameworks\base\services\core\java\com\android\server\AlarmManagerService.java

final long systemBuildTime =  Long.max(
                    1000L * SystemProperties.getLong("ro.build.date.utc", -1L),
                    Long.max(Environment.getRootDirectory().lastModified(), Build.TIME));
            if (mInjector.getCurrentTimeMillis() < systemBuildTime) {
                Slog.i(TAG, "Current time only " + mInjector.getCurrentTimeMillis()
                        + ", advancing to build time " + systemBuildTime);
                mInjector.setKernelTime(systemBuildTime);
            }

如果强行注释该内容可能会导致系统异常,因此不建议解决。

 

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册