여러 tty 장치가 있는 장치에 대한 rule.d 규칙을 추가하는 중에 문제가 발생했습니다.

여러 tty 장치가 있는 장치에 대한 rule.d 규칙을 추가하는 중에 문제가 발생했습니다.

/etc/udev/rules.dTexas Instruments CC1352P-2 개발 보드에 대한 규칙을 추가하고 싶습니다 . 내 Ubuntu 서버에서는 두 개의 ttyACM 장치를 생성합니다.

crw-rw-rw- 1 root dialout 166, 1 Sep 28 10:37 /dev/ttyACM1
crw-rw-rw- 1 root dialout 166, 2 Sep 28 07:28 /dev/ttyACM2

ttyACM1첫 번째 장치( 이 경우) 에 대한 심볼릭 링크를 만들고 싶습니다 . 그러나 사용하면 usb-devices공급업체 ID + 제품 ID 집합을 사용하여 보드에 대한 섹션을 생성합니다.

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  5 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=0451 ProdID=bef3 Rev=01.00
S:  Manufacturer=Texas Instruments
S:  Product=XDS110 (03.00.00.15) Embed with CMSIS-DAP
S:  SerialNumber=L430037Y
C:  #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#=0x1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
I:  If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
I:  If#=0x3 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#=0x4 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
I:  If#=0x5 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
I:  If#=0x6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)

그런 다음 다음 ID를 사용하여 규칙을 만듭니다 /etc/udev/rules.d/50-devboards.rules.

# Texas Instruments CC1352P-2 development kit
KERNEL=="ttyACM*" ATTRS{idVendor}=="0451", ATTRS{idProduct}=="bef3", MODE="0666", SYMLINK+="tty-CC1352P-2"

ttyACM2그러면 를 가리키는 심볼릭 링크가 생성됩니다 ttyACM1.

lrwxrwxrwx 1 root root 7 Sep 28 07:28 /dev/tty-CC1352P-2 -> ttyACM2

질문: 장치가 그 아래에 여러 개의 tty 장치를 생성하는 경우 규칙의 대상을 특정 tty 장치로 지정하려면 어떻게 해야 합니까 /dev?

답변1

"tty 장치"와 "USB 장치" 사이에는 중간 계층이 있습니다. - "USB상호 작용". 드라이버는 USB 장치에 전체적으로 연결되지 않지만 각 인터페이스마다 별도의 드라이버 인스턴스가 있습니다(다른 드라이버일 수 있음).

(불행히도 우분투에는 usbutils가 포함되어 있지 않습니다.lsusb.py, 이 -i옵션을 사용하면 인터페이스를 포함한 전체 USB 계층 구조가 표시됩니다. )

USB 장치에는 0x00부터 0x06까지 번호가 지정된 여러 인터페이스가 있으며 ttyACM1은 인터페이스 0을 통해 생성되었고 ttyACM2는 인터페이스 3을 통해 생성되었습니다(그러나 이것을 사용하여 udevadm info /dev/ttyACM2알아낼 수 있음).

일치의 일부로 인터페이스 번호를 사용하십시오(예: ) ATTRS{bInterfaceNumber}=="00".


그러나 단일 규칙의 모든 ATTRS(및 ENVS) 일치는 동일한 "상위" 수준으로 잠기는 반면, 서로 다른 두 수준의 속성을 일치시켜야 합니다. 따라서 ENVS를 사용하거나 다음 두 가지 규칙이 필요할 수 있습니다.

  1. 첫 번째 규칙에서 "인터페이스" 장치를 일치시키고 ENV 속성을 적용합니다.

    ACTION!="remove", DEVTYPE=="usb_interface", \
      ATTRS{idVendor}=="xx", ATTRS{idProduct}=="xx", \
      ATTR{bInterfaceNumber}=="xx",
      ENV{devboard_link}="tty-CC1352P-2"
    
  2. 그런 다음 "tty" 장치를 일치시키고 상위 장치에 해당 속성이 있는지 확인하십시오.

    ACTION!="remove", SUBSYSTEM=="tty", \
      ENVS{devboard_link}=="?*",
      IMPORT{parent}="devboard_link",
      TAG+="uaccess", SYMLINK+="$env{devboard_link}"
    

(테스트되지 않은 예입니다.)

관련 정보