/*----------------------------------------------------------------------------
@ File Name         : seriell.c
@ Object            : Grundfunktionen der seriellen Schnittstelle 
@	int init_ser(); char putch(char); char getch(); int puts(char *)
@
@ Autor 			: M.Pester
@ Datum				: 04.12.2007
@ letzte Aenderung		: 30.03.2021
@ 
@----------------------------------------------------------------------------*/

#include "seriell.h"

#define 	DEFAULT_BAUD 38400
#define 	CLOCK_SPEED 25000000
//CD = (CLOCK_SPEED / (16*(DEFAULT_BAUD))	// 25MHz / ( 16 * 38400) = 40.69  -> 41 -> 0x29
#define 	CD 0x29

// Initialisiert die serielle Schnittstelle USART0
int init_ser() 
{
	StructPIO* piobaseA = PIOA_BASE;	
	StructPMC* pmcbase  = PMC_BASE;	
	StructUSART* usartbase0 = USART0;	
	
	pmcbase->PMC_PCER = 0x4;	// Clock f�r US0 einschalten
	piobaseA->PIO_PDR = 0x18000;	// US0 TxD und RxD 
	usartbase0->US_CR = 0xa0;	// TxD und RxD disable
	usartbase0->US_BRGR = CD;	// Baud Rate Generator Register 
	usartbase0->US_MR = 0x8c0;	// Keine Parit�t, 8 Bit, MCKI
	usartbase0->US_CR = 0x50;	// TxD und RxD enable

	return 0;
}

// Gibt wenn m�glich ein Zeichen auf die serielle Schnittstelle aus
// und liefert das Zeichen wieder zur�ck
// wenn eine Ausgabe nicht m�glich war wird eine 0 zur�ck geliefert

char putch(char Zeichen) 
{
	StructUSART* usartbase0 = USART0;	

	if( usartbase0->US_CSR & US_TXRDY )
	{
		usartbase0->US_THR = Zeichen;
	}
	else
	{
		Zeichen = 0;	// wenn keine Ausgabe
	}
	return Zeichen;
}

// Gibt entweder ein empfangenes Zeichen oder eine 0 zur�ck
char getch(void) 
{
	StructUSART* usartbase0 = USART0;	
	char Zeichen;

	if( usartbase0->US_CSR & US_RXRDY )
	{
		Zeichen = usartbase0->US_RHR;
	}
	else 
	{
		Zeichen = 0;
	}

	return Zeichen;
}

// Gibt einen String ueber putch(char) aus 
// und ergaenzt 0xa (LF) durch 0xa und 0xd (CR)
// liefert die Anzahl der ausgebenen Zeichen
int puts(char *String)
{
	int	i = 0;

	while( String[i] != 0)
	{
		while(!(putch(String[i])));
		i = i + 1;

		if( String[i-1] == 0xa)
		{
			while(!(putch(0xd)));
			i = i + 1;
		}
	}
	return i;
}