476 lines
20 KiB
C
476 lines
20 KiB
C
|
/* ------------------------------------------
|
||
|
* Copyright (c) 2016, Synopsys, Inc. All rights reserved.
|
||
|
|
||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||
|
* are permitted provided that the following conditions are met:
|
||
|
|
||
|
* 1) Redistributions of source code must retain the above copyright notice, this
|
||
|
* list of conditions and the following disclaimer.
|
||
|
|
||
|
* 2) Redistributions in binary form must reproduce the above copyright notice,
|
||
|
* this list of conditions and the following disclaimer in the documentation and/or
|
||
|
* other materials provided with the distribution.
|
||
|
|
||
|
* 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may
|
||
|
* be used to endorse or promote products derived from this software without
|
||
|
* specific prior written permission.
|
||
|
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
* \version 2016.05
|
||
|
* \date 2014-06-16
|
||
|
* \author Huaqi Fang(Huaqi.Fang@synopsys.com)
|
||
|
--------------------------------------------- */
|
||
|
|
||
|
/**
|
||
|
* \defgroup DEVICE_HAL_UART UART Device HAL Interface
|
||
|
* \ingroup DEVICE_HAL_DEF
|
||
|
* \brief Definitions for uart device hardware layer (\ref dev_uart.h)
|
||
|
* \details Provide unified APIs for uart driver to implement.
|
||
|
* Here is a diagram for the uart interface.
|
||
|
*
|
||
|
* \htmlonly
|
||
|
* <div class="imagebox">
|
||
|
* <div style="width: 600px">
|
||
|
* <img src="pic/dev_uart_hal.jpg" alt="UART Device HAL Interface Diagram"/>
|
||
|
* <p>UART Device HAL Interface Diagram</p>
|
||
|
* </div>
|
||
|
* </div>
|
||
|
* \endhtmlonly
|
||
|
*
|
||
|
* ### Reference Links
|
||
|
* * [Serial Port](https://en.wikipedia.org/wiki/Serial_port)
|
||
|
*
|
||
|
* @{6
|
||
|
*
|
||
|
* \file
|
||
|
* \brief uart device hardware layer definitions
|
||
|
* \details Provide common definitions for uart device,
|
||
|
* then software developer can develop uart driver
|
||
|
* following this definitions, and the applications
|
||
|
* can directly call this definition to realize functions
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef _DEVICE_HAL_UART_H_
|
||
|
#define _DEVICE_HAL_UART_H_
|
||
|
|
||
|
#include "device/device_hal/inc/dev_common.h"
|
||
|
|
||
|
/**
|
||
|
* \defgroup DEVICE_HAL_UART_BAUD UART Device Baudrate Definitions
|
||
|
* \ingroup DEVICE_HAL_UART
|
||
|
* \brief Macros for uart baudrate.
|
||
|
* \details Definitions for baudrate from 4800 to 115200bps.
|
||
|
* @{
|
||
|
*/
|
||
|
/*
|
||
|
* defines for uart baudrates
|
||
|
*/
|
||
|
#define UART_BAUDRATE_110 (110) /*!< uart baudrate 110bps */
|
||
|
#define UART_BAUDRATE_300 (300) /*!< uart baudrate 300bps */
|
||
|
#define UART_BAUDRATE_600 (600) /*!< uart baudrate 600bps */
|
||
|
#define UART_BAUDRATE_1200 (1200) /*!< uart baudrate 1200bps */
|
||
|
#define UART_BAUDRATE_2400 (2400) /*!< uart baudrate 2400bps */
|
||
|
#define UART_BAUDRATE_4800 (4800) /*!< uart baudrate 4800bps */
|
||
|
#define UART_BAUDRATE_9600 (9600) /*!< uart baudrate 9600bps */
|
||
|
#define UART_BAUDRATE_14400 (14400) /*!< uart baudrate 14400bps */
|
||
|
#define UART_BAUDRATE_19200 (19200) /*!< uart baudrate 19200bps */
|
||
|
#define UART_BAUDRATE_38400 (38400) /*!< uart baudrate 38400bps */
|
||
|
#define UART_BAUDRATE_57600 (57600) /*!< uart baudrate 57600bps */
|
||
|
#define UART_BAUDRATE_115200 (115200) /*!< uart baudrate 115200bps */
|
||
|
#define UART_BAUDRATE_230400 (230400) /*!< uart baudrate 230400bps */
|
||
|
#define UART_BAUDRATE_460800 (460800) /*!< uart baudrate 460800bps */
|
||
|
#define UART_BAUDRATE_921600 (921600) /*!< uart baudrate 921600bps */
|
||
|
/** @} */
|
||
|
|
||
|
/**
|
||
|
* \defgroup DEVICE_HAL_UART_FORMAT UART Device Format Definitions
|
||
|
* \ingroup DEVICE_HAL_UART
|
||
|
* \brief Macros for uart format.
|
||
|
* \details Definitions for uart format like databits, parity, stopbits.
|
||
|
* @{
|
||
|
*/
|
||
|
/**
|
||
|
* UART Device Parity Types Enum
|
||
|
*/
|
||
|
typedef enum {
|
||
|
UART_PARITY_NONE = 0, /*!< no parity bit */
|
||
|
UART_PARITY_ODD = 1, /*!< odd parity bit */
|
||
|
UART_PARITY_EVEN = 2, /*!< even parity bit */
|
||
|
UART_PARITY_MARK = 3, /*!< mark parity bit, always logical 1 */
|
||
|
UART_PARITY_SPACE = 4 /*!< space parity bit, always logical 0 */
|
||
|
} UART_PARITY;
|
||
|
|
||
|
/**
|
||
|
* UART Device Stop Bits Enum
|
||
|
*/
|
||
|
typedef enum {
|
||
|
UART_STPBITS_ONE = 0, /*!< 1 stop bit */
|
||
|
UART_STPBITS_ONEHALF = 1, /*!< 1.5 stop bits */
|
||
|
UART_STPBITS_TWO = 2 /*!< 2 stop bits */
|
||
|
} UART_STOPBITS;
|
||
|
|
||
|
/**
|
||
|
* UART DPS Format: databits/parity/stopbits
|
||
|
*/
|
||
|
typedef struct uart_dps_format {
|
||
|
uint32_t databits; /*!< data bits */
|
||
|
UART_PARITY parity; /*!< parity bit type */
|
||
|
UART_STOPBITS stopbits; /*!< stop bits */
|
||
|
} UART_DPS_FORMAT;
|
||
|
|
||
|
#define UART_DATABITS_DEFAULT 8 /*!< default data bits */
|
||
|
|
||
|
/** Default UART DPS format */
|
||
|
static const UART_DPS_FORMAT dps_format_default = {UART_DATABITS_DEFAULT, UART_PARITY_NONE, UART_STPBITS_ONE};
|
||
|
/** @} */
|
||
|
|
||
|
/**
|
||
|
* UART Device Hardware Flow Control Types Enum
|
||
|
*/
|
||
|
typedef enum {
|
||
|
UART_FC_NONE = 0, /*!< Non hardware flow control */
|
||
|
UART_FC_RTS = 1, /*!< Request To Send */
|
||
|
UART_FC_CTS = 2, /*!< Clear To Send */
|
||
|
UART_FC_BOTH = 3 /*!< Both hardware flow control methods */
|
||
|
} UART_HW_FLOW_CONTROL;
|
||
|
/** Default hardware flow control method */
|
||
|
static const UART_HW_FLOW_CONTROL hwfc_default = UART_FC_NONE;
|
||
|
|
||
|
/**
|
||
|
* \defgroup DEVICE_HAL_UART_CTRLCMD UART Device Control Commands
|
||
|
* \ingroup DEVICE_HAL_UART
|
||
|
* \brief Definitions for uart control command, used in \ref dev_uart::uart_control "UART IO Control"
|
||
|
* \details These commands defined here can be used in user code directly.
|
||
|
* - Parameters Usage
|
||
|
* - For passing parameters like integer, just use uint32_t/int32_t to directly pass values
|
||
|
* - For passing parameters for a structure, please use pointer to pass values
|
||
|
* - For getting some data, please use pointer to store the return data
|
||
|
* - Common Return Values
|
||
|
* - \ref E_OK, Control device successfully
|
||
|
* - \ref E_CLSED, Device is not opened
|
||
|
* - \ref E_OBJ, Device object is not valid or not exists
|
||
|
* - \ref E_PAR, Parameter is not valid for current control command
|
||
|
* - \ref E_SYS, Control device failed, due to hardware issues such as device is disabled
|
||
|
* - \ref E_CTX, Control device failed, due to different reasons like in transfer state
|
||
|
* - \ref E_NOSPT, Control command is not supported or not valid
|
||
|
* @{
|
||
|
*/
|
||
|
/**
|
||
|
* Set \ref dev_uart_info::baudrate "uart baudrate".
|
||
|
* - Param type : uint32_t
|
||
|
* - Param usage : uart baudrate, must above zero. Here is a list of \ref DEVICE_HAL_UART_BAUD "possible baudrates"
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_BAUD DEV_SET_SYSCMD(0)
|
||
|
/**
|
||
|
* Get \ref dev_uart_info::status "current device status"
|
||
|
* - Param type : uint32_t *
|
||
|
* - Param usage : store result of current status
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_GET_STATUS DEV_SET_SYSCMD(1)
|
||
|
/**
|
||
|
* Enable uart device
|
||
|
* - Param type : NULL
|
||
|
* - Param usage : param is not required
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_ENA_DEV DEV_SET_SYSCMD(2)
|
||
|
/**
|
||
|
* Disable uart device, when device is disabled,
|
||
|
* only \ref UART_CMD_ENA_DEV, \ref UART_CMD_DIS_DEV and
|
||
|
* \ref UART_CMD_GET_STATUS commands can be executed,
|
||
|
* other commands will return \ref E_SYS
|
||
|
* - Param type : NULL
|
||
|
* - Param usage : param is not required
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_DIS_DEV DEV_SET_SYSCMD(3)
|
||
|
/**
|
||
|
* Flush uart device output
|
||
|
* - Param type : NULL
|
||
|
* - Param usage : param is not required
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_FLUSH_OUTPUT DEV_SET_SYSCMD(4)
|
||
|
/**
|
||
|
* Get how many bytes space in uart are available to transmit,
|
||
|
* this can be used in interrupt callback functions,
|
||
|
* cooperate with \ref dev_uart::uart_write "uart_write" API to realize non-blocked write
|
||
|
* - Param type : int32_t *
|
||
|
* - Param usage : store the write available bytes, > 0 for available bytes, 0 for not available
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_GET_TXAVAIL DEV_SET_SYSCMD(5)
|
||
|
/**
|
||
|
* Get how many bytes in uart are available to receive,
|
||
|
* this can be used in interrupt callback functions,
|
||
|
* cooperate with \ref dev_uart::uart_read "uart_read" API to realize non-blocked read
|
||
|
* - Param type : int32_t *
|
||
|
* - Param usage : store the read available bytes, > 0 for available bytes, 0 for not available
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_GET_RXAVAIL DEV_SET_SYSCMD(6)
|
||
|
/**
|
||
|
* Cause a break condition to be transmitted to the receiving device
|
||
|
* - Param type : NULL
|
||
|
* - Param usage : param is not required
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_BREAK_SET DEV_SET_SYSCMD(7)
|
||
|
/**
|
||
|
* Clear break condition and return to normal
|
||
|
* - Param type : NULL
|
||
|
* - Param usage : param is not required
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_BREAK_CLR DEV_SET_SYSCMD(8)
|
||
|
/**
|
||
|
* Change uart \ref dev_uart_info::dps_format "D/P/S(Data/Parity/Stop) format"
|
||
|
* - Param type : \ref UART_DPS_FORMAT *
|
||
|
* - Param usage : uart dps format including databits, parity and stopbits
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_DPS_FORMAT DEV_SET_SYSCMD(9)
|
||
|
/**
|
||
|
* Set uart device \ref dev_uart_info::hwfc "hardware flow control"
|
||
|
* - Param type : \ref UART_HW_FLOW_CONTROL
|
||
|
* - Param usage : uart dps format including databits, parity and stopbits
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_HWFC DEV_SET_SYSCMD(10)
|
||
|
/**
|
||
|
* Set \ref dev_uart_cbs::tx_cb "uart transmit success callback" function
|
||
|
* when all required bytes are transmitted for interrupt method
|
||
|
* - Param type : \ref DEV_CALLBACK * or NULL
|
||
|
* - Param usage : transmit success callback function for uart
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_TXCB DEV_SET_SYSCMD(11)
|
||
|
/**
|
||
|
* Set \ref dev_uart_cbs::rx_cb "uart receive success callback" function
|
||
|
* when all required bytes are received for interrupt method
|
||
|
* - Param type : \ref DEV_CALLBACK * or NULL
|
||
|
* - Param usage : receive success callback function for uart
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_RXCB DEV_SET_SYSCMD(12)
|
||
|
/**
|
||
|
* Set \ref dev_uart_cbs::err_cb "uart transfer error callback" function
|
||
|
* when something error happened for interrupt method
|
||
|
* - Param type : \ref DEV_CALLBACK * or NULL
|
||
|
* - Param usage : transfer error callback function for uart
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_ERRCB DEV_SET_SYSCMD(13)
|
||
|
/**
|
||
|
* Set transmit buffer via interrupt, and it will set \ref dev_uart_info::tx_buf "tx_buf"
|
||
|
* - Param type : DEV_BUFFER * or NULL
|
||
|
* - Param usage : buffer structure pointer, if param is NULL, then it will set tx_buf to NULL
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_TXINT_BUF DEV_SET_SYSCMD(14)
|
||
|
/**
|
||
|
* Set receive buffer via interrupt, and it will set \ref dev_uart_info::rx_buf "rx_buf"
|
||
|
* - Param type : DEV_BUFFER * or NULL
|
||
|
* - Param usage : buffer structure pointer, if param is NULL, then it will set rx_buf to NULL
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_RXINT_BUF DEV_SET_SYSCMD(15)
|
||
|
/**
|
||
|
* Enable or disable transmit interrupt
|
||
|
* - Param type : uint32_t
|
||
|
* - Param usage : enable(none-zero) or disable(zero) flag
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_TXINT DEV_SET_SYSCMD(16)
|
||
|
/**
|
||
|
* Enable or disable receive interrupt
|
||
|
* - Param type : uint32_t
|
||
|
* - Param usage : enable(none-zero) or disable(zero) flag
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_SET_RXINT DEV_SET_SYSCMD(17)
|
||
|
/**
|
||
|
* Abort current interrupt transmit operation if tx interrupt enabled,
|
||
|
* it will disable transmit interrupt, and set \ref DEV_IN_TX_ABRT
|
||
|
* in \ref dev_uart_info::status "status" variable,
|
||
|
* and call the transmit callback function, when tx callback is finished,
|
||
|
* it will clear \ref DEV_IN_TX_ABRT and return
|
||
|
* - Param type : NULL
|
||
|
* - Param usage :
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_ABORT_TX DEV_SET_SYSCMD(18)
|
||
|
/**
|
||
|
* Abort current interrupt receive operation if rx interrupt enabled,
|
||
|
* it will disable receive interrupt, and set \ref DEV_IN_TX_ABRT
|
||
|
* in \ref dev_uart_info::status "status" variable,
|
||
|
* and call the receive callback function, when rx callback is finished,
|
||
|
* it will clear \ref DEV_IN_TX_ABRT and return
|
||
|
* - Param type : NULL
|
||
|
* - Param usage :
|
||
|
* - Return value explanation :
|
||
|
*/
|
||
|
#define UART_CMD_ABORT_RX DEV_SET_SYSCMD(19)
|
||
|
|
||
|
/** @} */
|
||
|
|
||
|
/**
|
||
|
* \defgroup DEVICE_HAL_UART_CALLBACK UART Interrupt callback functions
|
||
|
* \ingroup DEVICE_HAL_UART
|
||
|
* \brief callback function structure for UART device
|
||
|
* @{
|
||
|
*/
|
||
|
typedef struct dev_uart_cbs {
|
||
|
DEV_CALLBACK tx_cb; /*!< uart data transmit success required bytes callback */
|
||
|
DEV_CALLBACK rx_cb; /*!< uart data receive success required bytes callback */
|
||
|
DEV_CALLBACK err_cb; /*!< uart error callback */
|
||
|
} DEV_UART_CBS, *DEV_UART_CBS_PTR;
|
||
|
/** @} */
|
||
|
|
||
|
/**
|
||
|
* \defgroup DEVICE_HAL_UART_DEVSTRUCT UART Device Interface Definition
|
||
|
* \ingroup DEVICE_HAL_UART
|
||
|
* \brief Contains definitions of uart device interface structure.
|
||
|
* \details This structure will be used in user implemented code, which was called
|
||
|
* \ref DEVICE_IMPL "Device Driver Implement Layer" for uart to use in implementation code.
|
||
|
* Application developer should use the UART API provided here to access to UART devices.
|
||
|
* BSP developer should follow the API definition to implement UART device drivers.
|
||
|
* @{
|
||
|
*/
|
||
|
/**
|
||
|
* \brief UART information struct definition
|
||
|
* \details informations about uart open count, working status,
|
||
|
* baudrate, uart registers and ctrl structure, uart dps format
|
||
|
*/
|
||
|
typedef struct dev_uart_info {
|
||
|
void *uart_ctrl; /*!< uart control related pointer, implemented by bsp developer, and this should be set during uart object implementation */
|
||
|
uint32_t opn_cnt; /*!< uart open count, open it will increase 1, close it will decrease 1, 0 for close, >0 for open */
|
||
|
uint32_t status; /*!< current working status, refer to \ref DEVICE_HAL_COMMON_DEVSTATUS, this should be \ref DEV_ENABLED for first open */
|
||
|
uint32_t baudrate; /*!< uart baud rate, this should be the value of baud passing by uart_open if first successfully opened */
|
||
|
UART_DPS_FORMAT dps_format; /*!< D/P/S format settings for uart device, here is \ref dps_format_default "default settings for first open" */
|
||
|
UART_HW_FLOW_CONTROL hwfc; /*!< UART hardware flow control, here is \ref hwfc_default "default hardware flow control settings for first open" */
|
||
|
DEV_BUFFER tx_buf; /*!< transmit buffer via interrupt, this should be all zero for first open */
|
||
|
DEV_BUFFER rx_buf; /*!< receive buffer via interrupt, this should be all zero for first open */
|
||
|
DEV_UART_CBS uart_cbs; /*!< uart callbacks, callback arguments should be \ref DEV_UART * or NULL, this should be all NULL for first open */
|
||
|
void *extra; /*!< a extra pointer to get hook to applications which should not used by bsp developer,
|
||
|
this should be NULL for first open and you can \ref DEV_UART_INFO_SET_EXTRA_OBJECT "set"
|
||
|
or \ref DEV_UART_INFO_GET_EXTRA_OBJECT "get" the extra information pointer */
|
||
|
} DEV_UART_INFO, * DEV_UART_INFO_PTR;
|
||
|
|
||
|
/** Set extra information pointer of uart info */
|
||
|
#define DEV_UART_INFO_SET_EXTRA_OBJECT(uart_info_ptr, extra_info) (uart_info_ptr)->extra = (void *)(extra_info)
|
||
|
/** Get extra information pointer of uart info */
|
||
|
#define DEV_UART_INFO_GET_EXTRA_OBJECT(uart_info_ptr) ((uart_info_ptr)->extra)
|
||
|
|
||
|
/**
|
||
|
* \brief UART device interface definition
|
||
|
* \details Define uart device interface, like uart information structure,
|
||
|
* provide functions to open/close/control uart, send/receive data by uart
|
||
|
* \note All this details are implemented by user in user porting code
|
||
|
*/
|
||
|
typedef struct dev_uart {
|
||
|
DEV_UART_INFO uart_info; /*!< UART device information */
|
||
|
int32_t (*uart_open) (uint32_t baud); /*!< Open uart device */
|
||
|
int32_t (*uart_close) (void); /*!< Close uart device */
|
||
|
int32_t (*uart_control) (uint32_t ctrl_cmd, void *param); /*!< Control uart device */
|
||
|
int32_t (*uart_write) (const void *data, uint32_t len); /*!< Send data by uart device(blocked) */
|
||
|
int32_t (*uart_read) (void *data, uint32_t len); /*!< Read data from uart device(blocked) */
|
||
|
} DEV_UART, * DEV_UART_PTR;
|
||
|
|
||
|
/**
|
||
|
* \fn int32_t (* dev_uart::uart_open) (uint32_t baud)
|
||
|
* \details open an uart device with defined baudrate
|
||
|
* \param[in] baud \ref DEVICE_HAL_UART_BAUD "initial baudrate of uart", must > 0
|
||
|
* \retval E_OK Open successfully without any issues
|
||
|
* \retval E_OPNED If device was opened before with different parameters,
|
||
|
* then just increase the \ref dev_uart_info::opn_cnt "opn_cnt" and return \ref E_OPNED
|
||
|
* \retval E_OBJ Device object is not valid
|
||
|
* \retval E_PAR Parameter is not valid
|
||
|
* \retval E_NOSPT Open settings are not supported
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* \fn int32_t (* dev_uart::uart_close) (void)
|
||
|
* \details close an uart device, just decrease the \ref dev_uart_info::opn_cnt "opn_cnt",
|
||
|
* if \ref dev_uart_info::opn_cnt "opn_cnt" equals 0, then close the device
|
||
|
* \retval E_OK Close successfully without any issues(including scenario that device is already closed)
|
||
|
* \retval E_OPNED Device is still opened, the device \ref dev_uart_info::opn_cnt "opn_cnt" decreased by 1
|
||
|
* \retval E_OBJ Device object is not valid
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* \fn int32_t (* dev_uart::uart_control) (uint32_t ctrl_cmd, void *param)
|
||
|
* \details control an uart device by \ref ctrl_cmd, with passed \ref param.
|
||
|
* you can control uart device using predefined uart control commands defined using \ref DEV_SET_SYSCMD
|
||
|
* (which must be implemented by bsp developer), such as \ref UART_CMD_SET_BAUD "change baudrate",
|
||
|
* \ref UART_CMD_FLUSH_OUTPUT "flush output" and \ref DEVICE_HAL_UART_CTRLCMD "more".
|
||
|
* And you can also control uart device using your own specified commands defined using \ref DEV_SET_USRCMD,
|
||
|
* but these specified commands should be defined in your own uart device driver implementation.
|
||
|
* \param[in] ctrl_cmd \ref DEVICE_HAL_UART_CTRLCMD "control command", to change or get some thing related to uart
|
||
|
* \param[in,out] param parameters that maybe argument of the command, or return values of the command
|
||
|
* \retval E_OK Control device successfully
|
||
|
* \retval E_CLSED Device is not opened
|
||
|
* \retval E_OBJ Device object is not valid or not exists
|
||
|
* \retval E_PAR Parameter is not valid for current control command
|
||
|
* \retval E_SYS Control device failed, due to hardware issues, such as device is disabled
|
||
|
* \retval E_CTX Control device failed, due to different reasons like in transfer state
|
||
|
* \retval E_NOSPT Control command is not supported or not valid
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* \fn int32_t (* dev_uart::uart_write) (const void *data, uint32_t len)
|
||
|
* \details send \ref data through uart with defined \ref len(blocked).
|
||
|
* \param[in] data pointer to data need to send by uart, must not be NULL
|
||
|
* \param[in] len length of data to be sent, must > 0
|
||
|
* \retval >0 Byte count that was successfully sent for poll method
|
||
|
* \retval E_OBJ Device object is not valid or not exists
|
||
|
* \retval E_PAR Parameter is not valid
|
||
|
* \retval E_SYS Can't write data to hardware due to hardware issues, such as device is disabled
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* \fn int32_t (* dev_uart::uart_read) (void *data, uint32_t len)
|
||
|
* \details receive \ref data of defined \ref len through uart(blocked).
|
||
|
* \param[out] data pointer to data need to received by uart, must not be NULL
|
||
|
* \param[in] len length of data to be received, must > 0
|
||
|
* \retval >0 Byte count that was successfully received for poll method
|
||
|
* \retval E_OBJ Device object is not valid or not exists
|
||
|
* \retval E_PAR Parameter is not valid
|
||
|
* \retval E_SYS Can't receive data from hardware due to hardware issues, such as device is disabled
|
||
|
*/
|
||
|
/** @} */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* \brief get an \ref dev_uart "uart device" by uart device id.
|
||
|
* For how to use uart device hal refer to \ref DEVICE_HAL_UART_DEVSTRUCT "Functions in uart device structure"
|
||
|
* \param[in] uart_id id of uart, defined by user
|
||
|
* \retval !NULL pointer to an \ref dev_uart "uart device structure"
|
||
|
* \retval NULL failed to find the uart device by \ref uart_id
|
||
|
* \note need to implemented by user in user code
|
||
|
*/
|
||
|
extern DEV_UART_PTR uart_get_dev(int32_t uart_id);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/** @} */
|
||
|
#endif /* _DEVICE_HAL_UART_H_ */
|