RTC子系统内核文档

============================================
译者:yuanlulu
http://blog.csdn.net/yuanlulu

版权没有,但是转载请保留此段声明
============================================

RTC内核文档 英文原文地址:http://lxr.linux.no/linux+v2.6.38/Documentation/rtc.txt
用户空间使用RTC的例程在:http://lxr.linux.no/linux+v2.6.38/Documentation/rtc.txt#L216

Real Time Clock (RTC) Drivers for Linux

=======================================

Linux有两个基本兼容的用户空间RTC API家族:

     */dev/rtc 这是PC系统提供的兼容接口,不适用于非x86的系统

     */dev/rtc0 /dev/rtc1   这是大部分系统支持的形式。

虽然所有的RTC适用同样的API和RTC架构交互,但是硬件提供的功能并不一样。

比如不是所有的RTC都产生中断,所以它们不能做闹钟定时。

(在fedora 上/dev/rtc是一个指向/dev/rtc0的链接)

老式PC/AT兼容驱动:/dev/rtc

----------------------------------------

     /dev/rtc(主设备号10,次设备号135,只读字符设备)的中断以unsigned int的格式报告。最低的两字节包含中断类型(update-done, alarm-rang, or periodic),

剩下的字节包含自上次读取以来中断的次数。如果使能了proc文件系统,在/proc/driver/rtc下能读到中断的状态信息。由于驱动占有了锁,所以同一时间只能有

     一个进程占有/dev/rtc。

     用户进程可以使用read(2)或者select(2)监视/dev/rtc-它们都将阻塞在设备节点上直到下一个中断的到来。

     只有root用户能在dev/rtc上使用大于64HZ的中断。这个值可以通过往/proc/sys/dev/rtc/max-user/freq写入新的值来改变。记住中断处理函数应该尽可能简短。

     内核使用额外的代码来和RTC进行同步-内核每11分钟就将自己的时间写回CMOS。在回写的时候内核会关闭RTC的周期中断,

     所以依赖RTC周期中断的重要工作需要特别注意这一点。如果你的内核不和RTC进行同步,内核不会访问RTC,你可以把RTC做其它的用处。

     中断的频率是通过ioctl(2)调用/include/linux/rtc.h中的命令来设置的。

新式的“RTC class”接口:/dev/rtcN

----------------------------------------------

     由于linux支持的一些非ACPI和非PC平台有不止一个RTC,所以需要更具有可移植性的解决方案。

一种新的“RTC类”框架就是为此而生的,它支持三类用户空间接口:

     */dev/rtcN                和老式的/dev/rtc接口大体相同。

     */sys/class/rtc/rtcN     sysfs支持只读的访问RTC属性。

     */proc/driver/rtc             第一个RTC(rtc0)可以从procfs中暴露自己的更多信息(比sysfs多)。

    新的RTC class框架支持多种RTC,包括片上RTC和使用i2c、spi等接口的独立芯片。甚至支持在最新

的PC上通过ACPI暴露的特性。

     新的框架不再受"每个系统一个RTC”的约束。比如系统中可以有一个电池供电的低功耗i2c RTC芯片

和一个高性能的片上RTC。系统可以从外置的RTC读取时间,其它的任务或许需要从高性能的片内RTC。

SYSFS 接口

------

     sysfs接口在/sys/class/rtc/rtcN 下,可以直接访问。所有的数据和时间都是RTC的时区决定的,

而不是系统时间的时区

     

     date:                         日期:年月日

     hctosys:                    1:RTC在系统启动的时候通过CONFIG_RTC_HCTOSYS设置系统时间

                                        0:其它

     max_user_freq:         一般用户(不是root)能从RTC申请的最大中断速率。

     name:                         映射到这个目录的RTC的名字

     since_epoch:          和c函数time返回的值意义是一样的。

     time:                         时分秒。

     wakearm:               下一次系统唤醒事件的时间点。这个唤醒事件是一次性的,所以要多次唤醒的话需要在每次

                                        唤醒后重新设置。格式是下次唤醒的    since_epoch值,或者在开头有一个“+”号的话,表示

                                        未来多少秒后发生唤醒事件。

IOCTL接口

--------------

/dev/rtc支持的ioctl()接口同样支持新的RTC框架。

          * RTC_RD_TIME, RTC_SET_TIME      读取和设置时间。传递时间的参数是struct
