какова вероятная причина того, что CMOS_WRITE не работает?

Уже несколько дней озадачен проблемой 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));

Я использую ядро ​​​​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);

person tristan    schedule 21.06.2010    source источник


Ответы (1)


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

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

person Kumba    schedule 15.11.2010