【全志T113】RTC时钟芯片PCF8563移植驱动流程记录

目录

1. 环境

2. 前言

3. 硬件设计

4. 内核配置

4.1 启用debug

4.2 关闭系统自带rtc

4.3 启用pcf8563驱动支持

5. 在设备树中配置rtc设备节点

5.1 确认i2c引脚配置

5.2 添加设备节点

小课堂:关于reg的计算方式

5.3 确认驱动成功

5.4 联网后校准系统时间

5.5 查看和设置rtc时钟

6. 过程中遇到的问题

6.1 系统提示low voltage detected, date/time is not reliable.

6.2 开机后系统时间还原为1970年

7. 参考资料


1. 环境

  • 芯片:全志T113
  • 内核:Linux TinaLinux 5.4.61
  • 系统:T113-S3 Tina5.0

2. 前言

硬件部门交付的主板上外挂了一颗RTC时钟芯片PCF8563,我需要实现pcf8563的驱动、外部rtc同步到系统、开机自动同步时间等工作。

这类时钟芯片大多数是通过i2c通讯和soc进行连接,而且linux内核自带了pcf8563的驱动,如果顺利的话,开发起来是非常顺利的。但是由于不熟悉流程,所以踩了很多坑,写下来作为记录供后人参考。

3. 硬件设计

外围电路参考

对比当前原理图设计,符合参考设计

所以我们的工作就是通过i2c读取时钟芯片寄存器来获取时间,连接方式:

RTC_I2C2_SCL -> PG14

RTC_I2C2_SDA -> PG15

4. 内核配置

进入kernel_menuconfig

make kernel_menuconfig

跳转到

->Device Driver

->Real Time Clock

4.1 启用debug

在系统初始化和调用rtc时能显示debug信息

往下看到Allwinner sunxi RTC,这是系统内置rtc

可以看到默认启用了系统内置的rtc以及两个附加功能,我选择了把内置时钟关掉,这样以后在系统中不会出现两个rtc设备,避免后续使用错误

4.2 关闭系统自带rtc

4.3 启用pcf8563驱动支持

注意不要选错成相近的型号。

不管是NXP的还是飞利浦的PCF8563,都是选这个8563,不同厂商的同型号料一般是pin to pin,引脚和功能都是一样的

内核配置结束,保存退出

5. 在设备中配置rtc设备节点

5.1 确认i2c引脚配置

查看原理图,外部rtc的i2c线连接到了i2c2

参考【全志T113-S3_100ask】6-编写IIC驱动GY-302(twi)_全志twi-CSDN博客

得知i2c2,也就是设备树中的twi2

查看T113芯片手册,可知twi2默认是分配给引脚PE12、PE13

而原理图上分配给了PG14、PG15,位于function3功能

所以需要在板设备树board.dts中修改设备twi2_pins引脚配置为PG14、PG15

T113-Tina/device/config/chips/t113_i/configs/evb1_auto/board.dts

5.2 添加设备节点

阅读内核驱动中的pcf8563移植说明,可以知道我们应该怎么添加设备节点

T113-Tina/kernel/linux-5.4/Documentation/devicetree/bindings/rtc/pcf8563.txt

找到&twi2,在&twi2的设备树中增加pcf8563节点,并把status状态改为okay来启用

下面代码中绿色部分是增加的代码

&twi2 {
	clock-frequency = <400000>;
	pinctrl-0 = <&twi2_pins_a>;
	pinctrl-1 = <&twi2_pins_b>;
	pinctrl-names = "default", "sleep";
	twi_drv_used = <1>;
	dmas = <&dma 45>, <&dma 45>;
	dma-names = "tx", "rx";
	status = "okay";
+	pcf8563: pcf8563@51 {
+		status = "okay";
+		compatible = "nxp,pcf8563";
+		reg = <0x51>;	// 读a3h, 写a2h: a3 >> 1 = 0x51
+		#clock-cells = <0>;
+	};
};

小课堂:关于reg的计算方式

i2c从机地址通常由7位的二进制数值组成,但linux在实际通讯使用时会扩展为8位,在最低位拼接一位操作位,0表示写,1表示读。
比如pcf8563的从机地址从芯片文档中可知:


从机地址
十六进制0xA30xA2
二进制101000110100010

所以要取这个i2c设备的从机地址,是将0xA3或者0xA2右移一位得到

0xA3 >> 1 = 0x51
在这里插入图片描述

简单理解,就是将读写地址的二进制的最后一位去掉,再转换成16进制

10100011 -> 1010001 = 0x51
在这里插入图片描述
5.3 确认驱动成功
编译烧录后可以在开机启动日志中识别到rtc-pcf8563
在这里插入图片描述
在设备树dtsi中查看 tw2的地址 2502800
在这里插入图片描述
根据tw2的地址,查看tw2设备树

cd /sys/firmware/devicetree/base/soc@3000000/twi@2502800/
ls

能看到pcf8563@51,说明设备树rtc节点配置正确
在这里插入图片描述

ls /dev/

也能查看到rtc0设备
在这里插入图片描述
说明系统能成功识别到pcf8563

5.4 联网后校准系统时间
在联网后,使用ntp来同步网络时间到系统

ntpd -p cn.pool.ntp.org -q

在这里插入图片描述
5.5 查看和设置rtc时钟
查看rtc详细信息

cat /proc/driver/rtc

在这里插入图片描述
查看rtc时间

hwclock -r

设置rtc时间与系统时间同步

hwclock -w

在这里插入图片描述
掉电后启动设备,测试外部rtc时间保存正常,也成功同步到了系统,验证pcf8563调试成功
在这里插入图片描述
在这里插入图片描述
6. 过程中遇到的问题

