Tutorial de puertos serie y UART

This translation may be out of date. To help with the translations please access the FreeBSD translations instance.

Marcas registradas

FreeBSD es una marca registrada de la Fundación FreeBSD

Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media y Windows NT son marcas registradas o marcas comerciales de Microsoft Corporation en los Estados Unidos de América y/o otros países.

Muchos de los nombres usados por los fabricantes y vendedores para diferenciar sus productos son designados como marcas comerciales. Allí donde estos nombres aparezcan en este documento y el Proyecto FreeBSD fuera consciente de la alegación de marca comercial, los nombres tienen a continuación el símbolo “™” o “®”.

Resumen

Este artículo trata sobre el uso de hardware serie con FreeBSD.


1. La UART: qué es y cómo funciona

Copyright ® 1996 Frank Durda IV <uhclem@FreeBSD.org>, Todos los derechos reservados. 13 de enero de 1996.

El controlador del Receptor/Transmisor Asíncrono Universal (UART) es el componente clave del subsistema de comunicaciones serie de un ordenador. La UART toma bytes de datos y transmite los bits individuales de forma secuencial. En el destino, una segunda UART vuelve a ensamblar los bits en bytes completos.

La transmisión serie se utiliza habitualmente con módems y para la comunicación sin red entre ordenadores, terminales y otros dispositivos.

Existen dos formas principales de transmisión serie: síncrona y asíncrona. Según los modos que admita el hardware, el nombre del subsistema de comunicaciones normalmente incluirá una A si admite comunicaciones asíncronas, y una S si admite comunicaciones síncronas. Ambas formas se describen a continuación.

Algunos acrónimos comunes son:

UART Universal Asynchronous Receiver/Transmitter (Receptor/Transmisor Asíncrono Universal)

USART Universal Synchronous-Asynchronous Receiver/Transmitter (Receptor/Transmisor Síncrono-Asíncrono Universal)

1.1. Transmisión serie síncrona

La transmisión serie síncrona requiere que el emisor y el receptor compartan un reloj, o que el emisor proporcione una señal de strobe u otra señal de temporización para que el receptor sepa cuándo "leer" el siguiente bit de los datos. En la mayoría de las formas de comunicación serie síncrona, si en un instante dado no hay datos disponibles para transmitir, debe enviarse en su lugar un carácter de relleno para que siempre se estén transmitiendo datos. La comunicación síncrona suele ser más eficiente porque solo se transmiten bits de datos entre el emisor y el receptor, aunque puede resultar más costosa si se necesitan cableado y circuitos adicionales para compartir una señal de reloj entre ambos.

Se utiliza una forma de transmisión síncrona con las impresoras y los dispositivos de disco fijo, en la que los datos se envían por un conjunto de hilos mientras que un reloj o strobe se envía por un hilo distinto. Las impresoras y los dispositivos de disco fijo normalmente no son dispositivos serie, ya que la mayoría de los estándares de interfaz de disco fijo envían una palabra de datos completa por cada señal de reloj o strobe, utilizando un hilo independiente para cada bit de la palabra. En la industria del PC, estos se conocen como dispositivos paralelos.

El hardware de comunicaciones serie estándar del PC no admite operaciones síncronas. Este modo se describe aquí únicamente con fines comparativos.

1.2. Transmisión serie asíncrona

La transmisión asíncrona permite transmitir datos sin que el emisor tenga que enviar una señal de reloj al receptor. En su lugar, el emisor y el receptor deben acordar de antemano los parámetros de temporización, y se añaden a cada palabra unos bits especiales que sirven para sincronizar las unidades emisora y receptora.

Cuando se entrega una palabra a la UART para transmisiones asíncronas, se añade al principio de cada palabra que se va a transmitir un bit llamado "Bit de inicio" (Start Bit). El Bit de inicio sirve para avisar al receptor de que está a punto de enviarse una palabra de datos, y para forzar la sincronización del reloj del receptor con el del transmisor. Estos dos relojes deben ser lo bastante precisos como para que la frecuencia no se desvíe más de un 10% durante la transmisión de los bits restantes de la palabra. (Este requisito se estableció en la época de los teleimpresores mecánicos y los equipos electrónicos modernos lo cumplen con facilidad.)

Tras el Bit de inicio, se envían los bits individuales de la palabra de datos, empezando por el bit menos significativo (LSB). Cada bit de la transmisión se transmite exactamente durante el mismo tiempo que todos los demás, y el receptor "mira" el hilo aproximadamente a la mitad del periodo asignado a cada bit para determinar si el bit es un 1 o un 0. Por ejemplo, si se tarda dos segundos en enviar cada bit, el receptor examinará la señal para determinar si es un 1 o un 0 una vez transcurrido un segundo, luego esperará dos segundos y examinará el valor del siguiente bit, y así sucesivamente.

El emisor no sabe cuándo el receptor ha "mirado" el valor del bit. El emisor solo sabe cuándo el reloj indica que debe comenzar a transmitir el siguiente bit de la palabra.

Cuando se ha enviado la palabra de datos completa, el transmisor puede añadir un Bit de paridad que genera el propio transmisor. El receptor puede utilizar el Bit de paridad para realizar una comprobación de errores sencilla. A continuación, el transmisor envía al menos un Bit de parada (Stop Bit).

Cuando el receptor ha recibido todos los bits de la palabra de datos, puede comprobar los Bits de paridad (el emisor y el receptor deben acordar si se va a utilizar un Bit de paridad) y, a continuación, busca un Bit de parada. Si el Bit de parada no aparece cuando debería, la UART considera que toda la palabra está corrupta e informará de un Error de trama (Framing Error) al procesador de la máquina cuando se lea la palabra de datos. La causa habitual de un Error de trama es que los relojes del emisor y del receptor no funcionaban a la misma velocidad, o que la señal se interrumpió.

Con independencia de que los datos se hayan recibido correctamente o no, la UART descarta automáticamente los bits de inicio, paridad y parada. Si el emisor y el receptor están configurados de forma idéntica, estos bits no se pasan a la máquina.

Si hay otra palabra lista para su transmisión, el Bit de inicio de la nueva palabra puede enviarse en cuanto se haya enviado el Bit de parada de la palabra anterior.

Dado que los datos asíncronos son "autosincronizados", si no hay datos que transmitir, la línea de transmisión puede permanecer inactiva.

1.3. Otras funciones de la UART

Además de la tarea básica de convertir los datos de paralelo a serie para la transmisión y de serie a paralelo en la recepción, una UART normalmente proporciona circuitos adicionales para señales que pueden utilizarse para indicar el estado del medio de transmisión y para regular el flujo de datos en caso de que el dispositivo remoto no esté preparado para aceptar más datos. Por ejemplo, cuando el dispositivo conectado a la UART es un módem, este puede informar de la presencia de una portadora en la línea telefónica, mientras que el ordenador puede indicar al módem que se reinicie o que no atienda llamadas elevando o bajando una o más de estas señales adicionales. La función de cada una de estas señales adicionales está definida en el estándar EIA RS232-C.

1.4. Los estándares RS232-C y V.24

En la mayoría de los sistemas informáticos, la UART está conectada a circuitos que generan señales conformes con la especificación EIA RS232-C. También existe un estándar CCITT llamado V.24 que reproduce las especificaciones incluidas en RS232-C.

1.4.1. Asignaciones de bits en RS232-C (Marks y Spaces)

En RS232-C, un valor de 1 se denomina Mark y un valor de 0 se denomina Space. Cuando una línea de comunicación está inactiva, se dice que la línea está en "Marking", es decir, transmitiendo valores 1 continuos.

El Bit de inicio siempre tiene un valor de 0 (un Space). El Bit de parada siempre tiene un valor de 1 (un Mark). Esto significa que siempre habrá una transición de Mark (1) a Space (0) en la línea al comienzo de cada palabra, incluso cuando se transmitan varias palabras seguidas. Esto garantiza que el emisor y el receptor puedan resincronizar sus relojes con independencia del contenido de los bits de datos que se estén transmitiendo.

