Als erstes braucht man nen I²C-Treiber. Ich war faul und hab einfach ein fertiges Image genommen

In dem Artikel http://nathan.chantrell.net/20120519...c-io-expander/ verlinkt der Autor auf das Image: http://www.frank-buss.de/tmp/kernel.img
(Ist ein Debian, einfach das kernel.img in der Bootpartition ersetzen. Der in diesem Image enthaltene I2C-Treiber arbeitet zwar noch über Software-I2C, aber das reicht dicke. Es gibt auch einen Treiber der das Hardware-I2C nutzt, aber da muss man sich den Kernel erst mal selbst bauen und da hab ich grad kein Bock drauf . Ausserdem haben Kernel mit diesem Treiber bis jetzt mehr Probleme beim booten von SD-Karten)

Dann kann man relativ einfach das Device öffen, Slave-Adresse angeben und dann nach Lust und Laune schreiben und lesen:
Code:
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>

// Commands:
#define CMD_POWER_OFF             0
#define CMD_POWER_ON             1
#define CMD_CONFIG                2
#define CMD_SETLEDS             3
#define CMD_STOP                4
#define CMD_MOVE_AT_SPEED        5
#define CMD_CHANGE_DIR            6
#define CMD_MOVE                7
#define CMD_ROTATE                8
#define CMD_SET_ACS_POWER        9
#define CMD_SEND_RC5            10
#define CMD_SET_WDT                11
#define CMD_SET_WDT_RQ            12

int main()
{
    bus = open( "/dev/i2c-0", O_RDWR );  // I2C öffnen
    if ( bus == -1 )
    {
      // error
    }
    slave_addr = 0x05;   // Slave Adresse (0x05 ist von der Base)
    ioctl( bus, I2C_SLAVE, slave_addr );  // Slave Adresse setzen

    char buffer[] = {0, CMD_MOVE_AT_SPEED, 30, 30};     // Command
    unsigned int bytes;
    bytes = write( bus, buffer, sizeof(buffer) );  // Rausschreiben

    close (bus);  // I2C schließen
    return 0;
}
Dieses Programm setzt die Geschwindigkeit jetzt eben auf 30/30. Für die ganzen Commands nehm ich mir die RP6Base_I2CSlave.c und die RP6Control_*I2C-XYZ-Master*.c aus den Beispielen zu Hilfe.

Den Quelltext einfach in eine rp6ctrl.c oder sowas schreiben (am besten via SSH auf Raspi zugreifen und dann in Nano Strg+Alt+V). Dann das Programm übersetzen mit "gcc rp6ctrl.c -o rp6ctrl". Ausführen mit "sudo ./rp6ctrl". Da braucht man eben Root-Rechte, oder man includet den User in irgend eine Gruppe deren Namen ich jetzt nicht weis, die die Rechte zum I2C-Schreiben hat.