/************************************************
Configura o clock, PLL e a porta serial
Módulo uart.c: Configura UART e o clock
Marcos Augusto Stemmer
*************************************************/
#include <arch/nxp/lpc24xx.h>
#include "monarm.h"
/* cpuclock e' uma variavel global usada para armazenar a freq. efetiva da cpu */
int cpuclock=12000000;

/* Configura o clock com o PLL. */
int PLL_Init(int pllmulti, int cpudiv)
{
int k;
cpudiv &= -2;	/* cpudiv deve ser par */
if(PLLSTAT & (1 << 25)){	/* Se PLL nao estava configurado */
	PLLCON = 1;	/* Habilita PLL, desconectado */
	PLLFEED=0xAA;PLLFEED=0x55;
	}
PLLCON=0;	/* Desconecta e desabilita o PLL */
PLLFEED=0xAA;PLLFEED=0x55;
/* Depois deste comando deve-se usar FIO1PIN para acessar a porta P1 */
SCS = 0x21;	/* Liga o oscilador externo (12MHz) e o GPIO */
while( !(SCS & 0x40) );	/* Espera estabilizar o oscilador */
CLKSRCSEL = 0x1;	/* Usa o 12MHz como oscilador principal */
PLLCFG = (pllmulti/2 - 1);
PLLFEED=0xAA;PLLFEED=0x55;
CCLKCFG=0;	/* Divisor do clock da CPU = 1 */
PLLCON=1;	/* Habilita o PLL	*/
PLLFEED=0xAA;PLLFEED=0x55;
k=80000;	/* No maximo 80000 voltas esperando o PLL lock */
while((!(PLLSTAT & (1<<26))) && k) k--;	/* espera PLL Lock */
/* Se conseguiu PLL Lock, conecta CPU clock ao PLL */
CCLKCFG=cpudiv-1;	/* Divisor por cpudiv na CPU */
if(k)	{
	cpuclock= pllmulti*CRYSTALFREQ/cpudiv;
	PLLCON=3;	/* Conecta o PLL ao clock da CPU */
	}
else	cpuclock=CRYSTALFREQ/cpudiv;
PLLFEED=0xAA;PLLFEED=0x55;
return cpuclock;
}

/* Configuracao da Porta Serial 0 (Parecido com o 16550) */
void U0init(int baudrate)
{
int cpudiv;
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) */
cpudiv = (cpuclock/baudrate + 8) >> 4;
U0DLL   = cpudiv & 0xff;
U0DLM   = (cpudiv >> 8) & 0xff;
U0LCR    = 3;		/* Desabilita DLAB */
}

