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_Dund Ä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: -- -- -- -- -- -- -- --
-
i2cdetectverwendet eine etwas andere Darstellung für die Adressen. Im AVR-Code würde man Aread = 2 * n + 1 und Awrite = 2 * n + 0 verwenden,0x51ist 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 5benutzen, 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
lm_sensors
TODO