Não tenho certeza de qual nível estou tendo um problema.
O System é um LeopardBoard DM368 executando o próprio kernel SDK / LSP / BusyBox da TI, o kernel principal do Linux é 2.6.x, portanto, usando o modelo de driver serial_core.c.
Por padrão, o sistema tem uma UART habilitada, UART0, montada como /dev/ttyS0
, que também é usada / invocada por meio das bootargs console=ttyS0,115200n8 earlyprintk
.
Queremos ativar o UART1 como /dev/ttyS1
, então passamos pelo código de inicialização de placa de baixo nível que configura o pinmux, relógios, etc.
Na inicialização, os relatórios de inicialização de baixo nível (via printk's que eu adicionei) estão habilitados no UART1, e o código do driver também informa felicidade:
[ 0.547812] serial8250.0: ttyS0 at MMIO 0x1c20000 (irq = 40) is a 16550A
[ 0.569849] serial8250.0: ttyS1 at MMIO 0x1d06000 (irq = 41) is a 16550A
No entanto, a porta não aparece em /dev/
(como /dev/ttyS1
) e há discrepâncias com seu status (bits de controle de fluxo) que eu suspeito que possam estar causando a queda / nunca transmissão:
cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:97998 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:0 rx:0 DSR
Se eu tentar configurá-lo ou modificá-lo na linha de comando, recebo um erro:
>: stty -F /dev/ttyS1
stty: can't open '/dev/ttyS1': No such file or directory
Estranhamente, se eu mudar as bootargs para console=ttyS1,115200n8 earlyprintk
, a porta funciona perfeitamente, e ttyS0 ainda é inicializado corretamente e funciona também:
cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x01C20000 irq:40 tx:0 rx:0 CTS|DSR
1: uart:16550A mmio:0x01D06000 irq:41 tx:11563 rx:0 RTS|DTR|DSR
Agora, isso seria ótimo, mas nosso gerenciador de inicialização deve usar o UART0, então seria bom manter todas as coisas do console em ttyS0 e ter o ttyS1 para nossas comunicações secundárias.
Eu inseri alguns printk's em serial_core.c e parece que uart_open () nunca está sendo chamado para ttyS1, estou assumindo que é algo na sequência de init / startup do Linux que precisa ser modificado?
Editado : porque eu tinha me enganado fazendo um echo >/dev/ttyS1
que criara um arquivo chamado /dev/ttyS1
, o que embaciava um pouco os assuntos. Agora tenho 99% de certeza que /dev/ttyS1
é nunca criado.