chen
2024-11-08 cc432b761c884a0bd8e9d83db0a4e26109fc08b1
keil/include/components/wsf/sources/platform/pal_uart.c
对比新文件
@@ -0,0 +1,211 @@
/*************************************************************************************************/
/*!
 *  \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);
}