setserial / dev / ttyS4: Não é possível definir informações de série

3

Então, eu tenho uma placa com 6 portas seriais de hardware: as 2 primeiras no barramento ETX e as 4 últimas no barramento ISA. A configuração a seguir é como deve ser:

/dev/ttyS0 port 0x03F8 irq 4
/dev/ttyS1 port 0x02F8 irq 3
/dev/ttyS2 port 0x0100 irq 5
/dev/ttyS3 port 0x0108 irq 5
/dev/ttyS4 port 0x0110 irq 5
/dev/ttyS5 port 0x0118 irq 5

Na inicialização, corro:

# dmesg | egrep -i 'serial|ttys'
Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled
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

# cat /proc/tty/driver/serial
Serinfo:1.0 driver revision:
0: uart:16550A port: 000003F8 irq:4 tx:0 rx:0
1: uart:16550A port: 000002F8 irq:3 tx:0 rx:0
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0
5: uart:unknown port:00000000 irq:0

Então, estou tentando usar o setserial para configurar as portas ttyS2-ttyS5 com os valores corretos:

# setserial /dev/ttyS2 irq 5 port 0x100 uart 16550A
# setserial /dev/ttyS3 irq 5 port 0x108 uart 16550A
# setserial /dev/ttyS4 irq 5 port 0x110 uart 16550A
Cannot set serial info: Invalid argument
# setserial /dev/ttyS5 irq 5 port 0x118 uart 16550A
Cannot set serial info: Invalid argument

Até mesmo tirando a opção uart do último comando:

# setserial /dev/ttyS4 irq 5
Cannot set serial info: Invalid argument

O que eu preciso fazer para configurar ttyS4 e ttyS5 através de setserial?

    
por Ryan 18.03.2011 / 14:41

5 respostas

1

Algumas coisas me impressionam sobre o que eu vejo na sua /proc e dmesg output:

  • Você não deve tentar compartilhar um IRQ entre dispositivos. Pode funcionar, mas a intenção com o ISA é que cada dispositivo no barramento que precisa de uma linha de interrupção para trabalhar receba seu próprio IRQ. Se as suas placas de porta serial não lhe derem opções de IRQ suficientes, você pode simplesmente não conseguir usá-las todas juntas nesse PC.

  • Os endereços de E / S que você está usando para o segundo par de portas seriais não são padrão. ttyS2 é normalmente em 0x3E8 e ttyS3 é normalmente em 0x2E8. Eu moveria esses se você tivesse essa opção com o cartão serial. (Não há endereços de E / S padrão ou IRQs para ttyS4 e para cima.)

Além de tudo isso, se eu precisasse de 6 portas seriais em uma caixa Linux, eu não tentaria usar placas adaptadoras antigas de porta serial. Eu usaria algo como um Digi AccelePort . Eles ainda oferecem um que funcionará em seus slots ISA, o modelo Xe. Se você precisa barato, você deve ser capaz de encontrar um flutuando no mercado usado; eles eram muito populares no passado.

    
por 18.03.2011 / 16:08
0

Tente adicionar 8250.nr_uarts=6 ou nr_uarts=6 aos seus parâmetros de inicialização do kernel.

Editar: algumas informações que podem ajudar (espero).

por 18.03.2011 / 17:37
0

Tente usar o parâmetro baud_rate 115200 para setserial

    
por 31.03.2011 / 11:34
0

Eu sei que esta questão foi postada em março de 2011, mas eu encontrei o mesmo problema no Debian recentemente, mas encontrei a causa / solução relativamente obscura.

Como tenho certeza, aumentar o número de dispositivos seriais / dev / ttySX além do padrão de quatro (/ dev / ttyS0 a ttyS3) é mais fácil com um sinalizador de inicialização no grub (como alterar o padrão, é necessário recompilar o kernel)

Após a inicialização, esses novos dispositivos ttyS estão vazios (os valores de porta, IRQ, UART etc estão todos definidos como zero).

After experimenting here, it turns out the reason is you're trying to configure a port with a zero base baud. Unfortunately, it starts off as zero.

However, when you try to change a port without specifying the base baud, it is possible for the port to become "usable" and unless we enforce the "must not have zero base baud" rule we have the possibility to oops the kernel via a divide by zero.

https://lkml.org/lkml/2007/2/27/201

O que você deve fazer é especificar o valor base_baud antes de fazer qualquer outra coisa. Se bem me lembro, o base_baud 115200 funcionou para mim.

    
por 03.04.2015 / 07:35
0

Além do base_baud, como mencionado na minha outra resposta sobre esta questão, também pode ser a ordem dos argumentos: (Eu não tive tempo de experimentar diferentes ordens para ver o que exatamente corrigiu, pois o base_baud definitivamente funcionou)

I ran into a similar set of issues trying to get new serial ports installed into an embedded x86 application. The issue for me turned out to be that the setserial program converts its command line arguments, in order, into corresponding ioctl() operations to set the various device parameters. Basically, setserial applied a strategy of: 1)read the current setting for the specific /dev/ttySx 2)modify the values as specifid by each command line arg, with each individual command line argument or flag turning into an ioctl

So, specifying the uart type (or autoconfigure) before you specify the port or irq won't work correctly for ports greater the /dev/ttyS3, because the port value for /dev/ttyS3 isn't initialized to anything. This causes the ioctl() operation to return with errno set to EINVAL (invalid argument). I suspect the chain of ioctl()'s that ^fourport flag followed by low_latency flag turn into something that doesn't make sense to the driver. https://bugzilla.kernel.org/show_bug.cgi?id=8458

    
por 03.04.2015 / 07:53