I2C-Bus auf dem Banana Pi F3 aktivieren

I2C-Bus auf dem Banana Pi F3 aktivieren
BPI-F3

English version

Langsam, aber doch drängen immer mehr SoCs auf Basis von der RISC-V-Architektur auf den Markt. Da Dart nun auch für RISC-V unterstützt wird, kam bei mir der Wunsch auf, ein RISC-V basiertes Board im Rahmen meines Projekts dart_periphery zu evaluieren.

Die Wahl fiel auf einen Banana Pi BPI-F3, der über Aliexpress direkt beim Hersteller SinoVoip Co., Limited bezogen wurde. Das Board, in einer schlichten Schachtel ohne jegliches Zubehör und Dokumentation verpackt, wurde innerhalb von knapp drei Wochen ohne Probleme geliefert.

Armbian wird für dieses Board als Rolling Release in Form einer Entwicklerversion unterstützt. Unter Armbian können Schnittstellen wie I2C, SPI etc. komfortabel mit dem Tool armbian-config verwaltet werden. Dieses Tool steht aber noch nicht für die aktuelle RISC-V-Version zur Verfügung.

Somit muss die I2C-Schnittstelle händisch eingebunden werden. Folgende Schritte wurden nun folgendem Beitrag aus dem Banana-Pi-Forum in angepasster Form entnommen. Root-Rechte sind vonnöten!

cd /boot/dtb/spacemit
cp k1-bananapi-f3.dtb k1-x_deb1.dtb.org
dtc -I dtb -O dts -o k1-bananapi-f3.dts k1-bananapi-f3.dtb
nano k1-bananapi-f3.dts 

Nun muss im I2C-4 Block der Status von disabled auf okay geändert werden...

    //i2c4
	i2c@d4012800 {
        .....
		status = "okay";
	};

...und dann die Änderungen am Device-Tree wieder zurückgeschieben werden.

 dtc -I dts -O dtb -o k1-bananapi-f3.dtb k1-bananapi-f3.dts

Nach einem Neustart und dem Laden des i2c-dev Modules sollte nun folgendes Device /dev/i2c-4 verfügbar sein.

modprobe i2c-dev
ls /dev/i2*
/dev/i2c-0  /dev/i2c-2  /dev/i2c-4  /dev/i2c-8

Nun wird das i2c-dev Modul der bestehenden Liste, der beim Start zu ladenden Modulen, hinzugefügt.

echo 'i2c-dev' >> /etc/modules-load.d/bananapif3.conf

Aber Achtung, ein OS Update, das bei dieser Rolling Release täglich per nightly build verfügbar ist, überschreibt folgende Dateien wieder.

/boot/dtb/spacemit/k1-bananapi-f3.dtb
/etc/modules-load.d/bananapif3.conf


Am Schluss wird das I2C-4 Device noch meinem Benutzer peter über eine Gruppe i2c zur Verfügung gestellt.

groupadd i2c
usermod -aG i2c peter
echo 'KERNEL=="/dev/i2c-4", GROUP="i2c", MODE="0660"' > /etc/udev/rules.d/99-i2c.rules
apt-get install i2c-tools
reboot

Nach dem Reboot logge ich mich mit meinem Benutzer peter an lasse mir alle Geräte auf dem Bus I2C-4 anzeigen.

peter@bananapif3:~$ i2cdetect -y -r 4
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

An der Adresse 0x68 des I2C-Busses hängt eine DS3231 Real-Time-Clock, die nun mit Hilfe von dart_periphery angesteuert wird. Der Beispiel-Code wird noch an die I2C-Bus-Nummer 4, und dass ein DS3231 mit Temperatursensor in Verwendung ist, angepasst.

void main() {
  // Select the right I2C bus number /dev/i2c-?
  // 1 for Raspberry Pi, 0 for NanoPi (Armbian), 2 Banana Pi (Armbian)
  var i2c = I2C(4); // Banana Pi BPI-F3
  try {
    print("dart_periphery Version: $dartPeripheryVersion");
    print("c-periphery Version   : ${getCperipheryVersion()}");
    print('I2C info: ${i2c.getI2Cinfo()}');
    print("DS1307 real time clock");

    var rtc = DS1307(i2c,true); // for DS3231 set DS1307(i2c, true)

Beispiel starten

peter@bananapif3:~/dart_periphery/example$ dart i2c_ds1307.dart

Bildschirmausgabe

dart_periphery Version: 0.9.15
c-periphery Version   : v2.4.2
I2C info: I2C (fd=9)
DS1307 real time clock
Get current RTC date and time
2025-02-14 18:43:50.000
RTC on board temperature sensor: 24.75
Set RTC to current sytem time?
Do you want to continue? (yes/no):