/*************************************************************************************************/ /*! * \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); }