                  Tutorial sobre Comunicac,oes Seriais e UART

  Frank Durda

   <uhclem@FreeBSD.org>

   Revisao: 1e4bf56345

   FreeBSD is a registered trademark of the FreeBSD Foundation.

   Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media and
   Windows NT are either registered trademarks or trademarks of Microsoft
   Corporation in the United States and/or other countries.

   Many of the designations used by manufacturers and sellers to distinguish
   their products are claimed as trademarks. Where those designations appear
   in this document, and the FreeBSD Project was aware of the trademark
   claim, the designations have been followed by the "(TM)" or the "(R)"
   symbol.

   2018-09-18 03:29:14 +0000 por Edson Brandi.
   Resumo

   Este artigo fala sobre o uso de hardware serial com o FreeBSD.

   [ Documento HTML em partes / Documento HTML completo ]

     ----------------------------------------------------------------------

   Indice

   1. A UART: O que e e como funciona

   2. Configurando o driver sio

   3. Configurando o driver cy

   4. Configurando o driver si

1. A UART: O que e e como funciona

   Copyright (c) 1996 Frank Durda IV < uhclem@FreeBSD.org >, Todos os
   direitos reservados. 13 de Janeiro de 1996.

   O controlador UART (Universal Asynchronous Receiver / Transmitter) e o
   componente chave do subsistema de comunicac,ao serial de um computador. O
   UART pega bytes de dados e transmite os bits individuais de forma
   sequ:encial. No destino, um segundo UART reune os bits em bytes completos.

   A transmissao serial e comumente usada com modems e para comunicac,ao
   entre computadores, terminais e outros dispositivos sem rede.

   Existem duas formas primarias de transmissao serial: Sincrona e
   Assincrona. Dependendo dos modos suportados pelo hardware, o nome do
   subsistema de comunicac,ao geralmente incluira um A se ele suportar
   comunicac,oes assincronas, e um S se ele suportar Comunicac,oes sincronas.
   Ambas as formas sao descritas abaixo.

   Algumas siglas comuns sao:

     UART Universal Asynchronous Receiver/Transmitter

     USART Universal Synchronous-Asynchronous Receiver/Transmitter

  1.1. Transmissao Serial Sincrona

   A transmissao serial sincrona requer que o emissor e o receptor
   compartilhem um clock entre si, ou que o remetente fornec,a um sinal
   estroboscopico ou outro sinal de tempo para que o receptor saiba quando
   deve "ler" o proximo bit dos dados. Na maioria das formas de comunicac,ao
   serial sincrona, se nao houver dados disponiveis em um dado instante para
   transmitir, um caractere de preenchimento deve ser enviado para que os
   dados sejam sempre transmitidos. A comunicac,ao sincrona e geralmente mais
   eficiente, pois somente os bits de dados sao transmitidos entre o emissor
   e o receptor, e a comunicac,ao sincrona pode ser mais cara se fios e
   circuitos extras forem necessarios para compartilhar um sinal de relogio
   entre o emissor e o receptor.

   Uma forma de transmissao sincrona e usada com impressoras e dispositivos
   de disco fixo em que os dados sao enviados em um conjunto de fios enquanto
   um clock ou strobe e enviado em um fio diferente. Impressoras e
   dispositivos de disco fixo normalmente nao sao dispositivos seriais porque
   a maioria dos padroes de interface de disco fixo envia uma palavra inteira
   de dados para cada sinal de clock ou de strobe usando um fio separado para
   cada bit da palavra. Na industria de PCs, esses sao conhecidos como
   dispositivos paralelos.

   O hardware de comunicac,ao serial padrao no PC nao suporta operac,oes
   sincronas. Este modo e descrito aqui apenas para fins de comparac,ao.

  1.2. Transmissao Serial Assincrona

   A transmissao assincrona permite que os dados sejam transmitidos sem que o
   emissor tenha que enviar um sinal de relogio ao receptor. Em vez disso, o
   remetente e o receptor devem concordar com os parametros de tempo de
   antecedencia e bits especiais sao adicionados a cada palavra, os quais sao
   usados para sincronizar as unidades de envio e recebimento.

   Quando uma palavra e dada ao UART para uma transmissao assincrona, um bit
   chamado "Start Bit" e adicionado ao inicio de cada palavra que deve ser
   transmitida. O Start Bit e usado para alertar o receptor de que uma
   palavra de dados esta prestes a ser enviada e para forc,ar o clock do
   receptor a sincronizar-se com o clock do transmissor. Estes dois clocks
   devem ser precisos o suficiente para nao ter um desvio de frequencia em
   mais de 10% durante a transmissao dos bits restantes na palavra. (Esse
   requisito foi definido nos dias das teleimpressoras mecanicas e e
   facilmente atendido pelos equipamentos eletronicos modernos.)

   Apos o Start Bit, os bits individuais da palavra de dados sao enviados,
   com o Bit Menos Significativo (LSB) sendo enviado primeiro. Cada bit na
   transmissao e transmitido exatamente pelo mesmo periodo de tempo que todos
   os outros bits, e o receptor "olha" para o fio aproximadamente na metade
   do periodo atribuido a cada bit para determinar se o bit e um 1 ou um 0.
   Por exemplo, se forem necessarios dois segundos para enviar cada bit, o
   receptor examinara o sinal para determinar se e um 1 ou um 0 apos ter
   passado um segundo, ele esperara dois segundos e examinara o valor do
   proximo bit, e assim por diante.

   O remetente nao sabe quando o receptor "olhou" para o valor do bit. O
   remetente so sabe quando o clock diz para comec,ar a transmitir o proximo
   bit da palavra.

   Quando toda a palavra de dados foi enviada, o transmissor pode adicionar
   um Bit de Paridade que o transmissor gera. O Bit de Paridade pode ser
   usado pelo receptor para executar uma verificac,ao de erros simples. Entao
   pelo menos um Stop Bit e enviado pelo transmissor.

   Quando o receptor recebeu todos os bits na palavra de dados, ele pode
   verificar os bits de paridade (tanto o remetente quanto o receptor devem
   concordar se um bit de paridade deve ser usado), e entao o receptor
   procura um Stop Bit. Se o Stop Bit nao aparecer quando e suposto aparecer,
   o UART considera a palavra inteira como ilegivel e ira relatar um Framing
   Error para o processador do host quando a palavra de dados e lida. A causa
   comum de um Framing Error e que os clocks do emissor e do receptor nao
   estavam sendo executados na mesma velocidade ou que o sinal foi
   interrompido.

   Independentemente de os dados terem sido recebidos corretamente ou nao, o
   UART descarta automaticamente os Bits de Start, Paridade e Stop. Se o
   emissor e o receptor forem configurados de forma identica, esses bits nao
   serao passados &#8203;&#8203;para o host.

   Se outra palavra estiver pronta para transmissao, o Start Bit da nova
   palavra pode ser enviado assim que o Stop Bit da palavra anterior for
   enviado.

   Como os dados assincronos sao "auto-sincronizados", se nao houver dados
   para transmitir, a linha de transmissao pode ficar inativa.

  1.3. Outras func,oes UART

   Alem do trabalho basico de conversao de dados de paralelo para serial para
   transmissao e de serial para paralelo na recepc,ao, um UART normalmente
   fornecera circuitos adicionais para sinais que podem ser usados
   &#8203;&#8203;para indicar o estado da midia de transmissao, e para
   regular o fluxo de dados no caso de o dispositivo remoto nao estar
   preparado para aceitar mais dados. Por exemplo, quando o dispositivo
   conectado `a UART e um modem, o modem pode informar a presenc,a de uma
   operadora na linha telefonica enquanto o computador pode instruir o modem
   a reinicializar a si mesmo ou a nao atender chamadas, aumentando ou
   diminuindo mais um desses sinais extras. A func,ao de cada um desses
   sinais adicionais e definida no padrao EIA RS232-C.

  1.4. Os padroes RS232-C e V.24

   Na maioria dos sistemas de computador, o UART e conectado a um circuito
   que gera sinais que atendem `a especificac,ao EIA RS232-C. Ha tambem um
   padrao CCITT chamado V.24 que reflete as especificac,oes incluidas no
   RS232-C.

    1.4.1. Atribuic,oes de bit RS232-C (marcas e espac,os)

   No RS232-C, um valor de 1 e chamado de Mark e um valor de 0 e chamado de
   Space. Quando uma linha de comunicac,ao esta inativa, a linha e chamada de
   "Marking", ou seja, esta transmitindo o valor 1 continuamente.

   O bit de inicio sempre tem um valor de 0 (um space). O bit de parada
   sempre tem um valor de 1 (uma mark). Isso significa que sempre havera uma
   transic,ao Mark (1) para Space (0) na linha no inicio de cada palavra,
   mesmo quando varias palavras forem transmitidas de volta para tras. Isso
   garante que o remetente e o destinatario possam ressincronizar seus
   relogios independentemente do conteudo dos bits de dados que estao sendo
   transmitidos.

   O tempo inativo entre os bits de Stop e Start nao precisa ser um multiplo
   exato (incluindo zero) da taxa de bits do link de comunicac,ao, mas a
   maioria dos UARTs e projetada dessa maneira para simplificar.

   No RS232-C, o sinal "Marking" (a 1) e representado por uma tensao entre -2
   VDC e -12 VDC, e um sinal "Spacing" (um 0) e representado por uma tensao
   entre 0 e +12 VDC. O transmissor deve enviar +12 VDC ou -12 VCC, e o
   receptor deve permitir alguma perda de tensao em cabos longos. Alguns
   transmissores em dispositivos de baixa potencia (como computadores
   portateis) `as vezes usam apenas +5 VCC e -5 VCC, mas esses valores ainda
   sao aceitaveis &#8203;&#8203;para um receptor RS232-C, desde que os
   comprimentos dos cabos sejam curtos.

    1.4.2. Sinal de quebra RS232-C

   O RS232-C tambem especifica um sinal chamado de Break (quebra), que e
   causado pelo envio de valores continuos de espac,amento (sem bits de
   inicio ou de parada). Quando nao ha eletricidade presente no circuito de
   dados, a linha e considerada como enviando um Break.

   O sinal Break deve ter uma durac,ao maior que o tempo que leva para enviar
   um byte completo mais os bits Start, Stop e Paridade. A maioria das UARTs
   pode distinguir entre um Framing Error e um intervalo, mas se a UART nao
   puder fazer isso, a detecc,ao de Framing Error pode ser usada para
   identificar quebras.

   Nos dias das teleimpressoras, quando numerosas impressoras em todo o pais
   eram conectadas em serie (como servic,os de noticias), qualquer unidade
   poderia causar um Break abrindo temporariamente todo o circuito de modo
   que nenhuma corrente fluisse. Isso foi usado para permitir que um local
   com noticias urgentes interrompesse algum outro local que estava enviando
   informac,oes no momento.

   Nos sistemas modernos existem dois tipos de sinais de quebra. Se o Break
   for maior que 1,6 segundos, sera considerado um "Modem Break", e alguns
   modems podem ser programados para encerrar a conversa e colocar no gancho
   ou entrar no modo de comando dos modems quando o modem detectar este
   sinal. Se a quebra for menor que 1,6 segundos, significa uma quebra de
   dados e cabe ao computador remoto responder a esse sinal. As vezes essa
   forma de quebra e usada como um sinal de Atenc,ao ou Interrupc,ao e `as
   vezes e aceita como um substituto para o caractere ASCII CONTROL-C.

   Marcas e espac,os tambem sao equivalentes a "furos" e "sem furos" em
   sistemas de fita de papel.

  Nota:

   As quebras nao podem ser geradas a partir da fita de papel ou de qualquer
   outro valor de byte, uma vez que os bytes sao sempre enviados com bit
   Start e Stop. A UART geralmente e capaz de gerar o sinal de espac,amento
   continuo em resposta a um comando especial do processador host.

    1.4.3. Dispositivos RS232-C DTE e DCE

   A especificac,ao RS232-C define dois tipos de equipamento: o Data Terminal
   Equipment (DTE) e o Data Carrier Equipment (DCE). Normalmente, o
   dispositivo DTE e o terminal (ou computador) e o DCE e um modem. Em toda a
   linha telefonica, no outro extremo de uma conversa, o modem receptor
   tambem e um dispositivo DCE e o computador conectado a esse modem e um
   dispositivo DTE. O dispositivo DCE recebe sinais nos pinos que o
   dispositivo DTE transmite e vice-versa.

   Quando dois dispositivos DTE ou DCE devem ser conectados sem utilizar um
   modem ou um tradutor de midia similar entre eles, um modem NULL deve ser
   usado. O modem NULL reorganiza eletricamente o cabeamento para que a saida
   do transmissor seja conectada `a entrada do receptor no outro dispositivo
   e vice-versa. Traduc,oes semelhantes sao executadas em todos os sinais de
   controle, de modo que cada dispositivo veja o que acha que sao sinais de
   DCE (ou DTE) do outro dispositivo.

   O numero de sinais gerados pelos dispositivos DTE e DCE nao e simetrico. O
   dispositivo DTE gera menos sinais para o dispositivo DCE do que o
   dispositivo DTE recebe do DCE.

    1.4.4. Atribuic,oes de pinos RS232-C

   A especificac,ao EIA RS232-C (e o equivalente ITU, V.24) requer um
   conector de vinte e cinco pinos (geralmente um DB25) e define a finalidade
   da maioria dos pinos nesse conector.

   No IBM Personal Computer e em sistemas semelhantes, um subconjunto de
   sinais RS232-C e fornecido por meio de conectores de nove pinos (DB9). Os
   sinais que nao estao incluidos no conector do PC lidam principalmente com
   a operac,ao sincrona, e esse modo de transmissao nao e suportado pelo UART
   que a IBM selecionou para uso no IBM PC.

   Dependendo do fabricante do computador, um DB25, um DB9 ou ambos os tipos
   de conectores podem ser usados &#8203;&#8203;para comunicac,oes RS232-C.
   (O IBM PC tambem usa um conector DB25 para a interface de impressora
   paralela, o que causa alguma confusao.)

   Abaixo esta uma tabela das atribuic,oes de sinal RS232-C nos conectores
   DB25 e DB9.

   Pinos DB25  Pinos  Simbolo do Simbolo do  Nome  Fonte                      
    RS232-C   DB9 IBM  Circuito   Circuito  Comum   de        Descric,ao
                PC       EIA       CCITT           sinal 
   1          -       AA         101        PG/FG  -     Quadro / aterramento 
                                                         de protec,ao         
   2          3       BA         103        TD     DTE   Transmit Data        
   3          2       BB         104        RD     DCE   Receive Data         
   4          7       CA         105        RTS    DTE   Request to Send      
   5          8       CB         106        CTS    DCE   Clear to Send        
   6          6       CC         107        DSR    DCE   Data Set Ready       
   7          5       AV         102        SG/GND -     Signal Ground        
   8          1       CF         109        DCD/CD DCE   Data Carrier Detect  
   9          -       -          -          -      -     Reserved for Test    
   10         -       -          -          -      -     Reserved for Test    
   11         -       -          -          -      -     Reserved for Test    
   12         -       CI         122        SRLSD  DCE   Sec. Recv. Line      
                                                         Signal Detector      
   13         -       SCB        121        SCTS   DCE   Secondary Clear to   
                                                         Send                 
   14         -       SBA        118        DST    DTE   Secondary Transmit   
                                                         Data                 
   15         -       DB         114        TSET   DCE   Trans. Sig. Element  
                                                         Timing               
   16         -       SBB        119        SRD    DCE   Secondary Received   
                                                         Data                 
   17         -       DD         115        RSET   DCE   Receiver Signal      
                                                         Element Timing       
   18         -       -          141        LOOP   DTE   Local Loopback       
   19         -       SCA        120        SRS    DTE   Secondary Request to 
                                                         Send                 
   20         4       CD         108.2      DTR    DTE   Data Terminal Ready  
   21         -       -          -          RDL    DTE   Remote Digital       
                                                         Loopback             
   22         9       CE         125        RI     DCE   Ring Indicator       
   23         -       CH         111        DSRS   DTE   Data Signal Rate     
                                                         Selector             
   24         -       DA         113        TSET   DTE   Trans. Sig. Element  
                                                         Timing               
   25         -       -          142        -      DCE   Test Mode            

  1.5. Bits, Baud e Simbolos

   Baud e uma medida de velocidade de transmissao em comunicac,ao assincrona.
   Devido aos avanc,os na tecnologia de comunicac,ao por modem, esse termo e
   frequentemente mal utilizado na descric,ao das taxas de dados em
   dispositivos mais recentes.

   Tradicionalmente, uma taxa de transmissao representa o numero de bits que
   estao realmente sendo enviados pela midia, nao a quantidade de dados que e
   realmente movida de um dispositivo DTE para outro. A contagem de Baud
   inclui os bits de Start, Stop e Paridade que sao gerados pelo UART de
   envio e removidos pelo UART de recebimento. Isso significa que palavras de
   dados de sete bits na verdade levam 10 bits para serem completamente
   transmitidas. Portanto, um modem capaz de mover 300 bits por segundo de um
   lugar para outro normalmente so pode mover 30 palavras de 7 bits se a
   Paridade for usada e um bit de Start e Stop estiver presente.

   Se palavras de dados de 8 bits sao usadas e bits de paridade tambem sao
   usados, a taxa de dados cai para 27,27 palavras por segundo, porque agora
   leva 11 bits para enviar as palavras de oito bits, e o modem ainda envia
   apenas 300 bits por segundo.

   A formula para converter bytes por segundo em uma taxa de transmissao e
   vice-versa era simples ate que os modems de correc,ao de erros apareceram.
   Esses modems recebem o fluxo serial de bits da UART no computador host
   (mesmo quando os modems internos sao usados, os dados ainda sao
   frequentemente serializados) e convertem os bits de volta em bytes. Esses
   bytes sao entao combinados em pacotes e enviados pela linha telefonica
   usando um metodo de transmissao sincrona. Isso significa que os bits de
   Stop, Start e Paridade adicionados pelo UART no DTE (o computador) foram
   removidos pelo modem antes da transmissao pelo modem de envio. Quando
   esses bytes sao recebidos pelo modem remoto, o modem remoto adiciona bits
   de Start, Stop e paridade `as palavras, converte-os em um formato serial e
   envia-os para o UART receptor no computador remoto, que retira o Start,
   Stop e bits de paridade.

   A razao pela qual todas essas conversoes extras sao feitas e para que os
   dois modems possam executar a correc,ao de erros, o que significa que o
   modem receptor pode solicitar ao modem de envio para reenviar um bloco de
   dados que nao foi recebido com a soma de verificac,ao correta. Essa
   verificac,ao e feita pelos modems, e os dispositivos DTE geralmente nao
   sabem que o processo esta ocorrendo.

   Ao separar os bits de Start, Stop e Paridade, os bits adicionais de dados
   que os dois modems devem compartilhar entre si para executar a correc,ao
   de erros sao praticamente ocultados da taxa de transmissao efetiva vista
   pelo equipamento DTE de envio e recebimento. Por exemplo, se um modem
   enviar dez palavras de 7 bits para outro modem sem incluir os bits Start,
   Stop e Paridade, o modem de envio podera adicionar 30 bits de suas
   proprias informac,oes que o modem receptor pode usar para corrigir erros.
   sem afetar a velocidade de transmissao dos dados reais.

   O uso do termo Baud e ainda mais confuso pelos modems que executam
   compressao. Uma unica palavra de 8 bits transmitida pela linha telefonica
   pode representar uma duzia de palavras que foram transmitidas para o modem
   de envio. O modem de recebimento ira expandir os dados de volta ao seu
   conteudo original e passar esses dados para o DTE de recebimento.

   Os modems modernos tambem incluem buffers que permitem que a taxa na qual
   os bits se movem pela linha telefonica (do DCE para o DCE) seja uma
   velocidade diferente da velocidade que os bits se movem entre o DTE e o
   DCE em ambas as extremidades da conversac,ao. Normalmente, a velocidade
   entre o DTE e o DCE e maior que a velocidade do DCE para o DCE devido ao
   uso de compactac,ao pelos modems.

   Como o numero de bits necessarios para descrever um byte variou durante a
   viagem entre as duas maquinas, mais as diferentes velocidades de bits por
   segundo usadas nos links DTE-DCE e DCE-DCE, o uso do termo Baud para
   descrever a velocidade geral de comunicac,ao causa problemas e pode
   deturpar a velocidade real de transmissao. Entao Bits Por Segundo (bps) e
   o termo correto a ser usado para descrever a taxa de transmissao na
   interface DCE para DCE e Baud ou Bits Por Segundo sao termos aceitaveis
   &#8203;&#8203;para uso quando uma conexao e feita entre dois sistemas com
   uma conexao com fio ou se estiver em uso um modem que nao esteja
   executando correc,ao de erros ou compactac,ao.

   Os modernos modems de alta velocidade (2400, 9600, 14.400 e 19.200bps) na
   realidade ainda operam a 2400 ou abaixo de 2400 baud, ou mais
   precisamente, 2400 simbolos por segundo. O modem de alta velocidade e
   capaz de codificar mais bits de dados em cada Symbol usando uma tecnica
   chamada Constellation Stuffing, e por isso que a taxa efetiva de bits por
   segundo do modem e maior, mas o modem continua a operar dentro da largura
   de banda limitada de audio que o sistema telefonico fornece. Modems
   operando a 28.800 e velocidades mais altas tem taxas variaveis
   &#8203;&#8203;de Symbol, mas a tecnica e a mesma.

  1.6. O computador pessoal IBM e o UART

   Comec,ando com o IBM Personal Computer original, a IBM selecionou o
   National Semiconductor INS8250 UART para uso no adaptador IBM PC
   Paralelo/Serial. Gerac,oes subsequentes de computadores compativeis da IBM
   e de outros fornecedores continuaram a usar o INS8250 ou versoes
   aprimoradas da familia UART da National Semiconductor.

    1.6.1. Arvore Genealogica da National Semiconductor UART

   Houve varias versoes e gerac,oes subsequ:entes do INSART50 UART. Cada
   versao principal esta descrita abaixo.

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

   INS8250

           Esta parte foi usada no IBM PC original e no IBM PC/XT. O nome
           original para esta parte era o INS8250 ACE (Elemento de
           Comunicac,ao Assincrona) e ele era feito com tecnologia NMOS.

           O 8250 usa oito portas de I/O e tem um envio de um byte e um
           buffer de recebimento de um byte. Esta UART original tem varias
           "race conditions" e outras falhas. O IBM BIOS original incluia
           codigo para contornar essas falhas, mas isso tornava o BIOS
           dependente das falhas estarem presentes, portanto, componentes
           subsequentes como o 8250A, 16450 ou 16550 nao podiam ser usados no
           IBM PC original ou no IBM PC/XT.

   INS8250-B

           Esta e a velocidade mais lenta do INS8250 feito a partir da
           tecnologia NMOS. Ele contem os mesmos problemas que o INS8250
           original.

   INS8250A

           Uma versao melhorada do INS8250 usando a tecnologia XMOS com
           varias falhas funcionais corrigidas. O INS8250A foi usado
           inicialmente em computadores clones de PC por fornecedores que
           usavam projetos de BIOS "limpos". Devido `as correc,oes no chip,
           este componente nao pode ser usado com um BIOS compativel com o
           INS8250 ou o INS8250B.

   INS82C50A

           Esta e uma versao CMOS (baixo consumo de energia) do INS8250A e
           possui caracteristicas funcionais semelhantes.

   NS16450

           O mesmo que o NS8250A com melhorias para que possa ser usado com
           projetos de barramento de CPU mais rapidos. A IBM usou esse
           componente no IBM AT e atualizou o IBM BIOS para nao depender mais
           dos erros no INS8250.

   NS16C450

           Esta e uma versao CMOS (baixo consumo de energia) do NS16450.

   NS16550

           O mesmo que NS16450 com um buffer de envio e recebimento de 16
           bytes, mas o design do buffer era falho e nao podia ser usado com
           seguranc,a.

   NS16550A

           O mesmo que NS16550 com as falhas de buffer corrigidas. O 16550A e
           seus sucessores se tornaram o projeto UART mais popular na
           industria de PCs, principalmente devido `a sua capacidade de lidar
           de forma confiavel com taxas de dados mais altas em sistemas
           operacionais com tempos de resposta de interrupc,ao lentos.

   NS16C552

           Este componente consiste em dois UARTs CMOS NS16C550A em um unico
           chip.

   PC16550D

           O mesmo que NS16550A com falhas sutis corrigidas. Esta e a revisao
           D da familia 16550 e e o mais recente projeto disponivel da
           National Semiconductor.

    1.6.2. O NS16550AF e o PC16550D sao a mesma coisa

   A National reorganizou seu sistema de numerac,ao de pec,as ha alguns anos
   e o NS16550AFN nao existe mais com esse nome. (Se voce tiver um
   NS16550AFN, observe o codigo de data da pec,a, que e um numero de quatro
   digitos que geralmente comec,a com nove. Os dois primeiros digitos do
   numero sao o ano, e os dois ultimos digitos sao a semana do ano em que a
   pec,a foi fabricada. Se voce tem um NS16550AFN, ele provavelmente tem
   alguns anos.)

   Os novos numeros sao como PC16550DV, com pequenas diferenc,as nas letras
   de sufixo, dependendo do material da embalagem e sua forma. (Uma
   descric,ao do sistema de numerac,ao pode ser encontrada abaixo.)

   E importante entender que em algumas lojas, voce pode pagar US$ 15 por um
   NS16550AFN fabricado em 1990 e no proximo bin encontrar as novas pec,as
   PC16550DN com pequenas correc,oes que o National fez desde que a pec,a AFN
   estava em produc,ao, o PC16550DN foi provavelmente feito nos ultimos seis
   meses e custa metade (tao baixo quanto US$ 5 se comprado em volume) do
   NS16550AFN porque ele esta prontamente disponivel.

   Como o fornecimento de chips NS16550AFN continua encolhendo, o prec,o
   provavelmente continuara aumentando ate que mais pessoas descubram e
   aceitem que o PC16550DN realmente tem a mesma func,ao que o numero de
   pec,a antigo.

    1.6.3. Sistema de Numerac,ao de Pec,as da National Semiconductor

   Os numeros de pec,a mais antigos NSnnnnnrqp agora sao do formato
   PCnnnnnrgp.

   O r e o campo de revisao. A revisao atual do 16550 da National
   Semiconductor e D.

   O p e o campo que define o tipo de encapsulamento. Os tipos sao:

   "F"     QFP      (quad flat pack) L lead type                              
   "N"     DIP      (dual inline package) through hole straight lead type     
   "V"     LPCC     (lead plastic chip carrier) J lead type                   

   O g e o campo de classificac,ao do produto. Se um I precede a letra do
   tipo de encapsulamento, ele indica uma parte de classe "industrial", que
   possui especificac,oes mais altas que uma parte padrao, mas nao tao alta
   quanto o componente Especificac,ao Militar (Milspec) . Este e um campo
   opcional.

   Entao, o que costumavamos chamar de NS16550AFN (Pacote DIP) agora e
   chamado de PC16550DN ou PC16550DIN.

  1.7. Outros fornecedores e UARTs semelhantes

   Ao longo dos anos, o 8250, o 8250A, o 16450 e o 16550 foram licenciados ou
   copiados por outros fornecedores de chips. No caso do 8250, 8250A e 16450,
   o circuito exato (o "megacell") foi licenciado para muitos fornecedores,
   incluindo a Western Digital e a Intel. Outros fornecedores realizaram
   engenharia reversa da pec,a ou produziram emulac,oes que tiveram
   comportamento semelhante.

   Nos modems internos, o projetista de modem frequ:entemente emula o
   8250A/16450 com o microprocessador de modem, e o UART emulado
   frequentemente tera um buffer oculto que consiste em varias centenas de
   bytes. Por causa do tamanho do buffer, essas emulac,oes podem ser tao
   confiaveis &#8203;&#8203;quanto uma 16550A em sua capacidade de lidar com
   dados de alta velocidade. No entanto, a maioria dos sistemas operacionais
   ainda relatara que o UART e apenas um 8250A ou 16450, e pode nao fazer uso
   efetivo do buffer extra presente no UART emulado, a menos que drivers
   especiais sejam usados.

   Alguns fabricantes de modem sao motivados pelas forc,as do mercado a
   abandonar um design que possui centenas de bytes de buffer e, em vez
   disso, usam uma UART 16550A para que o produto compare favoravelmente nas
   comparac,oes de mercado, embora o desempenho efetivo possa ser reduzido
   por essa ac,ao.

   Um equivoco comum e que todas as partes com "16550A" escritas nelas sao
   identicas no desempenho. Existem diferenc,as e, em alguns casos, falhas
   definitivas na maioria desses clones 16550A.

   Quando o NS16550 foi desenvolvido, a National Semiconductor obteve varias
   patentes sobre o projeto e tambem limitou o licenciamento, tornando mais
   dificil para outros fornecedores fornecer um chip com caracteristicas
   semelhantes. Por causa das patentes, projetos de engenharia reversa e
   emulac,oes tiveram que evitar infringir as reivindicac,oes cobertas pelas
   patentes. Posteriormente, essas copias quase nunca funcionam exatamente da
   mesma forma que a NS16550A ou a PC16550D, que sao as pec,as que a maioria
   dos fabricantes de computadores e modems deseja comprar, mas `as vezes nao
   estao dispostas a pagar o prec,o necessario para obter a pec,a genuina.

   Algumas das diferenc,as nas pec,as do clone 16550A nao sao importantes,
   enquanto outras podem impedir que o dispositivo seja usado com um
   determinado sistema operacional ou driver. Essas diferenc,as podem
   aparecer ao usar outros drivers ou quando ocorrem determinadas
   combinac,oes de eventos que nao foram bem testadas ou consideradas no
   driver Windows(R). Isso ocorre porque a maioria dos fornecedores de modem
   e de fabricantes de clones do 16550 usam os drivers da Microsoft do
   Windows(R) para Workgroups 3.11 e Microsoft(R) MS-DOS(R) como o principal
   teste de compatibilidade com o NS16550A. Esse criterio excessivamente
   simplista e significa que se um sistema operacional diferente for usado,
   poderao surgir problemas devido a diferenc,as sutis entre os clones e os
   componentes genuinos.

   A National Semiconductor disponibilizou um programa chamado COMTEST que
   realiza testes de compatibilidade independentemente de qualquer driver do
   sistema operacional. Deve ser lembrado que o proposito deste tipo de
   programa e demonstrar as falhas nos produtos dos concorrentes, de modo que
   o programa reportara diferenc,as importantes e extremamente sutis no
   comportamento da pec,a que esta sendo testada.

   Em uma serie de testes realizados pelo autor deste documento em 1994,
   componentes fabricados pela National Semiconductor, TI, StarTech e CMD,
   bem como megacells e emulac,oes incorporadas em modems internos foram
   testados com o COMTEST. Uma contagem de diferenc,a para alguns desses
   componentes esta listada abaixo. Como esses testes foram realizados em
   1994, eles podem nao refletir o desempenho atual do produto de um
   determinado fornecedor.

   Deve-se notar que o COMTEST normalmente aborta quando um numero excessivo
   ou certos tipos de problemas sao detectados. Como parte desse teste, o
   COMTEST foi modificado para nao abortar, independentemente de quantas
   diferenc,as fossem encontradas.

   Fornecedor            Numero da pec,a             Erros (tambem conhecidos 
                                                       como "diferenc,as")    
   National   (PC16550DV)                            0                        
   National   (NS16550AFN)                           0                        
   National   (NS16C552V)                            0                        
   TI         (TL16550AFN)                           3                        
   CMD        (16C550PE)                             19                       
   StarTech   (ST16C550J)                            23                       
   Rockwell   Modem de referencia com 16550 interno  117                      
              ou uma emulac,ao (RC144DPi / C3000-25) 
   Sierra     Modem com um 16550 interno             91                       
              (SC11951/SC11351)                      

  Nota:

   Ate o momento, o autor deste documento nao encontrou nenhuma pec,a
   nao-National que relate diferenc,a zero usando o programa COMTEST. Tambem
   deve ser notado que a National teve cinco versoes do 16550 ao longo dos
   anos e as partes mais novas se comportam de maneira um pouco diferente do
   NS16550AFN classico que e considerado o benchmark para funcionalidade. O
   COMTEST parece fechar os olhos para as diferenc,as dentro da linha de
   produto da National e nao relata nenhum erro nas pec,as da National
   (exceto para o original 16550) mesmo quando ha erratas oficiais que
   descrevem erros nas revisoes A, B e C das partes, entao este vies no
   COMTEST deve ser levado em considerac,ao.

   E importante entender que uma simples contagem de diferenc,as do COMTEST
   nao revela muito sobre quais diferenc,as sao importantes e quais nao sao.
   Por exemplo, cerca de metade das diferenc,as relatadas nos dois modems
   listados acima que tem UARTs internas foram causadas pelos clones UARTs
   que nao suportam modos de caractere de cinco e seis bits. Todos os UARTs
   16550, 16450 e 8250 reais suportam esses modos e o COMTEST verifica a
   funcionalidade desses modos, de modo que mais de cinquenta diferenc,as sao
   relatadas. No entanto, quase nenhum modem moderno suporta caracteres de
   cinco ou seis bits, particularmente aqueles com recursos de correc,ao de
   erros e compressao. Isso significa que as diferenc,as relacionadas aos
   modos de caractere de cinco e seis bits podem ser desconsideradas.

   Muitas das diferenc,as que o COMTEST reporta tem a ver com o tempo. Em
   muitos projetos de clones, quando o host le de uma porta, os bits de
   status em alguma outra porta podem nao ser atualizados na mesma quantidade
   de tempo (alguns mais rapidos, alguns mais lentos) que um NS16550AFN real
   e o COMTEST procura por essas diferenc,as. Isso significa que o numero de
   diferenc,as pode ser enganoso, pois um dispositivo pode ter apenas uma ou
   duas diferenc,as, mas elas serem extremamente serias, e algum outro
   dispositivo que atualiza o status de registro mais rapido ou mais devagar
   que a pec,a de referencia (que provavelmente nunca afetaria o operac,ao de
   um driver devidamente escrito) poderia ter dezenas de diferenc,as
   relatadas.

   O COMTEST pode ser usado como uma ferramenta de triagem para alertar o
   administrador sobre a presenc,a de componentes potencialmente
   incompativeis que podem causar problemas ou que precisam ser tratados como
   um caso especial.

   Se voce executar o COMTEST em um 16550 que esteja em um modem ou se um
   modem estiver conectado `a porta serial, sera necessario primeiro emitir
   um comando ATE0&W para o modem para que o modem nao fac,a eco de nenhum
   dos caracteres de teste. Se voce esquecer de fazer isso, o COMTEST
   informara pelo menos essa diferenc,a:

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

  1.8. Registradores 8250/16450/16550

   O UART 8250/16450/16550 ocupa oito enderec,os contiguos de porta de I/O.
   No IBM PC, ha dois locais definidos para essas oito portas e eles sao
   conhecidos coletivamente como COM1 e COM2. Os fabricantes de PC-clones e
   placas adicionais criaram duas areas adicionais conhecidas como COM3 e
   COM4, mas essas portas COM extras entram em conflito com outro hardware em
   alguns sistemas. O conflito mais comum e com adaptadores de video que
   fornecem emulac,ao IBM 8514.

   A COM1 esta localizada de 0x3f8 a 0x3ff e normalmente usa o IRQ 4. A COM2
   esta localizada de 0x2f8 a 0x2ff e normalmente usa IRQ 3. A COM3 esta
   localizada de 0x3e8 a 0x3ef e nao tem IRQ padronizado. A COM4 esta
   localizada de 0x2e8 a 0x2ef e nao tem IRQ padronizado.

   Uma descric,ao das portas I/O da UART 8250/16450/16550 e fornecida abaixo.

   Porta I/O     Acesso                         Descric,ao                    
                permitido    
                             Transmit Holding Register (THR).                 
                                                                              
   +0x00     write (DLAB==0) As informac,oes gravadas nessa porta sao         
                             tratadas como palavras de dados e serao          
                             transmitidas pela UART.                          
                             Receive Buffer Register (RBR).                   
                                                                              
   +0x00     read (DLAB==0)  Quaisquer palavras de dados recebidas pelo UART  
                             a partir do link serial sao acessadas pelo host  
                             lendo esta porta.                                
                             Divisor Latch LSB (DLL)                          
                                                                              
             write/read      Este valor sera dividido a partir do clock de    
   +0x00     (DLAB==1)       entrada principal (no IBM PC, o clock principal  
                             e 1.8432MHz) e o clock resultante determinara a  
                             taxa de transmissao do UART. Este registrador    
                             contem os bits de 0 a 7 do divisor.              
                             Divisor Latch MSB (DLH)                          
                                                                              
             write/read      Este valor sera dividido a partir do clock de    
   +0x01     (DLAB==1)       entrada principal (no IBM PC, o clock principal  
                             e 1.8432MHz) e o clock resultante determinara a  
                             taxa de transmissao do UART. Este registrador    
                             contem os bits 8 a 15 do divisor.                
                             Interrupt Enable Register (IER)                  
                                                                              
                             A UART 8250/16450/16550 classifica os eventos em 
                             uma de quatro categorias. Cada categoria pode    
                             ser configurada para gerar uma interrupc,ao      
                             quando qualquer um dos eventos ocorrer. A UART   
                             8250/16450/16550 gera um unico sinal de          
                             interrupc,ao externa, independentemente de       
                             quantos eventos nas categorias ativadas          
                             ocorreram. Cabe ao processador host responder `a 
                             interrupc,ao e depois pesquisar as categorias de 
                             interrupc,ao ativadas (geralmente todas as       
                             categorias tem interrupc,oes ativadas) para      
                             determinar a(s) causa(s) verdadeira(s) da        
                             interrupc,ao.                                    
                             Bit 7      Reserved, always 0.                   
                             6 bits     Reserved, always 0.                   
                             Bit 5      Reserved, always 0.                   
                             Bit 4      Reserved, always 0.                   
                                        Ativa o Modem Status Interrupt        
                                        (EDSSI). Definir esse bit como "1"    
                             Bit 3      permite que o UART gere uma           
                                        interrupc,ao quando ocorrer uma       
   +0x01     write/read                 alterac,ao em uma ou mais das linhas  
             (DLAB==0)                  de status.                            
                                        Ativa a interrupc,ao de status da     
                                        linha receptora (ELSI) Configurar     
                             Bit 2      este bit como "1" faz com que o UART  
                                        gere uma interrupc,ao quando um erro  
                                        (ou um sinal BREAK) for detectado nos 
                                        dados de entrada.                     
                                        Ativa a Interrupc,ao Vazia do         
                                        Registro de Holding do Transmissor    
                                        (ETBEI) Configurar este bit como "1"  
                             Bit 1      faz com que o UART gere uma           
                                        interrupc,ao quando o UART tiver      
                                        espac,o para um ou mais caracteres    
                                        adicionais que serao transmitidos.    
                                        Ativar a Interrupc,ao Disponivel de   
                                        Dados Recebidos (ERBFI) Configurar    
                                        este bit para "1" faz com que o UART  
                                        gere uma interrupc,ao quando o UART   
                             Bit 0      tiver recebido caracteres suficientes 
                                        para exceder o nivel de disparo do    
                                        FIFO, ou o temporizador FIFO tiver    
                                        expirado (dados antigos) ou um unico  
                                        caractere tiver sido recebido quando  
                                        o FIFO esta desativado.               
                             Registro de Controle FIFO (FCR) (Esta porta nao  
                             existe no UART 8250 e 16450).                    
                             Bit 7  Receiver Trigger Bit #1                   
                                    Trigger do Receptor Bit #0                
                                                                              
                             6 bits Esses dois bits controlam em que ponto o  
                                    receptor deve gerar uma interrupc,ao      
                                    quando o FIFO esta ativo.                 
                                                  Quantas palavras sao        
                                    7       6     recebidas antes que uma     
                                                  interrupc,ao seja gerada    
                                    0       0     1                           
                                    0       1     4                           
                                    1       0     8                           
                                    1       1     14                          
                             Bit 5  Reserved, always 0.                       
                             Bit 4  Reserved, always 0.                       
                                    DMA Mode Select. Se o Bit 0 for ajustado  
                                    para "1" (FIFOs habilitado), a            
   +0x02     write           Bit 3  configurac,ao deste bit altera a          
                                    operac,ao dos sinais -RXRDY e -TXRDY do   
                                    Modo 0 para o Modo 1.                     
                                    Transmit FIFO Reset. Quando um "1" e      
                                    gravado neste bit, o conteudo do FIFO e   
                             Bit 2  descartado. Qualquer palavra atualmente   
                                    sendo transmitida sera enviada intacta.   
                                    Esta func,ao e util para anular           
                                    transferencias.                           
                                    Receiver FIFO Reset. Quando um "1" e      
                                    gravado neste bit, o conteudo do FIFO e   
                             Bit 1  descartado. Qualquer palavra atualmente   
                                    montada no registrador de turno sera      
                                    recebida intacta.                         
                                    16550 FIFO Enable. Quando configurado, os 
                                    FIFOs de transmissao e recepc,ao estao    
                             Bit 0  ativados. Qualquer conteudo no registro   
                                    de espera, registradores de deslocamento  
                                    ou FIFOs sao perdidos quando as FIFOs sao 
                                    ativadas ou desativadas.                  
                             Registro de identificac,ao de interrupc,ao       
                             Bit 7 FIFOs habilitado. No 8250/16450 UART, esse 
                                   bit e zero.                                
                             6     FIFOs habilitado. No 8250/16450 UART, esse 
                             bits  bit e zero.                                
                             Bit 5 Reserved, always 0.                        
                             Bit 4 Reserved, always 0.                        
                             Bit 3 ID de Interrupc,ao Bit #2. No 8250/16450   
                                   UART, esse bit e zero.                     
                             Bit 2 ID de Interrupc,ao Bit #1                  
                                   ID de Interrupc,ao Bit #0.Esses tres bits  
                                   se combinam para relatar a categoria de    
                                   evento que causou a interrupc,ao que esta  
                                   em andamento. Essas categorias tem         
                                   prioridades, portanto, se varias           
                                   categorias de eventos ocorrerem ao mesmo   
                             Bit 1 tempo, a UART relatara os eventos mais     
                                   importantes primeiro e o host precisara    
                                   resolver os eventos na ordem em que forem  
                                   relatados. Todos os eventos que causaram a 
                                   interrupc,ao atual devem ser resolvidos    
                                   antes que novas interrupc,oes sejam        
   +0x02     read                  geradas. (Esta e uma limitac,ao da         
                                   arquitetura do PC.)                        
                                   2   1   0   Prioridade  Descric,ao         
                                                           Received Error     
                                   0   1   1   Primeiro    (OE, PE, BI, or    
                                                           FE)                
                                   0   1   0   Segundo     Dados Recebidos    
                                                           Disponiveis        
                                                           Identificac,ao do  
                                                           nivel de gatilho   
                                   1   1   0   Segundo     (dados obsoletos   
                                                           no buffer de       
                                                           recebimento)       
                                                           Transmissor tem    
                                   0   0   1   Terceiro    espac,o para mais  
                                                           palavras (THRE)    
                                                           Alterac,ao de      
                                   0   0   0   Quarto      status do modem    
                                                           (-CTS, -DSR, -RI   
                                                           ou -DCD)           
                                   Interromper Bit Pendente. Se este bit      
                             Bit 0 estiver definido como "0", pelo menos uma  
                                   interrupc,ao esta pendente.                
                             Registro de Controle de Linha (LCR)              
                                    Divisor Latch Access Bit (DLAB). Quando   
                                    configurado, o acesso ao registro de      
                                    transmissao / recepc,ao de dados (THR /   
                                    RBR) e ao Registro de Ativac,ao de        
                                    Interrupc,ao (ITA) e desabilitado.        
                             Bit 7  Qualquer acesso a essas portas e agora    
                                    redirecionado para os Registradores de    
                                    Latch do Divisor. Definir esse bit,       
                                    carregar os Registradores do Divisor e    
                                    limpar o DLAB deve ser feito com as       
                                    interrupc,oes desativadas.                
                                    Set Break. Quando definido para "1", o    
                                    transmissor comec,a a transmitir          
                             6 bits espac,amento continuo ate que este bit    
                                    seja definido como "0". Isso substitui    
                                    todos os bits de caracteres que estao     
                                    sendo transmitidos.                       
                                    Paridade da varStick Parity. Quando a     
                                    paridade esta ativada, a configurac,ao    
                             Bit 5  desse bit faz com que a paridade seja     
                                    sempre "1" ou "0", com base no valor do   
                                    Bit 4.                                    
                                    Even Parity Select (EPS). Quando a        
                                    paridade e ativada e o bit 5 e "0", a     
                             Bit 4  configurac,ao desse bit faz com que a     
   +0x03     write/read             paridade par seja transmitida e esperada. 
                                    Caso contrario, a paridade impar e usada. 
                                    Parity Enable (PEN). Quando definido para 
                                    "1", um bit de paridade e inserido entre  
                             Bit 3  o ultimo bit dos dados e o bit de Stop. A 
                                    UART tambem espera que a paridade esteja  
                                    presente nos dados recebidos.             
                                    Number of Stop Bits (STB). Se definido    
                                    como "1" e usando palavras de dados de 5  
                                    bits, 1.5 bits de parada sao transmitidos 
                                    e esperados em cada palavra de dados.     
                             Bit 2  Para palavras de dados de 6, 7 e 8 bits,  
                                    2 Stop Bits sao transmitidos e esperados. 
                                    Quando este bit e definido como "0", um   
                                    bit de parada e usado em cada palavra de  
                                    dados.                                    
                             Bit 1  Comprimento de palavra selecione bit #1   
                                    (WLSB1)                                   
                             Bit 0  Comprimento de palavra selecione bit #0   
                                    (WLSB0)                                   
                                    Juntos, esses bits especificam o numero   
                                    de bits em cada palavra de dados.         
                                    1      0     Comprimento da palavra       
                                    0      0     5 bits de dados              
                                    0      1     6 bits de dados              
                                    1      0     7 bits de dados              
                                    1      1     8 bits de dados              
                             Registro de Controle de Modem (MCR)              
                             Bit 7  Reserved, always 0.                       
                             6 bits Reserved, always 0.                       
                             Bit 5  Reserved, always 0.                       
                                    Loop-Back Enable. Quando definido para    
                                    "1", o transmissor e o receptor UART sao  
                                    conectados internamente para permitir     
                                    operac,oes de diagnostico. Alem disso, as 
                             Bit 4  saidas de controle do modem UART sao      
                                    conectadas `as entradas de controle do    
                                    modem UART. O CTS esta conectado a RTS, o 
                                    DTR esta conectado a DSR, o OUT1 esta     
                                    conectado a RI e o OUT 2 esta conectado a 
                                    DCD.                                      
   +0x04     write/read             OUT 2. E uma saida auxiliar que o         
                                    processador host pode definir como alta   
                             Bit 3  ou baixa. No adaptador serial IBM PC (e   
                                    na maioria dos clones), OUT 2 e usado     
                                    para triestar (desabilitar) o sinal de    
                                    interrupc,ao do UART 8250/16450/16550.    
                                    OUT 1. E uma saida auxiliar que o         
                             Bit 2  processador host pode definir como alta   
                                    ou baixa. Essa saida nao e usada no       
                                    adaptador serial IBM PC.                  
                                    Solicitac,ao para enviar (RTS). Quando    
                             Bit 1  definido para "1", a saida da linha       
                                    UART-RTS e Baixa (Ativo).                 
                                    Data Terminal Ready (DTR). Quando         
                             Bit 0  definido para "1", a saida da linha       
                                    UART-DTR e baixa (ativa).                 
                             Registro de status de linha (LSR)                
                                    Error in Receiver FIFO. No UART           
                                    8250/16450, esse bit e zero. Esse bit e   
                             Bit 7  definido como "1" quando qualquer um dos  
                                    bytes no FIFO tem uma ou mais das         
                                    seguintes condic,oes de erro: PE, FE ou   
                                    BI.                                       
                                    Transmitter Empty (TEMT). Quando definido 
                                    para "1", nao ha palavras restantes no    
                             6 bits FIFO de transmissao ou no registrador de  
                                    deslocamento de transmissao. O            
                                    transmissor esta completamente ocioso.    
                                    Transmissor Holding Register Empty        
                                    (THRE). Quando definido para "1", o FIFO  
                                    (ou registrador de retenc,ao) agora tem   
                             Bit 5  espac,o para pelo menos uma palavra       
                                    adicional para transmitir. O transmissor  
                                    ainda pode estar transmitindo quando este 
                                    bit esta definido para "1".               
                             Bit 4  Break Interrupt (BI). O receptor detectou 
                                    um sinal de Break.                        
   +0x05     write/read             Framing Error (FE). Um Bit de Inicio foi  
                             Bit 3  detectado, mas o Bit de Stop nao apareceu 
                                    no horario esperado. A palavra recebida e 
                                    provavelmente truncada.                   
                             Bit 2  Parity Error (PE). O bit de paridade      
                                    estava incorreto para a palavra recebida. 
                                    Overrun Error (OE). Uma nova palavra foi  
                                    recebida e nao havia espac,o no buffer de 
                                    recebimento. A palavra recem-chegada no   
                             Bit 1  registrador de deslocamento e descartada. 
                                    Nos UARTs 8250/16450, a palavra no        
                                    registro de retenc,ao e descartada e a    
                                    palavra recem-chegada e colocada no       
                                    registro de retenc,ao.                    
                                    Data Ready (DR). Uma ou mais palavras     
                                    estao no FIFO de recepc,ao que o host     
                                    pode ler. Uma palavra deve ser            
                             Bit 0  completamente recebida e movida do        
                                    registrador de deslocamento para o FIFO   
                                    (ou registrador de sustentac,ao para      
                                    desenhos do 8250/16450) antes que este    
                                    bit seja definido.                        
                             Registro de status de modem (MSR)                
                             Bit 7  Data Carrier Detect (DCD). Reflete o      
                                    estado da linha DCD no UART.              
                             6 bits Indicador de anel (RI). Reflete o estado  
                                    da linha RI no UART.                      
                             Bit 5  Conjunto de dados pronto (DSR). Reflete o 
                                    estado da linha DSR no UART.              
                             Bit 4  Limpar para enviar (CTS). Reflete o       
                                    estado da linha CTS no UART.              
                                    Delta Data Carrier Detect (DDCD). Defina  
                             Bit 3  para "1" se a linha -DCD mudou de estado  
                                    mais uma vez desde a ultima vez em que o  
   +0x06     write/read             MSR foi lido pelo host.                   
                                    Trailing Edge Ring Indicator (TERI).      
                             Bit 2  Defina para "1" se a linha -RI teve uma   
                                    transic,ao baixa para alta desde a ultima 
                                    vez em que o MSR foi lido pelo host.      
                                    Delta Data Set Ready (DDSR). Defina para  
                             Bit 1  "1" se a linha -DSR mudou de estado mais  
                                    uma vez desde a ultima vez em que o MSR   
                                    foi lido pelo host.                       
                                    Delta Clear To Send (DCTS). Defina para   
                             Bit 0  "1" se a linha -CTS mudou de estado mais  
                                    uma vez desde a ultima vez em que o MSR   
                                    foi lido pelo host.                       
                             Scratch Register (SCR). Este registro nao        
   +0x07     write/read      executa nenhuma func,ao no UART. Qualquer valor  
                             pode ser gravado pelo host para este local e     
                             lido pelo host mais tarde.                       

  1.9. Alem do UART 16550A

   Embora a National Semiconductor nao tenha oferecido nenhum componente
   compativel com o 16550 que fornec,a recursos adicionais, varios outros
   fornecedores oferecem. Alguns desses componentes sao descritos abaixo.
   Deve ser entendido que para utilizar efetivamente essas melhorias, os
   drivers podem ter que ser fornecidos pelo fornecedor do chip, ja que a
   maioria dos sistemas operacionais populares nao suportam recursos alem
   daqueles fornecidos pelo 16550.

   ST16650

           Por padrao, essa pec,a e semelhante ao NS16550A, mas um buffer de
           envio e recebimento de 32 bytes estendido pode ser opcionalmente
           ativado. Fabricado pela StarTech.

   TIL16660

           Por padrao, essa pec,a se comporta de maneira semelhante ao
           NS16550A, mas um buffer de envio e recebimento de 64 bytes
           estendido pode ser opcionalmente ativado. Fabricado pela Texas
           Instruments.

   Hayes ESP

           Esta placa plug-in proprietaria contem um buffer de envio e
           recebimento de 2048 bytes e suporta taxas de dados de ate 230,4
           Kbit/s. Fabricada pela Hayes.

   Alem desses UARTs "dumb", muitos fornecedores produzem placas de
   comunicac,ao serial inteligentes. Esse tipo de design geralmente fornece
   um microprocessador que faz interface com varios UARTs, processa e
   armazena os dados em buffer e, em seguida, alerta o processador principal
   do PC quando necessario. Como os UARTs nao sao acessados
   &#8203;&#8203;diretamente pelo processador do PC nesse tipo de sistema de
   comunicac,ao, nao e necessario que o fornecedor use UARTs compativeis com
   o UART 8250, 16450 ou 16550. Isso deixa o designer livre para usar
   componentes que tenham melhores caracteristicas de desempenho.

