저는 2개의 온보드 직렬 포트가 있는 Red Hat Enterprise 6.2 시스템과 8개의 추가 직렬 포트가 있는 PCIe 카드(16C950 UART, 16C550 호환)를 가지고 있습니다. 8250.nr_uarts=10
모든 장치 가 /dev
.
예상한 대로 두 개의 온보드 장치는 ttyS0 및 ttyS1로 표시되지만 예상대로 PCIe 카드의 직렬 포트는 I/O 포트별로 정렬되지 않습니다. 그렇지 않으면 장치가 제대로 작동하지만 tty 순서가 마더보드 브레이크아웃 케이블의 순서와 일치하지 않아 그다지 우아하지 않습니다. 순서를 변경하는 방법에 대한 아이디어가 있나요?
출력 형식 setserial
:
# setserial -g /dev/ttyS*
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: 16650, Port: 0xdf30, IRQ: 30
/dev/ttyS3, UART: 16650, Port: 0xdf38, IRQ: 30
/dev/ttyS4, UART: 16650, Port: 0xdf00, IRQ: 30 <-- Why is this one not ttyS2?
/dev/ttyS5, UART: 16650, Port: 0xdf08, IRQ: 30
/dev/ttyS6, UART: 16650, Port: 0xdf10, IRQ: 30
/dev/ttyS7, UART: 16650, Port: 0xdf18, IRQ: 30
/dev/ttyS8, UART: 16650, Port: 0xdf20, IRQ: 30
/dev/ttyS9, UART: 16650, Port: 0xdf28, IRQ: 30
그것을 보면 dmesg
올바른 순서로 발견되지만 가장 낮은 I/O 포트에 대해 ttyS4로 시작합니다.
# dmesg | grep ttyS
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
0000:05:00.0: ttyS4 at I/O 0xdf00 (irq = 30) is a ST16650
0000:05:00.0: ttyS5 at I/O 0xdf08 (irq = 30) is a ST16650
0000:05:00.0: ttyS6 at I/O 0xdf10 (irq = 30) is a ST16650
0000:05:00.0: ttyS7 at I/O 0xdf18 (irq = 30) is a ST16650
0000:05:00.0: ttyS8 at I/O 0xdf20 (irq = 30) is a ST16650
0000:05:00.0: ttyS9 at I/O 0xdf28 (irq = 30) is a ST16650
0000:05:00.0: ttyS2 at I/O 0xdf30 (irq = 30) is a ST16650
0000:05:00.0: ttyS3 at I/O 0xdf38 (irq = 30) is a ST16650
포트 변경을 사용해도 setserial
작동하지 않는 것 같습니다. 항상 장치가 사용 중이라고 보고합니다(재부팅으로 인한 것이며 장치에 액세스하는 항목이 없습니다).
# setserial /dev/ttyS2 port 0xdf00
Cannot set serial info: Device or resource busy
편집하다: 정보를 주신 Gilles에게 감사드립니다. 저는 현재 주로 udev에서 작업하고 있습니다.이름매칭하여핵심이름. info의 출력은 udevadm
이것이 각 장치를 고유하게 식별하는 데 사용할 수 있는 유일한 매개변수임을 보여줍니다(ttyS[2-9]는 모두 동일한 정보를 보고합니다.핵심범위).
# udevadm info -a -n /dev/ttyS2
looking at device '/devices/pci0000:00/0000:00:07.0/0000:05:00.0/tty/ttyS2':
KERNEL=="ttyS2"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:07.0/0000:05:00.0':
KERNELS=="0000:05:00.0"
SUBSYSTEMS=="pci"
DRIVERS=="serial"
ATTRS{vendor}=="0x494f"
ATTRS{device}=="0x10a9"
ATTRS{subsystem_vendor}=="0x0000"
ATTRS{subsystem_device}=="0x0000"
ATTRS{class}=="0x070002"
ATTRS{irq}=="30"
ATTRS{local_cpus}=="0000ff"
ATTRS{local_cpulist}=="0-7"
내 새로운 udev 규칙:
SUBSYSTEM=="tty", DRIVERS=="serial", ATTRS{vendor}=="0x494f", KERNEL=="ttyS4", NAME="ttyS2"
# [snipped 7 more rules for each device]
답변1
다음 명령을 사용하여 장치 이름을 변경할 수 있습니다.우데브규칙. 달리기udevadm info -a -n /dev/ttyS2
장치의 특성을 파악하십시오. 멀티포트 카드를 고유하게 식별하는 속성과 포트를 식별하는 속성 하나를 찾습니다. 그런 다음 각 포트에 대한 udev 규칙을 작성합니다. 규칙은 다음과 같습니다.
SUBSYSTEM=="tty", DRIVERS=="serial", ATTRS{vendor}=="Yoyodyne", ATTRS{port}=="0xdf00", NAME="ttyS2"
SUBSYSTEM=="tty", DRIVERS=="serial", ATTRS{vendor}=="Yoyodyne", ATTRS{port}=="0xdf80", NAME="ttyS3"
…
달리기udevadm trigger
(올바른 --attr-match-…
옵션을 사용하세요.) 연결된 장치에 규칙을 다시 적용하세요.