特定のVID / PIDのドライバブラックリスト/削除

特定のVID / PIDのドライバブラックリスト/削除

これは前の質問の連続です。 FTDI2XXドライバーを使用して権限のないユーザーとしてUSBデバイスにアクセスする

これには2つのusbserialハードウェアモジュールがあり、一度に1つしか使用できないと規定されています。

1. 0403:6014
2. 0403:6001

また、デバイスに "plugdev"グループへの読み取り/書き込みアクセス権があることを確認したいと思います。

デバイス用0403:6014、組み込み usbserial(ftdi_sio) ドライバを使用したくありません。 FTD2XXXライブラリを使用してこのデバイスにアクセスしたいです。デバイス用 0403:6001、inbulit usbserial(ftdi_sio) ドライバを使用したいと思います。私はこれを達成するための一般的な方法を見つけようとしています。

これまでに試したパスです。から、 0403:6001デバイスは組み込みのLinuxドライバを使用し、アンインストール/ブラックリストを作成しようとしています(0403:6014)ロード時のドライバ

  1. テスト1

    ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", RUN+="/usr/local/bin/rmmod.sh 4", GROUP="plugdev"

    これにより、ロードされたFTDIドライバが削除されますが、デバイスグループがROOTからPLUGDEVに変更されることはありません。

だから問題を解決するために、ルールラインがもう1つ追加されました。

  1. テスト2

    SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", GROUP="plugdev" ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", RUN+="/usr/local/bin/rmmod.sh 4"

    この実験では、私のデバイスグループを "plugdev"に設定しましたが、カーネルusbserialモジュールは削除されません。

  2. テスト3

    SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", GROUP="plugdev"

    ftdi_sioを追加しましたが、 /etc/modprobe.d/blacklist.confこれは私をブラックリストに投稿しました。 0403:6001完全に。

    この方法は以下に適しています。0403:6014しかし、これは私を完全に曖昧にします。0403:6001装備

この問題を解決するための指示を求めてください。

ベストアンサー1

私もほぼ同じ問題を経験し、ソースジェダイに触発され、スクリプトを完成しました。 udevはすでに環境を通じてかなりの量の情報を提供しているため、デバイスパスを渡す必要はありませんでした(スクリプトが受け取ったものを知りたい場合は、エクスポート> /tmp/varsを使用)。具体的には、/ devの下のデバイス名である$ DEVNAMEを使用します(例:ttyUSB0)。

/etc/udev/rules.d/ftdi.rules

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", KERNEL=="ttyUSB*" RUN+="/etc/udev/scripts/unbind_ftdi.sh"

/etc/udev/scripts/unbind_ftdi.sh

#!/bin/sh

# traverse sysfs to find the USB ID
# of the USB device which is parent/ancestor of ttyUSB*
# something like "1-1.6:1.0"
TTYDEV=$(basename $DEVNAME)
BOUND_DEVICES=/sys/bus/usb/drivers/ftdi_sio/*/
for DEVICE in ${BOUND_DEVICES}; do
    if [ -e $DEVICE/$TTYDEV ]; then
        USBID=$(basename $DEVICE)
        break
    fi
done

echo "$USBID" > /sys/bus/usb/drivers/ftdi_sio/unbind

おすすめ記事