2. Configurando o driver sio

   O driver sio fornece suporte para interfaces de comunicac,ao EIA RS-232C
   (CCITT V.24) baseadas em NS8250-, NS16450-, NS16550 e NS16550A. Varias
   placas multiportas tambem sao suportadas. Consulte a pagina de manual
   sio(4) para obter documentac,ao tecnica detalhada.

  2.1. Digi International (DigiBoard) PC/8

   Contribuic,ao de Andrew Webster <awebster@pubnix.net>. 26 de agosto de
   1995.

   Aqui esta um trecho de configurac,ao de uma maquina com uma placa Digi
   International PC/8 com 16550. Ela tem 8 modems conectados a essas 8 linhas
   e eles funcionam muito bem. Nao se esquec,a de adicionar options
   COM_MULTIPORT ao seu kernel ou ela nao funcionara muito bem!

 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

   O truque para configura-la e que o MSB dos flags representa a ultima porta
   SIO, neste caso 11, entao as flags sao 0xb05.

  2.2. Boca 16

   Contribuic,ao de Don Whiteside <whiteside@acm.org>. 26 de agosto de 1995.

   Os procedimentos para fazer uma placa multiporta Boca 16 funcionar com o
   FreeBSD sao bastante diretos, mas voce precisara de algumas coisas para
   faze-la funcionar:

    1. Voce precisa do codigo fonte do kernel instalado para poder recompilar
       as opc,oes necessarias ou precisara de alguem para compila-las para
       voce. O kernel padrao 2.0.5 nao vem com suporte a multiplas portas
       ativado e voce precisara adicionar uma entrada de dispositivo para
       cada porta de qualquer maneira.

    2. Dois, voce precisara saber a configurac,ao de interrupc,ao e de I/O da
       sua placa Boca para que voce possa definir essas opc,oes corretamente
       no kernel.

   Uma nota importante - os chips UART reais para a Boca 16 estao nos
   conectores, nao na propria placa interna. Entao, se voce os tiver
   desconectado, os probes destas portas falharao. Eu nunca testei a
   inicializac,ao com a caixa desconectada e conectando-a novamente, e sugiro
   que voce tambem nao o fac,a.

   Se voce ainda nao tiver um arquivo de configurac,ao de kernel
   personalizado, consulte o capitulo Configurac,ao do Kernel no Handbook do
   FreeBSD para os procedimentos gerais. A seguir estao as especificac,oes
   para a placa Boca 16 e supoe-se que voce esteja usando o nome do kernel
   MYKERNEL e editando com o vi.

    1. Adicione a linha

 options COM_MULTIPORT

       ao arquivo de configurac,ao.

    2. Onde as linhas atuais do dispositivo device sion estao, voce precisara
       adicionar mais 16 dispositivos. O exemplo a seguir e para uma placa
       Boca com uma interrupc,ao de 3 e um enderec,o de IO base de 100h. O
       enderec,o IO para cada porta e +8 hexadecimal da porta anterior,
       portanto, os enderec,os sao 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

       A entrada de flags deve ser alterada deste exemplo, a menos que voce
       esteja usando exatamente as mesmas atribuic,oes de sio. As
       sinalizac,oes sao definidas de acordo com 0xMYY onde M indica o numero
       menor da porta principal (a ultima porta em uma Boca 16) e YY indica
       se o FIFO esta ativado ou desativado (ativado), o compartilhamento de
       IRQ e usado (sim) e se ha um registro de controle de IRQ compativel
       com AST/4 (nao). Neste exemplo,

  flags
               0x1005

       indica que a porta principal e a sio16. Se eu adicionasse outra placa
       e atribuisse do sio17 ate sio28, os sinalizadores para todas as 16
       portas nesta placa seriam 0x1C05, onde 1C indica o menor numero da
       porta principal. Nao altere a configurac,ao 05.

    3. Salve e complete a configurac,ao do kernel, recompile, instale e
       reinicialize. Presumindo que voce tenha instalado com sucesso o kernel
       recompilado e configurado para o enderec,o e IRQ correto, sua mensagem
       de boot deve indicar o teste bem-sucedido das portas Boca da seguinte
       forma: (obviamente os numeros sio, IO e IRQ podem ser diferentes)

 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)

       Se as mensagens forem muito rapidas para serem visualizadas,

 # dmesg | more

       mostrara as mensagens de inicializac,ao.

    4. Em seguida, as entradas apropriadas em /dev para os dispositivos devem
       ser criadas usando o script /dev/MAKEDEV. Esta etapa pode ser omitida
       se voce estiver executando o FreeBSD 5.X com um kernel que tenha sido
       compilado com o suporte ao devfs(5).

       Se voce precisar criar as entradas /dev, execute o seguinte como root:

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

       Se voce nao quiser ou precisar de dispositivos de chamada por algum
       motivo, voce pode dispensar o uso dos dispositivos cua*.

    5. Se voce quiser uma maneira rapida e desleixada de se certificar de que
       os dispositivos estao funcionando, voce pode simplesmente conectar um
       modem em cada porta e (como root)

 # echo at > ttyd*

       para cada dispositivo que voce fez. Voce deve ver as luzes RX piscando
       para cada porta em funcionamento.

  2.3. Suporte para cartoes Multi-UART baratos

   Contribuic,ao de Helge Oldach <hmo@sep.hamburg.com>, setembro de 1999

   Ja se perguntou se o FreeBSD suporta a sua placa multi-I/O de US$ 20 com
   duas (ou mais) portas COM, compartilhando IRQs? Aqui esta como:

   Normalmente, a unica opc,ao para suportar esse tipo de placa e usar um IRQ
   distinto para cada porta. Por exemplo, se a placa da CPU tiver uma porta
   COM1 integrada (tambem conhecida como sio0 - enderec,o de I/O 0x3F8 e IRQ
   4) e voce tiver uma placa de extensao com dois UARTs , voce normalmente
   precisara configura-los como COM2 (tambem conhecido como sio1 - enderec,o
   de I/O 0x2F8 e IRQ 3) e a terceira porta (tambem conhecida como sio2) como
   I/O 0x3E8 e IRQ 5. Obviamente, isso e um desperdicio de recursos de IRQ,
   ja que deve ser basicamente possivel executar ambas as portas da placa de
   extensao usando um unico IRQ com a configurac,ao COM_MULTIPORT descrita
   nas sec,oes anteriores.

   Essas placas de I/O baratas geralmente tem uma matriz de jumpers de 4 por
   3 para as portas COM, semelhante `a seguinte:

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

   E mostrada aqui a porta A com fiac,ao para IRQ 5 e a porta B com fiac,ao
   para IRQ 3. As colunas de IRQ em sua placa especifica podem variar -
   outras placas podem fornecer jumpers para IRQs 3, 4, 5 e 7.

   Pode-se concluir que a fiac,ao de ambas as portas para o IRQ 3 usando um
   jumper feito a mao e feito `a mao cobrindo todos os tres pontos de conexao
   na coluna IRQ 3 resolveria o problema, mas nao. Voce nao pode duplicar o
   IRQ 3 porque os drivers de saida de cada UART estao conectados de forma
   "totem pole", portanto, se um dos UARTs ativar o IRQ 3, o sinal de saida
   nao sera o esperado. Dependendo da implementac,ao da placa de extensao ou
   da placa-mae, a linha IRQ 3 permanecera sempre ativa ou sempre baixa.

   Voce precisa separar os drivers de IRQ para as duas UARTs, de modo que a
   linha IRQ da placa so suba se (e somente se) uma das UARTs ativar uma IRQ
   e permanecendo abaixo de outra forma. A soluc,ao foi proposta por Joerg
   Wunsch <j@ida.interface-business.de>: Soldar um cabo - ou consistindo de
   dois diodos (de Germanio ou do tipo-Schottky sao fortemente preferidos) e
   um resistor de 1 kOhm. Aqui esta o esquema, a partir do campo de jumper 4
   por 3 acima:

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

   Os catodos dos diodos estao conectados a um ponto comum, junto com um
   resistor de 1 kOhm. E essencial conectar o resistor ao terra para evitar a
   flutuac,ao da linha IRQ no barramento.

   Agora estamos prontos para configurar um kernel. Ficando com este exemplo,
   nos configurariamos:

 # 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

   Note que a configurac,ao das flags para sio1 e sio2 e realmente essencial;
   consulte sio(4) para detalhes. (Geralmente, o 2 no atributo "flags"
   refere-se ao sio2 que contem o IRQ, e voce certamente deseja um "nibble"
   abaixo de 5. ) Com o modo verboso do kernel ativado, isso deve render algo
   semelhante a isto:

 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)

   Embora o /sys/i386/isa/sio.c seja um pouco enigmatico com o uso do array
   "irq maps" acima, a ideia basica e que voce observe 0x1 no primeiro,
   terceiro e quarto lugar. Isso significa que o IRQ correspondente foi
   definido na saida e limpo depois, o que e exatamente o que esperariamos.
   Se o seu kernel nao exibir esse comportamento, provavelmente ha algo
   errado com a sua fiac,ao.

