2010-06-21 20 views
3

J'ai été intrigué par un problème de RTC pendant plusieurs jours: je ne pouvais pas écrire dans le registre RTC. Ci-dessous est l'extrait de code et la valeur que j'ai lu de la reg (dernière ligne) est toujours différente de ce que je viens d'écrire à la Reg. Tout le monde peut m'aider à comprendre cela? J'utilise linux 2.6 noyau et les plates-formes que j'ai essayé étaient PPC et x86.quelle est la cause probable de CMOS_WRITE ne fonctionne pas?

MISE À JOUR: plus des extraits de code par le commentaire de 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); 

Répondre

0

Quelle est la puce spécifique RTC? La plupart des RTC, vous devez retourner un peu pour "mettre en pause" pendant que vous lisez/écrivez ses banques de registre, puis "unpause" quand c'est fait. Habituellement, vous voulez le faire aussi vite que possible.

Avez-vous également vérifié les documents de la puce pour vous assurer que le registre spécifique dans lequel vous essayez d'écrire est autorisé à être écrit?