- UID
- 1029342
- 性别
- 男
|
同理,报警时间设置函数如下:
static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
{
struct rtc_time *tm = &alrm->time; //得到RTC报警时间
void __iomem *base = s3c_rtc_base; //得到寄存器的虚拟内存地址的基地址
unsigned int alrm_en; //是否使能报警
pr_debug("s3c_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n",
alrm->enabled,
tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff,
tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); //打印一些调试信息
alrm_en = readb(base + S3C2410_RTCALM) & S3C2410_RTCALM_ALMEN; //读出RTCALM的第6位,表示所有报警功能都打开
writeb(0x00, base + S3C2410_RTCALM); //将00写入RTCALM,使所有的功能都不可以用
if (tm->tm_sec < 60 && tm->tm_sec >= 0) { //大于0小于60,则设置报警秒寄存器ALMSEC的值,并设置RTCALM寄存器的第0位为1,表示打开秒报警功能
alrm_en |= S3C2410_RTCALM_SECEN;
writeb(bin2bcd(tm->tm_sec), base + S3C2410_ALMSEC);
}
if (tm->tm_min < 60 && tm->tm_min >= 0) {
alrm_en |= S3C2410_RTCALM_MINEN;
writeb(bin2bcd(tm->tm_min), base + S3C2410_ALMMIN);
}
if (tm->tm_hour < 24 && tm->tm_hour >= 0) {
alrm_en |= S3C2410_RTCALM_HOUREN;
writeb(bin2bcd(tm->tm_hour), base + S3C2410_ALMHOUR);
}
pr_debug("setting S3C2410_RTCALM to %08x\n", alrm_en); //打印报警使能状态
writeb(alrm_en, base + S3C2410_RTCALM);
s3c_rtc_setaie(alrm->enabled);
if (alrm->enabled) //使能中断唤醒功能
enable_irq_wake(s3c_rtc_alarmno);
else
disable_irq_wake(s3c_rtc_alarmno);
return 0;
} |
|