Skip to content

Commit 1e4e5ce

Browse files
author
oclyke
committed
add am_hal_uart_configure_fifo function
addresses #25
1 parent de5c6ba commit 1e4e5ce

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

mcu/apollo3/hal/am_hal_uart.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,96 @@ am_hal_uart_configure(void *pHandle, const am_hal_uart_config_t *psConfig)
445445
return AM_HAL_STATUS_SUCCESS;
446446
} // am_hal_uart_configure()
447447

448+
uint32_t
449+
am_hal_uart_configure_fifo(void *pHandle, const am_hal_uart_config_t *psConfig, bool bEnableFIFO)
450+
{
451+
am_hal_uart_state_t *pState = (am_hal_uart_state_t *) pHandle;
452+
uint32_t ui32Module = pState->ui32Module;
453+
454+
uint32_t ui32ErrorStatus;
455+
456+
//
457+
// Check to make sure this is a valid handle.
458+
//
459+
if (!AM_HAL_UART_CHK_HANDLE(pHandle))
460+
{
461+
return AM_HAL_STATUS_INVALID_HANDLE;
462+
}
463+
464+
//
465+
// Reset the CR register to a known value.
466+
//
467+
UARTn(ui32Module)->CR = 0;
468+
469+
//
470+
// Start by enabling the clocks, which needs to happen in a critical
471+
// section.
472+
//
473+
AM_CRITICAL_BEGIN
474+
475+
UARTn(ui32Module)->CR_b.CLKEN = 1;
476+
UARTn(ui32Module)->CR_b.CLKSEL = UART0_CR_CLKSEL_24MHZ;
477+
478+
AM_CRITICAL_END
479+
480+
//
481+
// Disable the UART.
482+
//
483+
AM_CRITICAL_BEGIN
484+
485+
UARTn(ui32Module)->CR_b.UARTEN = 0;
486+
UARTn(ui32Module)->CR_b.RXE = 0;
487+
UARTn(ui32Module)->CR_b.TXE = 0;
488+
489+
AM_CRITICAL_END
490+
491+
//
492+
// Set the baud rate.
493+
//
494+
ui32ErrorStatus = config_baudrate(ui32Module, psConfig->ui32BaudRate,
495+
&(pState->ui32BaudRate));
496+
497+
RETURN_ON_ERROR(ui32ErrorStatus);
498+
499+
//
500+
// Copy the configuration options into the appropriate registers.
501+
//
502+
UARTn(ui32Module)->CR_b.RTSEN = 0;
503+
UARTn(ui32Module)->CR_b.CTSEN = 0;
504+
UARTn(ui32Module)->CR |= psConfig->ui32FlowControl;
505+
506+
UARTn(ui32Module)->IFLS = psConfig->ui32FifoLevels;
507+
508+
UARTn(ui32Module)->LCRH = (psConfig->ui32DataBits |
509+
psConfig->ui32Parity |
510+
psConfig->ui32StopBits |
511+
((bEnableFIFO) ? AM_HAL_UART_FIFO_ENABLE : AM_HAL_UART_FIFO_DISABLE));
512+
513+
//
514+
// Enable the UART, RX, and TX.
515+
//
516+
AM_CRITICAL_BEGIN
517+
518+
UARTn(ui32Module)->CR_b.UARTEN = 1;
519+
UARTn(ui32Module)->CR_b.RXE = 1;
520+
UARTn(ui32Module)->CR_b.TXE = 1;
521+
522+
AM_CRITICAL_END
523+
524+
if(bEnableFIFO){
525+
//
526+
// Set up any buffers that might exist.
527+
//
528+
buffer_configure(pHandle,
529+
psConfig->pui8TxBuffer,
530+
psConfig->ui32TxBufferSize,
531+
psConfig->pui8RxBuffer,
532+
psConfig->ui32RxBufferSize);
533+
}
534+
535+
return AM_HAL_STATUS_SUCCESS;
536+
} // am_hal_uart_configure_fifo()
537+
448538
//*****************************************************************************
449539
//
450540
// Allows the UART HAL to use extra space to store TX and RX data.

mcu/apollo3/hal/am_hal_uart.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ extern uint32_t am_hal_uart_power_control(void *pHandle,
312312
extern uint32_t am_hal_uart_configure(void *pHandle,
313313
const am_hal_uart_config_t *psConfig);
314314

315+
extern uint32_t am_hal_uart_configure_fifo(void *pHandle,
316+
const am_hal_uart_config_t *psConfig,
317+
bool bEnableFIFO);
318+
315319
//*****************************************************************************
316320
//
317321
//! @brief Transfer data through the UART interface.

0 commit comments

Comments
 (0)