调试目的
实现获取时间、设置时间、获取报警时间和设置报警时间等功能。
调试思路
- 阅读bl8025芯片数据手册,获取该芯片的通信协议(i2c、spi或其他)和基本信息;
- 查看原理图,获取硬件连接信息;
- 根据硬件连接信息添加设备树;
- 编写驱动程序;
- 调试。
调试过程
对上述关键步骤进行详细描述,尽量有理有据,讲清楚修改缘由。
步骤一
查询bl8025芯片数据手册,获取通信协议:
-
bl8025采用i2c协议进行通信,bl8025作为从设备;
-
获取bl8025从设备地址为0x32;
3 .获取bl8025寄存器以及寄存器描述信息。
步骤二
查看原理图,获取硬件连接信息:
1、从硬件连接情况可知,rk3568使用i2c2通道与bl8025模块进行通信;
2、bl8025的硬件中断信号连接到rk3568的GPIO1_B1引脚;
步骤三
根据硬件连接信息添加设备树:
- 添加i2c2设备信息;
&i2c2 {
status = "okay";
bl8025: bl8025@32 {
compatible = "belling,bl8025";
reg = <0x32>;
pinctrl-names = "default";
pinctrl-0 = <&rtc_int>;
interrupt-parent = <&gpio1>;
interrupts = <RK_PB1 IRQ_TYPE_LEVEL_LOW>;
};
};
reg = <0x32>; // bl8025 从设备地址;
pinctrl-0 = <&rtc_int>; // 指定pin group
interrupt-parent = <&gpio1>; // 指定外部中断由gpio1引入
interrupts = <RK_PB1 IRQ_TYPE_LEVEL_LOW>; // 指定具体中断引脚以及中断触发方式
2. 添加rtc引脚控制信息
&pinctrl {
cam {
camera_pwr: camera-pwr {
rockchip,pins =
/* camera power en */
<0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
.
.
.
rtc{
rtc_int: rtc-int {
rockchip,pins = <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
};
步骤四
编写驱动程序
-
源码目录
drivers/rtc/rtc-bl8025.c -
Makefile中添加bl8025模块编译命令:(drivers/rtc/Makefile)
obj-$(CONFIG_RTC_DRV_BL8025T) += rtc-bl8025.o -
Kconfig添加模块编译选择信息:(drivers/rtc/Kconfig)
config RTC_DRV_BL8025T
tristate “Belling BL8025T”
help
If you say yes here you get support for the Belling BL8025T chips.
This driver can also be built as a module. If so, the module will be called rtc-bl8025. -
开启i2c编译选项
-
开启bl8025模块编译选项
步骤五
调试
编译测试代码
-
测试代码路径:
tools/testing/selftests/rtc/rtctest.c
tools/testing/selftests/rtc/setdate.c -
修改Makefile,指定编译工具链
export PATH=$PATH:/home/wangchuandong/proj/siyuan/sieyuan-rk3568/prebuilts/gcc/linux-x86/aarch64/gcclinaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/
export ARCH=arm
export CROSS_COMPILE=aarch64-linux-gnu- -
编译出测试应用程序
-
测试
rk3568:/# ./rtctest /dev/rtc1
[] Running 7 tests from 2 test cases.
[ RUN ] rtc.date_read
rtctest.c:49:rtc.date_read:Current RTC date/time is 14/01/2022 10:48:39.
[ OK ] rtc.date_read
[ RUN ] rtc.uie_read
[ OK ] rtc.uie_read
[ RUN ] rtc.uie_select
[ OK ] rtc.uie_select
[ RUN ] rtc.alarm_alm_set
rtctest.c:137:rtc.alarm_alm_set:Alarm time now set to 10:48:48.
rtctest.c:156:rtc.alarm_alm_set:data: 1a0
[ OK ] rtc.alarm_alm_set
[ RUN ] rtc.alarm_wkalm_set
rtctest.c:195:rtc.alarm_wkalm_set:Alarm time now set to 14/01/2022 10:48:51.
[ OK ] rtc.alarm_wkalm_set
[ RUN ] rtc.alarm_alm_set_minute
rtctest.c:239:rtc.alarm_alm_set_minute:Alarm time now set to 10:49:00.
rtctest.c:258:rtc.alarm_alm_set_minute:data: 1a0
[ OK ] rtc.alarm_alm_set_minute
[ RUN ] rtc.alarm_wkalm_set_minute
rtctest.c:297:rtc.alarm_wkalm_set_minute:Alarm time now set to 14/01/2022 10:50:00.
[ OK ] rtc.alarm_wkalm_set_minute
[] 7 / 7 tests passed.
[ PASSED ]
遇到的问题
报警功能测试失败
现象或日志
rk3568:/# ./rtctest /dev/rtc1
[==========] Running 7 tests from 2 test cases.
[ RUN ] rtc.date_read
rtctest.c:49:rtc.date_read:Current RTC date/time is 14/01/2022 10:48:39.
[ OK ] rtc.date_read
[ RUN ] rtc.uie_read
[ OK ] rtc.uie_read
[ RUN ] rtc.uie_select
[ OK ] rtc.uie_select
[ RUN ] rtc.alarm_alm_set
rtctest.c:137:rtc.alarm_alm_set:Alarm time now set to 10:48:48.
rtctest.c:156:rtc.alarm_alm_set:data: 1a0
[ OK ] rtc.alarm_alm_set
[ RUN ] rtc.alarm_wkalm_set
rtctest.c:195:rtc.alarm_wkalm_set:Alarm time now set to 14/01/2022 10:48:51.
[ FAIL ] rtc.alarm_wkalm_set
[ RUN ] rtc.alarm_alm_set_minute
rtctest.c:239:rtc.alarm_alm_set_minute:Alarm time now set to 10:49:00.
rtctest.c:258:rtc.alarm_alm_set_minute:data: 1a0
[ OK ] rtc.alarm_alm_set_minute
[ RUN ] rtc.alarm_wkalm_set_minute
rtctest.c:297:rtc.alarm_wkalm_set_minute:Alarm time now set to 14/01/2022 10:50:00.
[ FAIL ] rtc.alarm_wkalm_set_minute
[==========] 5 / 7 tests passed.
[ PASSED ]
解决思路
描述对导致问题发生的原因,进行的合理猜测。(错误的猜测也记录,但不用在解决过程中详细描述,只需备注一下即可)
1. 猜测一、中断配置问题
2. 猜测二 、寄存器定义错误(已验证不是此原因)
3. 猜测三 、测试代码不适配(已验证不是此原因)
解决过程
1. 中断添加打印,打印出中断标志,判断程序是否进入中断;
调试现象:程序能正常进入中断,但只能进入一次。
2. 中断使能函数添加打印信息,判断中断使能被调用情况;
调试现象:每隔1秒被调用一次,且被设置为disable。
3. 猜测是中断使能函数中对定时中断更新位disable了,删除中断使能函数中的中断定时更新设置代码,在初始化函数中对初定时更新中断位进行初始化。
调试现象:测试程序全部通过。
4. 总结:该芯片支持定时更新中断功能,因此 初始化时应该配置该中断;
//bl8025->rtc->uie_unsupported = 1; // 支持时更新中断功能该句应该注释掉或者置0。
参考内容
调试过程中参考的文章(可以链接方式提供,也可以再次整理),需要重新梳理的一些概念,用到的调试技术。
BL8025T-DS_V1.0.pdf
命令:hwclock:查询/设置硬件时钟
1、同步硬件时钟rtc1到系统时钟 :hwclock -f /dev/rtc1 --hctosys
2、同步系统时钟到到硬件时钟:hwclock -f /dev/rtc1 --systohc
3、查询硬件时钟:hwclock -f /dev/rtc1
4、设置硬件时钟: hwclock --set --date "20140225 20:23:00"