I2C_SLAVE ioctl Zweck

8

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.

    
zacurry 02.04.2012, 10:17
quelle

3 Antworten

12

Es gibt drei Hauptmethoden für die Kommunikation mit i2c-Geräten über den Benutzerbereich.

1. IOCTL I2C_RDWR

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.

2. IOCTL SMBUS

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 ).

3. SYSFS-E / A

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.

Vollständiges IOCTL-Beispiel

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.

%Vor%     
Woodrow Barlow 14.07.2016, 19:26
quelle
1

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.

    
Ryan 23.04.2012 19:42
quelle
0

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.

    
3c71 02.04.2012 17:11
quelle

Tags und Links