科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux操作系统内核对RTC的编程详解 (2)

Linux操作系统内核对RTC的编程详解 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Linux内核仅使用RTC芯片的时间与日期寄存器组和控制寄存器组,地址为0x00~0x09之间的10个时间与日期寄存器的定义如下

作者:赛迪网技术社区 来源:赛迪网技术社区 2007年10月26日

关键字: 内核 Linux RTC 编程

  • 评论
  • 分享微博
  • 分享邮件

7.2.2 对RTC寄存器的定义

Linux在include/linux/mc146818rtc.h这个头文件中定义了RTC各寄存器的含义。

(1)寄存器内部地址索引的定义

Linux内核仅使用RTC芯片的时间与日期寄存器组和控制寄存器组,地址为0x00~0x09之间的10个时间与日期寄存器的定义如下:

#define RTC_SECONDS 0 
#define RTC_SECONDS_ALARM 1 
#define RTC_MINUTES 2 
#define RTC_MINUTES_ALARM 3 
#define RTC_HOURS 4 
#define RTC_HOURS_ALARM 5 
/* RTC_*_alarm is always true if 2 MSBs are set */ 
# define RTC_ALARM_DONT_CARE 0xC0 

#define RTC_DAY_OF_WEEK 6 
#define RTC_DAY_OF_MONTH 7 
#define RTC_MONTH 8 
#define RTC_YEAR 9

四个控制寄存器的地址定义如下:

#define RTC_REG_A 10 
#define RTC_REG_B 11 
#define RTC_REG_C 12 
#define RTC_REG_D 13

(2)各控制寄存器的状态位的详细定义

控制寄存器A(0x0A)主要用于选择RTC芯片的工作频率,因此也称为RTC频率选择寄存器。因此Linux用一个宏别名RTC_FREQ_SELECT来表示控制寄存器A,如下:

#define RTC_FREQ_SELECT RTC_REG_A

RTC频率寄存器中的位被分为三组:①bit[7]表示UIP标志;②bit[6:4]用于除法器的频率选择;③bit[3:0]用于速率选择。它们的定义如下:

# define RTC_UIP 0x80 
# define RTC_DIV_CTL 0x70 
/* Periodic intr. / Square wave rate select. 0=none, 1=32.8kHz,... 15=2Hz */ 
# define RTC_RATE_SELECT 0x0F

正如7.1.1.1节所介绍的那样,bit[6:4]有5中可能的取值,分别为除法器选择不同的工作频率或用于重置除法器,各种可能的取值如下定义所示:

/* divider control: refclock values 4.194 / 1.049 MHz / 32.768 kHz */ 
# define RTC_REF_CLCK_4MHZ 0x00 
# define RTC_REF_CLCK_1MHZ 0x10 
# define RTC_REF_CLCK_32KHZ 0x20 
/* 2 values for divider stage reset, others for "testing purposes only" */ 
# define RTC_DIV_RESET1 0x60 
# define RTC_DIV_RESET2 0x70

寄存器B中的各位用于使能/禁止RTC的各种特性,因此控制寄存器B(0x0B)也称为“控制寄存器”,Linux用宏别名RTC_CONTROL来表示控制寄存器B,它与其中的各标志位的定义如下所示:

#define RTC_CONTROL RTC_REG_B 
# define RTC_SET 0x80 /* disable updates for clock setting */ 
# define RTC_PIE 0x40 /* periodic interrupt enable */ 
# define RTC_AIE 0x20 /* alarm interrupt enable */ 
# define RTC_UIE 0x10 /* update-finished interrupt enable */ 
# define RTC_SQWE 0x08 /* enable square-wave output */ 
# define RTC_DM_BINARY 0x04 /* all time/date values are BCD if clear */ 
# define RTC_24H 0x02 /* 24 hour mode - else hours bit 7 means pm */ 
# define RTC_DST_EN 0x01 /* auto switch DST - works f. USA only */
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章