2013-07-23 12 views
7

Ich würde gerne von meinem RTC in C-Code lesen, anstatt die "hwclock" Shell-Befehl.Warum gibt der i2cdetect immer UU auf meiner RTC in Embedded Linux

Allerdings, wenn ich i2cdetect verwenden, zeigt es 0x68 (die Adresse meiner RTC-Slave) "UU" den Status wird mit, die „von einem Fahrer Probing war übersprungenen, weil diese Adresse derzeit im Einsatz“ bedeutet. Und nachdem ich die i2cget versucht habe, könnte seine givng "bot Adresse auf 0x68 setzen: Gerät oder Ressource beschäftigt".

Also ich denke, wenn es ein Problem in meinem Linux-Kernel gibt, das zwingen wird, die ganze Zeit oder aus irgendeinem anderen Grund von meinem RTC zu lesen.

Dank

+0

was ist der Ausgang von 'lsmod'? – microMolvi

Antwort

7

Ich gehe davon aus, dass Sie DS-1307 RTC verwenden oder eine seiner Varianten (wegen 0x68 Slave-Adresse). Überprüfen Sie, ob seine Fahrer durch geladen wird:

$ lsmod | grep rtc 

Wenn Sie einen Eintrag von rtc_ds1307 gesehen, (wie dies ->rtc_ds1307 17394 0) in der Ausgabe des obigen Befehls dann dieser Treiber in halten, dieser Adresse sein könnte.

Wenn der Treiber im System geladen wird dann entladen es

$ rmmod rtc-ds1307 

EDIT:

(Im Lichte der OP Feedbacks) Bitte beachten Sie die folgenden

1) cat /sys/bus/i2c/devices/3-0068/modalias. Dadurch erhalten Sie den Namen des Kernel-Treibers, der dieses Gerät beschäftigt hält. Kopieren Sie den Treiber-Namen nach dem Doppelpunkt (:) Ausgang des OP des Befehls sagt uns, dass seine DS1337

2) Überprüfen Sie, ob DS1337 ein Alias ​​für einen Fahrer ist, mit

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

Hoffentlich Sie die folgenden Ausgabe

alias i2c:ds1337 rtc_ds1307 

Dies bestätigt unsere Vermutung erhalten, die infact die Fahrer in Halt der I2C-Adresse 0x68 rtc_ds1307 sind.

3) Verwenden Sie rmmod rtc_ds1307, um den Treiber zu entladen. Hinweis: Dies funktioniert nur, wenn der Fahrer ein Loadable Kernel Module, ansonsten wird die folgende Fehlermeldung angezeigt:

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

In diesem Fall müssen Sie den Kernel neu kompilieren wieder mit diesem Treiber deaktiviert/modularisiert.

+0

Es gibt keine Ausgabe für den Befehl lsmod | grep rtc. – henryyao

+0

hmm .. können Sie uns die Ausgabe von 'ls/sys/bus/i2c/devices' geben – microMolvi

+1

Der Befehl ls gibt 3-0068 (3 ist die Busnummer), und einige andere Geräte. Und außerdem kann ich von der RTC lesen, indem ich ioctl() Funktion von meinem C-Code verwende. Was seltsam ist, da i2ctools nicht lesen kann. – henryyao

0

0x68 wird von einem Treiber verwendet, Deaktivieren Sie diesen Treiber im Quellcode des Kernels und kompilieren Sie den Quellcode neu.