El tiempo de inactividad entre los bits de parada y de inicio no tiene que ser un múltiplo exacto (incluido cero) de la velocidad en bits del enlace de comunicación, pero la mayoría de las UART están diseñadas así por simplicidad.

En RS232-C, la señal de "Marking" (un 1) se representa mediante una tensión entre -2 VDC y -12 VDC, y una señal de "Spacing" (un 0) se representa mediante una tensión entre 0 y +12 VDC. Se supone que el transmisor envía +12 VDC o -12 VDC, y que el receptor tolera cierta pérdida de tensión en los cables largos. Algunos transmisores de dispositivos de bajo consumo (como los ordenadores portátiles) a veces utilizan solo +5 VDC y -5 VDC, pero estos valores siguen siendo aceptables para un receptor RS232-C, siempre que las longitudes de cable sean cortas.

1.4.2. Señal de ruptura (Break) en RS232-C

RS232-C también especifica una señal llamada Break, que se produce enviando valores de Spacing continuos (sin bits de inicio ni de parada). Cuando no hay electricidad presente en el circuito de datos, se considera que la línea está enviando Break.

La señal Break debe tener una duración superior al tiempo necesario para enviar un byte completo más los bits de inicio, parada y paridad. La mayoría de las UART pueden distinguir entre un Error de trama y un Break, pero si la UART no puede hacerlo, la detección de Errores de trama puede utilizarse para identificar los Breaks.

En la época de los teleimpresores, cuando numerosas impresoras de todo el país estaban cableadas en serie (como las de las agencias de noticias), cualquier unidad podía provocar un Break abriendo temporalmente todo el circuito de modo que no circulase corriente. Esto se utilizaba para permitir que una ubicación con noticias urgentes interrumpiese a otra ubicación que estuviese enviando información en ese momento.

En los sistemas modernos existen dos tipos de señales Break. Si el Break dura más de 1,6 segundos, se considera un "Modem Break", y algunos módems pueden programarse para terminar la conversación y colgar, o para entrar en el modo de comandos del módem, cuando detectan esta señal. Si el Break dura menos de 1,6 segundos, se trata de un Data Break y corresponde al ordenador remoto responder a esta señal. A veces esta forma de Break se utiliza como señal de Atención o de Interrupción y a veces se acepta como sustituto del carácter ASCII CONTROL-C.

Los Marks y los Spaces también equivalen a los "agujeros" y "no agujeros" de los sistemas de cinta de papel.

Los Breaks no pueden generarse a partir de una cinta de papel ni de ningún otro valor de byte, ya que los bytes siempre se envían con bit de inicio y de parada. La UART normalmente es capaz de generar la señal de Spacing continuo en respuesta a un comando especial del procesador de la máquina.

1.4.3. Dispositivos DTE y DCE en RS232-C

La especificación RS232-C define dos tipos de equipos: el Equipo Terminal de Datos (DTE) y el Equipo de Comunicación de Datos (DCE). Normalmente, el dispositivo DTE es el terminal (u ordenador) y el DCE es un módem. Al otro lado de la línea telefónica, en el otro extremo de la conversación, el módem receptor también es un dispositivo DCE y el ordenador conectado a ese módem es un dispositivo DTE. El dispositivo DCE recibe las señales por los pines por los que transmite el dispositivo DTE, y viceversa.

Cuando dos dispositivos que son ambos DTE o ambos DCE deben conectarse entre sí sin un módem o un traductor de medios similar entre ellos, debe utilizarse un módem NULL. El módem NULL reorganiza eléctricamente el cableado de modo que la salida del transmisor se conecte con la entrada del receptor del otro dispositivo, y viceversa. Se realizan traducciones similares en todas las señales de control para que cada dispositivo vea lo que considera señales DCE (o DTE) del otro dispositivo.

El número de señales generadas por los dispositivos DTE y DCE no es simétrico. El dispositivo DTE genera menos señales para el dispositivo DCE que las que el DTE recibe del DCE.

1.4.4. Asignaciones de pines en RS232-C

La especificación EIA RS232-C (y su equivalente de la ITU, V.24) requiere un conector de veinticinco pines (normalmente un DB25) y define la finalidad de la mayoría de los pines de ese conector.

En el IBM Personal Computer y sistemas similares, un subconjunto de las señales RS232-C se proporciona mediante conectores de nueve pines (DB9). Las señales que no se incluyen en el conector del PC se refieren principalmente a la operación síncrona, y este modo de transmisión no está admitido por la UART que IBM seleccionó para el IBM PC.

Según el fabricante del ordenador, para las comunicaciones RS232-C puede utilizarse un DB25, un DB9 o ambos tipos de conector. (El IBM PC también utiliza un conector DB25 para la interfaz de impresora paralela, lo que provoca cierta confusión.)

A continuación se muestra una tabla con las asignaciones de señales RS232-C en los conectores DB25 y DB9.

Pin RS232-C en DB25Pin IBM PC en DB9Símbolo de circuito EIASímbolo de circuito CCITTNombre comúnOrigen de la señalDescripción

1

-

AA

101

PG/FG

-

Tierra de chasis/protectora

2

3

BA

103

TD

DTE

Transmitir datos

3

2

BB

104

RD

DCE

Recibir datos

4

7

CA

105

RTS

DTE

Solicitud de envío

5

8

CB

106

CTS

DCE

Listo para enviar

6

6

CC

107

DSR

DCE

Conjunto de datos listo

7

5

AV

102

SG/GND

-

Tierra de señal

8

1

CF

109

DCD/CD

DCE

Detección de portadora de datos

9

-

-

-

-

-

Reservado para pruebas

10

-

-

-

-

-

Reservado para pruebas

11

-

-

-

-

-

Reservado para pruebas

12

-

CI

122

SRLSD

DCE

Detector sec. de señal de línea recibida

13

-

SCB

121

SCTS

DCE

Listo para enviar secundario

14

-

SBA

118

STD

DTE

Transmitir datos secundario

15

-

DB

114

TSET

DCE

Temporización de elemento de señal de transm.

16

-

SBB

119

SRD

DCE

Recibir datos secundario

17

-

DD

115

RSET

DCE

Temporización de elemento de señal del receptor

18

-

-

141

LOOP

DTE

Bucle local

19

-

SCA

120

SRS

DTE

Solicitud de envío secundaria

20

4

CD

108.2

DTR

DTE

Terminal de datos listo

21

-

-

-

RDL

DTE

Bucle digital remoto

22

9

CE

125

RI

DCE

Indicador de llamada

23

-

CH

111

DSRS

DTE

Selector de velocidad de señal de datos

24

-

DA

113

TSET

DTE

Temporización de elemento de señal de transm.

25

-

-

142

-

DCE

Modo de prueba

1.5. Bits, baudios y símbolos

El baudio es una medida de la velocidad de transmisión en la comunicación asíncrona. Debido a los avances en la tecnología de comunicación de los módems, este término se utiliza con frecuencia de forma incorrecta al describir las velocidades de datos de los dispositivos más recientes.

Tradicionalmente, una velocidad en baudios representa el número de bits que se envían realmente por el medio, no la cantidad de datos que se mueven realmente de un dispositivo DTE a otro. El recuento de baudios incluye los bits adicionales de inicio, parada y paridad que genera la UART emisora y que elimina la UART receptora. Esto significa que las palabras de datos de siete bits en realidad necesitan 10 bits para transmitirse por completo. Por lo tanto, un módem capaz de mover 300 bits por segundo de un lugar a otro normalmente solo puede mover 30 palabras de 7 bits si se utiliza paridad y hay un bit de inicio y uno de parada.

Si se utilizan palabras de datos de 8 bits y también bits de paridad, la velocidad de datos cae a 27,27 palabras por segundo, porque ahora se necesitan 11 bits para enviar las palabras de ocho bits, y el módem sigue enviando solo 300 bits por segundo.

