2013-07-23 11 views
7

Vorrei comunicare dal mio RTC in codice C piuttosto che dal comando di shell "hwclock".perché l'i2cdetect fornisce sempre UU sul mio RTC in Linux incorporato

Tuttavia, quando uso i2cdetect, mostra 0x68 (che è il mio indirizzo slave RTC) sta avendo lo stato "UU", che significa "tastatura è stato saltato, perché questo indirizzo è attualmente in uso da un driver". E dopo aver provato il i2cget, il suo givng "potrebbe bot impostare l'indirizzo su 0x68: Dispositivo o risorsa occupata".

Quindi sto pensando se ci sono alcuni problemi nel mio kernel Linux che costringeranno a leggere dal mio RTC tutto il tempo, o qualche altra ragione.

Grazie

+0

qual è l'output di 'lsmod'? – microMolvi

risposta

7

Io parto dal presupposto che si sta utilizzando DS-1307 RTC, o una delle sue varianti (a causa della 0x68 indirizzo slave). Controllare se il suo driver viene caricato da:

$ lsmod | grep rtc 

Se hai visto una voce di rtc_ds1307, (come questo ->rtc_ds1307 17394 0) nell'output del comando precedente, allora questo driver potrebbe essere in possesso di tale indirizzo.

Se il driver è caricato nel sistema poi scaricarlo utilizzando

$ rmmod rtc-ds1307 

EDIT:

(Alla luce delle risposte dei OP,) eseguire le seguenti

1) cat /sys/bus/i2c/devices/3-0068/modalias. Questo ti darà il nome del driver del kernel che sta tenendo occupato questo dispositivo. Copia il-nome del driver dopo i due punti (uscita :) di OP del comando ci dice che la sua DS1337

2) Controllare se DS1337 è un alias per un pilota, utilizzando

grep ds1337 /lib/modules/`uname -r`/modules.alias 

Speriamo che otterrà il seguente output

alias i2c:ds1337 rtc_ds1307 

Questo conferma la nostra presunzione che rtc_ds1307 è infatti il ​​conducente nella stiva dell'indirizzo I2C 0x68.

3) utilizzare rmmod rtc_ds1307 per scaricare il driver. Nota: Questo funziona solo se il conducente è un Kernel modulo caricabile, altrimenti si vedrà il seguente errore:

ERROR: Module rtc_ds1307 does not exist in /proc/modules 

In questo caso si dovrà ricompilare il kernel di nuovo con quel driver disabilitata/modulare.

+0

Non esiste alcun output per il comando lsmod | grep rtc. – henryyao

+0

hmm .. può darci l'output di 'ls/sys/bus/i2c/devices' – microMolvi

+1

Il comando ls fornisce 3-0068 (3 è il numero di bus) e alcuni altri dispositivi. E btw, posso leggere da RTC usando la funzione ioctl() dal mio codice C. Il che è strano dal momento che i2ctools non può leggere. – henryyao

0

0x68 viene utilizzato da alcuni driver, Disabilita tale driver nel codice sorgente del kernel e ricompila il codice sorgente.

Problemi correlati