/************************************************
Configura a porta serial UART
Sistemas Embarcados 2010-2
Marcos Augusto Stemmer
*************************************************/
#include <arch/nxp/lpc24xx.h>
/* Frequencia efetiva do clock 12MHz */
#include "uart.h"

/* Configuracao da Porta Serial 0 */
void U0init(void)
{
PCLKSEL0 = (PCLKSEL0 & (~0xc0)) | 0x40; /* divide por 1 no PCLK da UART0 */
PCONP |= 8;		/* Liga energia da UART0 */
PINSEL0 = (PINSEL0 & (~0xf0)) | 0x50;	/* Seleciona pinos TxD0 e RxD0 */
U0FCR   = 0x7;		/* Habilita as FIFOs e reset */
U0LCR   = 0x83;		/* Habilita acesso ao divisor de baud-rate (DLAB) */
U0DLL   = ((CCLK/BAUDRATE+8) >> 4) & 0xff;	/* BAUDRATE definido externamente */
U0DLM   = ((CCLK/BAUDRATE) >> 12) & 0xff;
U0LCR    = 0x03;	/* Configura UART0 como 8N1 */
}

/* Recebe um caractere da porta serial */
int U0getchar(void)
{
while((U0LSR & 1) == 0);	/* Espera ate receber algo */
return U0RBR;
}

/* Envia um caractere */
void U0putchar(int c)
{
while((U0LSR & 0x20) == 0);	/* Espera transmissor disponivel */
U0THR = c;	/* Transmite */
}

/* Envia uma mensagem pela UART0 */
void U0puts(char *txt)
{
while(*txt) U0putchar(*txt++);
}

/* Escreve um digito hexadecimal */
void U0prdig(int dig)
{
dig &= 0xf;
if(dig > 9) dig+='A'-'9'-1;
U0putchar(dig+'0');
}

/* Escreve um byte como 2 digitos hexadecimais */
void U0prbyte(int c)
{
U0prdig(c>>4); U0prdig(c);
}


/* Entrada de texto */
int U0gets(char *txt, int nmax)
{
int k;	/* Numero de caracteres armazenados */
int c;	/* caractere lido */
k=0;
do	{
	c=U0getchar();
	if(c==0x7f) c=8;
	U0putchar(c);
	/* se for backspace retira um caractere do buffer */
	if(c==8 && (k!=0)) k--;
	else if(k<nmax) txt[k++]=c;
	} while(c!='\n' && c!='\r');
txt[k-1]='\0';
return k;
}