La fórmula para convertir bytes por segundo en una velocidad en baudios y viceversa era sencilla hasta que aparecieron los módems con corrección de errores. Estos módems reciben el flujo serie de bits de la UART del ordenador (incluso cuando se utilizan módems internos los datos suelen seguir serializándose) y vuelven a convertir los bits en bytes. A continuación, estos bytes se combinan en paquetes y se envían por la línea telefónica mediante un método de transmisión síncrona. Esto significa que los bits de parada, inicio y paridad añadidos por la UART en el DTE (el ordenador) fueron eliminados por el módem antes de la transmisión por parte del módem emisor. Cuando estos bytes son recibidos por el módem remoto, este añade bits de inicio, parada y paridad a las palabras, las convierte a formato serie y las envía a la UART receptora del ordenador remoto, que a continuación elimina los bits de inicio, parada y paridad.

La razón de todas estas conversiones adicionales es que los dos módems puedan realizar corrección de errores, lo que significa que el módem receptor puede pedir al módem emisor que reenvíe un bloque de datos que no se recibió con la suma de comprobación correcta. Esta comprobación la gestionan los módems, y los dispositivos DTE normalmente no son conscientes de que se está produciendo este proceso.

Al eliminar los bits de inicio, parada y paridad, los bits adicionales de datos que los dos módems deben compartir entre sí para realizar la corrección de errores quedan en su mayor parte ocultos a la velocidad de transmisión efectiva que ven los equipos DTE emisor y receptor. Por ejemplo, si un módem envía diez palabras de 7 bits a otro módem sin incluir los bits de inicio, parada y paridad, el módem emisor podrá añadir 30 bits de información propia que el módem receptor puede utilizar para realizar la corrección de errores sin afectar a la velocidad de transmisión de los datos reales.

El uso del término baudio se complica aún más con los módems que realizan compresión. Una única palabra de 8 bits transmitida por la línea telefónica puede representar una docena de palabras que se transmitieron al módem emisor. El módem receptor expandirá los datos a su contenido original y pasará esos datos al DTE receptor.

Los módems modernos también incluyen búferes que permiten que la velocidad a la que los bits se mueven por la línea telefónica (de DCE a DCE) sea distinta de la velocidad a la que los bits se mueven entre el DTE y el DCE en ambos extremos de la conversación. Normalmente la velocidad entre el DTE y el DCE es mayor que la velocidad de DCE a DCE debido al uso de compresión por parte de los módems.

Dado que el número de bits necesarios para describir un byte varía durante el trayecto entre las dos máquinas, además de las diferentes velocidades en bits por segundo presentes en los enlaces DTE-DCE y DCE-DCE, el uso del término baudio para describir la velocidad global de comunicación causa problemas y puede falsear la velocidad real de transmisión. Así pues, Bits por segundo (bps) es el término correcto para describir la velocidad de transmisión vista en la interfaz de DCE a DCE, y baudio o bits por segundo son términos aceptables cuando se establece una conexión entre dos sistemas mediante una conexión cableada, o si se utiliza un módem que no realiza corrección de errores ni compresión.

Los módems modernos de alta velocidad (2400, 9600, 14.400 y 19.200bps) en realidad siguen funcionando a 2400 baudios o menos, o más exactamente, a 2400 símbolos por segundo. Los módems de alta velocidad son capaces de codificar más bits de datos en cada símbolo mediante una técnica llamada Constellation Stuffing, y por eso la velocidad efectiva en bits por segundo del módem es mayor, pero el módem sigue funcionando dentro del limitado ancho de banda de audio que proporciona el sistema telefónico. Los módems que funcionan a 28.800 y velocidades superiores tienen velocidades de símbolo variables, pero la técnica es la misma.

1.6. La UART del IBM Personal Computer

Desde el IBM Personal Computer original, IBM seleccionó la UART INS8250 de National Semiconductor para el Adaptador Paralelo/Serie del IBM PC. Las generaciones posteriores de ordenadores compatibles de IBM y de otros fabricantes siguieron utilizando la INS8250 o versiones mejoradas de la familia de UART de National Semiconductor.

1.6.1. Árbol genealógico de la familia de UART de National Semiconductor

Ha habido varias versiones y generaciones posteriores de la UART INS8250. A continuación se describe cada versión importante.

INS8250  -> INS8250B
  \
   \
    \-> INS8250A -> INS82C50A
             \
              \
               \-> NS16450 -> NS16C450
                        \
                         \
                          \-> NS16550 -> NS16550A -> PC16550D
INS8250

Esta pieza se utilizó en el IBM PC original y en el IBM PC/XT. El nombre original de esta pieza era INS8250 ACE (Asynchronous Communications Element) y está fabricada con tecnología NMOS.

La 8250 utiliza ocho puertos de E/S y tiene un búfer de envío de un byte y un búfer de recepción de un byte. Esta UART original tiene varias condiciones de carrera y otros defectos. La BIOS original de IBM incluye código para sortear estos defectos, pero esto hizo que la BIOS dependiera de que los defectos estuvieran presentes, por lo que piezas posteriores como la 8250A, la 16450 o la 16550 no podían utilizarse en el IBM PC ni en el IBM PC/XT originales.

INS8250-B

Esta es la versión de menor velocidad de la INS8250 fabricada con tecnología NMOS. Contiene los mismos problemas que la INS8250 original.

INS8250A

Una versión mejorada de la INS8250 que utiliza tecnología XMOS y en la que se corrigieron varios defectos funcionales. La INS8250A se utilizó inicialmente en ordenadores clónicos de PC por fabricantes que empleaban diseños de BIOS "limpios". Debido a las correcciones del chip, esta pieza no podía utilizarse con una BIOS compatible con la INS8250 o la INS8250B.

INS82C50A

Es una versión CMOS (de bajo consumo) de la INS8250A y tiene características funcionales similares.

NS16450

Igual que la NS8250A, con mejoras para poder utilizarse con diseños de bus de CPU más rápidos. IBM utilizó esta pieza en el IBM AT y actualizó la BIOS de IBM para que dejase de depender de los errores de la INS8250.

NS16C450

Es una versión CMOS (de bajo consumo) de la NS16450.

NS16550

Igual que la NS16450 con un búfer de envío y recepción de 16 bytes, pero el diseño del búfer era defectuoso y no podía utilizarse de forma fiable.

NS16550A

Igual que la NS16550 con los defectos del búfer corregidos. La 16550A y sus sucesoras se han convertido en el diseño de UART más popular de la industria del PC, principalmente por su capacidad de manejar de forma fiable velocidades de datos más altas en sistemas operativos con tiempos de respuesta a interrupciones lentos.

NS16C552

Este componente consta de dos UART CMOS NS16C550A en un único encapsulado.

PC16550D

Igual que la NS16550A con defectos sutiles corregidos. Es la revisión D de la familia 16550 y el último diseño disponible de National Semiconductor.

1.6.2. La NS16550AF y la PC16550D son lo mismo

National reorganizó su sistema de numeración de piezas hace unos años, y la NS16550AFN ya no existe con ese nombre. (Si tiene una NS16550AFN, mire el código de fecha de la pieza, que es un número de cuatro dígitos que normalmente empieza por nueve. Los dos primeros dígitos del número son el año, y los dos últimos dígitos son la semana de ese año en que se encapsuló la pieza. Si tiene una NS16550AFN, probablemente tenga unos cuantos años.)

Los nuevos números son como PC16550DV, con diferencias menores en las letras del sufijo según el material del encapsulado y su forma. (A continuación se encuentra una descripción del sistema de numeración.)

Es importante entender que en algunas tiendas puede pagar 15$(US) por una NS16550AFN fabricada en 1990 y en el contenedor de al lado estar las nuevas piezas PC16550DN con correcciones menores que National ha realizado desde que se producía la pieza AFN; la PC16550DN probablemente se fabricó en los últimos seis meses y cuesta la mitad (hasta 5$(US) por volumen) que la NS16550AFN porque están fácilmente disponibles.

A medida que siga disminuyendo la oferta de chips NS16550AFN, el precio probablemente seguirá subiendo hasta que más gente descubra y acepte que la PC16550DN realmente tiene la misma función que el antiguo número de pieza.

1.6.3. Sistema de numeración de piezas de National Semiconductor

