(23C3:) I²C Hacking: Die einfache Variante - LM75 am VGA-DDC

2006年12月30日 (土曜日, Antiverpeil 123) 14時13分

Jaaaa, der 23C3 hier in Berlin eröffnet gerade mal eine sehr interessante Möglichkeit: Segor» ist nur einen Katzensprung entfernt. (Okay, der Katzensprung hat fast 2 Stunden verschlungen, aber naja.) Jedenfalls bekommt man bei Segor einiges an I²C-Devices.

Eines dieser I²C-Devices ist der LM75 (National)», der uns mit zugegeben eher schlechter Genauigkeit Temperaturen zwischen -55°C und +125°C über den I²C-Bus messen lässt. (Es gibt auch bessere I²C-Temperatorsensoren, den LM75 zu nehmen war pure Faulheit meinerseits.)

Wie ihr nun schon dem Titel entnehmen könnt, war meine Idee, den LM75 an den DDC-I²C anzuschliessen. Auf dem Fussboden von Saal 1 auf dem 23C3 zusammengelötet sieht das dann so aus:

LM75 am VGA-DDC-I²C

Praktischerweise hat sich die Anmerkung "selten +5V" auf der Wikipedia-Seite zum VGA-Anschluss» als unwahr erwiesen. Den Pufferkondensator hab' ich mir hackisherweise auch gespart, so dass einfach nur 4 Leitungen an 7 Pins zu verdrahten waren. (Die +5V-Leitung habe ich gleich noch auf die danebenliegenden Adresspins gelötet, sicherheitshalber.)

Um das ganze dann unter Linux anzusprechen benötigt man einen kleinen Kernel-Hack:

lm75_nonhwmon.patch:
--- old/drivers/hwmon/lm75.c   2006-12-11 20:32:53.000000000 +0100
+++ new/drivers/hwmon/lm75.c   2006-12-30 14:32:23.227463353 +0100
@@ -107,8 +107,6 @@
  
  static int lm75_attach_adapter(struct i2c_adapter *adapter)
  {
-       if (!(adapter->class & I2C_CLASS_HWMON))
-               return 0;
        return i2c_probe(adapter, &addr_data, lm75_detect);
  }

Das ist deshalb nötig, weil der DDC-I²C als Device-Klasse logischerweise nicht I2C_CLASS_HWMON gesetzt hat. Nach anwenden dieses Mikro-Kernel-Patches lädt man das lm75-Modul mit Angabe der I²C-Adresse:

insmod lm75.ko force_lm75=2,0x4f

Die Angabe 2,0x4f ist zu Verstehen als "Bus 2, Adresse 0x4f". Die Adresse entsteht dadurch, dass ich die Adresspins auf +5V gezogen habe (seht euch das Datenblatt an). Die Busnummer muss man ggf. herausfinden.
/sys/class/i2c-adapter/i2c-2/device/name sagt bei mir vga. Nachdem man nun das ganze am Laufen hat, kann man den Temperaturwert auslesen:

$ cat /sys/class/hwmon/hwmon0/device/temp1_input
19500
Temperatur auf dem 23C3

Wie bei allen Hardware-Monitoring-Treibern muss man den Wert noch durch 1000 teilen.

Upcoming: Ich hab' den natürlich die Temperatur hier auf dem 23C3 in ein RRD loggen lassen. Das bekommt ihr auch noch zu sehen, sobald's etwas aufbereitet ist.

Copyright © 2005, 2006, 2007 by David L. (equinox)
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Germany License
Creative Commons License

Impressum

      mode   entry
      uri    23c3_i2c_temp
      offset 0