123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- /*
- * ===========================================================================================
- *
- * Filename: hal_uart.h
- *
- * Description: UART HAL definition.
- *
- * Version: Melis3.0
- * Create: 2019-11-14 11:11:56
- * Revision: none
- * Compiler: GCC:version 9.2.1 20170904 (release),SUNXI_HAL/embedded-7-branch revision 255204
- *
- * Author: bantao@allwinnertech.com
- * Organization: SWC-BPD
- * Last Modified: 2020-04-02 19:39:41
- *
- * ===========================================================================================
- */
- #ifndef SUNXI_HAL_UART_H
- #define SUNXI_HAL_UART_H
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- #include "sunxi_hal_common.h"
- /*
- * include the platform uart header file.
- */
- #include <platform-uart.h>
- /*
- * This enum defines return status of the UART HAL public API.
- * User should check return value after calling these APIs.
- */
- typedef enum
- {
- HAL_UART_STATUS_ERROR_PARAMETER = -4, /**< Invalid user input parameter. */
- HAL_UART_STATUS_ERROR_BUSY = -3, /**< UART port is currently in use. */
- HAL_UART_STATUS_ERROR_UNINITIALIZED = -2, /**< UART port has not been initialized. */
- HAL_UART_STATUS_ERROR = -1, /**< UART driver detected a common error. */
- HAL_UART_STATUS_OK = 0 /**< UART function executed successfully. */
- } hal_uart_status_t;
- typedef enum
- {
- UART_0 = 0,
- UART_1,
- UART_2,
- UART_3,
- UART_MAX,
- } uart_port_t;
- #define CLI_UART_PORT (UART_0)
- /* This enum defines baud rate of the UART frame. */
- typedef enum
- {
- UART_BAUDRATE_300 = 0,
- UART_BAUDRATE_600,
- UART_BAUDRATE_1200,
- UART_BAUDRATE_2400,
- UART_BAUDRATE_4800,
- UART_BAUDRATE_9600,
- UART_BAUDRATE_19200,
- UART_BAUDRATE_38400,
- UART_BAUDRATE_57600,
- UART_BAUDRATE_115200,
- UART_BAUDRATE_230400,
- UART_BAUDRATE_576000,
- UART_BAUDRATE_921600,
- UART_BAUDRATE_500000,
- UART_BAUDRATE_1000000,
- UART_BAUDRATE_1500000,
- UART_BAUDRATE_3000000,
- UART_BAUDRATE_4000000,
- UART_BAUDRATE_MAX,
- } uart_baudrate_t;
- /* This enum defines word length of the UART frame. */
- typedef enum
- {
- UART_WORD_LENGTH_5 = 0,
- UART_WORD_LENGTH_6,
- UART_WORD_LENGTH_7,
- UART_WORD_LENGTH_8,
- } uart_word_length_t;
- /* This enum defines stop bit of the UART frame. */
- typedef enum
- {
- UART_STOP_BIT_1 = 0,
- UART_STOP_BIT_2,
- } uart_stop_bit_t;
- /* This enum defines parity of the UART frame. */
- typedef enum
- {
- UART_PARITY_NONE = 0,
- UART_PARITY_ODD,
- UART_PARITY_EVEN
- } uart_parity_t;
- /* This struct defines UART configure parameters. */
- typedef struct
- {
- uart_baudrate_t baudrate;
- uart_word_length_t word_length;
- uart_stop_bit_t stop_bit;
- uart_parity_t parity;
- } _uart_config_t;
- /* UART HAL Layer API Version */
- #define SUNXI_HAL_UART_API_VERSION SUNXI_HAL_VERSION_MAJOR_MINOR(1, 0)
- /* Driver version */
- #define SUNXI_HAL_UART_DRV_VERSION SUNXI_HAL_VERSION_MAJOR_MINOR(1, 0)
- //======================================reg==========================================================//
- #define UART_INVAL_DATA_IND (0xffffffff)
- #undef BIT
- #define BIT(nr) (1UL << (nr))
- //=================================reg===================================================//
- /*
- * brief UART Status
- */
- typedef struct sunxi_hal_uart_status
- {
- uint32_t tx_busy : 1; ///< Transmitter busy flag
- uint32_t rx_busy : 1; ///< Receiver busy flag
- uint32_t tx_underflow : 1; ///< Transmit data underflow detected (cleared on start of next send operation)
- uint32_t rx_overflow : 1; ///< Receive data overflow detected (cleared on start of next receive operation)
- uint32_t rx_break : 1; ///< Break detected on receive (cleared on start of next receive operation)
- uint32_t rx_framing_error : 1; ///< Framing error detected on receive (cleared on start of next receive operation)
- uint32_t rx_parity_error : 1; ///< Parity error detected on receive (cleared on start of next receive operation)
- uint32_t reserved : 25;
- } sunxi_hal_uart_status_t;
- /*
- *brief UART Modem Control
- */
- typedef enum sunxi_hal_uart_modem_control
- {
- SUNXI_HAL_UART_RTS_CLEAR, ///< Deactivate RTS
- SUNXI_HAL_UART_RTS_SET, ///< Activate RTS
- SUNXI_HAL_UART_DTR_CLEAR, ///< Deactivate DTR
- SUNXI_HAL_UART_DTR_SET ///< Activate DTR
- } sunxi_hal_uart_modem_control_e;
- /*
- *brief UART Modem Status
- */
- typedef struct sunxi_hal_uart_modem_status
- {
- uint32_t cts : 1; ///< CTS state: 1=Active, 0=Inactive
- uint32_t dsr : 1; ///< DSR state: 1=Active, 0=Inactive
- uint32_t dcd : 1; ///< DCD state: 1=Active, 0=Inactive
- uint32_t ri : 1; ///< RI state: 1=Active, 0=Inactive
- uint32_t reserved : 28;
- } sunxi_hal_uart_modem_status_t;
- /****** UART Event *****/
- #define SUNXI_HAL_UART_EVENT_SEND_COMPLETE (1UL << 0) ///< Send completed; however UART may still transmit data
- #define SUNXI_HAL_UART_EVENT_RECEIVE_COMPLETE (1UL << 1) ///< Receive completed
- #define SUNXI_HAL_UART_EVENT_TRANSFER_COMPLETE (1UL << 2) ///< Transfer completed
- #define SUNXI_HAL_UART_EVENT_TX_COMPLETE (1UL << 3) ///< Transmit completed (optional)
- #define SUNXI_HAL_UART_EVENT_TX_UNDERFLOW (1UL << 4) ///< Transmit data not available (Synchronous Slave)
- #define SUNXI_HAL_UART_EVENT_RX_OVERFLOW (1UL << 5) ///< Receive data overflow
- #define SUNXI_HAL_UART_EVENT_RX_TIMEOUT (1UL << 6) ///< Receive character timeout (optional)
- #define SUNXI_HAL_UART_EVENT_RX_BREAK (1UL << 7) ///< Break detected on receive
- #define SUNXI_HAL_UART_EVENT_RX_FRAMING_ERROR (1UL << 8) ///< Framing error detected on receive
- #define SUNXI_HAL_UART_EVENT_RX_PARITY_ERROR (1UL << 9) ///< Parity error detected on receive
- #define SUNXI_HAL_UART_EVENT_CTS (1UL << 10) ///< CTS state changed (optional)
- #define SUNXI_HAL_UART_EVENT_DSR (1UL << 11) ///< DSR state changed (optional)
- #define SUNXI_HAL_UART_EVENT_DCD (1UL << 12) ///< DCD state changed (optional)
- #define SUNXI_HAL_UART_EVENT_RI (1UL << 13) ///< RI state changed (optional)
- /* This enum defines the UART event when an interrupt occurs. */
- typedef enum
- {
- UART_EVENT_TRANSACTION_ERROR = -1,
- UART_EVENT_RX_BUFFER_ERROR = -2,
- UART_EVENT_TX_COMPLETE = 1,
- UART_EVENT_RX_COMPLETE = 2,
- } uart_callback_event_t;
- /** @brief This typedef defines user's callback function prototype.
- * This callback function will be called in UART interrupt handler when UART interrupt is raised.
- * User should call uart_register_callback() to register callbacks to UART driver explicitly.
- * Note, that the callback function is not appropriate for time-consuming operations. \n
- * parameter "event" : for more information, please refer to description of #uart_callback_event_t.
- * parameter "user_data" : a user defined data used in the callback function.
- */
- typedef void (*uart_callback_t)(uart_callback_event_t event, void *user_data);
- typedef struct
- {
- uint8_t *buf;
- uint32_t len;
- uint32_t head;
- uint32_t tail;
- int32_t cnt;
- } uart_ring_buf_t;
- /* This struct defines UART private data */
- typedef struct
- {
- /* basic info */
- uart_port_t uart_port;
- uint32_t irqn;
- /* uart register value */
- unsigned char ier;
- unsigned char lcr;
- unsigned char mcr;
- unsigned char fcr;
- unsigned char dll;
- unsigned char dlh;
- /* tx & rx buf */
- const char *tx_buf;
- uint32_t tx_buf_size;
- /* rx ring buf */
- uart_ring_buf_t ring_buf;
- /* user callback */
- uart_callback_t func;
- void *arg;
- } uart_priv_t;
- /**
- \fn sunxi_hal_version_t SUNXI_HAL_UART_GetVersion (void)
- \brief Get driver version.
- \return \ref sunxi_hal_version_t
- \fn SUNXI_HAL_UART_CAPABILITIES SUNXI_HAL_UART_GetCapabilities (void)
- \brief Get driver capabilities
- \return \ref SUNXI_HAL_UART_CAPABILITIES
- \fn int32_t SUNXI_HAL_UART_Initialize (SUNXI_HAL_UART_SignalEvent_t cb_event)
- \brief Initialize UART Interface.
- \param[in] cb_event Pointer to \ref SUNXI_HAL_UART_SignalEvent
- \return \ref execution_status
- \fn int32_t SUNXI_HAL_UART_Uninitialize (void)
- \brief De-initialize UART Interface.
- \return \ref execution_status
- \fn int32_t SUNXI_HAL_UART_PowerControl (SUNXI_HAL_POWER_STATE state)
- \brief Control UART Interface Power.
- \param[in] state Power state
- \return \ref execution_status
- \fn int32_t SUNXI_HAL_UART_Send (const void *data, uint32_t num)
- \brief Start sending data to UART transmitter.
- \param[in] data Pointer to buffer with data to send to UART transmitter
- \param[in] num Number of data items to send
- \return \ref execution_status
- \fn int32_t SUNXI_HAL_UART_Receive (void *data, uint32_t num)
- \brief Start receiving data from UART receiver.
- \param[out] data Pointer to buffer for data to receive from UART receiver
- \param[in] num Number of data items to receive
- \return \ref execution_status
- \fn int32_t SUNXI_HAL_UART_Transfer (const void *data_out,
- void *data_in,
- uint32_t num)
- \brief Start sending/receiving data to/from UART transmitter/receiver.
- \param[in] data_out Pointer to buffer with data to send to UART transmitter
- \param[out] data_in Pointer to buffer for data to receive from UART receiver
- \param[in] num Number of data items to transfer
- \return \ref execution_status
- \fn uint32_t SUNXI_HAL_UART_GetTxCount (void)
- \brief Get transmitted data count.
- \return number of data items transmitted
- \fn uint32_t SUNXI_HAL_UART_GetRxCount (void)
- \brief Get received data count.
- \return number of data items received
- \fn int32_t SUNXI_HAL_UART_Control (uint32_t control, uint32_t arg)
- \brief Control UART Interface.
- \param[in] control Operation
- \param[in] arg Argument of operation (optional)
- \return common \ref execution_status and driver specific \ref uart_execution_status
- \fn SUNXI_HAL_UART_STATUS SUNXI_HAL_UART_GetStatus (void)
- \brief Get UART status.
- \return UART status \ref SUNXI_HAL_UART_STATUS
- \fn int32_t SUNXI_HAL_UART_SetModemControl (SUNXI_HAL_UART_MODEM_CONTROL control)
- \brief Set UART Modem Control line state.
- \param[in] control \ref SUNXI_HAL_UART_MODEM_CONTROL
- \return \ref execution_status
- \fn SUNXI_HAL_UART_MODEM_STATUS SUNXI_HAL_UART_GetModemStatus (void)
- \brief Get UART Modem Status lines state.
- \return modem status \ref SUNXI_HAL_UART_MODEM_STATUS
- \fn void SUNXI_HAL_UART_SignalEvent (uint32_t event)
- \brief Signal UART Events.
- \param[in] event \ref UART_events notification mask
- \return none
- */
- typedef void (*sunxi_hal_uart_signal_event_t)(uint32_t event); ///< Pointer to \ref SUNXI_HAL_UART_SignalEvent : Signal UART Event.
- /**
- \brief UART Device Driver Capabilities.
- */
- typedef struct sunxi_hal_uart_capabilities
- {
- uint32_t asynchronous : 1; ///< supports UART (Asynchronous) mode
- uint32_t synchronous_master : 1; ///< supports Synchronous Master mode
- uint32_t synchronous_slave : 1; ///< supports Synchronous Slave mode
- uint32_t single_wire : 1; ///< supports UART Single-wire mode
- uint32_t irda : 1; ///< supports UART IrDA mode
- uint32_t smart_card : 1; ///< supports UART Smart Card mode
- uint32_t smart_card_clock : 1; ///< Smart Card Clock generator available
- uint32_t flow_control_rts : 1; ///< RTS Flow Control available
- uint32_t flow_control_cts : 1; ///< CTS Flow Control available
- uint32_t event_tx_complete : 1; ///< Transmit completed event: \ref SUNXI_HAL_UART_EVENT_TX_COMPLETE
- uint32_t event_rx_timeout : 1; ///< Signal receive character timeout event: \ref SUNXI_HAL_UART_EVENT_RX_TIMEOUT
- uint32_t rts : 1; ///< RTS Line: 0=not available, 1=available
- uint32_t cts : 1; ///< CTS Line: 0=not available, 1=available
- uint32_t dtr : 1; ///< DTR Line: 0=not available, 1=available
- uint32_t dsr : 1; ///< DSR Line: 0=not available, 1=available
- uint32_t dcd : 1; ///< DCD Line: 0=not available, 1=available
- uint32_t ri : 1; ///< RI Line: 0=not available, 1=available
- uint32_t event_cts : 1; ///< Signal CTS change event: \ref SUNXI_HAL_UART_EVENT_CTS
- uint32_t event_dsr : 1; ///< Signal DSR change event: \ref SUNXI_HAL_UART_EVENT_DSR
- uint32_t event_dcd : 1; ///< Signal DCD change event: \ref SUNXI_HAL_UART_EVENT_DCD
- uint32_t event_ri : 1; ///< Signal RI change event: \ref SUNXI_HAL_UART_EVENT_RI
- uint32_t reserved : 11; ///< Reserved (must be zero)
- } sunxi_hal_uart_capabilities_t;
- typedef struct sunxi_hal_driver_usart
- {
- ///< Pointer to \ref SUNXI_HAL_USART_GetVersion : Get driver version.
- sunxi_hal_version_t (*get_version)(int32_t dev);
- ///< Pointer to \ref SUNXI_HAL_USART_GetCapabilities : Get driver capabilities.
- sunxi_hal_uart_capabilities_t (*get_capabilities)(int32_t dev);
- ///< Pointer to \ref SUNXI_HAL_USART_Initialize : Initialize USART Interface.
- int32_t (*initialize)(int32_t uart_port);
- ///< Pointer to \ref SUNXI_HAL_USART_Uninitialize : De-initialize USART Interface.
- int32_t (*uninitialize)(int32_t uart_port);
- ///< Pointer to \ref SUNXI_HAL_USART_PowerControl : Control USART Interface Power.
- int32_t (*power_control)(int32_t dev, sunxi_hal_power_state_e state);
- ///< Pointer to \ref SUNXI_HAL_USART_Send : Start sending data to USART transmitter.
- int32_t (*send)(int32_t dev, const uint8_t *data, uint32_t num);
- ///< Pointer to \ref SUNXI_HAL_USART_Receive : Start receiving data from USART receiver.
- int32_t (*receive)(int32_t dev, int *data, uint32_t num);
- ///< Pointer to \ref SUNXI_HAL_USART_Transfer : Start sending/receiving data to/from USART.
- int32_t (*transfer)(int32_t dev, const void *data_out, void *data_in, uint32_t num);
- ///< Pointer to \ref SUNXI_HAL_USART_GetTxCount : Get transmitted data count.
- uint32_t (*get_tx_count)(int32_t dev);
- ///< Pointer to \ref SUNXI_HAL_USART_GetRxCount : Get received data count.
- uint32_t (*get_rx_count)(int32_t dev);
- ///< Pointer to \ref SUNXI_HAL_USART_Control : Control USART Interface.
- int32_t (*control)(int32_t uart_port, int cmd, void *args);
- ///< Pointer to \ref SUNXI_HAL_USART_GetStatus : Get USART status.
- sunxi_hal_uart_status_t (*get_status)(int32_t dev);
- ///< Pointer to \ref SUNXI_HAL_USART_SetModemControl : Set USART Modem Control line state.
- int32_t (*set_modem_control)(int32_t dev, sunxi_hal_uart_modem_control_e control);
- ///< Pointer to \ref SUNXI_HAL_USART_GetModemStatus : Get USART Modem Status lines state.
- sunxi_hal_uart_modem_status_t (*get_modem_status)(int32_t dev);
- int32_t (*receive_polling)(int32_t dev, uint8_t *data, uint32_t num);
- sunxi_hal_poll_ops *poll_ops;
- } const sunxi_hal_driver_usart_t;
- #if 0
- #define POLLIN (0x01)
- #define POLLRDNORM (0x01)
- #define POLLRDBAND (0x01)
- #define POLLPRI (0x01)
- #define POLLOUT (0x02)
- #define POLLWRNORM (0x02)
- #define POLLWRBAND (0x02)
- #define POLLERR (0x04)
- #define POLLHUP (0x08)
- #define POLLNVAL (0x10)
- #endif
- sunxi_hal_version_t hal_uart_get_version(int32_t dev);
- sunxi_hal_uart_capabilities_t hal_uart_get_capabilities(int32_t dev);
- int32_t hal_uart_init(int32_t uart_port);
- int32_t hal_uart_deinit(int32_t uart_port);
- int32_t hal_uart_power_control(int32_t dev, sunxi_hal_power_state_e state);
- int32_t hal_uart_send(int32_t dev, const uint8_t *data, uint32_t num);
- int32_t hal_uart_put_char(int32_t dev, char c);
- int32_t hal_uart_receive(int32_t dev, uint8_t *data, uint32_t num);
- int32_t hal_uart_receive_no_block(int32_t dev, uint8_t *data, uint32_t num, int32_t timeout);
- uint8_t hal_uart_get_char(int32_t dev);
- uint32_t hal_uart_get_tx_count(int32_t dev);
- uint32_t hal_uart_get_rx_count(int32_t dev);
- int32_t hal_uart_control(int32_t uart_port, int cmd, void *args);
- sunxi_hal_uart_status_t hal_uart_get_status(int32_t dev);
- int32_t hal_uart_transfer(int32_t dev, const void *data_out,
- void *data_in, uint32_t num);
- int32_t hal_uart_set_modem_control(int32_t dev,
- sunxi_hal_uart_modem_control_e control);
- sunxi_hal_uart_modem_status_t hal_uart_get_modem_status(int32_t dev);
- int32_t hal_uart_receive_polling(int32_t dev, uint8_t *data, uint32_t num);
- int32_t hal_uart_check_poll_state(int32_t dev_id, short key);
- int32_t hal_uart_poll_wakeup(int32_t dev_id, short key);
- int32_t hal_uart_register_poll_wakeup(poll_wakeup_func poll_wakeup);
- void hal_uart_set_hardware_flowcontrol(uart_port_t uart_port);
- void hal_uart_disable_flowcontrol(uart_port_t uart_port);
- void hal_uart_set_loopback(uart_port_t uart_port, bool enable);
- void sunxi_driver_uart_init(void);
- #ifdef __cplusplus
- }
- #endif
- #endif
|