/* * @brief LPCXPresso LPC1549 board file * * @note * Copyright(C) NXP Semiconductors, 2014 * All rights reserved. * * @par * Software that is described herein is for illustrative purposes only * which provides customers with programming information regarding the * LPC products. This software is supplied "AS IS" without any warranties of * any kind, and NXP Semiconductors and its licensor disclaim any and * all warranties, express or implied, including all implied warranties of * merchantability, fitness for a particular purpose and non-infringement of * intellectual property rights. NXP Semiconductors assumes no responsibility * or liability for the use of the software, conveys no license or rights under any * patent, copyright, mask work right, or any other intellectual property rights in * or to any products. NXP Semiconductors reserves the right to make changes * in the software without notification. NXP Semiconductors also makes no * representation or warranty that such application will be suitable for the * specified use without further testing or modification. * * @par * Permission to use, copy, modify, and distribute this software and its * documentation is hereby granted, under NXP Semiconductors' and its * licensor's relevant copyrights in the software, without fee, provided that it * is used in conjunction with NXP Semiconductors microcontrollers. This * copyright, permission, and disclaimer notice must appear in all copies of * this code. */ #include "board.h" #include "retarget.h" /***************************************************************************** * Private types/enumerations/variables ****************************************************************************/ /***************************************************************************** * Public types/enumerations/variables ****************************************************************************/ /* System oscillator rate and RTC oscillator rate */ const uint32_t OscRateIn = 12000000; const uint32_t RTCOscRateIn = 32768; /***************************************************************************** * Private functions ****************************************************************************/ /***************************************************************************** * Public functions ****************************************************************************/ /* Sends a character on the UART */ void Board_UARTPutChar(char ch) { #if defined(DEBUG_UART) Chip_UART_SendBlocking(DEBUG_UART, &ch, 1); #endif } /* Gets a character from the UART, returns EOF if no character is ready */ int Board_UARTGetChar(void) { #if defined(DEBUG_UART) uint8_t data; if (Chip_UART_Read(DEBUG_UART, &data, 1) == 1) { return (int) data; } #endif return EOF; } /* Outputs a string on the debug UART */ void Board_UARTPutSTR(const char *str) { #if defined(DEBUG_UART) while (*str != '\0') { Board_UARTPutChar(*str++); } #endif } /* Initialize debug output via UART for board */ void Board_Debug_Init(void) { #if defined(DEBUG_UART) /* Disables pullups/pulldowns and enable digitial mode */ Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 13, (IOCON_MODE_INACT | IOCON_DIGMODE_EN)); Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 18, (IOCON_MODE_INACT | IOCON_DIGMODE_EN)); /* UART signal muxing via SWM */ Chip_SWM_MovablePortPinAssign(SWM_UART0_RXD_I, 0, 13); Chip_SWM_MovablePortPinAssign(SWM_UART0_TXD_O, 0, 18); /* Use main clock rate as base for UART baud rate divider */ Chip_Clock_SetUARTBaseClockRate(Chip_Clock_GetMainClockRate(), false); /* Setup UART */ Chip_UART_Init(DEBUG_UART); Chip_UART_ConfigData(DEBUG_UART, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1); Chip_UART_SetBaud(DEBUG_UART, 115200); Chip_UART_Enable(DEBUG_UART); Chip_UART_TXEnable(DEBUG_UART); #endif } #define MAXLEDS 3 static const uint8_t ledpins[MAXLEDS] = {25, 3, 1}; static const uint8_t ledports[MAXLEDS] = {0, 0, 1}; /* Initializes board LED(s) */ static void Board_LED_Init(void) { int idx; for (idx = 0; idx < MAXLEDS; idx++) { /* Set the GPIO as output with initial state off (high) */ Chip_GPIO_SetPinDIROutput(LPC_GPIO, ledports[idx], ledpins[idx]); Chip_GPIO_SetPinState(LPC_GPIO, ledports[idx], ledpins[idx], true); } } /* Sets the state of a board LED to on or off */ void Board_LED_Set(uint8_t LEDNumber, bool On) { if (LEDNumber < MAXLEDS) { /* Toggle state, low is on, high is off */ Chip_GPIO_SetPinState(LPC_GPIO, ledports[LEDNumber], ledpins[LEDNumber], !On); } } /* Returns the current state of a board LED */ bool Board_LED_Test(uint8_t LEDNumber) { bool state = false; if (LEDNumber < MAXLEDS) { state = !Chip_GPIO_GetPinState(LPC_GPIO, ledports[LEDNumber], ledpins[LEDNumber]); } return state; } /* Toggles the current state of a board LED */ void Board_LED_Toggle(uint8_t LEDNumber) { Chip_GPIO_SetPinToggle(LPC_GPIO, ledports[LEDNumber], ledpins[LEDNumber]); } /* Set up and initialize all required blocks and functions related to the board hardware */ void Board_Init(void) { /* Sets up DEBUG UART */ DEBUGINIT(); /* Initialize GPIO */ Chip_GPIO_Init(LPC_GPIO); /* Initialize LEDs */ Board_LED_Init(); } /* Ordered up, down, left, right, press */ #define NUM_BUTTONS 5 static const uint8_t portButton[NUM_BUTTONS] = {1, 1, 1, 1, 1}; static const uint8_t pinButton[NUM_BUTTONS] = {4, 6, 8, 7, 5}; static const uint8_t stateButton[NUM_BUTTONS] = {JOY_UP, JOY_DOWN, JOY_LEFT, JOY_RIGHT, JOY_PRESS}; /* Initialize Joystick */ void Board_Joystick_Init(void) { int i; /* IOCON states already selected in SystemInit(), GPIO setup only. Pullups are external, so IOCON with no states */ for (i = 0; i < NUM_BUTTONS; i++) { Chip_GPIO_SetPinDIRInput(LPC_GPIO, portButton[i], pinButton[i]); } } /* Get Joystick status */ uint8_t Joystick_GetStatus(void) { uint8_t i, ret = 0; for (i = 0; i < NUM_BUTTONS; i++) { if ((Chip_GPIO_GetPinState(LPC_GPIO, portButton[i], pinButton[i])) == 0x00) { ret |= stateButton[i]; } } return ret; }