물리적인 USB 연결임에도 불구하고 5개의 tty 노드를 생성하는 3G/GPS 장치가 있습니다. 기본적으로 멀티포트 USB-직렬 어댑터입니다.
udev
저는 이러한 노드가 항상 동일한 이름을 갖도록 하거나 최소한 해당 노드를 가리키는 심볼릭 링크를 갖도록 몇 가지 규칙을 만들려고 합니다 .
실제로 장치를 찾을 수 있습니다 /sys/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/
. 내부는 5개의 노드를 생성하는 1-2.2:1.0/
to 입니다 1-2.2:1.4/
.
여기서도 찾을 수 있습니다 /sys/bus/usb/devices/1-2.2
.
장치의 udev 정보는 다음과 같습니다.
udevadm info -a -p /sys/bus/usb/devices/1-2.2/1-2.2\:1.0
looking at device '/bus/usb/devices/1-2.2/1-2.2:1.0':
KERNEL=="1-2.2:1.0"
SUBSYSTEM=="usb"
DRIVER=="option"
ATTR{bInterfaceNumber}=="00"
ATTR{bAlternateSetting}==" 0"
ATTR{bNumEndpoints}=="03"
ATTR{bInterfaceClass}=="ff"
ATTR{bInterfaceSubClass}=="01"
ATTR{bInterfaceProtocol}=="01"
ATTR{modalias}=="usb:v12D1p1506d0000dc00dsc00dp00icFFisc01ip01"
ATTR{supports_autosuspend}=="0"
이 시점부터 모든 노드는 동일한 정보를 갖게 됩니다. 노드 간의 유일한 차이점은 bInterfaceNumber 속성과 장치 경로입니다. 그래서 개발 경로별로 규칙을 작성해보자고 생각했습니다.
이제 어떤 이유로 이러한 노드는 모두 다음 규칙과 일치합니다.
ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0" SYMLINK+="huawey0"
따라서 기본적으로 huawey0
열거형의 마지막 노드를 가리킵니다. 장치는 ttyUSB2에서 6까지 노드를 생성했으며 링크는 USB6을 가리킵니다.
그래서 커널 노드를 전달해 보았습니다.
ACTION=="add", KERNEL=="1-2.2:1.0" SYMLINK+="huawey0"
이제 /dev에는 아무 것도 나타나지 않습니다.
그 후 bInterfaceNumber를 사용하여 분리해 보았습니다. 나는 다음 규칙을 사용했습니다
ACTION=="add", DEV="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]" ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"
하지만 여전히 아무 일도 일어나지 않았습니다. 나는 심지어 규칙의 간단한 버전을 시도했습니다 ..
ACTION=="add", ATTR{bInterfaceNumber}=="00" SYMLINK+="huawey0"
하지만 여전히 아무 일도 일어나지 않습니다. 왜 일치하지 않습니까?
답변1
이 기사는 3년 전에 요청된 것이므로 답변을 드릴 수 없을 수도 있지만, 나중에 참고할 수 있도록 제 성공적인 경험을 여기서 공유하고 싶습니다.
Jens Reimann에 따르면udev를 사용하여 GSM 모뎀 장치 식별, "장치 속성 "bInterfaceNumber"는 tty 장치가 아니라 상위 계층의 USB 장치에 있습니다." 따라서 FTDI USB-4 포트 직렬 어댑터에 대해 두 가지 규칙을 만들었습니다.
SUBSYSTEMS=="usb", ENV{.LOCAL_ifNum}="$attr{bInterfaceNumber}"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", SYMLINK+="ttyUSB_FTDI_4_PORT_%E{.LOCAL_ifNum}"
이는 "bInterfaceNumber" 속성을 환경 변수 ".LOCAL_ifNum"에 저장합니다(접두사 점은 임시 또는 숨겨진 변수에 대한 표기법입니다). 두 번째 규칙에서는 "%E" 구문을 사용하여 동일한 변수를 가져옵니다. 최신 udev 버전은 "%E" 대신 "$env"도 지원합니다.
(옌스 레만)
ttyUSB_FTDI_4_PORT_
심볼릭 링크 이름은 어디에 있습니까? 이 두 규칙은 ttyUSB_FTDI_4_PORT_00
, ttyUSB_FTDI_4_PORT_01
, ttyUSB_FTDI_4_PORT_02
, 에 대한 심볼릭 링크를 생성합니다 ttyUSB_FTDI_4_PORT_03
. ATTRS{serial}
속성을 추가하여 열거를 더욱 제한 할 수 있습니다 .
Jens Reimann도 인정했습니다.케탄 파텔U&L 문제,모뎀의 Udev 규칙 파일이 작동하지 않습니다., 그리고수락된 답변통과드 로버트.
답변2
모든 규칙에 구문 오류가 있습니다.
=
for 할당 은 비교를 위한 것이므로 실제로 동일한 것을==
보는 것이 아니라 할당하는 것입니다.DEV
,
앞에 아무 문도 없이 모든 문 사이를 이동 해야 합니다SYMLINK+=
.
주먹 규칙
ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.0", SYMLINK+="huawey0"
규칙 2
ACTION=="add", KERNEL=="1-2.2:1.0", SYMLINK+="huawey0"
규칙 3
ACTION=="add", DEV=="/devices/platform/pxa27x-ohci/usb1/1-2/1-2.2/1-2.2:1.[0-4]", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"
규칙 4
ACTION=="add", ATTR{bInterfaceNumber}=="00", SYMLINK+="huawey0"
이제 이러한 모든 규칙이 귀하의 요구 사항을 충족해야 합니다(저는 개인적으로 첫 번째 규칙을 사용하겠습니다).
답변3
Alex의 의견 외에도 또 다른 질문이 있습니다. ATTR{bInterfaceNumber}
어떤 이유에서든 작동 하지 않는 것 같습니다 . 인용하다관련 질문에 대한 답변, 다음과 같은 것을 사용해야합니다
SUBSYSTEM=="tty", ACTION=="add", \
ENV{ID_VENDOR_ID}=="067b", ENV{ID_MODEL_ID}="2303", \
ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="test_USB0"