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 */  |