/*************************************************************************************************/
|
/*!
|
* \file
|
*
|
* \brief UART driver definition.
|
*
|
* Copyright (c) 2019-2020 Packetcraft, Inc.
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
/*************************************************************************************************/
|
|
#include "pal_uart.h"
|
|
/**************************************************************************************************
|
Type definitions
|
**************************************************************************************************/
|
|
/*! \brief Control block. */
|
typedef struct
|
{
|
PalUartState_t state; /*!< UART state. */
|
PalUartConfig_t config; /*!< UART configuration. */
|
} palUartCtrlBlk_t;
|
|
/**************************************************************************************************
|
Local Variables
|
**************************************************************************************************/
|
|
#define PAL_UART_INVALID_INSTANCE_NUM 0xFF
|
|
#ifdef DEBUG
|
|
/*! \brief Parameter check. */
|
#define PAL_UART_PARAM_CHECK(p, expr) \
|
{ \
|
if (!(expr)) \
|
{ \
|
p->state = PAL_UART_STATE_ERROR; \
|
return; \
|
} \
|
}
|
|
#else
|
|
/*! \brief Parameter check (disabled). */
|
#define PAL_UART_PARAM_CHECK(p, expr)
|
|
#endif
|
|
/*! \brief Control block. */
|
static palUartCtrlBlk_t palUartCb[2];
|
|
/**************************************************************************************************
|
Local Functions
|
**************************************************************************************************/
|
|
/*************************************************************************************************/
|
/*!
|
* \brief Get UART instance number from UART ID.
|
*
|
* \param id UART ID.
|
*
|
* \return UART instance number.
|
*/
|
/*************************************************************************************************/
|
static palUartCtrlBlk_t *palUartGetContext(PalUartId_t id)
|
{
|
switch ((uint8_t)id)
|
{
|
case PAL_UART_ID_UCI:
|
case PAL_UART_ID_TERMINAL:
|
return &palUartCb[0];
|
|
case PAL_UART_ID_USER:
|
return &palUartCb[1];
|
|
default:
|
break;
|
}
|
|
return NULL;
|
}
|
|
/*************************************************************************************************/
|
/*!
|
* \brief UART event handler.
|
*
|
* \param pEvent UART event.
|
* \param pContext Instance context.
|
*/
|
/*************************************************************************************************/
|
|
/*************************************************************************************************/
|
/*!
|
* \brief Initialize UART.
|
*
|
* \param id UART ID.
|
* \param pCfg Peripheral configuration.
|
*/
|
/*************************************************************************************************/
|
void PalUartInit(PalUartId_t id, const PalUartConfig_t *pCfg)
|
{
|
palUartCtrlBlk_t *pCtx = palUartGetContext(id);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx != NULL);
|
PAL_UART_PARAM_CHECK(pCtx, pCfg != NULL);
|
|
pCtx->config = *pCfg;
|
|
/* Resolve instance. */
|
switch (pCtx - palUartCb)
|
{
|
case 0:
|
break;
|
default:
|
break;
|
}
|
|
pCtx->state = PAL_UART_STATE_READY;
|
}
|
|
/*************************************************************************************************/
|
/*!
|
* \brief De-Initialize UART.
|
*
|
* \param id UART ID.
|
*/
|
/*************************************************************************************************/
|
void PalUartDeInit(PalUartId_t id)
|
{
|
palUartCtrlBlk_t *pCtx = palUartGetContext(id);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx != NULL);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx->state == PAL_UART_STATE_READY);
|
|
pCtx->state = PAL_UART_STATE_UNINIT;
|
}
|
|
/*************************************************************************************************/
|
/*!
|
* \brief Get the current state.
|
*
|
* \param id UART id.
|
*
|
* \return Current state.
|
*/
|
/*************************************************************************************************/
|
PalUartState_t PalUartGetState(PalUartId_t id)
|
{
|
palUartCtrlBlk_t *pCtx = palUartGetContext(id);
|
|
if (pCtx == NULL)
|
{
|
return PAL_UART_STATE_ERROR;
|
}
|
|
return pCtx->state;
|
}
|
|
/*************************************************************************************************/
|
/*!
|
* \brief Read data from Rx FIFO.
|
*
|
* \param id UART ID.
|
* \param pData Read buffer.
|
* \param len Number of bytes to read.
|
*/
|
/*************************************************************************************************/
|
void PalUartReadData(PalUartId_t id, uint8_t *pData, uint16_t len)
|
{
|
palUartCtrlBlk_t *pCtx = palUartGetContext(id);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx != NULL);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx->state != PAL_UART_STATE_UNINIT);
|
PAL_UART_PARAM_CHECK(pCtx, pData != NULL);
|
PAL_UART_PARAM_CHECK(pCtx, len > 0);
|
|
pCtx->state = PAL_UART_STATE_BUSY;
|
|
PAL_UART_PARAM_CHECK(pCtx, err == NRFX_SUCCESS);
|
}
|
|
/*************************************************************************************************/
|
/*!
|
* \brief Write data to Tx FIFO.
|
*
|
* \param id UART ID.
|
* \param pData Write buffer.
|
* \param len Number of bytes to write.
|
*/
|
/*************************************************************************************************/
|
void PalUartWriteData(PalUartId_t id, const uint8_t *pData, uint16_t len)
|
{
|
palUartCtrlBlk_t *pCtx = palUartGetContext(id);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx != NULL);
|
PAL_UART_PARAM_CHECK(pCtx, pCtx->state != PAL_UART_STATE_UNINIT);
|
PAL_UART_PARAM_CHECK(pCtx, pData != NULL);
|
PAL_UART_PARAM_CHECK(pCtx, len > 0);
|
|
pCtx->state = PAL_UART_STATE_BUSY;
|
|
PAL_UART_PARAM_CHECK(pCtx, err == NRFX_SUCCESS);
|
}
|