이것은 이전 질문의 연속입니다. FTDI2XX 드라이버를 사용하여 권한이 없는 사용자로 USB 장치에 액세스
여기에는 2개의 usbserial 하드웨어 모듈이 있으며 한 번에 하나만 사용할 수 있다고 규정되어 있습니다.
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로 변경되지는 않습니다.
그래서 문제를 해결하기 위해 규칙 라인이 하나 더 추가되었습니다.
시험 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