私はLSM6DSLと呼ばれるIMUセンサーをiioドライバとともに使用しています。私はコマンドを使用して、生の値を表示するなら、彼らは正常に動作:IIOデバイスのバッファは常にnull
struct iio_context *context = iio_create_local_context();
struct iio_device *device = iio_context_get_device(context, 1);
struct iio_channel *chan = iio_device_get_channel(device, 0);
iio_channel_enable(chan);
if (iio_channel_is_scan_element(chan) == true)
printf("OK\n");
struct iio_channel *chan2 = iio_device_get_channel(device, 1);
iio_channel_enable(chan2);
struct iio_buffer *buff = iio_device_create_buffer(device, 1, true);
if (buff == NULL)
{
printf("Error: %s\n", strerror(errno));
return (1);
}
そして、これは次のとおりです。
cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw
は、それから私は、私はCプログラムから、これらすべての値を読み取ることができるようにlibiioを使用することにしました結果:
OK
Error: Device or resource busy
私に何か不足していますか?より多くの情報が必要な場合はお知らせください。
理由は何ですか。アクセス許可の問題(ルートを使用してみますか?)からライブラリのバグになることができます。プログラム+ libiioをデバッグする必要があります( 'gdb'、' strace'または 'printf'トレースを追加するだけです)。 'iio_device_create_buffer()'を呼び出す前にブレークポイントを置いて、正確に '-EBUSY'エラーが発生する場所を見つけるまで、ステップダウンしてください。 libiioをデバッグするには、[debug symbols](https://wiki.debian.org/DebugPackage)を使用する必要があります。そこから私たちの助けが必要な場合は、libiioに '-EBUSY'が設定されている正確なコード行について言及してください。 –
また、libiioのソースを 'EBUSY'という単語でgreppingするのは良い考えです。このエラーが 'open()'や 'fopen()'のようにsyscall/libc関数ではなくlibiio関数によって返されたとすれば、何が起こっているのかが分かります。 –
@SamProtsenko、btw、あなたが犯人行を見つけるのに使うことができるトリックがあります。つまり、 '#undef EINVAL; #define EINVAL __LINE__'。多分私はそれについての記事を書く必要があります:-) – 0andriy