2. Configurando o driver sio

O driver sio fornece suporte para interfaces de comunicação EIA RS-232C (CCITT V.24) baseadas em NS8250-, NS16450-, NS16550 e NS16550A. Várias placas multiportas também são suportadas. Consulte a página de manual sio(4) para obter documentação técnica detalhada.

2.1. Digi International (DigiBoard) PC/8

Contribuição de Andrew Webster . 26 de agosto de 1995.

Aqui está um trecho de configuração de uma máquina com uma placa Digi International PC/8 com 16550. Ela tem 8 modems conectados a essas 8 linhas e eles funcionam muito bem. Não se esqueça de adicionar options COM_MULTIPORT ao seu kernel ou ela não funcionará 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 configurá-la é que o MSB dos flags representa a última porta SIO, neste caso 11, então as flags são 0xb05.

2.2. Boca 16

Contribuição de Don Whiteside . 26 de agosto de 1995.

Os procedimentos para fazer uma placa multiporta Boca 16 funcionar com o FreeBSD são bastante diretos, mas você precisará de algumas coisas para fazê-la funcionar:

  1. Você precisa do código fonte do kernel instalado para poder recompilar as opções necessárias ou precisará de alguém para compilá-las para você. O kernel padrão 2.0.5 não vem com suporte a múltiplas portas ativado e você precisará adicionar uma entrada de dispositivo para cada porta de qualquer maneira.

  2. Dois, você precisará saber a configuração de interrupção e de I/O da sua placa Boca para que você possa definir essas opções corretamente no kernel.

Uma nota importante - os chips UART reais para a Boca 16 estão nos conectores, não na própria placa interna. Então, se você os tiver desconectado, os probes destas portas falharão. Eu nunca testei a inicialização com a caixa desconectada e conectando-a novamente, e sugiro que você também não o faça.

Se você ainda não tiver um arquivo de configuração de kernel personalizado, consulte o capitulo Configuração do Kernel no Handbook do FreeBSD para os procedimentos gerais. A seguir estão as especificações para a placa Boca 16 e supõe-se que você esteja usando o nome do kernel MYKERNEL e editando com o vi.

  1. Adicione a linha

    options COM_MULTIPORT

    ao arquivo de configuração.

  2. Onde as linhas atuais do dispositivo device sion estão, você precisará adicionar mais 16 dispositivos. O exemplo a seguir é para uma placa Boca com uma interrupção de 3 e um endereço de IO base de 100h. O endereço IO para cada porta é +8 hexadecimal da porta anterior, portanto, os endereços são 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 você esteja usando exatamente as mesmas atribuições de sio. As sinalizações são definidas de acordo com 0xMYY onde M indica o número menor da porta principal (a última porta em uma Boca 16) e YY indica se o FIFO está ativado ou desativado (ativado), o compartilhamento de IRQ é usado (sim) e se há um registro de controle de IRQ compatível com AST/4 (não). Neste exemplo,

     flags
    	      0x1005

    indica que a porta principal é a sio16. Se eu adicionasse outra placa e atribuísse do sio17 até sio28, os sinalizadores para todas as 16 portas nesta placa seriam 0x1C05, onde 1C indica o menor número da porta principal. Não altere a configuração 05.

  3. Salve e complete a configuração do kernel, recompile, instale e reinicialize. Presumindo que você tenha instalado com sucesso o kernel recompilado e configurado para o endereço e IRQ correto, sua mensagem de boot deve indicar o teste bem-sucedido das portas Boca da seguinte forma: (obviamente os números 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 rápidas para serem visualizadas,

    # dmesg | more

    mostrará as mensagens de inicialização.

  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 você estiver executando o FreeBSD 5.X com um kernel que tenha sido compilado com o suporte ao devfs(5).

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

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

    Se você não quiser ou precisar de dispositivos de chamada por algum motivo, você pode dispensar o uso dos dispositivos cua*.

  5. Se você quiser uma maneira rápida e desleixada de se certificar de que os dispositivos estão funcionando, você pode simplesmente conectar um modem em cada porta e (como root)

    # echo at > ttyd*

    para cada dispositivo que você fez. Você deve ver as luzes RX piscando para cada porta em funcionamento.

2.3. Suporte para cartões Multi-UART baratos

Contribuição de Helge Oldach , setembro de 1999

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

Normalmente, a única opção para suportar esse tipo de placa é usar um IRQ distinto para cada porta. Por exemplo, se a placa da CPU tiver uma porta COM1 integrada (também conhecida como sio0 - endereço de I/O 0x3F8 e IRQ 4) e você tiver uma placa de extensão com dois UARTs , você normalmente precisará configurá-los como COM2 (também conhecido como sio1 - endereço de I/O 0x2F8 e IRQ 3) e a terceira porta (também conhecida como sio2) como I/O 0x3E8 e IRQ 5. Obviamente, isso é um desperdício de recursos de IRQ, já que deve ser basicamente possível executar ambas as portas da placa de extensão usando um único IRQ com a configuração COM_MULTIPORT descrita nas seções anteriores.

Essas placas de I/O baratas geralmente têm uma matriz de jumpers de 4 por 3 para as portas COM, semelhante à seguinte:

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

É mostrada aqui a porta A com fiação para IRQ 5 e a porta B com fiação para IRQ 3. As colunas de IRQ em sua placa específica podem variar - outras placas podem fornecer jumpers para IRQs 3, 4, 5 e 7.

Pode-se concluir que a fiação de ambas as portas para o IRQ 3 usando um jumper feito a mão e feito à mão cobrindo todos os três pontos de conexão na coluna IRQ 3 resolveria o problema, mas não. Você não pode duplicar o IRQ 3 porque os drivers de saída de cada UART estão conectados de forma totem pole, portanto, se um dos UARTs ativar o IRQ 3, o sinal de saída não será o esperado. Dependendo da implementação da placa de extensão ou da placa-mãe, a linha IRQ 3 permanecerá sempre ativa ou sempre baixa.

Você precisa separar os drivers de IRQ para as duas UARTs, de modo que a linha IRQ da placa só suba se (e somente se) uma das UARTs ativar uma IRQ e permanecendo abaixo de outra forma. A solução foi proposta por Joerg Wunsch : Soldar um cabo - ou consistindo de dois diodos (de Germânio ou do tipo-Schottky são fortemente preferidos) e um resistor de 1 kOhm. Aqui está 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 cátodos dos diodos estão conectados a um ponto comum, junto com um resistor de 1 kOhm. É essencial conectar o resistor ao terra para evitar a flutuação da linha IRQ no barramento.

Agora estamos prontos para configurar um kernel. Ficando com este exemplo, nós 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

Note que a configuração das flags para sio1 e sio2 é realmente essencial; consulte sio(4) para detalhes. (Geralmente, o 2 no atributo "flags" refere-se ao sio2 que contém o IRQ, e você 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 enigmático com o uso do array irq maps acima, a ideia básica é que você observe 0x1 no primeiro, terceiro e quarto lugar. Isso significa que o IRQ correspondente foi definido na saída e limpo depois, o que é exatamente o que esperaríamos. Se o seu kernel não exibir esse comportamento, provavelmente há algo errado com a sua fiação.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.