在别的driver里(比如 irig) ,如何操作RTC?

背景

最近客户有一个基本的需求,要保证我们的网关设备系统时间和外置的基准时间源保持一致(对时功能)。其实功能实现起来很简单,irig 基准源是按标准的 IRIG-B 的标准格式发送给出来的,我们用FPGA来接收这种标准的格式,然后进行译码,再给CPU一个中断,将时间数据发送给CPU,CPU 将时间更新到系统时间。

至于要不要将时间更新到RTC,也是经过一番讨论的,因为我们不能够限定客户的使用场景

1 网关一直始终接着 irig 设备

这时候我们认为 irig 时间源 是最可信的,只要网关上连接着irig时间源,系统时间就会和irig保持严格一致,这时候写不写RTC都是无关紧要的。不过 irig 的中断来的特别频繁(s我们用的源 ms级别的),频繁写 rtc 是会浪费系统资源的,而且频繁读写 rtc 也会影响到电池的电量的损耗,这时候我们一般不会写 rtc 

2 网关接1次 irig 设备

有的客户可能有100台网关,都需要用到对时的功能,如果这个客户财大气粗的话,可以每个网关配一台基准时钟源,但是我们又能遇到几个这样财大气粗的客户呢?那很可能客户只购买了一台时钟源,然后分别根100太网关对接一次,然后实现对时操作。

我们又不想频繁的写 rtc , 想来想去是只有第一次中断来的时候进行写 rtc 了 。。。

 

言归正传哈。。

在 Linux 源码里,我们搜索 rtc_set_time 

我们发现  drivers/rtc/interface.c 中 包含了 rtc 提供给内核和别的驱动接口,在 drivers/rtc/systohc.c 中可以看到如何使用的

我们可以在 系统的config文件中看到 

CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
CONFIG_RTC_SYSTOHC_DEVICE="rtc0"

这样怎么使用,是不是就很清晰了,有时候内核源码是我们最好的学习资料。。。