Linux下RTC驱动的加载

  • Post author:
  • Post category:linux




引言


rtc驱动芯片为嵌入式linux系统提供系统时间,通过I2C接口挂载在开发板设备树的i2c节点上。本文简述pcf8563驱动的加载过程,其余rtc芯片的加载过程类似,并验证了rtc(pcf8563)驱动的加载。

waring:


rtc驱动本质上是一个字符设备驱动,只不过Linux内核在通用的字符设备驱动接口上引入了

RTC驱动框架

(字符设备驱动的封装)。常用rtc芯片驱动已经存放在kerner/driver/rtc/ 下,编译时通过make menuconfig 使能即可使用,其设备树下节点的配置方式可参考以下目录文件kernel/Documentation/devicetree/bindings/rtc/




i2c驱动使能与验证


由于rtc芯片常使用i2c接口,故在挂载前,需先验证i2c总线驱动是否能成功加载,使能设备树下的i2c节点,系统加载后可通过如下命令查看i2c节点的使能情况:


在执行如下命令验证IIC总线驱动时,先必须保证SDL和SCK两线为高电平(“线与”),部分I2C设备和I2C控制器分开,将上拉电阻放在设备端,故需接上I2C设备后,在用如下命令进行测试。


# 1. 查询可用的i2c设备
# i2cdetect -l
i2c-3   i2c             i2c3                                    I2C adapter

# 2. 判断总线驱动是否正常
# i2cdetect -y  3		// 依次获取该总线上,寄存器的值(0x3~0x77),如果没错误信息提示,则证明总线驱动没问题

# 3. 查看i2c总线下挂载的设备,就算驱动rtc驱动没使能,只要在设备树下添加了该节点,即可查询
 ls /sys/bus/i2c/
 
# 3. 查看pcf8563的加载
# cat /sys//bus/i2c/devices/2-0051/name
pcf8563


waring:


i2c-dev.c与SPI驱动中spidev.c类似,是内核层为用户空间提供的一条读写i2c总线数据的标准接口,其应用空间的编程接口可参考内核文档或者i2c-tools工具中的源码程序。

// 内核中i2c设备传输数据的接口主要有以下三个:
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)

int i2c_master_send(const struct i2c_client *client, const char *buf, int count)

int i2c_master_recv(const struct i2c_client *client, char *buf, int count)



rtc(pcf8563)驱动加载


1. 部分芯片内部还有rtc,故需先通过 make menuconfig关闭芯片内部的rtc驱动;

2. 往设备树i2c节点中添加rtc节点

&i2c3 {
	status = "okay";
	
	pcf8563: pcf8563@51 {
		compatible = "nxp,pcf8563";
		reg = <0x51>;
		#clock-cells = <0>;
	}
};


3. 通过 make menuconfig使能pcf8563芯片驱动;

在这里插入图片描述




rtc(pcf8563)驱动验证指令


1. 命令简介

# 显示当前的系统时间
date   
# 修改当前系统时间,为:date -s "2010-04-05 14:31:00"

# 显示当前硬件 rtc的时间(默认为rtc0)
hwclock
# hwclock -s 将硬件时间同步到系统时间
# hwclock -w 将系统时间同步到硬件时间
# hwclock -f /dev/rtc1 读取指定硬件 rtc 的时间


2. 当通过hwclock -r 命令能够成功读取rtc时,表面rtc驱动已成功加载

3. date -s 设置系统时间

4. hwclock -w 将系统时间同步到硬件时间,重启后date查看系统时间


waring:

rtc驱动没有加载成功时:

# hwclock -r
hwclock: can't open '/dev/misc/rtc': No such file or directory



实例:

板子上电
#date -s "2010-04-05 14:31:00"	 //设置系统时钟 2010 年 04 月 5 日 14:31:00 CST
#hwclock -w //将系统时钟写入硬件时钟
#hwclock -r //看时间是否在变化
如果没有出错,就已经把2010 年 04 月 5 日 14:31:00 CST 写入RTC chip了

为了使系统时间和RTC时间同步,可以在初始化文件中添加命令
hwclock –s
使每次开机时读取RTC时间,并同步给系统时间。
在根文件系统:usr/etc/rc.local中添加
/sbin/hwclock -s

断电
等2分钟在上电
#hwclock -r //看时间是否同步,即使与2分钟后的时间相同