Ich schreibe Code für die Implementierung einer einfachen i2c
Lese- / Schreibfunktion mit dem allgemeinen Linux i2c
Treiber linux/i2c-dev.h
Ich bin verwirrt über die ioctl
: I2C_SLAVE
Die Kerneldokumentation sagt folgendes aus:
Sie können einfache i2c-Transaktionen mit read (2) und write (2) aufrufen. Sie müssen das Adressbyte nicht übergeben; Setze es stattdessen durch ioctl I2C_SLAVE, bevor Sie versuchen, auf das Gerät zuzugreifen
Allerdings verwende ich die ioctl I2C_RDWR
, wo ich die Slave-Adresse erneut mit i2c_msg.addr
festlege.
Die Kernel-Dokumentation erwähnt auch Folgendes:
Einige ioctl () - Aufrufe sind für administrative Aufgaben vorgesehen und werden von i2c-dev direkt. Beispiele sind I2C_SLAVE
Also muss es das ioctl I2C_SLAVE
benutzen? Wenn ja, muss ich es nur einmal oder jedes Mal, wenn ich einen Lese- und Schreibvorgang mache, einstellen?
Wenn ich ein i2c
-Gerät hätte, hätte ich den Code auf dem Gerät testen können und hätte euch nicht gestört, aber leider habe ich gerade keins.
Danke für die Hilfe.
Es gibt drei Hauptmethoden für die Kommunikation mit i2c-Geräten über den Benutzerbereich.
Diese Methode ermöglicht das gleichzeitige Lesen / Schreiben und Senden einer ununterbrochenen Folge von Nachrichten. Nicht alle i2c-Geräte unterstützen diese Methode.
Bevor Sie i / o mit dieser Methode ausführen, sollten Sie überprüfen, ob das Gerät diese Methode mit einer Operation ioctl I2C_FUNCS
unterstützt.
Wenn Sie diese Methode verwenden, müssen Sie nicht eine ioctl I2C_SLAVE
-Operation ausführen - dies geschieht hinter den Kulissen mithilfe der in den Nachrichten eingebetteten Informationen.
Diese Methode von i / o ist leistungsfähiger, aber der resultierende Code ist ausführlicher. Diese Methode kann verwendet werden, wenn das Gerät die Methode I2C_RDWR
nicht unterstützt.
Wenn Sie diese Methode verwenden, müssen Sie eine Operation ioctl I2C_SLAVE
ausführen (oder, wenn das Gerät ausgelastet ist, eine Operation I2C_SLAVE_FORCE
).
Diese Methode verwendet die Basisdatei-Systemaufrufe read()
und write()
. Ununterbrochene sequenzielle Operationen sind mit dieser Methode nicht möglich. Diese Methode kann verwendet werden, wenn das Gerät die Methode I2C_RDWR
nicht unterstützt.
Wenn Sie diese Methode verwenden, müssen Sie eine Operation ioctl I2C_SLAVE
ausführen (oder, wenn das Gerät ausgelastet ist, eine Operation I2C_SLAVE_FORCE
).
Ich kann mir keine Situation vorstellen, in der diese Methode anderen vorzuziehen wäre, es sei denn, der Chip muss wie eine Datei behandelt werden.
Ich habe dieses Beispiel nicht getestet, aber es zeigt den konzeptionellen Ablauf beim Schreiben auf ein i2c-Gerät. - Ermittelt automatisch, ob die ioctl I2C_RDWR
- oder smbus-Technik verwendet wird.
Ich bin mir nicht sicher, ob das hilft, weil ich ioctl I2C_RDWR nicht verwende, aber ich habe den folgenden Code mit Erfolg verwendet:
%Vor%Alles, was ich tue, ist I2C_SLAVE_FORCE einmal am Anfang und ich kann so viel lesen und schreiben, wie ich danach möchte.
PS - Dies ist nur ein Codebeispiel und Sie sollten natürlich die Rückgabe aller dieser Funktionen überprüfen. Ich verwende diesen Code, um mit einem digitalen I / O-Chip zu kommunizieren. Die beiden i2c_ * -Funktionen sind nur Wrapper, die ioctl aufrufen (fd, I2C_SMBUS, & amp; args); wo args ist eine Struktur i2c_smbus_ioctl_data Typ.
Wenn Sie die Methoden read()
und write()
verwenden, genügt es, ioctl
mit I2C_SLAVE
einmal aufzurufen. Sie können I2C_SLAVE_FORCE
auch verwenden, wenn das Gerät bereits verwendet wird.
Ich habe jedoch noch keine konsistente Möglichkeit gefunden, spezifische Register für jedes Gerät mit den read()/write()
-Methoden zu lesen.