Blacklisting / Removendo o driver para um determinado VID / PID

2

Isto está na continuação do meu problema anterior. Acessando um dispositivo USB em Não-privilegiados usuário com o driver FTDI2XX

Aqui eu tenho 2 módulos de hardware usbserial e é provisionado que apenas um pode ser usado por vez.

1. 0403:6014
2. 0403:6001

Eu também queria ter certeza de que o dispositivo é acessível para R / W ao grupo "plugdev"

Para o dispositivo 0403: 6014 , eu não quero usar o driver usbserial (ftdi_sio) embutido. Eu quero acessar este dispositivo usando a biblioteca FTD2XXX. e para o dispositivo 0403: 6001 , eu quero usar o driver usbserial (ftdi_sio) inbulit. Estou tentando encontrar uma maneira comum de conseguir isso.

Trilhas que tentei até agora. Como o dispositivo 0403: 6001 usa o driver linux embutido, estou tentando remover o driver / blacklist ( 0403: 6014 ) durante o carregamento

  1. TRIAL 1

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

    Isso remove o driver FTDI carregado, mas não altera o grupo de dispositivos de ROOT para PLUGDEV

Então, resolva essa questão e adicione mais uma linha de regra

  1. TRIAL 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"

    Esta avaliação define o meu dispositivo GROUP como esperado para "plugdev", mas isso não remove o módulo usbserial do kernel.

  2. TRIAL 3

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

    Adicionamos ftdi_sio a /etc/modprobe.d/blacklist.conf , mas isso faz com que meu 0403: 6001 seja completamente bloqueado.

    Esta abordagem funciona bem para 0403: 6014 mas isto torna completamente obsoleto o meu 0403: 6001 dispositivo

Solicite orientação para corrigir esse problema

    
por Ragav 24.08.2016 / 12:54

2 respostas

2

Me deparei com quase o mesmo problema e concluí o script inspirado no sourcejedi. Eu não tive que passar o caminho do dispositivo desde udev fornece um pouco de informação através do ambiente já (use export > / tmp / vars no caso de você saber o que seu script recebe). Em particular, eu uso $ DEVNAME, que é o nome do dispositivo em / dev (por exemplo, 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
    
por 27.10.2016 / 21:31
0

Ok. sysfs docs parecem dizer que você não pode remover IDs de um driver (a menos que você corrija o código-fonte). Então você precisará manualmente desvincular o driver toda vez que ele for auto-bind. (Eu acredito que também é possível desabilitar a auto-ligação para todos os dispositivos USB, mas isso soa como uma idéia terrível).

Você precisará combinar o KERNEL="ttyUSB*" , bem como os IDs USB, para atuar após o driver está vinculado. Seu script terá que encontrar o dispositivo USB pai. Eu notei que há um estranho /sys/bus/usb-serial , bem como /sys/bus/usb , estou apenas esperando que isso não atrapalhe aqui.

Não tenho certeza de como preencher o código porque não sei como é o seu DEVPATH (e estou com preguiça de escrever um loop para isso). Eu espero algo ao longo das linhas de 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
    
por 24.08.2016 / 14:40