BLIT2008-Board mit i2c-tiny-usb-Firmware
Aus BraLUG-Wiki
Statt das Rad neu zu erfinden, kann man sich für I²C auf dem BLIT2008-Board auch die Linux-Kernel-Unterstützung für ein ähnliches Projekt zunutze machen. Die Firmware für das i2c-tiny-usb-Board läuft mit minimalen Änderungen auch und man hat die Treiber- und Software-Unterstützung von Linux als Bonus.
Inhaltsverzeichnis |
Firmware
Da die Firmware schon für den Mega8 vorgesehen ist, war die Portierung auf das Board mehr als einfach. Folgende Schritte sollten funktionieren:
- Beschaffen und Entpacken der Firmware (http://www.harbaum.org/till/i2c_tiny_usb/i2c_tiny_usb-2007-06-07.zip)
- In das Firmware-Verzeichnis wechseln: „
cd i2c_tiny_usb/firmware/
“ - Anpassen der
usbtiny.h
, Ändern des Ports aufPORT_D
und Ändern des D+-Pins auf 2 (Patch) - Bauen mit „
make -f Makefile-usbtiny.mega8
“ - Hochladen auf den Mikrocontroller z.B. mit „
avrusbboot main.hex
“
Kerneltreiber
Der benötigte Kerneltreiber namens i2c-tiny-usb
ist ungefähr seit Version 2.6.22 im Linux-Kernel. Man benötigt folgende Konfigurationsoptionen (sollte im Distributionskernel dabei sein):
CONFIG_I2C CONFIG_I2C_CHARDEV CONFIG_I2C_TINY_USB
Geladen werden müssen i2c_tiny_usb
und i2c_dev
.
i2c-tools
Zum grundlegenden Test, zum Debugging und zum Skripten eignen sich die I2C-Tools, bei Debian auch im Paket
i2c-tools
verfügbar.
Liste der verfügbaren Busse:
# i2cdetect -l i2c-5 i2c i2c-tiny-usb at bus 005 device 004 I2C adapter i2c-0 i2c radeonfb monid I2C adapter i2c-1 i2c radeonfb dvi I2C adapter i2c-2 i2c radeonfb vga I2C adapter i2c-3 i2c radeonfb crt2 I2C adapter i2c-4 smbus SMBus Via Pro adapter at e800 SMBus adapter
- Die Nummer des I²C-Busses ist die 5 in
i2c-5
, nicht die 5 in „at bus 005
“ (USB-Bus-Nummer)
Slave-Chips am Bus finden:
# i2cdetect 5 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-5. I will probe address range 0x03-0x77. Continue? [Y/n] 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
-
i2cdetect
verwendet eine etwas andere Darstellung für die Adressen. Im AVR-Code würde man Aread = 2 * n + 1 und Awrite = 2 * n + 0 verwenden,0x51
ist also Adresse0xA2
(schreiben) und0xA3
(lesen). - Die Warnung sollte man durchaus ernst nehmen und das Kommando nicht unreflektiert auf den anderen Bussen ausführen. Ist man sich sicher, den richtigen Bus erwischt zu haben (in diesem Fall
5
), dann kann man auchi2cdetect -y 5
benutzen, um die Nachfrage abzuschalten.
RTC auslesen
In Anlehnung an Uwes Beispiele hier ein Script, um die RTC-Zeit auszulesen. Gegebenfalls sind wieder Bus-Nummer und Adresse anzupassen.
get_rtc_time.sh
:
#!/bin/sh BUS=5 ADDR=0x51 get_part () { i2cget -y "$BUS" "$ADDR" $1 | sed -e 's/^0x//' ; } ss=`get_part 2` mm=`get_part 3` hh=`get_part 4` dd=`get_part 5` mo=`get_part 6` echo "RTC time: $dd.$mo. $hh:$mm:$ss"
# ./get_rtc_time.sh RTC time: 01.01. 03:14:11
RTC beschreiben
Der umgekehrte Weg geht natürlich auch! Mittels des Kommandos i2cset
kann ein I²C-Chip beschrieben werden, wenn er es zulässt. Der PCF8583, welcher auf dem RTC-Board verwendet wird, erlaubt dies. Zum einen kann Datum/Uhrzeit auf einen Wert vorinitialisiert werden, zum anderen gibt es in dem Schaltkreis 240 Byte RAM zur freien Verfügung. Im folgenden Beispiel wird eine solche Speicherzelle beschrieben:
Erst mal schauen, was derzeit in der Speicherzelle (Adresse: 0x11) steht:
# i2cget -y 2 0x51 0x11 0x00
Einen neuen Wert schreiben:
# i2cset -y 2 0x51 0x11 0xbc b Value 0xbc written, readback matched
Nochmals auslesen:
# i2cget -y 2 0x51 0x11 0xbc
In diesem Beispiel war das BLIT-Board über I²C-Bus 2 zu erreichen und das RTC-Board hatte die Adresse 0x51. Der genaue Syntax von i2cget
und i2cset
ist der jeweiligen Manpage zu entnehmen.
Thermo-Board auslesen
Und natürlich das entsprechende Script für das Thermo-Board darf nicht fehlen. Auch hier sind wieder Bus-Nummer und Adresse entsprechend anzupassen (bei mir war es halt der Bus 2...!). Als Shell wird bash vorausgesetzt.
get_temperature.sh
:
#!/bin/bash # # Kodierung der Temperatur im LM75 # -------------------------------- # # High-Byte Low-Byte # 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 # x 1 1 1 1 1 1 1 x x x x x x x x # | | |...........| # | | | # | | +-- Temperatur (Vorkomma): Bit 0...6 # | +---- Vorzeichen: 1 -> Temperatur < 0°C # +---------------------- Nachkommastelle: 0 -> ,0°C; 1 -> ,5°C # BUS=2 ADDR=0x49 get_part () { i2cget -y "$BUS" "$ADDR" $1 w | sed -e 's/^0x//' ; } # lm75 auslesen und in dezimal val=$((16#`get_part 0`)) # Nachkommawert bestimmen if [ $val -ge 65280 ] then nk=5 val=`expr $val - 65280` # FF00 else nk=0 val=`expr $val - 32512` # 7F00 fi # Vorzeichen und Temperatur selbst ermitteln if [ $val -ge 128 ] then vz="-" vk= `expr $val - 128` else vz="+" vk=$val fi echo "Thermo-Board: $vz$vk,$nk °C"
# ./get_temperature.sh Thermo-Board: +23,5 °C
lm_sensors
Selbstverständlich kann man die ganze Geschichte auch in lm-sensors einbinden, wenn die I²C-Slave-Schaltkreise unterstützt würden. Beim Thermo-Board mit seinem LM75-Chip ist dies der Fall :-)!
Die Installation von lm-sensors auf dem Rechner erfolgt entweder über das Paketsystem der jeweiligen Distribution oder das Übersetzen/Installieren der Originalquellen.
Die Konfiguration von lm-sensors erledigt man sinnvollerweise mit dem mitgelieferten Setup-Script:
# sudo sensors-detect
Sämtliche Fragen können bedenkenlos mit Ja (Yes) beantwortet werden. Die entscheidende Stelle der Ausgaben sollte ungefähr so aussehen:
... Next adapter: i2c-tiny-usb at bus 002 device 007 (i2c-2) Do you want to scan it? (YES/no/selectively): Client found at address 0x49 Probing for `National Semiconductor LM75'... Success! (confidence 6, driver `lm75') Probing for `Dallas Semiconductor DS75'... No Probing for `National Semiconductor LM77'... No Probing for `Dallas Semiconductor DS1621'... No Probing for `National Semiconductor LM92'... No Probing for `National Semiconductor LM76'... No Probing for `Maxim MAX6633/MAX6634/MAX6635'... No Client found at address 0x51 Probing for `Analog Devices ADM1033'... No Probing for `Analog Devices ADM1034'... No Probing for `SPD EEPROM'... No Probing for `EDID EEPROM'... No ...
Nach einem Reboot des Rechners sollte lm-sensors auch die Thermo-Zusatzbaugruppe des BLIT-Boards mit eingebunden haben:
# sensors k8temp-pci-00c3 Adapter: PCI adapter Core0 Temp: +26°C Core1 Temp: +31°C lm75-i2c-2-49 Adapter: i2c-tiny-usb at bus 002 device 007 temp: +22.0°C (high = +80.0°C, hyst = +75.0°C)
Zur Visualisierung der gemessenen Temperatur können die verschiedensten Tools verwendet werden. Bei einer Gnome-Oberfläche bietet sich da das Panel-Applet sensors-applet an. Als "desktop-neutrales" Tools wären z.B. xsensors oder GkrellM zu erwähnen.
Nachtrag: Ich habe gerade gesehen, dass der I²C-Chip SAA1064 ebenfalls von lm-sensors unterstützt wird. Also werde ich demnächst doch mal die 7-Segment-Anzeige zusammenlöten und ausprobieren.