RTC bl8025t驱动调试记录

调试目的

实现获取时间、设置时间、获取报警时间和设置报警时间等功能。

调试思路

  1. 阅读bl8025芯片数据手册,获取该芯片的通信协议(i2c、spi或其他)和基本信息;
  2. 查看原理图,获取硬件连接信息;
  3. 根据硬件连接信息添加设备树;
  4. 编写驱动程序;
  5. 调试。

调试过程

对上述关键步骤进行详细描述,尽量有理有据,讲清楚修改缘由。

步骤一

查询bl8025芯片数据手册,获取通信协议:

  1. bl8025采用i2c协议进行通信,bl8025作为从设备;
    在这里插入图片描述

  2. 获取bl8025从设备地址为0x32;
    在这里插入图片描述

3 .获取bl8025寄存器以及寄存器描述信息。

步骤二

查看原理图,获取硬件连接信息:

1、从硬件连接情况可知,rk3568使用i2c2通道与bl8025模块进行通信;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgNalNPI-1647411607198)(http://192.168.16.46:4999/server/index.php?s=/api/attachment/visitFile/sign/9674c934d9756d30101a9c0832601fad)]

在这里插入图片描述

2、bl8025的硬件中断信号连接到rk3568的GPIO1_B1引脚;
在这里插入图片描述

步骤三

根据硬件连接信息添加设备树:

  1. 添加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>;
	    };
	};
};

步骤四

编写驱动程序

  1. 源码目录
    drivers/rtc/rtc-bl8025.c

  2. Makefile中添加bl8025模块编译命令:(drivers/rtc/Makefile)
    obj-$(CONFIG_RTC_DRV_BL8025T) += rtc-bl8025.o

  3. 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.

  4. 开启i2c编译选项
    在这里插入图片描述

  5. 开启bl8025模块编译选项
    在这里插入图片描述

步骤五

调试

编译测试代码

  1. 测试代码路径:
    tools/testing/selftests/rtc/rtctest.c
    tools/testing/selftests/rtc/setdate.c

  2. 修改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-

  3. 编译出测试应用程序
    在这里插入图片描述

  4. 测试
    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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值