부트로더

부트로더

저는 USB<->직렬 상자를 사용하고 있으며 직렬 포트에 대한 사용자 정의 심볼릭 링크를 갖고 싶습니다.

출력에 따르면 udevadm각 포트의 KERNELS 값이 다르다는 것을 알 수 있습니다.

KERNELS=="1-3:1.0" (this is labeled as port 1 on the box)
KERNELS=="1-3:1.1" (port 2)
KERNELS=="1-3:1.2" (port 3)
KERNELS=="1-3:1.3" (port 4)

나는 다음 규칙을 시도했습니다.

ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", KERNELS=="1-3:1.3", SYMLINK+="my_port"

이것은 작동하지 않습니다. 그러나 KERNELS=="1-3"대신 사용하면 KERNELS=="1-3:1.3"심볼릭 링크가 생성됩니다.

서로 다른 직렬 포트를 구별하기 위해 규칙을 어떻게 다시 작성할 수 있습니까?

 $ udevadm info --path=/sys/bus/usb-serial/devices/ttyUSB19 --attribute-walk

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3/ttyUSB19':
    KERNEL=="ttyUSB19"
    SUBSYSTEM=="usb-serial"
    DRIVER=="ftdi_sio"
    ATTR{latency_timer}=="16"
    ATTR{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3':
    KERNELS=="1-3:1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="ftdi_sio"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceNumber}=="03"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{bInterfaceSubClass}=="ff"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{interface}=="USB <-> Serial Cable"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
    KERNELS=="1-3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 4"
    ATTRS{bcdDevice}=="0800"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="65"
    ATTRS{devpath}=="3"
    ATTRS{idProduct}=="6011"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    [...]

답변1

부트로더

  • KERNEL@dirkt가 쓴 것처럼 USB 장치에 대한 규칙을 작성할 때는 수학을 할 수 없습니다.
  • 불행하게도 ""에 있는 장치의 채우기 속도는 looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3/ttyUSB19'적절한 일치에 충분하지 않습니다(질문에서 볼 수 있듯이).
  • 하지만 udev이전 규칙과 다른 규칙이 도움이 될 수 있습니다! 원래 장치 정보 가 udevadm info인쇄되지만 udevadm monitor -u -p패딩된 버전이 인쇄됩니다.

    udevadm monitor --help
    
    ...
    -p --property                            Print the event properties
    -k --kernel                              Print kernel uevents
    -u --udev                                Print udev events
    -s --subsystem-match=SUBSYSTEM[/DEVTYPE] Filter events by subsystem
    

해결책

매개변수 가져오기

  1. 장치를 분리하세요
  2. udevadm monitor -kups usb완전히 채워진 이벤트를 가져오려면 명령을 실행하세요 .
  3. 연결하여 로그를 받으세요.

규칙 작성

두 가지 옵션이 있습니다:

  1. 원래 KERNEL이벤트를 기반으로 규칙을 작성합니다.

    ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \
      ENV{PRODUCT}=="403/6011/0", SYMLINK+="my_port"
    
  2. 확장 이벤트를 기반으로 UDEV규칙 작성 :

    ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \
      ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6011", SYMLINK+="my_port"
    

테스트 규칙

원치 않는 동작을 방지하려면 프로덕션 전에 규칙을 테스트해야 합니다.(예: 너무 광범위한 조건 => 여러 일치 => 여러 실행)

  1. 마지막 실행 출력에서 ​​장치 경로를 가져옵니다 udevadm monitor(예: usb1/1-3귀하의 경우)
  2. udevadm test다음을 위해 달려라시운전udev 규칙:

    udevadm test --action=add /sys/bus/usb/devices/usb1/1-3
    

변경사항을 적용하고 시도해 보세요.

  1. 규칙을 다시 로드합니다:

    udevadm control --reload
    
  2. USB 장치 재연결 트리거:

    udevadm trigger -v --action=add --subsystem-match /sys/bus/usb/devices/usb1/1-3
    

관련 정보