PeripheralDriver_AutoChips_.../inc/uart_drv.h

383 lines
15 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright Statement:
*
* This software/firmware and related documentation ("AutoChips Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
* the prior written permission of AutoChips inc. and/or its licensors, any
* reproduction, modification, use or disclosure of AutoChips Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*
* AutoChips Inc. (C) 2021. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
*/
/*!
* @file uart_drv.h
*
* @brief This file provides uart integration functions interface.
*
*/
#ifndef UART_DRV_H
#define UART_DRV_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* =========================================== Includes =========================================== */
#include "device_register.h"
#include "osif.h"
/*=====================================SOURCE FILE VERSION INFORMATION==============================*/
#define UART_HAL_MODULE_ID (661U)
#define UART_HAL_SW_MAJOR_VERSION (1U)
#define UART_HAL_SW_MINOR_VERSION (1U)
#define UART_HAL_SW_PATCH_VERSION (1U)
/* ============================================ Define ============================================ */
/* =========================================== Typedef ============================================ */
/*!< Callback for UART module */
typedef void (*uart_callback_t)(void *driverState, uint32_t event, void *userData);
/*!
* @brief Define the enum of the events which can trigger UART callback.
*/
typedef enum
{
UART_EVENT_RX_FULL = 0x00U, /*!< Rx buffer is full */
UART_EVENT_TX_EMPTY = 0x01U, /*!< Tx buffer is empty */
UART_EVENT_END_TRANSFER = 0x02U, /*!< The current transfer is ending */
UART_EVENT_ERROR = 0x03U, /*!< An error occured during transfer */
UART_EVENT_DATA_MATCH = 0x04U, /*!< Rx data match */
UART_EVENT_IDLE_LINE = 0x05U, /*!< Idle line */
} uart_event_t;
/*!
* @brief no-blocking transfer type.
*/
typedef enum
{
UART_USING_DMA = 0U, /*!< Use DMA to perform UART transfer */
UART_USING_INTERRUPTS /*!< Use interrupts to perform UART transfer */
} uart_transfer_type_t;
/*!
* @brief UART number of bits in a character.
*/
typedef enum
{
UART_7_BITS_PER_CHAR = 0x0U, /*!< 7-bit data characters */
UART_8_BITS_PER_CHAR = 0x1U, /*!< 8-bit data characters */
UART_9_BITS_PER_CHAR = 0x2U /*!< 9-bit data characters */
} uart_bit_count_per_char_t;
/*!
* @brief UART parity mode.
*/
typedef enum
{
UART_PARITY_DISABLED = 0x0U, /*!< parity disabled */
UART_PARITY_EVEN = 0x1U, /*!< parity enabled, type even */
UART_PARITY_ODD = 0x2U /*!< parity enabled, type odd */
} uart_parity_mode_t;
/*!
* @brief UART number of stop bits.
*/
typedef enum
{
UART_ONE_STOP_BIT = 0x0U, /*!< one stop bit */
UART_TWO_STOP_BIT = 0x1U /*!< two stop bits */
} uart_stop_bit_count_t;
/*!
* @brief UART runtime state.
*/
typedef struct
{
const uint8_t *txBuff; /*!< The buffer of transmit data */
uint8_t *rxBuff; /*!< The buffer of received data */
volatile uint32_t txSize; /*!< The remaining number of bytes to be transmitted */
volatile uint32_t rxSize; /*!< The remaining number of bytes to be received */
volatile bool isTxBusy; /*!< True if transmit is active */
volatile bool isRxBusy; /*!< True if receive is active */
volatile bool isTxBlocking; /*!< True if transmit is blocking */
volatile bool isRxBlocking; /*!< True if receive is blocking */
uart_bit_count_per_char_t bitCountPerChar; /*!< number of bits(7/8/9 bits) in a char */
uart_callback_t rxCallback; /*!< Callback for data receive */
void *rxCallbackParam; /*!< Receive callback parameter pointer.*/
uart_callback_t txCallback; /*!< Callback for data send */
void *txCallbackParam; /*!< Transmit callback parameter pointer.*/
uart_transfer_type_t transferType; /*!< Type of UART transfer (interrupt or dma) */
uint8_t rxDMAChannel; /*!< DMA channel for UART receive. */
uint8_t txDMAChannel; /*!< DMA channel for UART transmit. */
semaphore_t rxComplete; /*!< Synchronization object for blocking Rx timeout condition */
semaphore_t txComplete; /*!< Synchronization object for blocking Tx timeout condition */
volatile status_t transmitStatus; /*!< Status of last transmit */
volatile status_t receiveStatus; /*!< Status of last receive */
uint8_t clockConfigType; /*!< Clock config type, use for DMA RX */
} uart_state_t;
/*!
* @brief UART configuration structure.
*/
typedef struct
{
uint32_t baudRate; /*!< UART baud rate */
uart_parity_mode_t parityMode; /*!< parity mode, disabled, even, odd */
uart_stop_bit_count_t stopBitCount; /*!< number of stop bits, 1 or 2 stop bits */
uart_bit_count_per_char_t bitCountPerChar; /*!< number of bits in a character (7, 8 or 9) */
uart_transfer_type_t transferType; /*!< Type of UART transfer (interrupt or dma) */
uint8_t rxDMAChannel; /*!< DMA rx channel for DMA transfer */
uint8_t txDMAChannel; /*!< DMA tx channel for DMA transfer */
uart_callback_t rxCallback; /*!< Callback for data receive */
void *rxCallbackParam; /*!< Receive callback parameter pointer.*/
uart_callback_t txCallback; /*!< Callback for data send */
void *txCallbackParam; /*!< Transmit callback parameter pointer.*/
} uart_user_config_t;
/* ========================================== Variables =========================================== */
/* ==================================== Functions declaration ===================================== */
/*!
* @brief Get UART module base address.
*
* @param[in] instance: UART module instance
* @return UART module base address
*/
UART_Type * UART_DRV_GetBase(uint32_t instance);
/*!
* @brief Initializes the UART configuration structure with default values.
*
* @param[out] uartUserConfig: Initializes a configuration structure received from the application
* with default values
* @return none
*/
void UART_DRV_GetDefaultConfig(uart_user_config_t *uartUserConfig);
/*!
* @brief Initializes an UART operation instance.
*
* @param[in] instance: UART instance number
* @param[in] uartUserConfig: user configuration structure of type uart_user_config_t
* @param[in] uartStatePtr: pointer to the UART driver state structure
* @return STATUS_SUCCESS if successful;
* STATUS_ERROR if an error occurred
*/
status_t UART_DRV_Init(uint32_t instance, uart_state_t *uartStatePtr, const uart_user_config_t *uartUserConfig);
/*!
* @brief Shuts down the UART by disabling interrupts and transmitter/receiver.
*
* @param[in] instance: UART instance number
* @return STATUS_SUCCESS if successful;
* STATUS_ERROR if an error occurred
*/
status_t UART_DRV_Deinit(uint32_t instance);
/*!
* @brief Installs callback function for the UART receive.
* After a callback is installed, it bypasses part of the UART IRQHandler logic.
* Therefore, the callback needs to handle the indexes of txBuff and txSize.
*
* @param[in] instance: The UART instance number.
* @param[in] function: The UART receive callback function.
* @param[in] rxBuff: The receive buffer used inside IRQHandler.
* This buffer must be kept as long as the callback is alive.
* @param[in] callbackParam: The UART receive callback parameter pointer.
* @return Former UART receive callback function pointer.
*/
uart_callback_t UART_DRV_InstallRxCallback(uint32_t instance, uart_callback_t function, void *callbackParam);
/*!
* @brief Installs callback function for the UART transmit.
* After a callback is installed, it bypasses part of the UART IRQHandler logic.
* Therefore, the callback needs to handle the indexes of txBuff and txSize.
*
* @param[in] instance: The UART instance number
* @param[in] function: The UART transmit callback function
* @param[in] txBuff: The transmit buffer used inside IRQHandler.
* This buffer must be kept as long as the callback is alive
* @param[in] callbackParam: The UART transmit callback parameter pointer
* @return Former UART transmit callback function pointer.
*/
uart_callback_t UART_DRV_InstallTxCallback(uint32_t instance, uart_callback_t function, void *callbackParam);
/*!
* @brief Sends data out through the UART module using a blocking method.
* Blocking means that the function does not return until the transmission is complete.
*
* @param[in] instance: UART instance number
* @param[in] txBuff: source buffer containing 8-bit data chars to send
* @param[in] txSize: the number of bytes to send
* @param[in] timeout: timeout value in milliseconds
* @return STATUS_SUCCESS if successful;
* STATUS_TIMEOUT if the timeout was reached;
* STATUS_BUSY if the resource is busy;
* STATUS_ERROR if an error occurred
*/
status_t UART_DRV_SendDataBlocking(uint32_t instance, const uint8_t *txBuff, uint32_t txSize, uint32_t timeout);
/*!
* @brief UART send data using polling mode
*
* @param[in] instance: UART instance
* @param[in] txBuff: The tx data buffer pointer
* @param[in] txSize: The tx data buffer bytes size
* @return STATUS_BUSY or STATUS_SUCCESS
*/
status_t UART_DRV_SendDataPolling(uint32_t instance, const uint8_t *txBuff, uint32_t txSize);
/*!
* @brief UART send data using non-blocking method (interrupt or DMA)
*
* @param[in] instance: UART instance
* @param[in] txBuff: The tx data buffer pointer
* @param[in] txSize: The tx data buffer bytes size
* @return STATUS_BUSY or STATUS_SUCCESS
*/
status_t UART_DRV_SendData(uint32_t instance, const uint8_t *txBuff, uint32_t txSize);
/*!
* @brief Get transmit status
*
* @param[in] instance: UART instance
* @param[out] bytesRemaining: Remaining bytes to be sent
* @return Transmit status
*/
status_t UART_DRV_GetTransmitStatus(uint32_t instance, uint32_t *bytesRemaining);
/*!
* @brief Terminates an non-blocking UART transmission early.
*
* @param[in] instance: UART instance
* @return STATUS_SUCCESS
*/
status_t UART_DRV_AbortSendingData(uint32_t instance);
/*!
* @brief UART receive data using blocking method, which will not return until
* the receive is complete.
*
* @param[in] instance: UART instance
* @param[out] rxBuff: The rx data buffer pointer
* @param[in] rxSize: The rx data buffer bytes size
* @param[in] timeoutConfigurate timeout
* @return The receive status
*/
status_t UART_DRV_ReceiveDataBlocking(uint32_t instance, uint8_t *rxBuff, uint32_t rxSize, uint32_t timeout);
/*!
* @brief UART receive data using polling mode.
*
* @param[in] instance: UART instance
* @param[out] rxBuff: The rx data buffer pointer
* @param[in] rxSize: The rx data buffer bytes size
* @return Receive status
*/
status_t UART_DRV_ReceiveDataPolling(uint32_t instance, uint8_t *rxBuff, uint32_t rxSize);
/*!
* @brief UART receive data using non-blocking method(interrupt or DMA).
*
* @param[in] instance: UART instance
* @param[out] rxBuff: The rx data buffer pointer
* @param[in] rxSize: The rx data buffer bytes size
* @return STATUS_BUSY or STATUS_SUCCESS
*/
status_t UART_DRV_ReceiveData(uint32_t instance, uint8_t *rxBuff, uint32_t rxSize);
/*!
* @brief Get receive status.
*
* @param[in] instance: UART instance
* @param[out] bytesRemaining: Remaining bytes to receive
* @return Receive status
*/
status_t UART_DRV_GetReceiveStatus(uint32_t instance, uint32_t *bytesRemaining);
/*!
* @brief Terminates a non-blocking receive early.
*
* @param[in] instance: UART instance
* @return STATUS_SUCCESS
*/
status_t UART_DRV_AbortReceivingData(uint32_t instance);
/*!
* @brief Set UART baud rate.
*
* @param[in] instance: UART instance
* @param[in] desiredBaudRate: UART state pointer
* @return STATUS_BUSY, STATUS_ERROR or STATUS_SUCCESS
*/
status_t UART_DRV_SetBaudRate(uint32_t instance, uint32_t desiredBaudRate);
/*!
* @brief Get UART baud rate.
*
* @param[in] instance: UART instance
* @param[out] configuredBaudRate: Return the UART configured baud rate
* @return none
*/
void UART_DRV_GetBaudRate(uint32_t instance, uint32_t *configuredBaudRate);
/*!
* @brief Set the driver internal tx buffer.
*
* @param[in] instance: UART instance
* @param[in] txBuff: The tx data buffer pointer
* @param[in] txSize: The tx data buffer bytes size
* @return STATUS_SUCCESS
*/
status_t UART_DRV_SetTxBuffer(uint32_t instance, const uint8_t *txBuff, uint32_t txSize);
/*!
* @brief Set the driver internal rx buffer.
*
* @param[in] instance: UART instance
* @param[in] txBuff: The rx data buffer pointer
* @param[in] txSize: The rx data buffer bytes size
* @return STATUS_SUCCESS
*/
status_t UART_DRV_SetRxBuffer(uint32_t instance, uint8_t *rxBuff, uint32_t rxSize);
/*!
* @brief Get module version information.
*
* @param[out] versionInfo: Module version information address.
* @return void
*/
void UART_DRV_GetVersionInfo(Drv_VersionInfo_Type *versionInfo);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
#endif /* UART_DRV_H */
/* ============================================= EOF ============================================== */