/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup UART
* @{
*
* @brief Defines standard APIs of universal asynchronous receiver/transmitter (UART) capabilities.
*
* You can use this module to access the UART and enable the driver to operate a UART-compliant device.
* The functions in this module help you to obtain and release the UART device handle, read and write data,
* obtain and set the baud rate and device attributes.
*
* @since 1.0
*/
/**
* @file uart_if.h
*
* @brief Declares standard UART APIs.
*
* @since 1.0
*/
#ifndef UART_IF_H
#define UART_IF_H
#include "platform_if.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* @brief Defines basic attributes of the UART port.
*
* You can configure the attributes via {@link UartSetAttribute}. If the parameters are not set,
* default attributes are used.
*
* @attention The UART controller determines which UART attribute parameters are supported.
*
* @since 1.0
*/
struct UartAttribute {
/**
* Data Bit | Description
* ------------| -----------------------
* UART_ATTR_DATABIT_8 | 8 data bits
* UART_ATTR_DATABIT_7 | 7 data bits
* UART_ATTR_DATABIT_6 | 6 data bits
* UART_ATTR_DATABIT_5 | 5 data bits
*/
unsigned int dataBits : 4;
/**
* @brief Indicates the UART word length, which is 8 data bits per frame.
*
* @since 1.0
*/
#define UART_ATTR_DATABIT_8 0
/**
* @brief Indicates the UART word length, which is 7 data bits per frame.
*
* @since 1.0
*/
#define UART_ATTR_DATABIT_7 1
/**
* @brief Indicates the UART word length, which is 6 data bits per frame.
*
* @since 1.0
*/
#define UART_ATTR_DATABIT_6 2
/**
* @brief Indicates the UART word length, which is 5 data bits per frame.
*
* @since 1.0
*/
#define UART_ATTR_DATABIT_5 3
/**
* Parity Bit | Description
* ------------| -----------------------
* UART_ATTR_PARITY_NONE | No parity bit
* UART_ATTR_PARITY_ODD | Odd parity bit
* UART_ATTR_PARITY_EVEN | Even parity bit
* UART_ATTR_PARITY_MARK | 1
* UART_ATTR_PARITY_SPACE | 0
*/
unsigned int parity : 4;
/**
* @brief Indicates that the UART device has no parity bit.
*
* @since 1.0
*/
#define UART_ATTR_PARITY_NONE 0
/**
* @brief Indicates that the UART device has an odd parity bit.
*
* @since 1.0
*/
#define UART_ATTR_PARITY_ODD 1
/**
* @brief Indicates that the UART device has an even parity bit.
*
* @since 1.0
*/
#define UART_ATTR_PARITY_EVEN 2
/**
* @brief Indicates that the parity bit is 1.
*
* @since 1.0
*/
#define UART_ATTR_PARITY_MARK 3
/**
* @brief Indicates that the parity bit is 0.
*
* @since 1.0
*/
#define UART_ATTR_PARITY_SPACE 4
/**
* Stop Bit | Description
* ------------| -----------------------
* UART_ATTR_STOPBIT_1 | 1 stop bit
* UART_ATTR_STOPBIT_1P5 | 1.5 stop bits
* UART_ATTR_STOPBIT_2 | 2 stop bits
*/
unsigned int stopBits : 4;
/**
* @brief Indicates that the UART device has 1 stop bit.
*
* @since 1.0
*/
#define UART_ATTR_STOPBIT_1 0
/**
* @brief Indicates that the UART device has 1.5 stop bits.
*
* @since 1.0 */
#define UART_ATTR_STOPBIT_1P5 1
/**
* @brief Indicates that the UART device has 2 stop bits.
*
* @since 1.0
*/
#define UART_ATTR_STOPBIT_2 2
/**
* RTS | Description
* ------------| -----------------------
* UART_ATTR_RTS_DIS | RTS disabled
* UART_ATTR_RTS_EN | RTS enabled
*/
unsigned int rts : 1;
/**
* @brief Indicates that Request To Send (RTS) is disabled for the UART device.
*
* @since 1.0
*/
#define UART_ATTR_RTS_DIS 0
/**
* @brief Indicates that RTS is enabled for the UART device.
*
* @since 1.0
*/
#define UART_ATTR_RTS_EN 1
/**
* CTS | Description
* ------------| -----------------------
* UART_ATTR_CTS_DIS | CTS disabled
* UART_ATTR_CTS_EN | CTS enabled
*/
unsigned int cts : 1;
/**
* @brief Indicates that Clear To Send (CTS) is disabled for the UART device.
*
* @since 1.0
*/
#define UART_ATTR_CTS_DIS 0
/**
* @brief Indicates that CTS is enabled for the UART device.
*
* @since 1.0
*/
#define UART_ATTR_CTS_EN 1
/**
* Receiver FIFO | Description
* ------------| -----------------------
* UART_ATTR_RX_FIFO_DIS | FIFO disabled
* UART_ATTR_RX_FIFO_EN | FIFO enabled
*/
unsigned int fifoRxEn : 1;
/**
* @brief Indicates that First In First Out (FIFO) is disabled for the receiving UART.
*
* @since 1.0
*/
#define UART_ATTR_RX_FIFO_DIS 0
/**
* @brief Indicates that FIFO is enabled for the receiving UART.
*
* @since 1.0
*/
#define UART_ATTR_RX_FIFO_EN 1
/**
* Transmitter FIFO | Description
* ------------| -----------------------
* UART_ATTR_TX_FIFO_DIS | FIFO disabled
* UART_ATTR_TX_FIFO_EN | FIFO enabled
*/
unsigned int fifoTxEn : 1;
/**
* @brief Indicates that FIFO is disabled for the transmitting UART.
*
* @since 1.0
*/
#define UART_ATTR_TX_FIFO_DIS 0
/**
* @brief Indicates that FIFO is enabled for the transmitting UART.
*
* @since 1.0
*/
#define UART_ATTR_TX_FIFO_EN 1
/** Reserved bits */
unsigned int reserved : 16;
};
/**
* @brief Enumerates UART transmission modes.
*
* @attention The UART controller determines whether an enumerated transmission mode is supported.
*
* @since 1.0
*/
enum UartTransMode {
UART_MODE_RD_BLOCK = 0, /**< Blocking mode */
UART_MODE_RD_NONBLOCK, /**< Non-blocking mode */
UART_MODE_DMA_RX_EN, /**< DMA enabled for data receiving */
UART_MODE_DMA_RX_DIS, /**< DMA disabled for data receiving */
UART_MODE_DMA_TX_EN, /**< DMA enabled for data transmitting */
UART_MODE_DMA_TX_DIS, /**< DMA disabled for data transmitting */
};
/**
* @brief Enumerates UART I/O commands.
*
* @since 1.0
*/
enum UartIoCmd {
UART_IO_REQUEST = 0, /**< Reference count management and initialize the UART device. */
UART_IO_RELEASE, /**< Reference count management and deinitialize the UART device. */
UART_IO_READ, /**< Read data. */
UART_IO_WRITE, /**< Write data. */
UART_IO_GET_BAUD, /**< Obtain the baud rate. */
UART_IO_SET_BAUD, /**< Set the baud rate. */
UART_IO_GET_ATTRIBUTE, /**< Obtain the device attributes. */
UART_IO_SET_ATTRIBUTE, /**< Set the device attributes. */
UART_IO_SET_TRANSMODE, /**< Set the transmission mode. */
};
/**
* @brief Obtains the UART device handle.
*
* Before accessing the UART device, you must call this function to obtain the UART device handle.
*
* @param port Indicates the UART port.
*
* @return Returns the pointer to the UART device handle if the handle is obtained; returns NULL otherwise.
* @since 1.0
*/
DevHandle UartOpen(uint32_t port);
/**
* @brief Releases the UART device handle.
*
* If you no longer need to access the UART device, you should call this function to close its handle so as to
* release unused memory resources.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
*
* @since 1.0
*/
void UartClose(DevHandle handle);
/**
* @brief Reads data of a specified size from a UART device.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param data Indicates the pointer to the buffer for receiving the data.
* @param size Indicates the size of the data to read.
*
* @return Returns the size of the data that is successfully read; returns a negative number if the reading fails.
* @since 1.0
*/
int32_t UartRead(DevHandle handle, uint8_t *data, uint32_t size);
/**
* @brief Writes data of a specified size into a UART device.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param data Indicates the pointer to the data to write.
* @param size Indicates the size of the data to write.
*
* @return Returns 0 if the data is successfully written; returns a negative number otherwise.
* @since 1.0
*/
int32_t UartWrite(DevHandle handle, uint8_t *data, uint32_t size);
/**
* @brief Obtains the baud rate of the UART device.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param baudRate Indicates the pointer to the obtained baud rate.
*
* @return Returns 0 if the baud rate is obtained; returns a negative number otherwise.
* @since 1.0
*/
int32_t UartGetBaud(DevHandle handle, uint32_t *baudRate);
/**
* @brief Sets the baud rate for the UART device.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param baudRate Indicates the baud rate to set.
*
* @return Returns 0 if the setting is successful; returns a negative number otherwise.
* @since 1.0
*/
int32_t UartSetBaud(DevHandle handle, uint32_t baudRate);
/**
* @brief Obtains the UART attribute.
*
* UART attributes include data bits, stop bits, parity bit, CTS, RTS, and receiving and transmitting FIFO.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param attribute Indicates the pointer to the obtained UART attribute.
*
* @return Returns 0 if the UART attribute is obtained; returns a negative number otherwise.
* @since 1.0 */
int32_t UartGetAttribute(DevHandle handle, struct UartAttribute *attribute);
/**
* @brief Sets the UART attribute.
*
* UART attributes include data bits, stop bits, parity bit, CTS, RTS, and receiving and transmitting FIFO.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param attribute Indicates the pointer to the UART attribute to set.
*
* @return Returns 0 if the setting is successful; returns a negative number otherwise.
* @since 1.0
*/
int32_t UartSetAttribute(DevHandle handle, struct UartAttribute *attribute);
/**
* @brief Sets the UART transmission mode.
*
* @param handle Indicates the pointer to the UART device handle, which is obtained via {@link UartOpen}.
* @param mode Indicates a transmission mode enumerated in {@linkUartTransMode}.
*
* @return Returns 0 if the setting is successful; returns a negative number otherwise.
* @since 1.0
*/
int32_t UartSetTransMode(DevHandle handle, enum UartTransMode mode);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* PAL_UART_IF_H */
/** @} */