ttyS1 / uart1 inicializado mas não acessível através de / dev / ttyS1

4

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.

    
por John U 14.10.2013 / 13:22

1 resposta

1

mknod /dev/ttyS1 c 4 65

(se /dev for somente leitura, use qualquer diretório gravável montado sem a opção nodev )

Se o nó for criado sem erros, você poderá verificar se o seu patch está funcionando lendo / gravando no nó ou com qualquer emulador de terminal.

O problema é que o nó não é criado?

Se você estiver usando alguns devs dinâmicos de magia automática como devfs ou udev provavelmente há algum problema registro no meio (mas eu acho que não, como a maioria do código é o mesmo para trazer o ttyS0 e eu acho que adicionar uma porta serial é como adicionar uma linha de configuração em um array em algum arquivo de plataforma).

Se você não está usando o dev fs assim, provavelmente você tem um arquivo MAKEDEV em algum lugar na sua árvore de construção onde adicionar manualmente uma linha para que seu novo dispositivo seja criado estaticamente. Eu vi também um sistema onde os nós dev foram criados por um script de inicialização.

    
por 16.10.2013 / 18:30