Los antiguos números de pieza NSnnnnnrqp tienen ahora el formato PCnnnnnrgp.

El campo r es el campo de revisión. La revisión actual de la 16550 de National Semiconductor es D.

El campo p es el campo del tipo de encapsulado. Los tipos son:

"F"

QFP

(quad flat pack) tipo de patillas L

"N"

DIP

(dual inline package) tipo de patillas rectas de orificio pasante

"V"

LPCC

(lead plastic chip carrier) tipo de patillas J

El campo g es el campo del grado del producto. Si una I precede a la letra del tipo de encapsulado, indica una pieza de grado "industrial", que tiene especificaciones superiores a las de una pieza estándar pero no tan altas como un componente de Especificación Militar (Milspec). Este es un campo opcional.

Así pues, lo que antes llamábamos NS16550AFN (encapsulado DIP) ahora se llama PC16550DN o PC16550DIN.

1.7. Otros fabricantes y UART similares

A lo largo de los años, la 8250, la 8250A, la 16450 y la 16550 han sido licenciadas o copiadas por otros fabricantes de chips. En el caso de la 8250, la 8250A y la 16450, el circuito exacto (la "megacelda") fue licenciado a muchos fabricantes, entre ellos Western Digital e Intel. Otros fabricantes aplicaron ingeniería inversa a la pieza o produjeron emulaciones con un comportamiento similar.

En los módems internos, el diseñador del módem suele emular la 8250A/16450 con el microprocesador del módem, y la UART emulada suele tener un búfer oculto de varios cientos de bytes. Debido al tamaño del búfer, estas emulaciones pueden ser tan fiables como una 16550A en su capacidad de manejar datos de alta velocidad. Sin embargo, la mayoría de los sistemas operativos seguirán informando de que la UART es solo una 8250A o una 16450, y es posible que no hagan un uso eficaz del búfer adicional presente en la UART emulada a menos que se utilicen controladores especiales.

Algunos fabricantes de módems se ven impulsados por las fuerzas del mercado a abandonar un diseño con cientos de bytes de búfer y a utilizar en su lugar una UART 16550A para que el producto salga bien parado en las comparativas de mercado, aunque el rendimiento efectivo pueda verse reducido por esta decisión.

Un error muy extendido es creer que todas las piezas con "16550A" escrito tienen un rendimiento idéntico. Existen diferencias y, en algunos casos, defectos manifiestos en la mayoría de estos clones de la 16550A.

Cuando se desarrolló la NS16550, National Semiconductor obtuvo varias patentes sobre el diseño y además limitó las licencias, lo que dificultó que otros fabricantes proporcionasen un chip con características similares. Como consecuencia de las patentes, los diseños de ingeniería inversa y las emulaciones tuvieron que evitar infringir las reivindicaciones cubiertas por las patentes. Posteriormente, estas copias casi nunca se comportan exactamente igual que la NS16550A o la PC16550D, que son las piezas que la mayoría de los fabricantes de ordenadores y módems quieren comprar, pero que a veces no están dispuestos a pagar el precio necesario para obtener la pieza genuina.

Algunas de las diferencias en las piezas clónicas de la 16550A carecen de importancia, mientras que otras pueden impedir por completo que el dispositivo se utilice con un determinado sistema operativo o controlador. Estas diferencias pueden manifestarse al utilizar otros controladores, o cuando se producen combinaciones concretas de eventos que no fueron bien probadas o consideradas en el controlador de Windows®. Esto se debe a que la mayoría de los fabricantes de módems y de clones de la 16550 utilizan los controladores de Microsoft de Windows® for Workgroups 3.11 y la utilidad de Microsoft® MS-DOS® como pruebas principales de compatibilidad con la NS16550A. Este criterio excesivamente simplista significa que, si se utiliza un sistema operativo diferente, podrían aparecer problemas debido a diferencias sutiles entre los clones y los componentes genuinos.

National Semiconductor ha puesto a disposición un programa llamado COMTEST que realiza pruebas de compatibilidad independientes de cualquier controlador del sistema operativo. Debe recordarse que el propósito de este tipo de programa es demostrar los defectos de los productos de la competencia, por lo que el programa informará tanto de diferencias de comportamiento importantes como de otras extremadamente sutiles en la pieza que se está probando.

En una serie de pruebas realizadas por el autor de este documento en 1994, se probaron con COMTEST componentes fabricados por National Semiconductor, TI, StarTech y CMD, así como megaceldas y emulaciones integradas en módems internos. A continuación se indica el recuento de diferencias de algunos de estos componentes. Dado que estas pruebas se realizaron en 1994, es posible que no reflejen el rendimiento actual del producto correspondiente de un fabricante.

Debe señalarse que COMTEST normalmente aborta cuando se ha detectado un número excesivo de problemas o ciertos tipos de problemas. Como parte de estas pruebas, COMTEST se modificó para que no abortase sin importar cuántas diferencias se encontrasen.

FabricanteNúmero de piezaErrores (o "diferencias" notificadas)

National

(PC16550DV)

0

National

(NS16550AFN)

0

National

(NS16C552V)

0

TI

(TL16550AFN)

3

CMD

(16C550PE)

19

StarTech

(ST16C550J)

23

Rockwell

Módem de referencia con 16550 interna o una emulación (RC144DPi/C3000-25)

117

Sierra

Módem con 16550 interna (SC11951/SC11351)

91

Hasta la fecha, el autor de este documento no ha encontrado ninguna pieza que no sea de National que notifique cero diferencias con el programa COMTEST. También debe señalarse que National ha tenido cinco versiones de la 16550 a lo largo de los años y que las piezas más nuevas se comportan de forma algo distinta a la clásica NS16550AFN, que se considera la referencia de funcionalidad. COMTEST parece hacer la vista gorda ante las diferencias dentro de la línea de productos de National y no notifica errores en las piezas de National (excepto en la 16550 original) incluso cuando existen erratas oficiales que describen errores en las revisiones A, B y C de las piezas, por lo que debe tenerse en cuenta este sesgo de COMTEST.

Es importante entender que un simple recuento de diferencias de COMTEST no revela mucho sobre qué diferencias son importantes y cuáles no. Por ejemplo, aproximadamente la mitad de las diferencias notificadas en los dos módems mencionados arriba que tienen UART internas se debieron a que las UART clónicas no admitían los modos de carácter de cinco y seis bits. Las UART 16550, 16450 y 8250 reales admiten todas estos modos y COMTEST comprueba la funcionalidad de estos modos, por lo que se notifican más de cincuenta diferencias. Sin embargo, casi ningún módem moderno admite caracteres de cinco o seis bits, en particular los que tienen capacidades de corrección de errores y compresión. Esto significa que las diferencias relacionadas con los modos de carácter de cinco y seis bits pueden descartarse.

Muchas de las diferencias que notifica COMTEST tienen que ver con la temporización. En muchos de los diseños clónicos, cuando la máquina lee de un puerto, los bits de estado de algún otro puerto pueden no actualizarse en el mismo tiempo (unos más rápido, otros más lento) que en una NS16550AFN real, y COMTEST busca estas diferencias. Esto significa que el número de diferencias puede inducir a error: un dispositivo puede tener solo una o dos diferencias, pero extremadamente graves, y otro dispositivo que actualice los registros de estado más rápido o más lento que la pieza de referencia (lo que probablemente nunca afectaría al funcionamiento de un controlador bien escrito) podría tener decenas de diferencias notificadas.

COMTEST puede utilizarse como herramienta de cribado para alertar al administrador de la presencia de componentes potencialmente incompatibles que podrían causar problemas o tener que tratarse como un caso especial.

Si ejecuta COMTEST en una 16550 que se encuentra en un módem o hay un módem conectado al puerto serie, primero debe enviar un comando ATE0&W al módem para que este no repita (eco) ninguno de los caracteres de prueba. Si olvida hacerlo, COMTEST notificará al menos esta diferencia:

Error (6)...Timeout interrupt failed: IIR = c1  LSR = 61

1.8. Registros 8250/16450/16550

