【嵌入式Linux驱动开发】二十三、Linux RTC 驱动

  待机而举是良谋,成竹在胸方可求。
  默默无闻积实力,时成奋起定春秋。
  夕楚庄王初登位,三载不发号令休。
  不鸣则已鸣即震,一举伐齐胜徐州。


一、Linux 内核 RTC 驱动简介

  STM32 内部有一个 RTC 外设模块,这个模块需要一个32.768KHz 的晶振,对这个 RTC 模块进行初始化就可以得到一个实时时钟。 I.MX6U 内部也有个 RTC 模块,但是不叫作“ RTC”,而是叫做“ SNVS”。SNVS 直译过来就是安全的非易性存储, SNVS 里面主要是一些低功耗的外设,包括一个安全的实时计数器(RTC)、一个单调计数器(monotonic counter)和一些通用的寄存器。

   首先需要说明的是,I.MX6U 的 RTC 驱动我们不用自己编写,因为 NXP 已经写好了。其实对于大多数的 SOC 来讲,内部 RTC 驱动都不需要我们去编写,半导体厂商会编写好。我们先学会怎么使用,再来探究具体原理!

  Linux 内核将 RTC 设备抽象为 rtc_device 结构体,因此 RTC 设备驱动就是申请并初始化rtc_device,最后将 rtc_device 注册到 Linux 内核里面,这样 Linux 内核就有一个 RTC 设备的。 Linux 内核中 RTC 驱动调用流程如下图所示:

在这里插入图片描述

  当 rtc_class_ops 准备好以后需要将其注册 到 Linux 内核中,这里我们可以使 用rtc_device_register函数完成注册工作。此函数会申请一个 rtc_device并且初始化这个 rtc_device,最后向调用者返回这个 rtc_device,此函数原型如下:

//name:设备名字。
//dev: 设备。
//ops: RTC 底层驱动函数集。
//owner:驱动模块拥有者。
//返回值: 注册成功的话就返回 rtc_device,错误的话会返回一个负值。
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,函数原型如下:

//rtc:要删除的 rtc_device。
void rtc_device_unregister(struct rtc_device *rtc)

  还有另外一对 rtc_device 注册函数 devm_rtc_device_register 和devm_rtc_device_unregister,分别为注册和注销 rtc_device。

二、RTC 时间查看与设置

2.1、查看RTC时间

  RTC 是用来计时的,因此最基本的就是查看时间, Linux 内核启动的时候可以看到系统时钟设置信息,如下图所示,可以看出, Linux 内核在启动的时候将 snvs_rtc 设置为 rtc0。

在这里插入图片描述
  如果要查看时间的话输入“ date”命令即可,如下图所示,可以看出,当前时间为 1970 年 1 月 1 日00:30:11,很明显是时间不对,我们需要重新设置 RTC 时间。

在这里插入图片描述

2.2、设置RTC时间

   时间设置也是使用的 date 命令,输入“ date --help”命令即可查看 date 命令如何设置系统时间,结果如下图所示:

在这里插入图片描述
  设置当前时间为2020年04月09日 12:00:00 ,因此输入如下命令:

date -s "2020-04-09 12:00:00"

  设置完成以后再次使用 date 命令查看一下当前时间就会发现时间改过来了,如下图所示:

在这里插入图片描述

  注意我们使用“ date -s”命令仅仅是将当前系统时间设置了,此时间还没有写入到I.MX6U 内部 RTC 里面或其他的 RTC 芯片里面,因此系统重启以后时间又会丢失。我们需要将当前的时间写入到 RTC 里面,这里要用到 hwclock 命令,输入如下命令将系统时间写入到 RTC里面:

hwclock -w //将当前系统时间写入到 RTC 里面
发布了723 篇原创文章 · 获赞 1208 · 访问量 86万+

猜你喜欢

转载自blog.csdn.net/ReCclay/article/details/105406541