A interface Serial ou Controladora 8250 ----------------------------------------- ( para os q querem escrever programas p/ interagir c/ modems/robos ou querem soh conhecer a parada mesmo. ) por augur - LTdG - Esse tutorial foi inicialmente escrito p/ um amigo q codava em asm e eh composto por ripagem de uns livros e minhas proprias palavras. Isso foi escrito em 2000 para ajudar um amigo q precisava escrever um device driver para linux, mas nao conhecia todas as especificacoes tecnicas da interface RS232, mas era fera em asm(heehee lembra bpt). Dei continuidade a este texto, qdo um outro amigo, q pensou em escrever um wardialer nao sabia como acessar o modem. Entao, pensei em liberar esse arquivo na net p/ ajudar os coders q nao conhecem estas especificacoes. isso eh de muita ajuda p/ os q querem escrever qquer coisa q envolva o modem. Bem... eh isso... tenham um bom proveito... Os pcs IBM ou compativeis(os ditos clones heehee) possuem o UART (Universal Asynchronous Receiver Transmitter) ou simplesmente controladora 8250, para auxilia-los na comunicacao serial. Mas antes de ser utilizado, a controladora 8250 deve ser programada com todos os parametros da comunicacao tais como velocidade, paridade, stop bits e tamanho da word. Tb, qdo desejamos transmitir um caractere, deve-se checar previamente se a controladora 8250 estah pronta para transmiti-lo, ou seja, se o anterior jah foi devidamente tratado(enviado/descartado). Ao receber um caractere, a controladora 8250 tem duas possibilidades de informar tal fato ao processador: atraves do processo de interrupcao ou ativando um de seus bits de status(da controladora). De qquer forma, se o processador esse caractere do buffer de recepcao da controladora 8250 e outro caractere chegar, um erro de Buffer Overrun(ou sobreposicao de buffer) serah gerado. Uma outra possibilidade de erro q pode ocorrer eh o Framing Error(erro estrutural), q pode ser causado caso o transmissor esteja configurado de maneira diferente do receptor(stop bits, tamanho da word, ...). Tb podem haver erros de paridade qdo um numero impar de bits q compoem o caractere recebido, seja invertido. A interface RS232 A interface RS232 conecta eletricamente a controladora 8250 ao mundo exterior. Ela pode ser ligada diretamente a outra interface RS232 atraves de um cabo cross-over(cabo serial com o TX/RX invertidos) desde q as distancias sejam pequenas. Caso as ligacoes sejam feitas a longa distancia, um modem pode ser ligado na RS232 para converter os sinais digitais e analogicos e poder usar sua linha telefonica para se comunicar. Para operar um modem, a interface RS232 possui controles adicionais, para informar se o computador estah ligado, para requisitar uma transmissao, para verificar se o modem estah ligado, se estah recebendo dados, etc. Cada um desses controles estao associados a pinos especificos da interface, seguindo normas de padronizacao(tipo a do modem de 56kbps eh chamada V90). A distribuicao desses controles eh a seguinte: Pino Nome Descricao 1 GND Terra de protecao 2 TX Transmicao 3 RX Recepcao 4 RTS Permicao p/ transmitir(request to send) 5 CTS Permicao p/ transmitir consedida(clear to send) 6 DSR Modem pronto(Data set ready) 7 GND Terra de sinal 8 DCD Portadora de dados detectada(Data Carrier Detected) 20 DTR Terminal pronto(data terminal ready) A controladora 8250 nao precisa ser programado diretamente, pois na BIOS existem chamadas para executar tal tarefa, a INT 14h, adiante eu definirei os enderecos de hardware e tudo q for necessario para programar sem o uso da INT 14h(pro caso de vc querer escrever um driver de modem) e, tb, os paramatros da INT 14h. A INT 14H Tambem chamada de RS232_IO, a int 14h eh a interrupcao da BIOS usada para permitir ao usuario programar as interfaces RS232 dos pcs ibm/compativeis, bem como enviar, receber e verificar os bytes e verificar o status dessa interface. Seus parametros sao: DX -> indica a porta de comunicacao q vai se utilizar(COM[1-4]) AH -> setado p/ 0(zero) inicializa a porta de comunicacao. AL -> parametros de inicializacao definidos abaixo: bit 7 6 5 4 3 2 1 0 baud rate paridade stop bit word 000- 110bps X0 - sem 0 - um 10 - 7 bits 001- 150bps 01 - impar 1 - dois 11 - 8 bits 010- 300bps 11 - par 011- 600bps 100- 1200bps 101- 2400bps 110- 4800bps 111- 9600bps AH -> setado p/ 1(um) transmite o caractere em AL pela porta DX Na saida, de o bit 7 de AH for 1, o caractere nao foi transmitido, caso contrario, AH contem o status da interface. AH -> setado p/ 2(dois) recebe um caractere de DX e poe em AL Na saida, de o bit 7 de AH for 1, houve um time-out na recepcao do caractere, caso contrario AH contem o status da interface. AH -> setado p/ 3(tres) retorna o status da porta de comunicacao Na saida AH contem o estatus da linha: bit 7 = TIME OUT bit 6 = SHIFT REGISTER EMPTY bit 5 = HOLDING REGISTER EMPTY bit 4 = DETECCAO DE SINAL BREAK bit 3 = ERRO DE FRAMING bit 2 = ERRO DE PARIDADE bit 1 = ERRO DE OVERRUN bit 0 = DADO RECEBIDO e AL con tem o status do modem: bit 7 = RECEIVED LINE SIGNAL DETECTED bit 6 = RING INDICATOR bit 5 = DATA SET READY(DSR) bit 4 = CLEAR TO SEND(CTS) bit 3 = DELTA RECEIVE LINE SIGNAL DETECTED bit 2 = TRAILING EDGE RING DETECTOR bit 1 = DELTA DATA SET READY bit 0 = DELTA CLEAR TO SEND Assim termina os parametros de inicalizacao e uso do modem. um exemplo de como isso funcionaria eh o seguinte: TX equ 3f8h ; isso p/ com1 RX equ TX LCR equ TX + 3 ; line control reg MCR equ TX + 4 ; modem control reg LSR equ TX + 5 ; line status reg MSR equ TX + 6 ; modem status reg ... INICIA PROC NEAR MOV AX, 11111011b ; seta para 9600, paridade par XOR DX, DX ; 1 stop bit, word de 8 bits INT 14 RET INICIA ENDP ENVIA PROC NEAR ; entra o caractere a enviar em AL MOV DX, TX OUT DX, AL RET ; retorna p/ quem chamou o procedimento ENVIA ENDP RECEBE PROC NEAR ; recebe o caractere da COMx e poe em AL MOV DX, RX IN AL, DX RET RECEBE ENDP Bem, esse eh um codigo basico, mas funciona, eh soh por os headers compativeis com o seu compilador q vc terah em instantes um programinha pra conversar com seu modem. soh nao esqueca de setar os enderecos da COM, pq no codigo, tudo foi setado pra COM1. os outros enderecos sao: COM1 - 3f8h ~ 3ffh COM3 - 3e8h ~ 3efh COM2 - 2f8h ~ 2ffh COM4 - 2e8h ~ 2efh Agora, caso vcs queiram pular a BIOS e controlar totalmente o modem, agora vou listar todos os passos da inicializacao e controle, sem o uso da INT 14h... eh na unha agora... Primeiro vamos listar os enderecos de hardware( p/ com1. p/ outra eh soh setar assim end_COM +(ou -) 1 ou 2... use THR como base ) endereco registrador abraviacao end_COMx+ 03f8h Transmitter Holding reg THR 0 03f8h receiver data register RDR 0 03f8h baud rate divisor(low) BDL 0 03f9h baud rate divisor(high) BDH 1 03f9h interrupt enabled reg IER 1 03fah interrupt identification reg IIR 2 03fbh line control reg LCR 3 03fch modem control reg MCR 4 03fdh line status reg LSR 5 03feh modem status reg MSR 6 A inicializacao do 8250 em si O primeiro parametro a ser setado eh o divisor de baud-rate ou taxa de transmissao. Esse valor eh utilizado p/ dividir uma frequencia de entrada em um sinal de clock q representa o baud-rate a ser utilizado p/ a transmissao/recepcao dos dados. A seguir, eu descreverei a relacao entre a taxa de transmicao e o valor a ser setado. Taxa Parte Alta Parte Baixa 50 09h 00h 75 06h 00h 150 03h 00h 300 01h 80h 600 00h c0h 1200 00h 60h 2400 00h 30h 4800 00h 18h 9600 00h 0ch 19200 00h 06h Para inicializar o divisor de baud-rate, deve-se inicialmente setar o bit 7 do LCR p/ 1. Ambas as partes(alta e baixa) dos divisores devem, entao, ser enviadas aos enderecos de IO 3f8h e 3f9h, respectivamente (isso para COM1, para as outras siga minha descricao anterior). Exemplo: programar 0 8250 p/ funcionar em 9600bps. OUT 3fbh, 80h ; mandar p/ LCR(3fbh) o valor 10000000(80h) OUT 3f8h, 0ch ;\_ isso manda respectivamente as partes alta OUT 3f9h, 00h ;/ e baixa do divisor de baud-rate para a 8250 Terminada o envio do baud-rate, configura-se o LCR, determinando o tamanho da word, numero de stop-bits e a paridade a ser utilizada. Bits do LCR Significado ################### 0 tamanho da word - bit 0 /##### # tamanho da word # 1 tamanho da word - bit 1 \# ##### 0 0 - 5 bpchar # 2 numero de stop-bits # 0 1 - 6 bpc # 3 habilita paridade(1 - habilita) # 1 0 - 7 bpc # 4 paridade par # 1 1 - 8 bpc # 5 mantem bit de paridade em 0 ou 1 ################### 6 habilita o sinal break 7 acesso ao divisor de baud-rate O proximo registrador a ser inicializado eh o MCR. O DTR sempre deverah estar ativo e o RTS deverah ser ativado antes de cada transmissao. O sinal OUT2 deve ser setado p/ 1, caso queramos q o 8250 gere interrupcao p/ o processador. Bits do MCR Significado 0 DTR -> 1 p/ ativar 1 RTS -> 1 p/ ativar 2 OUT1 -> saida auxiliar 3 OUT2 -> 1 p/ habilitar interrupcoes 4 1 p/ ativar retorno de interface 5 0 6 0 7 0 O bit 4(ativar retorno de interface) eh utilizado normalmente p/ teste de interface, onde todos os caracteres transmitidos serao tb recebidos. Em operacoes normais, deve ser setado p/ 0. O ultimo registrador a ser setado eh o IER, q nos permite habilitar ou desabilitar as interrupcoes. Bits do IER Significado 0 1 p/ habilitar interrupcao na recepcao 1 1 p/ habilitar interrupcao na transmicao 2 1 p/ habilitar interrupcao de status de linha 3 1 p/ habilitar interrupcao de status do modem 4 0 5 0 6 0 7 0 Vejam tb, os bits do IIR, do LSR e do MSR. Bits do IIR Significado 0 0 se nao houver interrupcoes pendentes 1 bit 0 do Interrupt ID 2 bit 1 do interrupt ID 3 0 ############# Interrupt ID ############# 4 0 # 1 1 - Status da linha recebido # 5 0 # 1 0 - Dado recebido # 6 0 # 0 1 - Pronto p/ transmitir outro char# 7 0 # 0 0 - Status do modem recebido # ######################################## Bits do LSR Significado 0 dado recebido 1 erro de overrun 2 erro de paridade 3 erro de framing 4 sinal break recebido 5 buffer de transmissao vazio 6 serializador de bits vazios 7 0 Bits do MSR Significado 0 houve variacao do CTS 1 houve variacao do DSR 2 houve variacao do ring indicator 3 houve variacao do sinal dado recebido 4 estado do CTS 5 estado do DSR 6 ring indicator 7 igual ao sinal OUT2 do MCR Aqui termina a descricao e o modo de programar a interface RS232 da controladora 8250. Esse nao eh o tutorial mais completo nem o mais fodao, mas eh o suficiente para escrever device drivers pros linux da vida(heehee). augur@brasnet.org LTdG - todos os direitos pirateados