La UART 8250/16450/16550 ocupa ocho direcciones de puertos de E/S contiguas. En el IBM PC hay dos ubicaciones definidas para estos ocho puertos, que se conocen colectivamente como COM1 y COM2. Los fabricantes de clones de PC y de tarjetas de ampliación han creado dos áreas adicionales conocidas como COM3 y COM4, pero estos puertos COM adicionales entran en conflicto con otro hardware en algunos sistemas. El conflicto más común es con los adaptadores de vídeo que proporcionan emulación del IBM 8514.

COM1 se encuentra de 0x3f8 a 0x3ff y normalmente utiliza la IRQ 4. COM2 se encuentra de 0x2f8 a 0x2ff y normalmente utiliza la IRQ 3. COM3 se encuentra de 0x3e8 a 0x3ef y no tiene una IRQ normalizada. COM4 se encuentra de 0x2e8 a 0x2ef y no tiene una IRQ normalizada.

A continuación se ofrece una descripción de los puertos de E/S de la UART 8250/16450/16550.

Puerto de E/SAcceso permitidoDescripción

+0x00

escritura (DLAB==0)

Registro de retención de transmisión (Transmit Holding Register, THR).

La información escrita en este puerto se trata como palabras de datos y será transmitida por la UART.

+0x00

lectura (DLAB==0)

Registro de búfer de recepción (Receive Buffer Register, RBR).

La máquina accede a las palabras de datos recibidas por la UART desde el enlace serie leyendo este puerto.

+0x00

escritura/lectura (DLAB==1)

Latch de divisor LSB (Divisor Latch LSB, DLL)

Este valor se dividirá a partir del reloj maestro de entrada (en el IBM PC, el reloj maestro es de 1,8432MHz) y el reloj resultante determinará la velocidad en baudios de la UART. Este registro contiene los bits 0 a 7 del divisor.

+0x01

escritura/lectura (DLAB==1)

Latch de divisor MSB (Divisor Latch MSB, DLH)

Este valor se dividirá a partir del reloj maestro de entrada (en el IBM PC, el reloj maestro es de 1,8432MHz) y el reloj resultante determinará la velocidad en baudios de la UART. Este registro contiene los bits 8 a 15 del divisor.

+0x01

escritura/lectura (DLAB==0)

Registro de habilitación de interrupciones (Interrupt Enable Register, IER)

La UART 8250/16450/16550 clasifica los eventos en una de cuatro categorías. Cada categoría puede configurarse para generar una interrupción cuando se produce cualquiera de los eventos. La UART 8250/16450/16550 genera una única señal de interrupción externa con independencia de cuántos eventos de las categorías habilitadas se hayan producido. Corresponde al procesador de la máquina responder a la interrupción y consultar después las categorías de interrupción habilitadas (normalmente todas las categorías tienen las interrupciones habilitadas) para determinar la(s) causa(s) real(es) de la interrupción.
Bit 7 → Reservado, siempre 0.
Bit 6 → Reservado, siempre 0.
Bit 5 → Reservado, siempre 0.
Bit 4 → Reservado, siempre 0.
Bit 3 → Habilitar interrupción de estado del módem (Enable Modem Status Interrupt, EDSSI). Al poner este bit a "1", la UART puede generar una interrupción cuando se produce un cambio en una o más de las líneas de estado.
Bit 2 → Habilitar interrupción de estado de línea del receptor (Enable Receiver Line Status Interrupt, ELSI). Al poner este bit a "1", la UART genera una interrupción cuando se ha detectado un error (o una señal BREAK) en los datos entrantes.
Bit 1 → Habilitar interrupción de registro de retención de transmisor vacío (Enable Transmitter Holding Register Empty Interrupt, ETBEI). Al poner este bit a "1", la UART genera una interrupción cuando tiene espacio para uno o más caracteres adicionales que se van a transmitir.
Bit 0 → Habilitar interrupción de datos recibidos disponibles (Enable Received Data Available Interrupt, ERBFI). Al poner este bit a "1", la UART genera una interrupción cuando ha recibido suficientes caracteres para superar el nivel de disparo de la FIFO, o ha expirado el temporizador de la FIFO (datos obsoletos), o se ha recibido un solo carácter cuando la FIFO está deshabilitada.

+0x02

write

Registro de control de FIFO (FIFO Control Register, FCR) (Este puerto no existe en las UART 8250 y 16450.)
Bit 7 → Bit #1 de disparo del receptor
Bit 6 → Bit #0 de disparo del receptor

Estos dos bits controlan en qué punto debe generar el receptor una interrupción cuando la FIFO está activa.
7 6 Cuántas palabras se reciben antes de generar una interrupción
0 0 1
0 1 4
1 0 8
1 1 14
Bit 5 → Reservado, siempre 0.
Bit 4 → Reservado, siempre 0.
Bit 3 → Selección del modo DMA. Si el Bit 0 está a "1" (FIFO habilitadas), al poner este bit se cambia el funcionamiento de las señales -RXRDY y -TXRDY del Modo 0 al Modo 1.
Bit 2 → Reinicio de la FIFO de transmisión. Cuando se escribe un "1" en este bit, se descarta el contenido de la FIFO. Cualquier palabra que se esté transmitiendo en ese momento se enviará íntegra. Esta función es útil para abortar transferencias.
Bit 1 → Reinicio de la FIFO del receptor. Cuando se escribe un "1" en este bit, se descarta el contenido de la FIFO. Cualquier palabra que se esté ensamblando en ese momento en el registro de desplazamiento se recibirá íntegra.
Bit 0 → Habilitación de la FIFO de la 16550. Cuando está activado, se habilitan tanto la FIFO de transmisión como la de recepción. Cualquier contenido del registro de retención, de los registros de desplazamiento o de las FIFO se pierde cuando las FIFO se habilitan o se deshabilitan.

+0x02

read

Registro de identificación de interrupción (Interrupt Identification Register)
Bit 7 → FIFO habilitadas. En la UART 8250/16450, este bit es cero.
Bit 6 → FIFO habilitadas. En la UART 8250/16450, este bit es cero.
Bit 5 → Reservado, siempre 0.
Bit 4 → Reservado, siempre 0.
Bit 3 → Bit #2 de ID de interrupción. En la UART 8250/16450, este bit es cero.
Bit 2 → Bit #1 de ID de interrupción
Bit 1 → Bit #0 de ID de interrupción. Estos tres bits se combinan para informar de la categoría del evento que causó la interrupción en curso. Estas categorías tienen prioridades, por lo que si se producen varias categorías de eventos al mismo tiempo, la UART informará primero de los eventos más importantes y la máquina debe resolver los eventos en el orden en que se notifican. Todos los eventos que causaron la interrupción actual deben resolverse antes de que se generen nuevas interrupciones. (Esta es una limitación de la arquitectura del PC.)
2 1 0 Prioridad Descripción
0 1 1 Primera Error de recepción (OE, PE, BI o FE)
0 1 0 Segunda Datos recibidos disponibles
1 1 0 Segunda Identificación del nivel de disparo (datos obsoletos en el búfer de recepción)
0 0 1 Tercera El transmisor tiene espacio para más palabras (THRE)
0 0 0 Cuarta Cambio de estado del módem (-CTS, -DSR, -RI o -DCD)
Bit 0 → Bit de interrupción pendiente. Si este bit está a "0", al menos una interrupción está pendiente.

+0x03

write/read

