Ich habe einen i2c-Adapter für den Benutzer als /dev/i2c-0
exponiert. Wenn ich i2cdetect
aus dem i2c-tools-Paket auf diesem Adapter verwende, sehe ich mein Gerät auf diesem Adapter aufgelistet und bin in der Lage, Get, Set und Dump-Operationen über die Befehlszeile auszuführen.Was bedeutet ENXIO für ein i2c ioctl?
Ich habe einige C-Code, der versucht, einen Schreibvorgang mit der ioctl I2C_RDWR
Operation durchzuführen.
Hier ist der abgespeckte Code, mit dem ich arbeite (nur für den Kontext, und es ist nicht wichtig, die Fragen zu beantworten).
fd = open ("/dev/i2c-0", O_RDWR | O_NONBLOCK);
/* other stuff happens here */
if (ioctl (fd, I2C_FUNCS, &funcs) != 0)
return -1;
if (!(funcs & I2C_FUNC_I2C))
return -1;
/* i added this bit of debug just to be sure fd didn't
* get inadvertently closed along the way.
*/
if (fcntl (fd, F_GETFD) != 0) {
return -1;
}
/* build the ioctl message payload */
ret = ioctl (fd, I2C_RDWR, &payload)
if (ret) {
fprintf (stderr, "ioctl returned %d. Reason: %s (errno=%d).",
ret, strerror(errno), errno);
return -1;
}
return 0;
Ich habe auch versucht, die smbus ioctl Funktionen zu verwenden, die so aussahen.
fd = open ("/dev/i2c-0", O_RDWR | O_NONBLOCK);
/* other stuff happens here */
if (ioctl (fd, I2C_FUNCS, &funcs) != 0)
return -1;
if (!(funcs & I2C_FUNC_SMBUS_WORD_DATA))
return -1;
/* i added this bit of debug just to be sure fd didn't
* get inadvertently closed along the way.
*/
if (fcntl (fd, F_GETFD) != 0) {
return -1;
}
/* build the ioctl smbus message payload */
if (ioctl (fd, I2C_SLAVE_FORCE, dev) != 0)
return -1;
ret = ioctl (fd, I2C_SMBUS, &payload);
if (ret) {
fprintf (stderr, "ioctl returned %d. Reason: %s (errno=%d).",
ret, strerror(errno), errno);
return -1;
}
return 0;
In allen Fällen trifft das Programm immer die fprintf
und dies ist die Ausgabe:
ioctl zurück -1. Grund: Kein solches Gerät oder Adresse (errno = 6).
Nach man 3 ioctl
, der "generic" Grund für einen ENXIO Fehler ist:
ENXIO Die Anfrage und arg Argumente gelten für diese Gerätetreiber sind, aber der Service angefordert kann auf diesem bestimmten Untergerät nicht ausgeführt werden.
Als Ian in den Kommentaren darauf hingewiesen, die Informationen in Bezug auf STREAMS in der obigen Manpage jedoch auf Linux nicht relevant und ich soll man 2 ioctl
verwenden - was leider meist nur sagt, dass ioctls don‘ t wirklich zu irgendeinem Standard entsprechen, und alles geht.
Dies wirft drei Fragen auf.
- Was bedeutet dies für einen i2c-Adapter? Unterstützt der Treiber für dieses Gerät das Lesen und Schreiben mit dieser Methode nicht?
- Die man-Seite enthält spezifische Beschreibungen von Rückkehrcodes für die mit I_ vorangestellten Operationen, jedoch nicht für andere Operationen. Kann ich woanders nach Informationen suchen, die spezifisch für I2C ioctl-Operationen sind?
- Wo finde ich die Quelle für die ioc ioctl Funktionen?
Der Verweis auf STREAMS-Geräte ist für Linux ein wenig irrelevant, da es [STREAMS] (https://en.wikipedia.org/wiki/STREAMS) nicht unterstützt. Du solltest wirklich ['man 2 ioctl'] anschauen (http://linux.die.net/man/2/ioctl). –
@IanAbbott hmmm, dass ENXIO nicht einmal erwähnt wird. :( –
Siehe den Abschnitt "CONFORMING TO" :) –