Eu tenho uma máquina Red Hat Enterprise 6.2 com duas portas seriais on-board e uma placa PCIe com 8 portas seriais adicionais (16C950 UARTs, 16C550). Eu adicionei a opção de kernel 8250.nr_uarts=10
para que todos os dispositivos sejam exibidos em /dev
.
Os dois dispositivos on-board aparecem como ttyS0 e ttyS1, como esperado, mas as portas seriais na placa PCIe não estão sendo solicitadas pela sua porta de E / S, como eu esperaria. Caso contrário, os dispositivos funcionam bem, mas não é muito elegante que a ordem tty não corresponda à ordem no cabo breakout da placa. Alguma idéia de como mudar o pedido?
Formulário de saída 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
Olhando em dmesg
, ele está encontrando-os na ordem correta, mas iniciando a porta de E / S mais baixa em 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
Tentar usar setserial
para alterar a porta parece não funcionar, ele sempre informa que o dispositivo está ocupado (isso é de uma nova reinicialização, nada acessou o dispositivo).
# setserial /dev/ttyS2 port 0xdf00
Cannot set serial info: Device or resource busy
Editar : graças às informações fornecidas pelo Gilles, atualmente estou trabalhando principalmente com um udev que escreve um NAME ordenado ao corresponder no KERNEL udevadm info mostra que é o único parâmetro que pode ser usado para identificar exclusivamente os dispositivos individuais (ttyS [2-9] todos relatam as mesmas informações, exceto pelo parâmetro 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"
Minhas novas regras do udev:
SUBSYSTEM=="tty", DRIVERS=="serial", ATTRS{vendor}=="0x494f", KERNEL=="ttyS4", NAME="ttyS2"
# [snipped 7 more rules for each device]