6.1 系统提示low voltage detected, date/time is not reliable.
参考RTC时钟操作记录_rtc-pcf8563 0-0051: low voltage detected-CSDN博客

搜索得知是rtc掉电检测器生效,pcf8563首次操作前处于未初始化状态、或者是出现过电压过低的情况会报这个错,表示rtc时间不再可信

寄存器VL位置被置为高

查看pcf8563芯片手册可确认原理
在这里插入图片描述
使用hwclock命令写入rtc一次即可解决
在这里插入图片描述
使用hwclock命令写入rtc一次即可解决
在这里插入图片描述
6.2 开机后系统时间还原为1970年
排查内核配置是否有启用这个开机自动从外部RTC同步时间的选项
在这里插入图片描述
也可以排查一下RTC开机后的时间是否还原为1970年,如果是的话,大概率是RTC是内部的,外部RTC没驱动起来,所以一掉电内部RTC就丢时间了。所以在一开始要把内部RTC关闭掉,这样 /dev/rtc0 这个设备一定是外部的,如果连 /dev/rtc0 设备都没有的话那就说明外部rtc没有成功驱动,重点排查i2c接口引脚定义是否正确、是否在内核配置中启用驱动支持。

RTC 驱动会注册生成串口设备/dev/rtcN,如果关闭了内置的rtc的话,只会有一个外部的rtc0
在这里插入图片描述

<think>好的,用户需要关于全志T113_i芯片在Linux环境下移植蓝牙驱动并进行功能测试的技术总结概要。首先,我需要回顾一下全志T113_i的相关资料和已有的驱动移植案例。 根据引用[1],全志T113RTC驱动移植流程中,提到了内核文档中的设备树绑定说明。这说明在移植外设驱动时,设备树节点的正确配置是关键步骤。同样,蓝牙驱动移植可能也需要类似的步骤,比如修改设备树、配置内核驱动等。 引用[2]中提到,应用开发中可以借鉴成熟的驱动和例程,遇到问题应多方求助。因此,在蓝牙驱动移植过程中,参考现有的蓝牙驱动实现,如Linux内核中的标准蓝牙协议栈(如BlueZ)或全志提供的参考代码,会是有效的方法。此外,可能需要依赖社区资源或全志的技术支持来解决潜在问题。 引用[3]提供了全志T113-i的芯片资料链接,这可能是获取硬件相关信息的必要来源,比如芯片的GPIO配置、UART或SDIO接口用于蓝牙模块的连接方式等。需要确认蓝牙模块的硬件接口类型(如UART、USB、SDIO),并在设备树中正确配置对应的引脚和控制器。 接下来,思考技术总结的结构。通常应包括硬件环境准备、内核配置与驱动移植、设备树修改、功能测试步骤、问题排查等部分。需要确保每个步骤都符合Linux驱动开发的标准流程,并结合全志芯片的具体情况。 可能的挑战包括:蓝牙模块的兼容性、内核配置选项的依赖关系、设备树节点编写的正确性,以及测试过程中可能出现的协议栈问题。需要参考类似驱动(如RTC驱动)的移植经验,确保驱动加载和硬件识别正常。 最后,生成相关问题时要围绕蓝牙驱动移植的扩展内容,如调试工具、协议栈配置、功耗优化和多模块共存问题,这些都是实际开发中可能遇到的后续步骤。</think>### 全志T113_i芯片 Linux蓝牙驱动移植及测试技术总结概要 #### 1. **硬件环境准备** - **蓝牙模块选型**:确认使用的蓝牙芯片型号(如RTL8723DS、BCM43438等),需与Linux内核驱动兼容[^1]。 - **接口配置**:根据硬件设计,确定蓝牙模块与T113_i的连接方式(如UART、SDIO或USB),并在设备树中配置对应引脚复用和时钟。 #### 2. **内核驱动配置** - **启用蓝牙协议栈**:通过`make menuconfig`启用内核蓝牙子系统(`CONFIG_BT`)、协议支持(如`CONFIG_BT_HCIUART`)及芯片专用驱动[^2]。 - **设备树节点添加**:参考内核文档(如`Documentation/devicetree/bindings/net/bluetooth/`)编写节点,示例: ```dts &uart3 { status = "okay"; bluetooth { compatible = "realtek,rtl8723ds-bt"; device-wake-gpio = <&pio PH 5 GPIO_ACTIVE_HIGH>; // 硬件具体引脚 }; }; ``` #### 3. **驱动移植与编译** - **源码适配**:若使用第三方驱动(如厂商提供SDK),需调整代码兼容性(如GPIO操作、时钟频率)。 - **编译与加载**:将驱动编译为模块(`.ko`)或直接内置,通过`insmod`加载后,使用`hciconfig -a`检查设备识别状态[^3]。 #### 4. **功能测试流程** - **基础通信验证**: ```bash hciconfig hci0 up # 启用蓝牙接口 hcitool scan # 扫描周边设备 bluetoothctl # 进入交互模式配对测试 ``` - **数据传输测试**:使用`obexftp`或自定义脚本测试文件传输,验证吞吐量及稳定性。 #### 5. **常见问题与解决** - **驱动加载失败**:检查设备树节点与硬件实际连接的匹配性(如UART编号、GPIO极性)。 - **无法识别设备**:确认内核日志(`dmesg`)中HCI层初始化是否完成,排查供电或中断配置问题。 - **协议栈兼容性**:若BlueZ版本过低,需升级至5.55+以支持BLE等新特性。 #### 6. **优化方向** - **低功耗配置**:通过设备树或运行时参数调整睡眠模式(如`hci0 down`时进入省电状态)。 - **多模块共存**:若WiFi与蓝牙共用SDIO总线,需在驱动中协调资源冲突(如`mmc1`分时复用)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值