pcf8563驱动的加载
引言
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分钟后的时间相同