RTC - Linux手册页

时间:2019-08-20 18:01:47  来源:igfitidea点击:

Linux程序员手册 第4部分
更新日期: 2017-09-15

名称

rtc-实时时钟

语法

#包括

int ioctl(fd,RTC_request,param);

说明

这是实时时钟(RTC)驱动程序的接口。

大多数计算机都有一个或多个记录当前"挂钟"时间的硬件时钟。这些称为"实时时钟"(RTC)。其中之一通常具有备用电池,因此即使计算机关闭,它也可以跟踪时间。 RTC通常会提供警报和其他中断。

所有i386 PC和基于ACPI的系统都具有与原始PC / AT上的Motorola MC146818芯片兼容的RTC。如今,这样的RTC通常集成在主板的芯片组(南桥)中,并使用可更换的硬币大小的备用电池。

非PC系统(例如,围绕片上系统处理器构建的嵌入式系统)使用其他实现。它们通常不会提供与PC / AT的RTC相同的功能。

RTC vs system clock

RTC不应与系统时钟混淆,系统时钟是内核维护的软件时钟,用于实现gettimeofday(2)和time(2)以及在文件上设置时间戳等等。系统时钟报告从起始点开始的秒数和微秒数,该起始点定义为POSIX纪元:1970-01-01 00:00:00 +0000(UTC)。 (一种常见的实现方式是每个"抖动"以100、250或1000 Hz的频率对计时器中断进行计数。)也就是说,它应该报告挂钟时间,而RTC也会这样做。

RTC与系统时钟之间的主要区别在于,即使系统处于低功耗状态(包括"关闭"),RTC仍可以运行,而系统时钟则不能。在初始化之前,系统时钟只能报告自系统启动以来的时间,而不能报告自POSIX时代以来的时间。因此,在启动时以及从系统低功耗状态恢复后,系统时钟通常会使用RTC设置为当前的挂钟时间。没有RTC的系统需要使用另一个时钟来设置系统时钟,这可能是通过网络或通过手动输入该数据。

RTC functionality

可以使用hwclock(8)或直接使用下面列出的ioctl(2)请求来读写RTC。

除了跟踪日期和时间,许多RTC还可生成中断

*
每次时钟更新(即每秒一次);
*
以周期性间隔,其频率可以设置为2 Hz至8192 Hz范围内的任何2的幂的倍数;
*
在达到先前指定的警报时间时。

这些中断源中的每一个都可以分别启用或禁用。在许多系统上,警报中断可以配置为系统唤醒事件,它可以从低功耗状态(例如Suspend-to-RAM(STR,在ACPI系统中称为S3),休眠(在ACPI系统中称为S4)恢复系统。 ),甚至"关闭"(在ACPI系统中称为S5)。在某些系统上,电池供电的RTC无法发出中断,但另一个可以发出中断。

/ dev / rtc(或/ dev / rtc0,/ dev / rtc1等)设备只能打开一次(直到关闭),并且它是只读的。在read(2)和select(2)上,调用过程被阻塞,直到收到来自该RTC的下一个中断为止。在中断之后,进程可以读取一个长整数,该整数的最低有效字节包含一个位掩码,该位掩码对发生的中断类型进行编码,而其余3个字节包含自上次read(2)以来的中断数。

ioctl(2) interface

在连接到RTC设备的文件描述符上定义了以下ioctl(2)请求:

