对比新文件 |
| | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \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); |
| | | } |