I.MX6U嵌入式Linux Platform设备驱动开发(5)RTC驱动

1、Linux 内核 RTC 驱动简介

RTC 设备驱动是一个标准的字符设备驱动,应用程序通过 open、release、read、write 和 ioctl等函数完成对 RTC 设备的操作。

Linux 内核将 RTC 设备抽象为 rtc_device 结构体,因此 RTC 设备驱动就是申请并初始化rtc_device,最后将 rtc_device 注册到 Linux 内核里面。

用一个操作集合(结构体:rtc_device)来表示RTC 设备的操作,此结构体定义在 include/linux/rtc.h 文件中。重点关注 ops 成员变量,是一个 rtc_class_ops 类型的指针变量,为 RTC 设备的最底层操作函数集合,包括从 RTC 设备中读取时间、向 RTC 设备写入新的时间值等。并不是提供给应用层的file_operations 函数操作集。

RTC 是个字符设备,那么肯定有字符设备的 file_operations 函数操作集,Linux 内核提供了一个 RTC 通用字符设备驱动文件,文件名为 drivers/rtc/rtc-dev.c。

应用程序可以通过 ioctl 函数来设置/读取时间、设置/读取闹钟的操作,那么对应的 rtc_dev_ioctl 函数就会执行,rtc_dev_ioctl 最终会通过操作 rtc_class_ops 中的 read_time、set_time 等函数来对具体 RTC 设备的读写操作。

在这里插入图片描述
当 rtc_class_ops 准备好以后需要将其注册到 Linux 内核中,使用如下函数:

struct rtc_device *rtc_device_register(const char *name, struct device *dev, const struct rtc_class_ops *ops, struct module *owner)

当卸载 RTC 驱动的时候需要调用 rtc_device_unregister 函数来注销注册的 rtc_device,函数原型如下:

void rtc_device_unregister(struct rtc_device *rtc)

2、I.MX6U 内部 RTC 驱动分析

I.MX6U 的 RTC 驱动我们不用自己编写,原厂是怎么编写 RTC 驱动的??

设备树文件,打开imx6ull.dtsi在里面找到snvs_rtc设备节点,

1 snvs_rtc: snvs-rtc-lp {
2 	compatible = "fsl,sec-v4.0-mon-rtc-lp";
3 	regmap = <&snvs>;
4 	offset = <0x34>;
5 	interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 20
					IRQ_TYPE_LEVEL_HIGH>;
6 };

设置兼容属性 compatible 的值为“fsl,sec-v4.0-mon-rtc-lp”,因此在 Linux 内核源码
中搜索此字符串即可找到对应的驱动文件,此文件为 drivers/rtc/rtc-snvs.c。在这个文件中能够找到rtc设备platform驱动框架,当设备和驱动匹配成功以后 snvs_rtc_probe 函数就会执行。

3、 RTC 时间查看与设置

(1)时间RTC查看:
RTC 是用来计时的,因此最基本的就是查看时间,Linux 内核启动的时候可以看到系统时钟设置信息。

/ # date   //查看时间

(2)设置RTC时间

/ # date --help
/ # date -s "2019-08-31 18:13:00"
/ # date

注意:date -s 仅仅是将当前系统时间设置了,此时间还没有写入到I.MX6U 内部 RTC 里面或其他的 RTC 芯片里面,因此系统重启以后时间又会丢失。

/ # hwclock -w //将当前系统时间写入到 RTC 里面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值