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

文章作者 100test 发表时间 2007:03:14 16:40:01
来源 100Test.Com百考试题网


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 0select. 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 0updates for clock setting */ 

# define RTC_PIE 0x40 /* periodic interrupt enable */ 

# define RTC_AIE 0x20 /* alarm interrupt enable */ 

# define RTC_UIE 0x10 /* 0update-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 */


相关文章


Linux操作系统内核对RTC的编程详解(1)
Linux操作系统跨控制台登录方法运用(上)
Linux操作系统内核对RTC的编程详解(2)
双赢协议:微软为何将不会攻击Linux
Linux操作系统跨控制台登录方法运用(下)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