3. Configurando o driver cy

   Contribuic,ao de Alex Nash. 6 de Junho de 1996.

   As placas multiseriais da Cyclades sao baseadas no driver cy em vez do
   driver usual sio usado por outras placas multiseriais. Configurac,ao e uma
   simples questao de:

    1. Adicione o dispositivo cy `a sua configurac,ao do kernel (observe que
       suas configurac,oes irq e iomem podem ser diferentes).

 device cy0 at isa? irq 10 iomem 0xd4000 iosiz 0x2000

    2. Recompile e instale o novo kernel.

    3. Crie os device nodes digitando (o exemplo a seguir assume uma placa de
       8 portas) [1]:

 # cd /dev
 # for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done

    4. Se apropriado, adicione entradas de discagem ao /etc/ttys duplicando
       as entradas dos dispositivos seriais (ttyd) e usando ttyc no lugar de
       ttyd. Por exemplo:

 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 com o novo kernel.

4. Configurando o driver si

   Contribuic,ao de Nick Sayer <nsayer@FreeBSD.org>. 25 de Marc,o de 1998.

   As placas multiportas Specialix SI/XIO e SX usam o driver si. Uma unica
   maquina pode ter ate 4 placas host. As seguintes placas host sao
   suportadas:

     * ISA SI/XIO host card (2 versions)

     * EISA SI/XIO host card

     * PCI SI/XIO host card

     * ISA SX host card

     * PCI SX host card

   Embora as placas host SX e SI/XIO parec,am marcadamente diferentes, sua
   funcionalidade e basicamente a mesma. Os cartoes de host nao usam locais
   de I/O, mas exigem um bloco de memoria de 32K. A configurac,ao de fabrica
   para cartoes ISA coloca isso em 0xd0000-0xd7fff. Elas tambem exigem um
   IRQ. As placas PCI, e claro, se configuram automaticamente.

   Voce pode anexar ate 4 modulos externos a cada placa de host. Os modulos
   externos contem 4 ou 8 portas seriais. Eles vem nas seguintes variedades:

     * Modulos de portas SI 4 ou 8. Ate 57600 bps em cada porta suportada.

     * Modulos de porta XIO 8. Ate 115.200 bps em cada porta suportada. Um
       tipo de modulo XIO possui 7 portas seriais e 1 porta paralela.

     * Modulos de porta SXDC 8. Ate 921.600 bps em cada porta suportada. Tal
       como no XIO, um modulo esta disponivel com uma porta paralela tambem.

   Para configurar uma placa de host ISA, adicione a seguinte linha ao seu
   arquivo de configurac,ao do kernel, alterando os numeros conforme
   apropriado:

 device si0 at isa? iomem 0xd0000 irq 11

   Numeros de IRQ validos sao 9, 10, 11, 12 e 15 para placas host SX ISA e
   11, 12 e 15 para placas host ISA/XIO ISA.

   Para configurar uma placa de host EISA ou PCI, use esta linha:

 device si0

   Depois de adicionar a entrada de configurac,ao, recompile e instale seu
   novo kernel.

  Nota:

   A etapa seguinte, nao e necessaria se voce estiver usando o devfs(5) no
   FreeBSD 5.X.

   Apos a reinicializac,ao com o novo kernel, voce precisa criar os device
   nodes no /dev. O script MAKEDEV cuidara disso para voce. Conte quantas
   portas totais voce tem e digite:

 # cd /dev
 # ./MAKEDEV ttyAnn cuaAnn

   (no qual nn e o numero de portas)

   Se voce quiser que as solicitac,oes de login aparec,am nessas portas, voce
   precisara adicionar linhas como esta para /etc/ttys:

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

   Altere o tipo de terminal conforme apropriado. Para modems, dialup ou
   unknown esta bem.

     ----------------------------------------------------------------------

   [1] Voce pode omitir esta parte se voce estiver executando o FreeBSD 5.X
   com devfs(5).
