Какова вероятная причина сбоя CMOS_WRITE? - PullRequest
3 голосов
/ 21 июня 2010

Я был озадачен проблемой RTC в течение нескольких дней: я не мог записать в регистр RTC.

Ниже приведен фрагмент кода и значение, которое я прочитал из 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.

ОБНОВЛЕНИЕ: больше фрагментов кода вКомментарий Амардипа ...

   /* 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 Ответ

0 голосов
/ 15 ноября 2010

Какой конкретно чип RTC? В большинстве RTC вам нужно немного перевернуть, чтобы «приостановить» его, пока вы читаете / записываете его банки регистров, а затем «отменить», когда закончите. Обычно вы хотите сделать это как можно быстрее.

Вы также проверяли документы на чип, чтобы убедиться, что в конкретный регистр, в который вы пытаетесь записать, разрешено запись?

...