저는 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
해결책
매개변수 가져오기
- 장치를 분리하세요
udevadm monitor -kups usb
완전히 채워진 이벤트를 가져오려면 명령을 실행하세요 .- 연결하여 로그를 받으세요.
규칙 작성
두 가지 옵션이 있습니다:
원래
KERNEL
이벤트를 기반으로 규칙을 작성합니다.ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \ ENV{PRODUCT}=="403/6011/0", SYMLINK+="my_port"
확장 이벤트를 기반으로
UDEV
규칙 작성 :ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \ ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6011", SYMLINK+="my_port"
테스트 규칙
원치 않는 동작을 방지하려면 프로덕션 전에 규칙을 테스트해야 합니다.(예: 너무 광범위한 조건 => 여러 일치 => 여러 실행)
- 마지막 실행 출력에서 장치 경로를 가져옵니다
udevadm monitor
(예:usb1/1-3
귀하의 경우) udevadm test
다음을 위해 달려라시운전udev 규칙:udevadm test --action=add /sys/bus/usb/devices/usb1/1-3
변경사항을 적용하고 시도해 보세요.
규칙을 다시 로드합니다:
udevadm control --reload
USB 장치 재연결 트리거:
udevadm trigger -v --action=add --subsystem-match /sys/bus/usb/devices/usb1/1-3