Warum sind i2c_smbus Funktion nicht verfügbar? (I2C – Embedded Linux)
Gibt es viele Verweise auf die Verwendung i2c_smbus_ Funktionen bei der Entwicklung von embedded-Linux-software für die Kommunikation auf dem I2C-bus. Wenn i2c_smbus Funktionen wie i2c_smbus_read_word_data verwiesen wird im software-Projekt für ARM8-Prozessor-Fehler wie "i2c_smbus_read_word_data' wurde nicht deklariert, in diesem Umfang erzeugt beim kompilieren.
Untersuchung der folgenden header-Dateien anzugeben, die Abwesenheit der meisten i2c_smbus definition einer Funktion.
- /usr/arm-linux-gnueabi/include/linux/i2c.h
- /usr/arm-linux-gnueabi/include/linux/i2c-dev.h
Sich auch in folgenden Verweis i2c.h - Datei hat alle i2c_smbus definiert.
Wie kann dieses problem gelöst werden?
Referenzen
- Über die I2C-Schnittstelle aus dem userspace unter Linux
- Die I2C-Kommunikation von Linux-Userspace – Teil II
- I2C-dev interface
- Die Schnellste google jemals zeigt, dass Sie benötigen, um include <linux/i2c-smbus.h>.
- Ich sehe nicht ein i2c-smbus.h enthalten, in einen der oben genannten arm-linux-gnueabi-Pfade.
- Die Datei wurde Hinzugefügt, um den kernel im Jahr 2010 als include/linux/i2c-smbus.h aber nachdem es in den kernel-Quellen nicht notwendigerweise, dass es in Ihrem userspace-include-Verzeichnisse auf einem bestimmten system Für die Referenz -, fern-commit ist hier git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/...
- Aber ich sehe nicht, Funktionen wie i2c_smbus_read_byte_data definiert i2c-smbus.h. Aber sehen diese Funktionen definiert i2c.h pro anfügen-link. cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/.... Ich Frage mich, wie das aktualisieren der Bibliothek Dateien /usr/arm-linux-gnueabi/include/linux/i2c.h enthalten i2c_smbus Funktionen. Ich bin nicht sicher, wenn es möglich ist. Ich habe eine Frage auf ask.ubuntu-c, wenn ein Prozess zum aktualisieren der arm-linux-gnueabi-Bibliotheken. askubuntu.com/questions/507628/...
- Sie implementieren die Treiber in den user-space oder im kernel-space?
- Userspace.
- Meistens sind die I2C-Funktionen von user-space gesteuert werden und der Zugriff über
ioctl()
,read()
undwrite()
. Ich empfehle, dass Sie gehen durch die Linux-Dokumentation selbst, wie Sie den Zugriff auf die i2c-Geräte aus dem userspace : lxr.free-electrons.com/source/Documentation/i2c/dev-interface - Ich verwendet read() und write() auf, um das Programm zu arbeiten. Ich habe veröffentlicht die base-code bei github.com/mahengunawardena/BeagleboneBlack_I2C_ADXL345. Können Sie bitte zeigen Sie mir zu verstehen, wie zu verwenden i2c_smbus_read_word_data. Sieht aus wie der smbus Bibliothek ist weit mehr fähig. Ich möchte wissen, wie man smbus Bibliothek installiert. Bin ich richtig, anzunehmen, dass smbus verwendet wird, der im kernel-space.
- Ja, diese Funktionen sind in der Regel für kernel-space. Aber, die gleiche Umsetzung wurde durchgeführt auf den user-space als auch. Beachten Sie die syntax der user-space -
i2c_smbus_*()
Funktionen, Sie akzeptieren ein 'file descriptor' als erstes argument, im Gegensatz zu den kernel-space-Funktionen annehmen, diei2c_client
als argument. Zum Beispieli2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
(kernel-space),i2c_smbus_read_byte_data(int file, __u8 command)
(user-space). - Sie können machen verwenden der Funktionen, die durch die Installation
i2c_tools
undlibi2c-dev
Pakete. - danke. Ich installieren libi2c-dev und sehen, ob Sie Zugriff auf den smbus-Funktionen. Ich habe bereits die i2c-tools installiert.
InformationsquelleAutor Mahendra Gunawardena | 2014-08-06
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie mit einer falschen header-Datei für Ihre Anwendung.
Wenn Sie sehen, ein
extern
auf die Funktioni2c_smbus_read_word_data()
in Ihrem Kopf, es ist eine header-Datei für Ihr kernel, aber nicht für Ihre Anwendung. Der Linux-kernel hati2c_smbus_read_word_data()
und andere i2c-smbus-Funktionen für den internen Gebrauch. Aber Sie sind a) nicht-system-Aufrufe, oder b) nicht zugänglich sind, von Ihrer Anwendung aus.Stattdessen bekommen i2c-tools von lm-Sensors und installieren Sie es. Wenn Sie Debian verwenden, nur
und verwenden
i2c_smbus_read_word_data()
oder andere Schnittstellen, die Sie bieten. i2c-dev ist eine header-only " - Paket, was bedeutet, dass es keine Bibliothek zu verknüpfen. Alle Funktionen sind inline-Funktionen definiert mitioctl()
.z.B.)
Ich lief in heute. Die
i2c_smbus_*
Funktionen sind definiert in:...aber wenn ich versuchen würde, um cross-kompilieren für ARM auf einer älteren version von Ubuntu, ich lief in Fehler, wie:
Stellt sich heraus, die Funktionen sind nicht definiert in der entsprechenden ARM-spezifische Position:
Beim cross-kompilieren, das 2. älter header-Datei verwendet. Re-deklarieren Sie vor Ort ein paar der inline-i2c_smbus_... - Funktionen zu bekommen, um das problem.
Aus der i2c-Linux-kernel-Dokumentation:
So müssen Sie den
i2c-dev.h
aus i2c-tools nicht aus dem Linux-kernel.