멀티포트 카드의 직렬 포트 재정렬

멀티포트 카드의 직렬 포트 재정렬

저는 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-…옵션을 사용하세요.) 연결된 장치에 규칙을 다시 적용하세요.

관련 정보