/* uart_drv_lpc.c * * Driver for the back-end of the UART_FLASH module. * * Example implementation for LPC54xxx, using UART0. * * Copyright (C) 2021 wolfSSL Inc. * * This file is part of wolfBoot. * * wolfBoot is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * wolfBoot is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ #if defined(UART_FLASH) && defined(TARGET_lpc) #include "fsl_common.h" #include "fsl_iocon.h" #include "fsl_usart.h" #include "target.h" #include "wolfboot/wolfboot.h" #include "hal.h" #define IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */ #define IOCON_PIO_FUNC1 0x01u /*!<@brief Selects pin function 1 */ #define IOCON_PIO_INPFILT_OFF 0x0200u /*!<@brief Input filter disabled */ #define IOCON_PIO_INV_DI 0x00u /*!<@brief Input function is not inverted */ #define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */ #define IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */ #define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */ static void uart_pin_init(void) { /* Enables the clock for the IOCON block. 0 = Disable; 1 = Enable.: 0x01u */ CLOCK_EnableClock(kCLOCK_Iocon); const uint32_t port0_pin29_config = (/* Pin is configured as FC0_RXD_SDA_MOSI */ IOCON_PIO_FUNC1 | /* No addition pin function */ IOCON_PIO_MODE_INACT | /* Input function is not inverted */ IOCON_PIO_INV_DI | /* Enables digital function */ IOCON_PIO_DIGITAL_EN | /* Input filter disabled */ IOCON_PIO_INPFILT_OFF | /* Standard mode, output slew rate control is enabled */ IOCON_PIO_SLEW_STANDARD | /* Open drain is disabled */ IOCON_PIO_OPENDRAIN_DI); /* PORT0 PIN29 (coords: B13) is configured as FC0_RXD_SDA_MOSI */ IOCON_PinMuxSet(IOCON, 0U, 29U, port0_pin29_config); const uint32_t port0_pin30_config = (/* Pin is configured as FC0_TXD_SCL_MISO */ IOCON_PIO_FUNC1 | /* No addition pin function */ IOCON_PIO_MODE_INACT | /* Input function is not inverted */ IOCON_PIO_INV_DI | /* Enables digital function */ IOCON_PIO_DIGITAL_EN | /* Input filter disabled */ IOCON_PIO_INPFILT_OFF | /* Standard mode, output slew rate control is enabled */ IOCON_PIO_SLEW_STANDARD | /* Open drain is disabled */ IOCON_PIO_OPENDRAIN_DI); /* PORT0 PIN30 (coords: A2) is configured as FC0_TXD_SCL_MISO */ IOCON_PinMuxSet(IOCON, 0U, 30U, port0_pin30_config); } int uart_tx(const uint8_t c) { while((USART_GetStatusFlags(USART0) & kUSART_TxFifoEmptyFlag) == 0) ; USART_WriteByte(USART0, c); return 1; } int uart_rx(uint8_t *c) { if ((USART_GetStatusFlags(USART0) & kUSART_RxFifoNotEmptyFlag) != 0) { *c = USART_ReadByte(USART0); return 1; } return 0; } int uart_init(uint32_t bitrate, uint8_t data, char parity, uint8_t stop) { uint8_t ch; usart_config_t config; uart_pin_init(); USART_GetDefaultConfig(&config); config.baudRate_Bps = bitrate; config.enableTx = true; config.enableRx = true; CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0); USART_Init(USART0, &config, CLOCK_GetFlexCommClkFreq(0)); uart_send_current_version(); return 0; } #endif /* UART_FLASH && TARGET_lpc */