linux RTC时钟时间出现了明显的偏移

RTC时钟时间出现了明显的偏移

1、开发环境

平台:imx6ul

kernel版本:linux4.1.5

RTC芯片:PCF85063

硬件电路图如下所示

2、问题阐述

硬件时钟RTC往往是用作系统在掉电后,用纽扣电池维持硬件时钟继续运转时间。待系统起来后,再将硬件时间同步到系统时间上。

所以,硬件时间是否准确就很重要了。最近发现一款RTC芯片PCF85063,稍微运行个3-4个小时,就会跟系统时间出现明显的时间偏移(大概是2-3秒),按这个计算一天就12秒左右了。这是完全不可以接受的。

影响时间不准有几大因素:

1、输入时钟(晶振)

2、芯片本身

3、芯片电压不稳定

4、硬件电路问题

接下来我们去验证

3、验证问题

3.1、首先去排查了硬件电路和芯片电压不稳定的问题。
3.2、晶振的问题。

不同的晶振输出的频率都会有所差异,比如同样是32.768KZ的不同型号的晶振,在同一个板子上,分别会出现快了5秒和慢了3秒的情况。

经过实验,分别换电路图中晶振的负载电容,比如5pf,7pf,12.5pf,15pf,22pf。确实是会出现不用程度的时间偏移,

但优化程度远远没有达到目标偏移值。

3.3、芯片本身

将芯片放在其他不同型号,封装一样,稳定的板子上测试,这里我推荐是pcf8563,这里基本上可以推测出是晶振还是芯片的问题了。

3.4、芯片寄存器

查看一下这个型号的手册,发现这个RTC芯片比较特殊,居然有个偏移寄存器PPM。

可以通过这个寄存器去校正晶振频率带来的频移。从而使芯片大约1秒滴答一次。

寄存器说明如下所示,默认为0x00

我个人把这个称为低功耗模式,另一个是性能模式。为什么这么说。一个是2个小时偏移一次,另一个是4分钟偏移一次。通过不断实验对比,得到较为稳定的值即可。

4、代码修改

通过实验得到偏移寄存器的偏移值,再通过pcf85063.c驱动代码的形式写进去即可,如下所示。

bash 复制代码
static int pcf85063_rtc_mode(struct device *dev, unsigned int arg, unsigned long cmd)
{
	struct i2c_client *client = to_i2c_client(dev);
	unsigned char buf[2];
	unsigned char val;
	int err;

	buf[0] = arg;
	buf[1] = cmd;
	err = i2c_master_send(client, buf, sizeof(buf));
	if(err != sizeof(buf)) {
		dev_err(&client->dev, \
				"%s: err=%d addr=%02x, data=%02x\n",
				__func__, err, buf[0], buf[1]);
			return -EIO;
	}
		

	return 0;
}
bash 复制代码
static int pcf85063_probe(struct i2c_client *client,
				const struct i2c_device_id *id)
{
//......省略
	ret = device_create_file(&client->dev, &dev_attr_clk_out_ctl);
	if(ret != 0)
		dev_err(&client->dev, "%s: device create file err\n", __func__);

	pcf85063_rtc_ioctl(&client->dev, CLKOUT_OFF, 0);
	+ pcf85063_rtc_mode(&client->dev, 0x02, 0xe0);
	return PTR_ERR_OR_ZERO(pcf85063->rtc);
}
相关推荐
嘉禾望岗5034 分钟前
lvs+keepalived轮询访问doris集群
linux·服务器·lvs
沐欣工作室_lvyiyi4 分钟前
基于单片机的校园路灯智能控制系统(论文+源码)
单片机·嵌入式硬件·毕业设计·校园路灯
_OP_CHEN5 分钟前
【Linux系统编程】(十)从入门到精通!Linux 调试器 gdb/cgdb 超全使用指南,程序员必备调试神器
linux·运维·c/c++·linux开发工具·调试器·gdb/cgdb
本妖精不是妖精5 分钟前
在 CentOS 7 上部署 Node.js 18 + Claude Code
linux·python·centos·node.js·claudecode
李少兄6 分钟前
在 Linux 中精准查找名为 `xxx` 的文件或目录路径
android·linux·adb
不会kao代码的小王8 分钟前
突破局域网!OpenObserve,数据观测随时随地
linux·windows·后端
老条码新物联数字派9 分钟前
【学习Linux】 乌班图(UBuntu)和Linux
linux·运维·ubuntu
Lynnxiaowen9 分钟前
今天继续学习Kubernetes内容namespace资源对象和pod简介
linux·运维·学习·容器·kubernetes
纳米软件13 分钟前
电源芯片的欠压锁定如何测试,需要哪些设备?-纳米软件
自动化测试·单片机·嵌入式硬件
我在人间贩卖青春13 分钟前
输入输出相关命令
linux·输入输出