3
几天来我一直困扰于RTC问题:我无法写入RTC寄存器。CMOS_WRITE无法正常工作的原因是什么?
以下是代码片段,我从reg(最后一行)读取的值总是与我刚刚写入reg的值不同。任何人都可以帮我理解这一点?
val = CMOS_READ(RTC_FREQ_SELECT);
printk(KERN_INFO "reading val=%d from RTC_FREQ_SELECT.\n", val);
val &= 0xf0;
val |= 2;
printk(KERN_INFO "writing val=%d to RTC_FREQ_SELECT.\n", val);
CMOS_WRITE(val, RTC_FREQ_SELECT);
printk(KERN_INFO "reading val=%d from RTC_FREQ_SELECT.\n", CMOS_READ(RTC_FREQ_SELECT));
我使用的是Linux 2.6内核,我试过的平台是PPC和x86。
UPDATE:每Amardeep的评论更多的代码片段...
/* disable periodic interrupts */
tmp_control = CMOS_READ(RTC_CONTROL);
tmp_control &= ~RTC_PIE;
CMOS_WRITE(tmp_control, RTC_CONTROL);
CMOS_READ(RTC_INTR_FLAGS);
val = CMOS_READ(RTC_FREQ_SELECT);
printk(KERN_INFO "reading val=%d from RTC_FREQ_SELECT.\n", val);
val &= 0xf0;
/* ...... */
val |= 2;
printk(KERN_INFO "writing val=%d to RTC_FREQ_SELECT.\n", val);
CMOS_WRITE(val, RTC_FREQ_SELECT);
printk(KERN_INFO "reading val=%d from RTC_FREQ_SELECT.\n", CMOS_READ(RTC_FREQ_SELECT));
/* Enable periodic interrupts */
tmp_control = CMOS_READ(RTC_CONTROL);
tmp_control |= RTC_PIE;
CMOS_WRITE(tmp_control, RTC_CONTROL);
/* read the flags register to start interrupts */
CMOS_READ(RTC_INTR_FLAGS);