web-dev-qa-db-ja.com

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

これは私の前の問題の続きです。 FTDI2XXドライバーを使用して非特権ユーザーでUSBデバイスにアクセスする

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

1. 0403:6014
2. 0403:6001

また、デバイスが「plugdev」グループにR/Wアクセス可能であることを確認したかった

デバイス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"

    この試行では、デバイスGROUPが期待どおりに「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 端末

この問題を修正するためのガイダンスをリクエストする

2
Ragav

私はほぼ同じ問題に遭遇し、sourcejediに触発されたスクリプトを完成させました。 udevはすでに環境を介してかなりの情報を提供しているため、デバイスパスを渡す必要はありませんでした(スクリプトが何を受け取るのか疑問に思う場合は、export>/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
2
falstaff

OK。 sysfsのドキュメントには、組み込みIDをドライバーから削除できないと書かれているようです(ソースコードにパッチを適用しない限り)。したがって、自動バインドするたびに、手動で nbind ドライバーを作成する必要があります。 (すべてのUSBデバイスの自動バインドを無効にすることも可能だと思いますが、それはひどい考えのように聞こえます)。

動作するには、_KERNEL="ttyUSB*"_とUSBIDを照合する必要がありますafterドライバーがバインドされています。スクリプトは親USBデバイスを見つける必要があります。奇妙な_/sys/bus/usb-serial_と_/sys/bus/usb_があることに気づきましたが、それがここで邪魔にならないことを願っています。

DEVPATHがどのように見えるかわからないため、コードの入力方法がわかりません(そして、このためのループを書くのが面倒です)。 USBID=$(basename $(dirname $TTY_DEVPATH))の線に沿って何かを期待しています

_# udev rule
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", KERNEL=="ttyUSB*" RUN+="/usr/local/bin/unbind_ftdi.sh %p"

#!/bin/bash
# unbind_ftdi.sh
TTY_DEVPATH="$1"

# traverse sysfs to find the USB ID
# of the USB device which is parent/ancestor of ttyUSB*
# something like "1-1.6:1.0"
....

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