Forum: PC-Programmierung udev für i2c verwenden?


von Ulrich P. (uprinz)


Lesenswert?

Hallo!

Ich programmiere gerade an einem embedded device unter linux.
Wie man in einem Programm mittels udev ein USB device bedient habe ich 
schon erfolgreich umgesetzt und es gibt auch einige Beispiele dazu im 
Netz, die mir geholfen haben.

Nun habe ich mir gedacht, dass man mit udev doch auch alle anderen 
devices unter /sys/class/... ansprechen können sollte.
Außerdem kann mich ein udev device doch benachrichtigen, wenn an dem per 
udev_monitor_... etwas interessantes passiert.

Da ich einen temperatursensor habe, der seine daten auf einen CAN bus 
übertragen soll, müsste ich doch irgendwie auf
/sys/class/i2c-dev/i2c-0/subsystem/i2c-0/device/0-0048/temp1_input
einen monitor setzen können und mein thread wird immer nur dann 
ausgeführt, wenn die Temperatur sich geändert hat.

Grundsätzlich bin ich schon so weit, dass ich per
printf("  I2C temp1_input %s\n", udev_device_get_sysattr_value(dev, 
"temp1_input"));
den Wert des Sensors auslesen kann, aber ich bekomme den udev_monitor 
nicht hin. Leider finde ich auch keine halbwegs vollständigen und 
lesbaren Beispiele, die sich mit etwas anderem als USB beschäftigen. Hat 
da mal jemand was für mich?

Vielen Dank schon mal
Ulrich

von Imon (Gast)


Lesenswert?

sihe dir mal die lmsensors an

http://lm-sensors.org/

Hier solltest du einigen Input finden wie dieses Sensoren normalerweis 
unter (embedded) Linux gnutzt werden. Ich bin fast sicher das man mit 
dieser Basis was für deine zwecke Adaptieren kann.

btw. was spricht dagegen einen eigenen kleine Dämon zu schreiben der 
denn Sensor regelmäßig Pollt und sich dann schlafen legt, zumal 
Temperatur Änderungen doch eher ein langsame Prozesse sind.

von Ulrich P. (uprinz)


Lesenswert?

Hi!

Danke schon mal für den Verweis auf lm-sensors.

Ich bin mir nicht sicher, ob ein kleiner Dämon für mein Problem wirklich 
geeignet ist. Der LM92 ist nur eine vorübergehende Lösung, er wird durch 
einen NTC abgelöst, der an einem ADC Eingang der CPU hängt. Auch der 
soll per sys/classs/... exportiert werden. Die UserApp greift dann 
wieder darauf zu.
Das soll noch für andere Sensoren und Eingänge ebenfalls so gelöst 
werden.

Dieser Versuch ist dafür gedacht das udev mal aus zu probieren. Das 
finale Ziel ist eigentlich, dass die Applikation die Werte aller 
verbundenen Sensoren in einem eigenen udev Bereich ablegt. Dabei stammen 
die Daten von internen und via TCP/IP oder CAN angebundenen Sensoren.

Das würde eine homogene Behandlung aller Sensoren ermöglichen, wobei der 
CAN Master die zentrale Drehscheibe ist. Alles andere würde vermutlich 
dazu führen, dass alles separat und womöglich unterschiedlich gemacht 
wird. Das ist nach einiger Zeit nicht mehr zu pflegen.

Gruß, Ulrich

von Ulrich P. (uprinz)


Lesenswert?

Ok, für alled, die es interssiert:

Anscheinend kann der aktuelle hwmon (Kernel 2.6.34) das udev-system noch 
nicht über sein Polling oder geänderte Werte eines I2C Sensors 
informieren.

Das ist der Grund, warum man per udev einen Wert auslesen kann, dieser 
aber immer auf dem Stand bleibt, den er beim ersten Auslesen hatte.
Das erklärt auch, warum ein gesetzter udev_monitor nicht getriggert 
wird.

Gruß, Ulrich

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.