これは前の質問の連続です。 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
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つ追加されました。
テスト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モジュールは削除されません。
テスト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
答え2
わかりました sysfs ドキュメントには、(ソースコードをパッチしない限り) ドライバから組み込み ID を削除できないことが示されているようです。だから手動で行う必要があります。解くドライバは毎回自動的にバインドされます。 (すべてのUSBデバイスの自動バインディングを無効にすることも可能だと思いますが、これは悪い考えのように聞こえます。)
KERNEL="ttyUSB*"
操作を実行するには、USB IDを一致させる必要があります。後ろにドライバーが拘束されました。スクリプトは親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