代码之家  ›  专栏  ›  技术社区  ›  tristan

CMOS写入失败的可能原因是什么?

  •  3
  • tristan  · 技术社区  · 14 年前

    下面是代码片段,我从注册表中读取的值(最后一行)总是与我刚写给注册表的值不同。有人能帮我理解吗?

        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。

    更新:

       /* 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);
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Kumba    14 年前

    具体的RTC芯片是什么?大多数RTC,在读/写它的寄存器组时,必须稍微翻转一下以“暂停”它,然后在完成时“取消暂停”。通常,你想尽快做到这一点。

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