I2C_SLAVE ioctl Zweck
Ich bin das schreiben von code für die Implementierung einer einfachen i2c
Lesen/schreiben Funktion mit der Allgemeinen linux - i2c
Treiber linux/i2c-dev.h
Ich bin verwirrt über die ioctl
: I2C_SLAVE
Die kernel-Dokumentation Mitgliedstaaten wie folgt :
Können Sie tun plain i2c-Transaktionen durch die Verwendung von read(2) und write(2) - Aufrufe.
Sie nicht brauchen, um passieren die byte-Adresse; stattdessen, Sie durch
ioctl I2C_SLAVE, bevor Sie versuchen auf das Gerät zuzugreifen
Jedoch bin ich mit der ioctl I2C_RDWR
wo ich das wieder einstellen der slave-Adresse mit i2c_msg.addr
.
Die kernel-Dokumentation erwähnt auch die folgenden :
Einige ioctl () - Aufrufe sind für die administrativen Aufgaben und bearbeitet werden
i2c-dev direkt. Beispiele sind I2C_SLAVE
So ist es muss, um zu verwenden, die ioctl I2C_SLAVE
? Wenn ja muss ich es nur einmal oder jedes mal, wenn ich eine Lesen und schreiben?
Wenn ich eine i2c
Gerät konnte ich gerade getestet, der code auf dem Gerät und würde nicht die Mühe gemacht, Sie Jungs, aber leider habe ich nicht ein Recht haben.
Danke für die Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es drei wichtige Methoden der Kommunikation mit i2c-Geräte aus dem userspace.
1. IOCTL I2C_RDWR
Diese Methode ermöglicht eine gleichzeitige Lesen/schreiben und senden Sie eine ununterbrochene Reihenfolge der Meldung. Nicht alle i2c-Geräte unterstützen diese Methode.
Vor Durchführung von i/o mit dieser Methode sollten Sie prüfen, ob das Gerät unterstützt diese Methode mit einem ioctl
I2C_FUNCS
Betrieb.Mit dieser Methode, Sie nicht Notwendigkeit der Durchführung einer ioctl
I2C_SLAVE
Betrieb -- es ist geschehen hinter den kulissen mit den eingebetteten Informationen in den Nachrichten.2. IOCTL-SMBUS
Diese Methode der i/o ist mächtiger, aber der resultierende code ist Ausführlicher. Diese Methode kann verwendet werden, wenn das Gerät unterstützt nicht die
I2C_RDWR
Methode.Mit dieser Methode, Sie tun Notwendigkeit der Durchführung einer ioctl
I2C_SLAVE
Betrieb (oder, wenn das Gerät beschäftigt ist, eineI2C_SLAVE_FORCE
Betrieb).3. SYSFS-I/O -
Diese Methode verwendet die grundlegende Datei-i/o-system fordert
read()
undwrite()
. Ununterbrochene sequenzielle Operationen sind nicht möglich mit dieser Methode. Diese Methode kann verwendet werden, wenn das Gerät unterstützt nicht dieI2C_RDWR
Methode.Mit dieser Methode, Sie tun Notwendigkeit der Durchführung einer ioctl
I2C_SLAVE
Betrieb (oder, wenn das Gerät beschäftigt ist, eineI2C_SLAVE_FORCE
Betrieb).Ich kann mir nicht vorstellen, dass es eine situation, wenn diese Methode vorzuziehen wäre, andere, es sei denn, Sie benötigen den chip behandelt zu werden wie eine Datei.
Voll IOCTL Beispiel
Habe ich noch nicht getestet, dieses Beispiel, aber es zeigt den konzeptionellen Fluss des Schreibens auf ein i2c-Gerät.-- automatische Erkennung, ob die ioctl -
I2C_RDWR
oder smbus-Technik.sizeof(data)
wenndata
ist ein pointer, der immer wieder sizeof Zeiger (auf 4 oder 8 auf gängigen Betriebssysteme). Sie müssen übergeben Sie die Größe der Daten, nicht verwenden könnensizeof
wie diese!Bin ich mir auch nicht sicher, ob das hilft, weil ich nicht verwenden ioctl I2C_RDWR aber ich habe mit den folgenden code mit Erfolg:
Alles, was ich tun gesetzt I2C_SLAVE_FORCE einmal am Anfang und ich kann Lesen und schreiben, so viel wie ich möchte, dass nach.
PS - Das ist nur ein Beispielcode und natürlich sollten Sie überprüfen Sie die Versandkosten für alle diese Funktionen. Ich verwende diesen code, um die Kommunikation mit einer digital-I/O-chip. Die beiden i2c_* - Funktionen sind nur Wrapper, call ioctl(fd, I2C_SMBUS, &args); wobei args ist eine Struktur, i2c_smbus_ioctl_data geben.
Wenn Sie die
read()
undwrite()
Methoden aufrufenioctl
mitI2C_SLAVE
einmal ist genug. Sie können auchI2C_SLAVE_FORCE
wenn sich das Gerät bereits im Einsatz.Allerdings habe ich noch nicht gefunden, eine konsistente Art und Weise zu Lesen bestimmten Registern für jedes Gerät mithilfe der
read()/write()
Methoden.Für die interessierten, SLAVE_FORCE wird verwendet, wenn das Gerät in Frage, die bereits verwaltet wird, über einen kernel-Treiber. (i2cdetect zeigt UU-Adresse)