私はとしてユーザ空間に公開されたi2cアダプタを持っています。そのアダプタのi2c-toolsパッケージのi2cdetect
を使用すると、このアダプタにデバイスが表示され、コマンドラインからget、set、およびdump操作を実行できます。i2c ioctlのENXIOとは何ですか?
ioctl I2C_RDWR
操作を使用して書き込みを実行しようとするCコードがあります。
ここでは、私が取り組んでいる切り捨てられたコードがあります(コンテキストに対してのみ提供され、それを実行することは質問に答えることが重要ではありません)。
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;
私はまた、このように見えるsmbus ioctl関数を使ってみました。すべての場合において
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;
、プログラムは常にfprintf
に当たり、これが出力されます:
ioctlは返さ-1。理由:そのようなデバイスまたはアドレスはありません(errno = 6)。
man 3 ioctl
によると、ENXIOエラーのために「一般的な」理由は次のとおりです。
ENXIO要求と引数は、このデバイスドライバのために有効ですが、サービスが要求ARGこの特定のサブデバイスでは実行できません。
イアンはコメントで指摘したように、しかし、上記のmanページに記載されている情報に関するSTREAMSは、Linux上では関係ありません、私は使用しなければならない - 残念ながら、ほとんどはちょうどそれのioctlドン」と言い、実際にはどの標準にも合致しています。
これは3つの質問を提起します。
- これはi2cアダプタにはどういう意味がありますか?このデバイスのドライバは、このメソッドを使用して読み書きをサポートしていませんか?
- マニュアルページには、I_接頭辞付き操作の戻りコードの具体的な説明が含まれていますが、他の操作用の戻りコードはありません。 I2Cのioctl操作に固有の情報を探すことができる別の場所がありますか?
- i2c ioctl関数のソースはどこにありますか?
STREAMSデバイスへの参照は、[STREAMS](https://en.wikipedia.org/wiki/STREAMS)をサポートしていないため、Linuxでは無関係です。実際には '' man 2 ioctl'(http://linux.die.net/man/2/ioctl)を見てください。 –
@IanAbbott hmmm、ENXIOは言及していません。 : –
「準拠する」セクションを参照してください。 –