Registro de control de línea (Line Control Register, LCR)
Bit 7 → Bit de acceso al latch de divisor (Divisor Latch Access Bit, DLAB). Cuando está activado, se deshabilita el acceso al registro de transmisión/recepción de datos (THR/RBR) y al Registro de habilitación de interrupciones (IER). Cualquier acceso a estos puertos se redirige entonces a los registros Divisor Latch. La activación de este bit, la carga de los registros de divisor y la desactivación de DLAB deben realizarse con las interrupciones deshabilitadas.
Bit 6 → Activar Break. Cuando está a "1", el transmisor empieza a transmitir Spacing continuo hasta que este bit se pone a "0". Esto prevalece sobre cualquier bit de los caracteres que se estén transmitiendo.
Bit 5 → Paridad fija (Stick Parity). Cuando la paridad está habilitada, al poner este bit la paridad es siempre "1" o "0", según el valor del Bit 4. Bit 4 → Selección de paridad par (Even Parity Select, EPS). Cuando la paridad está habilitada y el Bit 5 es "0", al poner este bit se transmite y se espera paridad par. En caso contrario, se utiliza paridad impar.
Bit 3 → Habilitación de paridad (Parity Enable, PEN). Cuando está a "1", se inserta un bit de paridad entre el último bit de los datos y el Bit de parada. La UART también esperará que haya paridad en los datos recibidos.
Bit 2 → Número de bits de parada (Number of Stop Bits, STB). Si está a "1" y se utilizan palabras de datos de 5 bits, se transmiten y se esperan 1,5 Bits de parada en cada palabra de datos. Para palabras de datos de 6, 7 y 8 bits, se transmiten y se esperan 2 Bits de parada. Cuando este bit está a "0", se utiliza un Bit de parada en cada palabra de datos.
Bit 1 → Bit #1 de selección de longitud de palabra (WLSB1)
Bit 0 → Bit #0 de selección de longitud de palabra (WLSB0)
Juntos, estos bits especifican el número de bits de cada palabra de datos.
1 0 Longitud de palabra
0 0 5 bits de datos
0 1 6 bits de datos
1 0 7 bits de datos
1 1 8 bits de datos

+0x04

write/read

Registro de control del módem (Modem Control Register, MCR)
Bit 7 → Reservado, siempre 0.
Bit 6 → Reservado, siempre 0.
Bit 5 → Reservado, siempre 0.
Bit 4 → Habilitación de bucle (Loop-Back Enable). Cuando está a "1", el transmisor y el receptor de la UART se conectan internamente entre sí para permitir operaciones de diagnóstico. Además, las salidas de control de módem de la UART se conectan a las entradas de control de módem de la UART. CTS se conecta a RTS, DTR se conecta a DSR, OUT1 se conecta a RI y OUT 2 se conecta a DCD.
Bit 3 → OUT 2. Una salida auxiliar que el procesador de la máquina puede poner a nivel alto o bajo. En el adaptador serie del IBM PC (y en la mayoría de los clones), OUT 2 se utiliza para poner en tercer estado (deshabilitar) la señal de interrupción de la UART 8250/16450/16550.
Bit 2 → OUT 1. Una salida auxiliar que el procesador de la máquina puede poner a nivel alto o bajo. Esta salida no se utiliza en el adaptador serie del IBM PC.
Bit 1 → Solicitud de envío (Request to Send, RTS). Cuando está a "1", la salida de la línea -RTS de la UART está en nivel bajo (activa).
Bit 0 → Terminal de datos listo (Data Terminal Ready, DTR). Cuando está a "1", la salida de la línea -DTR de la UART está en nivel bajo (activa).

+0x05

write/read

Registro de estado de línea (Line Status Register, LSR)
Bit 7 → Error en la FIFO del receptor. En la UART 8250/16450, este bit es cero. Este bit se pone a "1" cuando cualquiera de los bytes de la FIFO tiene una o más de las siguientes condiciones de error: PE, FE o BI.
Bit 6 → Transmisor vacío (Transmitter Empty, TEMT). Cuando está a "1", no quedan palabras en la FIFO de transmisión ni en el registro de desplazamiento de transmisión. El transmisor está completamente inactivo.
Bit 5 → Registro de retención del transmisor vacío (Transmitter Holding Register Empty, THRE). Cuando está a "1", la FIFO (o registro de retención) tiene ahora espacio para al menos una palabra adicional que transmitir. El transmisor puede seguir transmitiendo cuando este bit está a "1".
Bit 4 → Interrupción de Break (Break Interrupt, BI). El receptor ha detectado una señal Break.
Bit 3 → Error de trama (Framing Error, FE). Se detectó un Bit de inicio pero el Bit de parada no apareció en el momento esperado. La palabra recibida probablemente está corrupta.
Bit 2 → Error de paridad (Parity Error, PE). El bit de paridad era incorrecto para la palabra recibida.
Bit 1 → Error de desbordamiento (Overrun Error, OE). Se recibió una palabra nueva y no había espacio en el búfer de recepción. La palabra recién llegada al registro de desplazamiento se descarta. En las UART 8250/16450, se descarta la palabra del registro de retención y la palabra recién llegada se coloca en el registro de retención.
Bit 0 → Datos listos (Data Ready, DR). Hay una o más palabras en la FIFO de recepción que la máquina puede leer. Una palabra debe haberse recibido por completo y haberse movido del registro de desplazamiento a la FIFO (o al registro de retención en los diseños 8250/16450) antes de que este bit se ponga a "1".

+0x06

write/read

Registro de estado del módem (Modem Status Register, MSR)
Bit 7 → Detección de portadora de datos (Data Carrier Detect, DCD). Refleja el estado de la línea DCD de la UART.
Bit 6 → Indicador de llamada (Ring Indicator, RI). Refleja el estado de la línea RI de la UART.
Bit 5 → Conjunto de datos listo (Data Set Ready, DSR). Refleja el estado de la línea DSR de la UART.
Bit 4 → Listo para enviar (Clear To Send, CTS). Refleja el estado de la línea CTS de la UART.
Bit 3 → Delta de detección de portadora de datos (Delta Data Carrier Detect, DDCD). Se pone a "1" si la línea -DCD ha cambiado de estado una o más veces desde la última vez que la máquina leyó el MSR.
Bit 2 → Indicador de llamada de flanco de bajada (Trailing Edge Ring Indicator, TERI). Se pone a "1" si la línea -RI ha tenido una transición de bajo a alto desde la última vez que la máquina leyó el MSR.
Bit 1 → Delta de conjunto de datos listo (Delta Data Set Ready, DDSR). Se pone a "1" si la línea -DSR ha cambiado de estado una o más veces desde la última vez que la máquina leyó el MSR.
Bit 0 → Delta de listo para enviar (Delta Clear To Send, DCTS). Se pone a "1" si la línea -CTS ha cambiado de estado una o más veces desde la última vez que la máquina leyó el MSR.

+0x07

write/read

Registro Scratch (Scratch Register, SCR). Este registro no realiza ninguna función en la UART. La máquina puede escribir cualquier valor en esta ubicación y leerlo más tarde.

1.9. Más allá de la UART 16550A

Aunque National Semiconductor no ha ofrecido ningún componente compatible con la 16550 que proporcione funciones adicionales, otros fabricantes sí lo han hecho. A continuación se describen algunos de estos componentes. Debe entenderse que, para aprovechar eficazmente estas mejoras, puede que el fabricante del chip tenga que proporcionar los controladores, ya que la mayoría de los sistemas operativos populares no admiten funciones más allá de las proporcionadas por la 16550.

ST16650

Por defecto esta pieza es similar a la NS16550A, pero opcionalmente puede habilitarse un búfer extendido de envío y recepción de 32 bytes. Fabricada por StarTech.

TIL16660

Por defecto esta pieza se comporta de forma similar a la NS16550A, pero opcionalmente puede habilitarse un búfer extendido de envío y recepción de 64 bytes. Fabricada por Texas Instruments.

Hayes ESP

Esta tarjeta enchufable propietaria contiene un búfer de envío y recepción de 2048 bytes y admite velocidades de datos de hasta 230,4Kbit/s. Fabricada por Hayes.

Además de estas UART "tontas", muchos fabricantes producen tarjetas de comunicación serie inteligentes. Este tipo de diseño normalmente incorpora un microprocesador que se comunica con varias UART, procesa y almacena en búfer los datos y avisa después al procesador principal del PC cuando es necesario. Como el procesador del PC no accede directamente a las UART en este tipo de sistema de comunicación, el fabricante no necesita utilizar UART compatibles con la 8250, la 16450 o la 16550. Esto deja libre al diseñador para emplear componentes que pueden tener mejores características de rendimiento.

2. Configuración del controlador sio