rtc_time结构体。

          * RTC_AIE_ON, RTC_AIE_OFF, RTC_ALM_SET, RTC_ALM_READ    alarm中断的开启、关闭、设置、读取。

               如果RTC和某个中断线相连,它可以在未来24小时内的某个时间段内产生中断。

               (建议优先使用RTC_WKALM_*)

          * RTC_WKALM_SET, RTC_WKALM_RD     设置和读取 wakeup alarm触发的时间点。wakeup alarm和alrm

               中断唯一不同的是wakeup alrm可以申请超过24小时的定时中断。

          * RTC_UIE_ON, RTC_UIE_OFF     更新中断,每秒钟触发一次(更新的时候触发,因此每秒一次)。

          * RTC_PIE_ON, RTC_PIE_OFF, RTC_IRQP_SET, RTC_IRQP_READ      周期中断的开启、关闭、设置、读取。

                      周期中断的频率必须是2^N(N>= 1),大于64的频率只有root用户才能设置。

          RTC_AIE_ON, RTC_AIE_OFF可以开启和关闭alarm和wake alarm的功能)

yuanlulu的补充:

       * RTC_RD_TIME, RTC_SET_TIME的参数是一个struct rtc_time的指针。它的各个成员的含义和struct
tm是一样的。

                    struct rtc_time {

                    int tm_sec;
                    int tm_min;
                    int tm_hour;
                    int tm_mday;
                    int tm_mon;
                    int tm_year;
                    int tm_wday;
                    int tm_yday;

                    int tm_isdst;

               };      

           * RTC_WKALM_SET, RTC_WKALM_RD wakeup_alarm和alarm中断的实现方式是一样的,参数struct
rtc_wkalrm指针,

                    只是wake_alarm没有时间限制,可以指定未来任意时刻发生中断。

                                        struct rtc_wkalrm {
                                        unsigned char enabled;     /* 0 = alarm disabled, 1 = alarm enabled */
                                        unsigned char pending;  /* 0 = alarm not pending, 1 = alarm pending */
                                        struct rtc_time time;     /* time the alarm is set to */
                                   };

              * RTC_ALM_SET, RTC_ALM_READ 的传递参数也是struct
rtc_time的指针,但只有时分秒的部分有效。时分秒

               这三个成员代表24小时以内的时间点。比如当前时间是13:00:00,而传入的参数是14:00:00,则意味着定时中断

               将在一小时后发生。而如果传入的参数是12:00:00,则意味着明天中午发生中断。总之,alarm 中断不能超过

               24小时。

                              

              *
RTC_IRQP_SET, RTC_IRQP_READ 周期中断的参数是中断频率,参数必须是2^N(N>=1),也就是说

                         设置的周期中断必须大于2。并且只有root用户可以设置64HZ以上的频率。

     

RTC的中断方式有三类:

     1.更新中断,也就是RTC的时间更新的时候触发的中断。RTC每秒钟更新一次,所以更新中断的频率就是1。

     2.周期中断。频率可以设置为2^N(N>=1)。注意周期中断频率不可设置为1,否则会被忽略。

      3. alarm/wake alarm。这两个中断内部实现是一样的,只不过前者只能指定24小时内的某一时刻触发中断,后者没有限制。

 中断被触发后,可以从RTC设备节点中读取到一个unsigned long数据,最低两比特表示中断的类型。各bit的定义如下:

/* interrupt flags */
#define RTC_IRQF 0x80 /* any of the following is active */
#define RTC_PF 0x40          //周期中断
#define RTC_AF 0x20          //定时中断(alarm和wakeup alarm中断)
#define RTC_UF 0x10          //更新中断

再说RTC中断:RTC的中断概念和内核中的中断不是一回事,没有中断回调函数。但是在设备节点上使用select和read

          睡眠的函数会被唤醒,这就是RTC中断的功能。

另外RTC的设备节点,同一时刻只允许一个用户打开。不可能两个用户同时打开同一个RTC设备设备节点。

经过测试,有以下结论:

     1.更新中断(1HZ)和周期中断可以同时开启。

     2.周期中断可以和alarm中断同时开启。

     3.alarm中断不可以和wakeup alarm中断同时开启,因为他们两个在内核中就是一回事。

     
4..RTC_WKALM_SET不必设置struct
rtc_wkalrm的enabled成员,只在读取的时候才需要这个成员。 

