OWPDK
USB-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線アダプタを排他的にすることを防ぎます。次の内容でファイルを作成します。onewire
libusb
/etc/modprobe.d/blacklist-1wire.conf
blacklist ds2490
次に、modprobe -r ds2490
root として実行または再起動します。