RTC_RD_TIME
以以下结构返回此RTC的时间:
struct rtc_time {
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;     /* unused */
    int tm_yday;     /* unused */
    int tm_isdst;    /* unused */
};
该结构中的字段与gmtime(3)中描述的tm结构具有相同的含义和范围。指向此结构的指针应作为第三个ioctl(2)参数传递。
RTC_SET_TIME
将此RTC的时间设置为第三个ioctl(2)参数指向的rtc_time结构指定的时间。要设置RTC的时间,该过程必须具有特权(即具有CAP_SYS_TIME功能)。
RTC_ALM_READ, RTC_ALM_SET
对于支持警报的RTC,读取并设置警报时间。必须使用RTC_AIE_ON,RTC_AIE_OFF请求分别启用或禁用警报中断。第三个ioctl(2)参数是指向rtc_time结构的指针。仅使用此结构的tm_sec,tm_min和tm_hour字段。
RTC_IRQP_READ, RTC_IRQP_SET
读取并设置周期性中断的频率,以及支持周期性中断的RTC的频率。必须使用RTC_PIE_ON,RTC_PIE_OFF请求分别启用或禁用定期中断。第三个ioctl(2)参数分别是无符号long *或无符号long。该值是每秒中断的频率。允许的频率集是2到8192范围内的两个的倍数。只有特权进程(即,具有CAP_SYS_RESOURCE功能的进程)才能将频率设置为高于/ proc / sys / dev / rtc / max-user中指定的值-频率(此文件默认情况下包含值64。)
RTC_AIE_ON, RTC_AIE_OFF
为支持警报的RTC启用或禁用警报中断。第三个ioctl(2)参数将被忽略。
RTC_UIE_ON, RTC_UIE_OFF
对于支持此每秒中断一次的RTC,在每次时钟更新时启用或禁用该中断。第三个ioctl(2)参数将被忽略。
RTC_PIE_ON, RTC_PIE_OFF
为支持这些定期中断的RTC启用或禁用定期中断。第三个ioctl(2)参数将被忽略。如果当前将频率设置为高于/ proc / sys / dev / rtc / max-user-freq中指定的值,则只有特权进程(即具有CAP_SYS_RESOURCE功能的进程)才能启用周期性中断。
RTC_EPOCH_READ, RTC_EPOCH_SET
许多RTC在8位寄存器中对年份进行编码,该寄存器要么解释为8位二进制数,要么解释为BCD数。在这两种情况下,数字都是相对于该RTC的纪元来解释的。在大多数系统上,RTC的纪元被初始化为1900,但在Alpha和MIPS上,它也可能被初始化为1952、1980或2000,具体取决于年份中RTC寄存器的值。对于某些RTC,这些操作可分别用于读取或设置RTC的纪元。第三个ioctl(2)参数分别是无符号long *或无符号long,返回(或分配)的值是纪元。要设置RTC的纪元,必须授予该进程特权(即具有CAP_SYS_TIME功能)。
RTC_WKALM_RD, RTC_WKALM_SET
某些RTC支持更强大的警报接口,使用这些ioctl通过以下结构分别读写RTC的警报时间:
struct rtc_wkalrm {
    unsigned char enabled;
    unsigned char pending;
    struct rtc_time time;
};
enabled标志用于启用或禁用警报中断,或读取其当前状态。使用这些调用时,不使用RTC_AIE_ON和RTC_AIE_OFF。 RTC_WKALM_RD使用挂起标志来报告挂起的中断(因此,在Linux上几乎没有用,除了与EFI固件管理的RTC通话时)。时间字段与RTC_ALM_READ和RTC_ALM_SET一起使用,除了tm_mday,tm_mon和tm_year字段也有效。指向此结构的指针应作为第三个ioctl(2)参数传递。

文件

/dev/rtc, /dev/rtc0, /dev/rtc1, etc.
RTC特殊字符设备文件。
/proc/driver/rtc
(第一个)RTC的状态。

备注

当使用adjtimex(2)将内核的系统时间与外部参考同步时,它将每11分钟定期更新一次指定的RTC。为此,内核必须短暂地关闭周期性中断。这可能会影响使用该RTC的程序。

RTC的纪元与POSIX纪元无关,后者仅用于系统时钟。

如果根据RTC的纪元和年份注册的年份小于1970,则假定是100年后,即2000到2069之间。

某些RTC在警报字段中支持"通配符"值,以支持诸如每小时每小时15分钟或每月第一天的定期警报之类的方案。这种用法是不可移植的;可移植用户空间代码仅预期单个警报中断,并且在接收到警报后将禁用或重新初始化警报。

一些RTC支持周期中断,周期为几秒而不是几分之一秒。多个警报;可编程输出时钟信号;非易失性存储器以及此API当前未提供的其他硬件功能。

另外参见

date(1),adjtimex(2),gettimeofday(2),settimeofday(2),stime(2),time(2),gmtime(3),time(7),hwclock(8)

Linux内核源代码树中的Documentation / rtc.txt

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/