mirror of https://github.com/wolfSSL/wolfBoot.git
114 lines
4.7 KiB
C
114 lines
4.7 KiB
C
/* 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
|
|
*/
|
|
|
|
#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;
|
|
}
|
|
|