ttyS1/uart1 inicializado pero no accesible a través de /dev/ttyS1

ttyS1/uart1 inicializado pero no accesible a través de /dev/ttyS1

No estoy seguro de en qué nivel tengo un problema.

El sistema es un LeopardBoard DM368 que ejecuta el propio kernel SDK/LSP/BusyBox de TI, el kernel central de Linux es 2.6.x, por lo que se utiliza el modelo de controlador serial_core.c.

De forma predeterminada, el sistema tiene un UART habilitado, UART0, montado que /dev/ttyS0también se usa/invoca a través de bootargs console=ttyS0,115200n8 earlyprintk.

Queremos habilitar UART1 como /dev/ttyS1, por lo que revisamos el código de inicialización de la placa de bajo nivel que configura el pinmux, los relojes, etc.

Al arrancar, el inicio de bajo nivel informa (a través de printk que agregué) que está habilitado el UART1, y el código del controlador también informa felicidad:

[    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

Sin embargo, el puerto no aparece en /dev/(como /dev/ttyS1) y hay discrepancias con su estado (bits de control de flujo) que sospecho que pueden estar provocando que se cuelgue/nunca transmita:

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

Si intento configurarlo o modificarlo desde la línea de comando me sale un error:

>: stty -F /dev/ttyS1
stty: can't open '/dev/ttyS1': No such file or directory

Curiosamente, si cambio los bootargs al console=ttyS1,115200n8 earlyprintkpuerto, funciona perfectamente y ttyS0 todavía se inicializa correctamente y también funciona:

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

Ahora, eso estaría bien, pero nuestro gestor de arranque debe usar UART0, por lo que sería bueno mantener todo el material de la consola en ttyS0 y tener ttyS1 para nuestras comunicaciones secundarias.

Inserté un par de printk en serial_core.c y parece que nunca se llama a uart_open() para ttyS1, ¿supongo que es algo en la secuencia de inicio/inicio de Linux que necesita modificación?

Editado: porque me había engañado al hacer algo echo >/dev/ttyS1que había creado unarchivollamado /dev/ttyS1, lo que enturbió un poco las cosas. Ahora estoy 99% seguro /dev/ttyS1de que es así.nuncacreado.

Respuesta1

mknod /dev/ttyS1 c 4 65

(si /deves de solo lectura, utilice cualquier directorio de escritura montado sin la opción nodev)

Si el nodo se crea sin errores, puede verificar si su parche funciona leyendo/escribiendo en el nodo o con cualquier emulador de terminal.

¿El problema es que el nodo no se crea?

Si estás usando algunos desarrolladores dinámicos automágicos como devfso udevprobablemente haya algunosregistroproblema en el medio (pero creo que no, ya que la mayor parte del código es el mismo para abrir el ttyS0 y supongo que agregar un puerto serie es como agregar una fila de configuración en una matriz en algún archivo de plataforma).

Si no está utilizando dev fs de esa manera, probablemente tenga un MAKEDEVarchivo en algún lugar de su árbol de compilación donde agregar manualmente una línea para que su nuevo dispositivo se cree estáticamente. También he visto un sistema en el que los nodos de desarrollo fueron creados mediante un script de inicio.

información relacionada