猜测:更新中断和可以和alarm中断同时开启。

          

 从RTC设备节点读取到的数据,包含了上次读取以来发生中断的次数(包括所有类型的中断)。

低字节会置位发生的所有中断类型。

时间: 2024-09-20 00:46:26

RTC子系统内核文档的相关文章

Linux内核官方文档atomic_ops.txt【摘自Linux 内核文档】

摘自Linux内核文档 Documentation/atomic_ops.txt,不是本人原创 Semantics and Behavior of Atomic and Bitmask Operations David S. Miller This document is intended to serve as a guide to Linux port maintainers on how to implement atomic counter, bitops, and spinlock i

内核中的多点触摸协议文档 Multi【转】

转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Android 系统有所偏重的.于是便仔细阅读了一下内核文档中关于多点触摸协议的介绍. 多点触摸的信息,是触摸屏这样的触摸设备向 input core 上报 MT 消息传递的.这些 MT消息,可以通过 设备文件的接口,被应用程序读取到. 整个消息传递过程,以及 上层应用程序(DirectFB / Xorg

一些不错的文档网址--笔记【原创】

一些不错的内核文档网址 1. 轻松认识 Linux Kernel 转自:http://www.bricktou.com/default_cn.html  git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git reset v4.0 -hard http://www.infradead.org/~mchehab/kernel_docs/index.html 2. Linux Device Dr

linux内核源码及对应参考文档(1)

内核文件结构:内核源码:http://www.oldlinux.org/Linux.old/kernel/0.1x/ 内核 交互结构 内核参考文档 

Oracle AWR报告详细分析 (文档 ID 1523048.1)

Oracle AWR报告详细分析  (文档 ID 1523048.1) AWR 是 Oracle  10g 版本 推出的新特性, 全称叫Automatic Workload Repository-自动负载信息库 AWR 是通过对比两次快照(snapshot)收集到的统计信息,来生成报表数据,生成的报表包括多个部分. WORKLOAD REPOSITORY report for  DB Name DB Id Instance Inst num Release RAC Host ICCI 13140

【MOS】RAC 环境中 gc block lost 和私网通信性能问题的诊断 (文档 ID 1674865.1)

[MOS]RAC 环境中 gc block lost 和私网通信性能问题的诊断 (文档 ID 1674865.1) 文档内容 症状   概要:   场景:   原因:   Global Cache Block Loss诊断指南 更改 原因 解决方案 参考 适用于: Oracle Database - Enterprise Edition - 版本 9.2.0.1 和更高版本本文档所含信息适用于所有平台Oracle Clusterware & Oracle Real Application Clu

word文档-如何在360浏览器中直接 打开word文件 ?

问题描述 如何在360浏览器中直接 打开word文件 ? 在IE浏览器中可以.碰到WORD文档,自动就下载了!为什么? 解决方案 需要有浏览器插件,IE一般有OFFICE插件,所以可以直接打开 解决方案二: 因为360是非法流氓软件,它根本就是粗陋地用IE的内核拼凑了一个山寨的浏览器,做一个稍微有点用的软件功能只是它实施违法犯罪侵害用户计算机和数据的幌子而已. 解决方案三: 这个好像需要转换吧.吧word转成pdf格式的然后在线显示!

如何写软件设计文档

软件设计的不同模型:瀑布式.快速原型法以及迭代式 自从1968年提出"软件工程"概念以来,软件开发领域对于借鉴传统工程的原则.方法,以提高质量.降低成本的探索就从未停止过.而在这个过程中,提出了许多不同的软件开发模型,典型的有:瀑布式,快速原型法,以及迭代式开发等. 瀑布式模型 是由W.W.Royce在1970年最初提出的软件开发模型,在瀑布模型中,开发被认为是按照需求分析,设计,实现,测试 (确认), 集成,和维护顺序的进行. 快速原型法 快速原型模型的第一步是建造一个快速原型,实现

Oracle文档阅读指南

Oracle官方文档数量庞大,而且往往没有侧重点,让oracle新手看起来很费力.但是,仍有很多 Oracle使用者认为任何oracle学习资料都比不上Oracle官方文档的权威和扼要,且兼具基础与全面. 这种差异可能与个人的阅读方法有很大关系,本文将为您提供一些可供参考的Oracle官方文档阅读方 法. 如何读Reference? Reference意思是参考,向产品使用说明书一样包罗万象,建议无需精读,碰到问题时速查即可 Oracle基础入门必读文档:Oracle Database Conc