4

私は数日間RTCの問題に戸惑っていました:RTCレジスタに書き込めませんでした。

以下はコードスニペットであり、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));

私はLinux2.6カーネルを使用しており、試したプラットフォームはPPCとx86でした。

更新: 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);
4

1 に答える 1

0

特定の RTC チップは何ですか? ほとんどの RTC では、レジスタ バンクの読み取り/書き込み中にビットを反転して「一時停止」し、完了したら「一時停止を解除」する必要があります。通常、これはできるだけ早く実行したいと考えています。

また、チップのドキュメントをチェックして、書き込もうとしている特定のレジスタへの書き込みが許可されていることを確認しましたか?

于 2010-11-15T04:16:58.117 に答える