udevルールを使用してlibusbアクセスを許可することはできません。

udevルールを使用してlibusbアクセスを許可することはできません。

OWPDKUSB-1-Wireアダプタ(DS2490 USB-1-Wire BridgeチップベースのDS9490R)への(1-Wireライブラリ)アクセスを取得しようとしています。

このライブラリはlibusbを使用してデバイスを列挙します(各バスの使用usb_get_bussesとナビゲーションbus->devices)。次に、ベンダーと製品ID(私は1つだけ挿入しました)と一致する最初のデバイスを取得して呼び出し、返されたusb_openハンドルusb_set_configurationを呼び出します。

私のDebian 10システムでこのプログラムをrootとして実行すると、正しく動作します。

ところで、このUSBデバイスにのみアクセスできるonewireグループのユーザーとしてプログラムを実行したいと思います。onewire

だから私は/etc/udev/rules.d/90-onewire.rules次の行を含むファイルを作成しました。

SUBSYSTEMS=="usb", ATTRS{vendor}=="04fa", GROUP="onewire", MODE="0660"

その後、ルールを再ロードします。sudo udevadm control --reload

usb_openこのユーザーには適用可能ですがusb_set_configuration適用できません(ゼロ以外の結果を返します)。

私は(Sなし)、ATTRS条件の削除などのルールでさまざまな組み合わせを試しましたが、SUBSYSTEM成功しませんでした。私は何を見逃していますか?

ベストアンサー1

マニュアルusb_set_configuration(3)ページ説明する:

int libusb_set_configuration(libusb_device_handle *devh, int config)

devhに含まれるデバイスのアクティブ構成をconfigに設定します。この関数は成功した場合は0を返し、要求された設定が存在しない場合はLIBUSB_ERROR_NOT_FOUNDを返し、インタフェースが現在宣言されている場合はLIBUSB_ERROR_BUSYを返し、デバイスが切断された場合はLIBUSB_ERROR_NO_DEVICEを返し、失敗するとLIBUSB_ERRORコードを返します。

それでは、ゼロ以外の結果は何ですか?

アダプタにカーネルドライバがある場合LIBUSB_ERROR_BUSY

この場合、ユーザー(またはライブラリ)は最初にそれらを分離する必要があります。ライブラリが設定されている場合libusb_set_auto_detach_kernel_driver(handle, 1)(おそらくデフォルト)、この操作は自動的に実行できますが、正常に実行するにはroot権限が必要な場合があります。

ユーザーが1線アダプタにアクセスできるようにするには、ds2490カーネルモジュールをブラックリストに追加して1線アダプタを排他的にすることを防ぎます。次の内容でファイルを作成します。onewirelibusb/etc/modprobe.d/blacklist-1wire.conf

blacklist ds2490

次に、modprobe -r ds2490root として実行または再起動します。

おすすめ記事