2010-06-21 37 views
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); 

回答

0

有什么具体的RTC芯片?大多数RTC,当你读/写它的寄存器组时,你必须翻转一下“暂停”它,然后在完成时“解除暂停”。通常,你想尽可能快地做到这一点。

您是否还检查了芯片文档以确保您试图写入的特定寄存器被允许写入?

相关问题