El controlador sio proporciona soporte para interfaces de comunicaciones EIA RS-232C (CCITT V.24) basadas en NS8250, NS16450, NS16550 y NS16550A. También se admiten varias tarjetas multipuerto. Consulte la página de manual sio(4) para obtener documentación técnica detallada.

2.1. Digi International (DigiBoard) PC/8

Aportado por Andrew Webster <awebster@pubnix.net>. 26 de agosto de 1995.

Este es un fragmento de configuración de una máquina con una Digi International PC/8 con 16550. Tiene 8 módems conectados a estas 8 líneas y funcionan perfectamente. No olvide añadir options COM_MULTIPORT o no funcionará muy bien.

device          sio4    at isa? port 0x100 flags 0xb05
device          sio5    at isa? port 0x108 flags 0xb05
device          sio6    at isa? port 0x110 flags 0xb05
device          sio7    at isa? port 0x118 flags 0xb05
device          sio8    at isa? port 0x120 flags 0xb05
device          sio9    at isa? port 0x128 flags 0xb05
device          sio10   at isa? port 0x130 flags 0xb05
device          sio11   at isa? port 0x138 flags 0xb05 irq 9

El truco para configurarlo es que el MSB de los indicadores (flags) representa el último puerto SIO, que en este caso es el 11, por lo que los indicadores son 0xb05.

2.2. Boca 16

Aportado por Don Whiteside <whiteside@acm.org>. 26 de agosto de 1995.

Los procedimientos para hacer funcionar una placa Boca de 16 puertos con FreeBSD son bastante sencillos, pero necesitará un par de cosas para que funcione:

  1. O bien necesita tener instaladas las fuentes del kernel para poder recompilar las opciones necesarias, o bien necesitará que otra persona lo compile por usted. El kernel por defecto de la 2.0.5 no incluye el soporte multipuerto habilitado y de todos modos tendrá que añadir una entrada de dispositivo para cada puerto.

  2. En segundo lugar, necesitará conocer la configuración de interrupción y de E/S de su placa Boca para poder establecer estas opciones correctamente en el kernel.

Una nota importante: los chips UART reales de la Boca 16 están en la caja de conectores, no en la propia placa interna. Por lo tanto, si la tiene desenchufada, las sondas de esos puertos fallarán. Nunca he probado a arrancar con la caja desenchufada y enchufarla de nuevo, y le sugiero que usted tampoco lo haga.

Si todavía no tiene un fichero de configuración de kernel personalizado, consulte el capítulo Configuración del kernel del Manual de FreeBSD para conocer los procedimientos generales. Lo siguiente corresponde específicamente a la placa Boca 16 y supone que utiliza el nombre de kernel MYKERNEL y que edita con vi.

  1. Añada la línea

    options COM_MULTIPORT

    al fichero de configuración.

  2. Donde estén las líneas actuales device sion, deberá añadir 16 dispositivos más. El siguiente ejemplo es para una placa Boca con una interrupción 3 y una dirección base de E/S 100h. La dirección de E/S de cada puerto es +8 hexadecimal respecto al puerto anterior, de ahí las direcciones 100h, 108h, 110h…​

    device sio1 at isa? port 0x100 flags 0x1005
    device sio2 at isa? port 0x108 flags 0x1005
    device sio3 at isa? port 0x110 flags 0x1005
    device sio4 at isa? port 0x118 flags 0x1005
    ...
    device sio15 at isa? port 0x170 flags 0x1005
    device sio16 at isa? port 0x178 flags 0x1005 irq 3

    La entrada flags debe modificarse respecto a este ejemplo a menos que utilice exactamente las mismas asignaciones sio. Los indicadores se establecen según 0xMYY donde M indica el número menor del puerto maestro (el último puerto de una Boca 16) e YY indica si la FIFO está habilitada o deshabilitada (habilitada), si se utiliza compartición de IRQ (sí) y si hay un registro de control de IRQ compatible con AST/4 (no). En este ejemplo,

     flags
    	      0x1005

    indica que el puerto maestro es sio16. Si añadiera otra placa y asignara de sio17 a sio28, los indicadores de los 16 puertos de esa placa serían 0x1C05, donde 1C indica el número menor del puerto maestro. No cambie el valor 05.

  3. Guarde y complete la configuración del kernel, recompile, instale y reinicie. Suponiendo que haya instalado correctamente el kernel recompilado y lo tenga configurado con la dirección y la IRQ correctas, su mensaje de arranque debería indicar la detección correcta de los puertos Boca de la siguiente manera: (obviamente los números sio, la E/S y la IRQ pueden ser distintos)

    sio1 at 0x100-0x107 flags 0x1005 on isa
    sio1: type 16550A (multiport)
    sio2 at 0x108-0x10f flags 0x1005 on isa
    sio2: type 16550A (multiport)
    sio3 at 0x110-0x117 flags 0x1005 on isa
    sio3: type 16550A (multiport)
    sio4 at 0x118-0x11f flags 0x1005 on isa
    sio4: type 16550A (multiport)
    sio5 at 0x120-0x127 flags 0x1005 on isa
    sio5: type 16550A (multiport)
    sio6 at 0x128-0x12f flags 0x1005 on isa
    sio6: type 16550A (multiport)
    sio7 at 0x130-0x137 flags 0x1005 on isa
    sio7: type 16550A (multiport)
    sio8 at 0x138-0x13f flags 0x1005 on isa
    sio8: type 16550A (multiport)
    sio9 at 0x140-0x147 flags 0x1005 on isa
    sio9: type 16550A (multiport)
    sio10 at 0x148-0x14f flags 0x1005 on isa
    sio10: type 16550A (multiport)
    sio11 at 0x150-0x157 flags 0x1005 on isa
    sio11: type 16550A (multiport)
    sio12 at 0x158-0x15f flags 0x1005 on isa
    sio12: type 16550A (multiport)
    sio13 at 0x160-0x167 flags 0x1005 on isa
    sio13: type 16550A (multiport)
    sio14 at 0x168-0x16f flags 0x1005 on isa
    sio14: type 16550A (multiport)
    sio15 at 0x170-0x177 flags 0x1005 on isa
    sio15: type 16550A (multiport)
    sio16 at 0x178-0x17f irq 3 flags 0x1005 on isa
    sio16: type 16550A (multiport master)

    Si los mensajes pasan demasiado rápido para verlos,

    # dmesg | more

    mostrará los mensajes de arranque.

  4. A continuación, deben crearse las entradas apropiadas en /dev para los dispositivos mediante el script /dev/MAKEDEV. Este paso puede omitirse si utiliza FreeBSD 5.X con un kernel que tenga compilado el soporte de devfs(5).

    Si necesita crear las entradas de /dev, ejecute lo siguiente como root:

    # cd /dev
    # ./MAKEDEV tty1
    # ./MAKEDEV cua1
    
    (everything in between)
    # ./MAKEDEV ttyg
    # ./MAKEDEV cuag

    Si por algún motivo no desea o no necesita dispositivos de llamada saliente, puede prescindir de crear los dispositivos cua*.

  5. Si desea una forma rápida y chapucera de asegurarse de que los dispositivos funcionan, simplemente puede enchufar un módem en cada puerto y (como root)

    # echo at > ttyd*

    para cada dispositivo que haya creado. Debería ver parpadear los LED de RX de cada puerto que funcione.

2.3. Soporte para tarjetas multi-UART baratas

Aportado por Helge Oldach hmo@sep.hamburg.com, septiembre de 1999

¿Se ha preguntado alguna vez por el soporte de FreeBSD para su tarjeta multi-E/S de 20$ con dos (o más) puertos COM que comparten IRQ? Así se hace:

Normalmente la única opción para admitir este tipo de placas es utilizar una IRQ distinta para cada puerto. Por ejemplo, si su placa de CPU tiene un puerto COM1 integrado (es decir, sio0, dirección de E/S 0x3F8 e IRQ 4) y tiene una placa de ampliación con dos UART, normalmente tendrá que configurarlas como COM2 (es decir, sio1, dirección de E/S 0x2F8 e IRQ 3), y el tercer puerto (es decir, sio2) como E/S 0x3E8 e IRQ 5. Obviamente esto es un desperdicio de recursos de IRQ, ya que básicamente debería ser posible hacer funcionar ambos puertos de la placa de ampliación con una única IRQ mediante la configuración COM_MULTIPORT descrita en las secciones anteriores.

