2011-02-23 15 views
11

Posix requiere cambiar el pin RTS en la abertura del puerto. Quiero una manera de evitarlo.¿Cómo abrir el puerto serie en Linux sin cambiar ningún pin?

+0

Por favor, elabore. ¿Qué quieres hacer con RTS? ¿Cómo requiere el estándar para cambiarlo y por qué? –

+0

Quiero dejar rts sin cambiar durante la apertura del puerto –

+2

Solo para aclarar: en Linux al menos, la llamada abierta ("/ dev/ttyUSB0", os.RDWR) hace que las líneas RTS y DTR suban en el puerto serie. Después de que se haya abierto el puerto, RTS se puede configurar de nuevo en bajo llamando a ioctl. Sin embargo, la pregunta es: ¿cómo abrir el dispositivo sin configurar RTS alto ni siquiera momentáneamente? – Nakedible

Respuesta

1

Teniendo el mismo problema, lo probaría parcheando el controlador de kernel ftdi_sio. Sólo tiene que elimine una pequeña pieza de código en ftdi_dtr_rts() así:

static void ftdi_dtr_rts(struct usb_serial_port *port, int on) { 
    ... 
    /* drop RTS and DTR */ 
    if (on) 
     set_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- HERE 
    else 
     clear_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- and HERE 
} 

y la línea de comunicación RTS ya no se cambia al open() llamada. Tenga en cuenta que es posible que el uart ya no funcione con el protocolo de enlace de hardware RTS/CTS, siempre que se cargue el controlador de kernel modificado. Pero todavía se puede controlar el estado de la línea de comunicación RTS manualmente llamando ej .:

int opins = TIOCM_RTS; 
    ioctl(tty_fd, TIOCMBIC, &opins); 

que había probado esto con el comando de Ctrl+A+G 2.3a picocom, corriendo Kubuntu 16.04 64 bits y Ftdi FT2232H adaptador USB UART basada.

Puede encontrar más detalles sobre este tema here.

+0

¿Podría comprobar cómo la opción O_NONBLOCK interfiere con él? –

+1

Comprobando [picocom.c] (https://github.com/npat-efault/picocom/blob/master/picocom.c), utiliza 'O_NONBLOCK':' tty_fd = open (opts.port, O_RDWR | O_NONBLOCK | O_NOCTTY); 'y se comporta como se describe arriba. – Joe

-2

llamando al fopen("/dev/ACM0", "r") no requiere que haga nada :) Sin embargo, puede que no reciba los datos que espera.

+1

esta llamada cambiará el pin RTS. Necesito evitarlo. –

4

No tengo idea de por qué quieres hacer esto, pero esto se puede hacer fácilmente modificando el controlador del kernel de Linux para tu consola serie para que no active el RTS. Por ejemplo, para el controlador de la serie 8250 en drivers/tty/serial/8250/, puede cambiar cada escritura en el registro MCR (UART_MCR) para asegurarse de que el bit 1 (la máscara no sea UART_MCR_RTS) nunca se configure.

Dado que se abstrae en el espacio de usuario, no tiene suerte si desea hacerlo sin modificar el controlador del kernel.

+2

"No es posible sin modificar el kernel" es una respuesta perfectamente buena. Gracias. – Nakedible

+3

"No tengo idea de por qué quieres hacer esto" -> es muy común que los cargadores de arranque integrados tengan un RTS conectado al pin de reinicio y DTR conectado al pin de selección del gestor de arranque (o viceversa). Si se alterna el pin de reinicio, incluso durante una fracción de un microsegundo, el chip se reiniciará. Esto significa que no es fácil utilizar las líneas de control para este propósito si también está utilizando el puerto serie para la comunicación general con el dispositivo ... no sin desconectar primero las líneas de control :( – Thomas

+0

Veo, es una especie de secuestro de la línea de flujo de control para reiniciar en un estado de programación justo antes de que se envíen los datos en serie.Conveniente, al menos hasta que el diseño cambie de tener un pequeño microcontrolador para usar un SoC de cuatro núcleos con Linux y el ingeniero de hardware no se moleste en consultar a nadie sobre los cambios requeridos en el modelo de programación. – cha5on

Cuestiones relacionadas