Rhel

重新排序多埠卡上的串列埠

  • January 27, 2014

我有一台帶有兩個板載串列埠的 Red Hat Enterprise 6.2 機器和一個帶有 8 個額外串列埠(16C950 UART,兼容 16C550)的 PCIe 卡。我添加了核心選項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,它以正確的順序找到它們,但從 ttyS4 開始最低的 I/O 埠:

# 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 工作,該 udev通過匹配核心名稱來寫入有序****名稱。info的輸出顯示這是唯一可用於唯一標識單個設備的參數(ttySudevadm

$$ 2-9 $$除了KERNEL參數外,所有都報告相同的資訊)。

# 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]

您應該能夠使用udev規則更改設備名稱。執行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-…選項)以將規則重新應用於已連接的設備。

引用自:https://unix.stackexchange.com/questions/79733