From f7f7d63d8a83ec5a2313e21143ff73c247c389a5 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Tue, 11 Jun 2013 07:03:35 +0200 Subject: Current (broken) state of SPI/WM8723 code. --- firmware/drivers/uart.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 firmware/drivers/uart.c (limited to 'firmware/drivers/uart.c') diff --git a/firmware/drivers/uart.c b/firmware/drivers/uart.c new file mode 100644 index 0000000..28a6e00 --- /dev/null +++ b/firmware/drivers/uart.c @@ -0,0 +1,169 @@ +/**************************************************************************** + * $Id:: uart.c 5751 2010-11-30 23:56:11Z usb00423 $ + * Project: NXP LPC17xx UART example + * + * Description: + * This file contains UART code example which include UART initialization, + * UART interrupt handler, and APIs for UART access. + * + **************************************************************************** + * Software that is described herein is for illustrative purposes only + * which provides customers with programming information regarding the + * products. This software is supplied "AS IS" without any warranties. + * NXP Semiconductors assumes no responsibility or liability for the + * use of the software, conveys no license or title under any patent, + * copyright, or mask work right to the product. NXP Semiconductors + * reserves the right to make changes in the software without + * notification. NXP Semiconductors also make no representation or + * warranty that such application will be suitable for the specified + * use without further testing or modification. +****************************************************************************/ +#include +#include //"type.h" +#include "uart.h" + +#define TRUE 1 +#define FALSE 0 + +volatile uint32_t UART0Status, UART1Status; +volatile uint8_t UART0TxEmpty = 1, UART1TxEmpty = 1; + +/***************************************************************************** +** Function name: UARTInit +** +** Descriptions: Initialize UART port, setup pin select, +** clock, parity, stop bits, FIFO, etc. +** +** parameters: portNum(0 or 1) and UART baudrate +** Returned value: true or false, return false only if the +** interrupt handler can't be installed to the +** VIC table +** +*****************************************************************************/ +uint32_t UARTInit( uint32_t PortNum, uint32_t baudrate ) +{ + uint32_t Fdiv; + uint32_t pclkdiv, pclk; + + uint32_t SystemFrequency = SystemCoreClock; + + if ( PortNum == 0 ) + { + LPC_PINCON->PINSEL0 &= ~0x000000F0; + LPC_PINCON->PINSEL0 |= 0x00000050; /* RxD0 is P0.3 and TxD0 is P0.2 */ + /* By default, the PCLKSELx value is zero, thus, the PCLK for + all the peripherals is 1/4 of the SystemFrequency. */ + /* Bit 6~7 is for UART0 */ + pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03; + switch ( pclkdiv ) + { + case 0x00: + default: + pclk = SystemFrequency/4; + break; + case 0x01: + pclk = SystemFrequency; + break; + case 0x02: + pclk = SystemFrequency/2; + break; + case 0x03: + pclk = SystemFrequency/8; + break; + } + + LPC_UART0->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ + Fdiv = ( pclk / 16 ) / baudrate ; /*baud rate */ + LPC_UART0->DLM = Fdiv / 256; + LPC_UART0->DLL = Fdiv % 256; + LPC_UART0->LCR = 0x03; /* DLAB = 0 */ + LPC_UART0->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ + + // NVIC_EnableIRQ(UART0_IRQn); + + //LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */ + return (TRUE); + } + else if ( PortNum == 1 ) + { + LPC_PINCON->PINSEL4 &= ~0x0000000F; + LPC_PINCON->PINSEL4 |= 0x0000000A; /* Enable RxD1 P2.1, TxD1 P2.0 */ + + /* By default, the PCLKSELx value is zero, thus, the PCLK for + all the peripherals is 1/4 of the SystemFrequency. */ + /* Bit 8,9 are for UART1 */ + pclkdiv = (LPC_SC->PCLKSEL0 >> 8) & 0x03; + switch ( pclkdiv ) + { + case 0x00: + default: + pclk = SystemFrequency/4; + break; + case 0x01: + pclk = SystemFrequency; + break; + case 0x02: + pclk = SystemFrequency/2; + break; + case 0x03: + pclk = SystemFrequency/8; + break; + } + + LPC_UART1->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ + Fdiv = ( pclk / 16 ) / baudrate ; /*baud rate */ + LPC_UART1->DLM = Fdiv / 256; + LPC_UART1->DLL = Fdiv % 256; + LPC_UART1->LCR = 0x03; /* DLAB = 0 */ + LPC_UART1->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ + + // NVIC_EnableIRQ(UART1_IRQn); + + LPC_UART1->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART1 interrupt */ + return (TRUE); + } + return( FALSE ); +} + +/***************************************************************************** +** Function name: UARTSend +** +** Descriptions: Send a block of data to the UART 0 port based +** on the data length +** +** parameters: portNum, buffer pointer, and data length +** Returned value: None +** +*****************************************************************************/ +void UARTSend( uint32_t portNum, char *BufferPtr, uint32_t Length ) +{ + if ( portNum == 0 ) + { + while ( Length != 0 ) + { + /* THRE status, contain valid data */ + //while ( !(UART0TxEmpty & 0x01) ); + LPC_UART0->THR = *BufferPtr; + UART0TxEmpty = 0; /* not empty in the THR until it shifts out */ + BufferPtr++; + Length--; + } + } + else + { + while ( Length != 0 ) + { + /* THRE status, contain valid data */ + while ( !(UART1TxEmpty & 0x01) ); + LPC_UART1->THR = *BufferPtr; + UART1TxEmpty = 0; /* not empty in the THR until it shifts out */ + BufferPtr++; + Length--; + } + } + return; +} + +/****************************************************************************** +** End Of File +******************************************************************************/ -- cgit v1.2.3