Estas placas de E/S baratas suelen tener una matriz de puentes (jumpers) de 4 por 3 para los puertos COM, similar a la siguiente:

            o  o  o  *
Port A               |
            o  *  o  *
Port B         |
            o  *  o  o
IRQ         2  3  4  5

Aquí se muestra el puerto A cableado para la IRQ 5 y el puerto B cableado para la IRQ 3. Las columnas de IRQ de su placa concreta pueden variar: otras placas pueden ofrecer puentes para las IRQ 3, 4, 5 y 7 en su lugar.

Se podría concluir que cablear ambos puertos a la IRQ 3 mediante un puente hecho a mano con cable que cubra los tres puntos de conexión de la columna de la IRQ 3 resolvería el problema, pero no es así. No puede duplicar la IRQ 3 porque los controladores de salida de cada UART están cableados en configuración "totem pole", así que si una de las UART maneja la IRQ 3, la señal de salida no será la que cabría esperar. Según la implementación de la placa de ampliación o de su placa base, la línea IRQ 3 permanecerá continuamente en alto o siempre en bajo.

Debe desacoplar los controladores de IRQ de las dos UART, de modo que la línea IRQ de la placa solo suba si (y solo si) una de las UART activa una IRQ, y permanezca en bajo en caso contrario. La solución fue propuesta por Joerg Wunsch j@ida.interface-business.de: soldar un wired-or formado por dos diodos (se recomiendan encarecidamente los de tipo germanio o Schottky) y una resistencia de 1 kOhm. Este es el esquema, partiendo del campo de puentes de 4 por 3 anterior:

                          Diode
                +---------->|-------+
               /                    |
            o  *  o  o              |     1 kOhm
Port A                              +----|######|-------+
            o  *  o  o              |                   |
Port B          `-------------------+                 ==+==
            o  *  o  o              |                 Ground
                \                   |
                 +--------->|-------+
IRQ         2  3  4  5    Diode

Los cátodos de los diodos están conectados a un punto común, junto con una resistencia pull-down de 1 kOhm. Es esencial conectar la resistencia a tierra para evitar que la línea IRQ flote en el bus.

Ahora estamos listos para configurar un kernel. Siguiendo con este ejemplo, configuraríamos:

# standard on-board COM1 port
device          sio0    at isa? port "IO_COM1" flags 0x10
# patched-up multi-I/O extension board
options         COM_MULTIPORT
device          sio1    at isa? port "IO_COM2" flags 0x205
device          sio2    at isa? port "IO_COM3" flags 0x205 irq 3

Tenga en cuenta que el valor de flags para sio1 y sio2 es realmente esencial; consulte sio(4) para obtener más detalles. (En general, el 2 del atributo "flags" se refiere a sio2, que contiene la IRQ, y seguramente querrá un 5 en el nibble bajo.) Con el modo detallado (verbose) del kernel activado, esto debería producir algo similar a lo siguiente:

sio0: irq maps: 0x1 0x11 0x1 0x1
sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa
sio0: type 16550A
sio1: irq maps: 0x1 0x9 0x1 0x1
sio1 at 0x2f8-0x2ff flags 0x205 on isa
sio1: type 16550A (multiport)
sio2: irq maps: 0x1 0x9 0x1 0x1
sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa
sio2: type 16550A (multiport master)

Aunque /sys/i386/isa/sio.c es algo críptico con su uso del array "irq maps" anterior, la idea básica es que se observe 0x1 en la primera, tercera y cuarta posición. Esto significa que la IRQ correspondiente se activó en la salida y se desactivó después, que es justo lo que esperaríamos. Si su kernel no muestra este comportamiento, lo más probable es que haya algún problema con el cableado.

3. Configuración del controlador cy

Aportado por Alex Nash. 6 de junio de 1996.

Las tarjetas multipuerto Cyclades se basan en el controlador cy en lugar del controlador sio habitual utilizado por otras tarjetas multipuerto. La configuración es sencilla:

  1. Añada el dispositivo cy a la configuración de su kernel (tenga en cuenta que sus valores de irq e iomem pueden ser distintos).

    device cy0 at isa? irq 10 iomem 0xd4000 iosiz 0x2000
  2. Recompile e instale el nuevo kernel.

  3. Cree los nodos de dispositivo escribiendo lo siguiente (el ejemplo siguiente supone una placa de 8 puertos):

    # cd /dev
    # for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done
  4. Si procede, añada entradas de acceso telefónico a /etc/ttys duplicando las entradas de dispositivos serie (ttyd) y utilizando ttyc en lugar de ttyd. Por ejemplo:

    ttyc0   "/usr/libexec/getty std.38400"  unknown on insecure
    ttyc1   "/usr/libexec/getty std.38400"  unknown on insecure
    ttyc2   "/usr/libexec/getty std.38400"  unknown on insecure
    ...
    ttyc7   "/usr/libexec/getty std.38400"  unknown on insecure
  5. Reinicie con el nuevo kernel.

4. Configuración del controlador si

Aportado por Nick Sayer <nsayer@FreeBSD.org>. 25 de marzo de 1998.

Las tarjetas multipuerto Specialix SI/XIO y SX utilizan el controlador si. Una sola máquina puede tener hasta 4 tarjetas host. Se admiten las siguientes tarjetas host:

  • Tarjeta host ISA SI/XIO (2 versiones)

  • Tarjeta host EISA SI/XIO

  • Tarjeta host PCI SI/XIO

  • Tarjeta host ISA SX

  • Tarjeta host PCI SX

Aunque las tarjetas host SX y SI/XIO tienen un aspecto notablemente distinto, su funcionalidad es básicamente la misma. Las tarjetas host no utilizan ubicaciones de E/S, sino que requieren un bloque de memoria de 32K. La configuración de fábrica de las tarjetas ISA lo sitúa en 0xd0000-0xd7fff. También requieren una IRQ. Las tarjetas PCI, por supuesto, se autoconfiguran.

Puede conectar hasta 4 módulos externos a cada tarjeta host. Los módulos externos contienen 4 u 8 puertos serie. Se presentan en las siguientes variedades:

  • Módulos SI de 4 u 8 puertos. Se admiten hasta 57600 bps en cada puerto.

  • Módulos XIO de 8 puertos. Se admiten hasta 115200 bps en cada puerto. Un tipo de módulo XIO tiene 7 puertos serie y 1 puerto paralelo.

  • Módulos SXDC de 8 puertos. Se admiten hasta 921600 bps en cada puerto. Al igual que XIO, también hay disponible un módulo con un puerto paralelo.

Para configurar una tarjeta host ISA, añada la siguiente línea al fichero de configuración de su kernel, cambiando los números según corresponda:

device si0 at isa? iomem 0xd0000 irq 11

Los números de IRQ válidos son 9, 10, 11, 12 y 15 para las tarjetas host ISA SX y 11, 12 y 15 para las tarjetas host ISA SI/XIO.

Para configurar una tarjeta host EISA o PCI, utilice esta línea:

device si0

Tras añadir la entrada de configuración, recompile e instale su nuevo kernel.

El siguiente paso no es necesario si utiliza devfs(5) en FreeBSD 5.X.

Tras reiniciar con el nuevo kernel, debe crear los nodos de dispositivo en /dev. El script MAKEDEV se encargará de ello. Cuente cuántos puertos tiene en total y escriba:

# cd /dev
# ./MAKEDEV ttyAnn cuaAnn

(donde nn es el número de puertos)

Si desea que aparezcan indicativos de inicio de sesión (login) en estos puertos, deberá añadir líneas como esta a /etc/ttys:

ttyA01  "/usr/libexec/getty std.9600"   vt100   on insecure

Cambie el tipo de terminal según corresponda. Para los módems, dialup o unknown es suficiente.