mirror of
https://github.com/thelsing/knx.git
synced 2025-10-12 11:15:54 +02:00
git-subtree-dir: examples/knx-cc1310/coresdk_cc13xx_cc26xx git-subtree-split: 0d78d3280357416a5c0388148cda13717c9ffaa5
957 lines
35 KiB
C
957 lines
35 KiB
C
/*
|
|
* Copyright (c) 2015-2019, Texas Instruments Incorporated
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * 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.
|
|
*
|
|
* * Neither the name of Texas Instruments Incorporated 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 OWNER 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.
|
|
*/
|
|
/*!*****************************************************************************
|
|
* @file UART.h
|
|
* @brief Universal Asynchronous Receiver-Transmitter (UART) Driver
|
|
*
|
|
* To use the UART driver, ensure that the correct driver library for your
|
|
* device is linked in and include this header file as follows:
|
|
* @code
|
|
* #include <ti/drivers/UART.h>
|
|
* @endcode
|
|
*
|
|
* This module serves as the main interface for applications. Its purpose
|
|
* is to redirect the UART APIs to specific driver implementations
|
|
* which are specified using a pointer to a #UART_FxnTable.
|
|
*
|
|
* @anchor ti_drivers_UART_Overview
|
|
* # Overview
|
|
* A UART is used to translate data between the chip and a serial port.
|
|
* The UART driver simplifies reading and writing to any of the UART
|
|
* peripherals on the board, with multiple modes of operation and performance.
|
|
* These include blocking, non-blocking, and polling, as well as text/binary
|
|
* mode, echo and return characters.
|
|
*
|
|
* The UART driver interface provides device independent APIs, data types,
|
|
* and macros. The APIs in this driver serve as an interface to a typical RTOS
|
|
* application. The specific peripheral implementations are responsible for
|
|
* creating all the RTOS specific primitives to allow for thread-safe
|
|
* operation.
|
|
*
|
|
* <hr>
|
|
* @anchor ti_drivers_UART_Usage
|
|
* # Usage
|
|
*
|
|
* This documentation provides a basic @ref ti_drivers_UART_Synopsis
|
|
* "usage summary" and a set of @ref ti_drivers_UART_Examples "examples"
|
|
* in the form of commented code fragments. Detailed descriptions of the
|
|
* APIs are provided in subsequent sections.
|
|
*
|
|
* @anchor ti_drivers_UART_Synopsis
|
|
* ## Synopsis
|
|
* @anchor ti_drivers_UART_Synopsis_Code
|
|
* @code
|
|
* // Import the UART driver definitions
|
|
* #include <ti/drivers/UART.h>
|
|
*
|
|
* // One-time initialization of UART driver
|
|
* UART_init();
|
|
*
|
|
* // Initialize UART parameters
|
|
* UART_Params params;
|
|
* UART_Params_init(¶ms);
|
|
* params.baudRate = 9600;
|
|
* params.readMode = UART_MODE_BLOCKING;
|
|
* params.writeMode = UART_MODE_BLOCKING;
|
|
* params.readTimeout = UART_WAIT_FOREVER;
|
|
* params.writeTimeout = UART_WAIT_FOREVER;
|
|
*
|
|
* // Open the UART
|
|
* UART_Handle uart;
|
|
* uart = UART_open(Board_UART0, ¶ms);
|
|
*
|
|
* // Read from the UART
|
|
* int32_t readCount;
|
|
* uint8_t buffer[BUFSIZE];
|
|
* readCount = UART_read(uart, buffer, BUFSIZE);
|
|
*
|
|
* // Write to the UART
|
|
* UART_write(uart, buffer, BUFSIZE);
|
|
*
|
|
* // Close the UART
|
|
* UART_close(uart);
|
|
* @endcode
|
|
*
|
|
* <hr>
|
|
* @anchor ti_drivers_UART_Examples
|
|
* # Examples
|
|
* The following code example opens a UART instance, reads
|
|
* a byte from the UART, and then writes the byte back to the UART.
|
|
*
|
|
* @code
|
|
* char input;
|
|
* UART_Handle uart;
|
|
* UART_Params uartParams;
|
|
*
|
|
* // Initialize the UART driver. UART_init() must be called before
|
|
* // calling any other UART APIs.
|
|
* UART_init();
|
|
*
|
|
* // Create a UART with data processing off.
|
|
* UART_Params_init(&uartParams);
|
|
* uartParams.writeDataMode = UART_DATA_BINARY;
|
|
* uartParams.readDataMode = UART_DATA_BINARY;
|
|
* uartParams.readReturnMode = UART_RETURN_FULL;
|
|
* uartParams.readEcho = UART_ECHO_OFF;
|
|
* uartParams.baudRate = 115200;
|
|
*
|
|
* // Open an instance of the UART drivers
|
|
* uart = UART_open(Board_UART0, &uartParams);
|
|
*
|
|
* if (uart == NULL) {
|
|
* // UART_open() failed
|
|
* while (1);
|
|
* }
|
|
*
|
|
* // Loop forever echoing
|
|
* while (1) {
|
|
* UART_read(uart, &input, 1);
|
|
* UART_write(uart, &input, 1);
|
|
* }
|
|
* @endcode
|
|
*
|
|
* Details for the example code above are described in the following
|
|
* subsections.
|
|
*
|
|
* ### Opening the UART Driver #
|
|
*
|
|
* Opening a UART requires four steps:
|
|
* 1. Create and initialize a UART_Params structure.
|
|
* 2. Fill in the desired parameters.
|
|
* 3. Call UART_open(), passing the index of the UART in the UART_config
|
|
* structure, and the address of the UART_Params structure. The
|
|
* UART instance is specified by the index in the UART_config structure.
|
|
* 4. Check that the UART handle returned by UART_open() is non-NULL,
|
|
* and save it. The handle will be used to read and write to the
|
|
* UART you just opened.
|
|
*
|
|
* Only one UART index can be used at a time; calling UART_open() a second
|
|
* time with the same index previosly passed to UART_open() will result in
|
|
* an error. You can, though, re-use the index if the instance is closed
|
|
* via UART_close().
|
|
* In the example code, Board_UART0 is passed to UART_open(). This macro
|
|
* is defined in the example's Board.h file.
|
|
*
|
|
*
|
|
* ### Modes of Operation #
|
|
*
|
|
* The UART driver can operate in blocking mode or callback mode, by
|
|
* setting the writeMode and readMode parameters passed to UART_open().
|
|
* If these parameters are not set, as in the example code, the UART
|
|
* driver defaults to blocking mode. Options for the writeMode and
|
|
* readMode parameters are #UART_MODE_BLOCKING and #UART_MODE_CALLBACK:
|
|
*
|
|
* - #UART_MODE_BLOCKING uses a semaphore to block while data is being sent.
|
|
* The context of calling UART_read() or UART_write() must be a Task when
|
|
* using #UART_MODE_BLOCKING. The UART_write() or UART_read() call
|
|
* will block until all data is sent or received, or the write timeout or
|
|
* read timeout expires, whichever happens first.
|
|
*
|
|
* - #UART_MODE_CALLBACK is non-blocking and UART_read() and UART_write()
|
|
* will return while data is being sent in the context of a hardware
|
|
* interrupt. When the read or write finishes, the UART driver will call
|
|
* the user's callback function. In some cases, the UART data transfer
|
|
* may have been canceled, or a newline may have been received, so the
|
|
* number of bytes sent/received are passed to the callback function. Your
|
|
* implementation of the callback function can use this information
|
|
* as needed. Since the user's callback may be called in the context of an
|
|
* ISR, the callback function must not make any RTOS blocking calls.
|
|
* The buffer passed to UART_write() in #UART_MODE_CALLBACK is not copied.
|
|
* The buffer must remain coherent until all the characters have been sent
|
|
* (ie until the tx callback has been called with a byte count equal to
|
|
* that passed to UART_write()).
|
|
*
|
|
* The example sets the writeDataMode and readDataMode parameters to
|
|
* #UART_DATA_BINARY. Options for these parameters are #UART_DATA_BINARY
|
|
* and #UART_DATA_TEXT:
|
|
*
|
|
* - #UART_DATA_BINARY: The data is passed as is, without processing.
|
|
*
|
|
* - #UART_DATA_TEXT: Write actions add a carriage return before a
|
|
* newline character, and read actions replace a return with a newline.
|
|
* This effectively treats all device line endings as LF and all host
|
|
* PC line endings as CRLF.
|
|
*
|
|
* Other parameters set by the example are readReturnMode and readEcho.
|
|
* Options for the readReturnMode parameter are #UART_RETURN_FULL and
|
|
* #UART_RETURN_NEWLINE:
|
|
*
|
|
* - #UART_RETURN_FULL: The read action unblocks or returns when the buffer
|
|
* is full.
|
|
* - #UART_RETURN_NEWLINE: The read action unblocks or returns when a
|
|
* newline character is read, before the buffer is full.
|
|
*
|
|
* Options for the readEcho parameter are #UART_ECHO_OFF and #UART_ECHO_ON.
|
|
* This parameter determines whether the driver echoes data back to the
|
|
* UART. When echo is turned on, each character that is read by the target
|
|
* is written back, independent of any write operations. If data is
|
|
* received in the middle of a write and echo is turned on, the echoed
|
|
* characters will be mixed in with the write data.
|
|
*
|
|
* ### Reading and Writing data #
|
|
*
|
|
* The example code reads one byte frome the UART instance, and then writes
|
|
* one byte back to the same instance:
|
|
*
|
|
* @code
|
|
* UART_read(uart, &input, 1);
|
|
* UART_write(uart, &input, 1);
|
|
* @endcode
|
|
*
|
|
* The UART driver allows full duplex data transfers. Therefore, it is
|
|
* possible to call UART_read() and UART_write() at the same time (for
|
|
* either blocking or callback modes). It is not possible, however,
|
|
* to issue multiple concurrent operations in the same direction.
|
|
* For example, if one thread calls UART_read(uart0, buffer0...),
|
|
* any other thread attempting UART_read(uart0, buffer1...) will result in
|
|
* an error of UART_STATUS_ERROR, until all the data from the first UART_read()
|
|
* has been transferred to buffer0. This applies to both blocking and
|
|
* and callback modes. So applications must either synchronize
|
|
* UART_read() (or UART_write()) calls that use the same UART handle, or
|
|
* check for the UART_STATUS_ERROR return code indicating that a transfer is
|
|
* still ongoing.
|
|
*
|
|
* <hr>
|
|
* @anchor ti_drivers_UART_Configuration
|
|
* # Configuration
|
|
*
|
|
* Refer to the @ref driver_configuration "Driver's Configuration" section
|
|
* for driver configuration information.
|
|
* <hr>
|
|
*
|
|
* ============================================================================
|
|
*/
|
|
|
|
#ifndef ti_drivers_UART__include
|
|
#define ti_drivers_UART__include
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
/**
|
|
* @defgroup UART_CONTROL UART_control command and status codes
|
|
* These UART macros are reservations for UART.h
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* Common UART_control command code reservation offset.
|
|
* UART driver implementations should offset command codes with
|
|
* UART_CMD_RESERVED growing positively
|
|
*
|
|
* Example implementation specific command codes:
|
|
* @code
|
|
* #define UARTXYZ_CMD_COMMAND0 UART_CMD_RESERVED + 0
|
|
* #define UARTXYZ_CMD_COMMAND1 UART_CMD_RESERVED + 1
|
|
* @endcode
|
|
*/
|
|
#define UART_CMD_RESERVED (32)
|
|
|
|
/*!
|
|
* Common UART_control status code reservation offset.
|
|
* UART driver implementations should offset status codes with
|
|
* UART_STATUS_RESERVED growing negatively.
|
|
*
|
|
* Example implementation specific status codes:
|
|
* @code
|
|
* #define UARTXYZ_STATUS_ERROR0 UART_STATUS_RESERVED - 0
|
|
* #define UARTXYZ_STATUS_ERROR1 UART_STATUS_RESERVED - 1
|
|
* #define UARTXYZ_STATUS_ERROR2 UART_STATUS_RESERVED - 2
|
|
* @endcode
|
|
*/
|
|
#define UART_STATUS_RESERVED (-32)
|
|
|
|
/**
|
|
* @defgroup UART_STATUS Status Codes
|
|
* UART_STATUS_* macros are general status codes returned by UART_control()
|
|
* @{
|
|
* @ingroup UART_CONTROL
|
|
*/
|
|
|
|
/*!
|
|
* @brief Successful status code returned by UART_control().
|
|
*
|
|
* UART_control() returns UART_STATUS_SUCCESS if the control code was executed
|
|
* successfully.
|
|
*/
|
|
#define UART_STATUS_SUCCESS (0)
|
|
|
|
/*!
|
|
* @brief Generic error status code returned by UART_control().
|
|
*
|
|
* UART_control() returns UART_STATUS_ERROR if the control code was not executed
|
|
* successfully.
|
|
*/
|
|
#define UART_STATUS_ERROR (-1)
|
|
|
|
/*!
|
|
* @brief An error status code returned by UART_control() for undefined
|
|
* command codes.
|
|
*
|
|
* UART_control() returns UART_STATUS_UNDEFINEDCMD if the control code is not
|
|
* recognized by the driver implementation.
|
|
*/
|
|
#define UART_STATUS_UNDEFINEDCMD (-2)
|
|
/** @}*/
|
|
|
|
/**
|
|
* @defgroup UART_CMD Command Codes
|
|
* UART_CMD_* macros are general command codes for UART_control(). Not all UART
|
|
* driver implementations support these command codes.
|
|
* @{
|
|
* @ingroup UART_CONTROL
|
|
*/
|
|
|
|
/*!
|
|
* @brief Command code used by UART_control() to read the next unsigned char.
|
|
*
|
|
* This command is used to read the next unsigned char from the UART's circular
|
|
* buffer without removing it. With this command code, @b arg is a pointer to an
|
|
* integer. @b *arg contains the next @c unsigned @c char read if data is
|
|
* present, else @b *arg is set to #UART_STATUS_ERROR.
|
|
*/
|
|
#define UART_CMD_PEEK (0)
|
|
|
|
/*!
|
|
* @brief Command code used by UART_control() to determine if the read buffer
|
|
* is empty.
|
|
*
|
|
* This command is used to determine if there are any unsigned chars available
|
|
* to read from the UART's circular buffer using UART_read(). With this command
|
|
* code, @b arg is a pointer to a @c bool. @b *arg contains @c true if data is
|
|
* available, else @c false.
|
|
*/
|
|
#define UART_CMD_ISAVAILABLE (1)
|
|
|
|
/*!
|
|
* @brief Command code used by UART_control() to determine how many unsigned
|
|
* chars are in the read buffer.
|
|
*
|
|
* This command is used to determine how many @c unsigned @c chars are available
|
|
* to read from the UART's circular buffer using UART_read(). With this command
|
|
* code, @b arg is a pointer to an @a integer. @b *arg contains the number of
|
|
* @c unsigned @c chars available to read.
|
|
*/
|
|
#define UART_CMD_GETRXCOUNT (2)
|
|
|
|
/*!
|
|
* @brief Command code used by UART_control() to enable data receive by the
|
|
* UART.
|
|
*
|
|
* This command is used to enable the UART in such a way that it stores received
|
|
* unsigned chars into the circular buffer. For drivers that support power
|
|
* management, this typically means that the UART will set a power constraint
|
|
* while receive is enabled. UART_open() will always have this option
|
|
* enabled. With this command code, @b arg is @a don't @a care.
|
|
*/
|
|
#define UART_CMD_RXENABLE (3)
|
|
|
|
/*!
|
|
* @brief Command code used by UART_control() to disable data received by the
|
|
* UART.
|
|
*
|
|
* This command is used to disable the UART in such a way that ignores the data
|
|
* it receives. For drivers that support power management, this typically means
|
|
* that the driver will release any power constraints, to permit the system to
|
|
* enter low power modes. With this command code, @b arg is @a don't @a care.
|
|
*
|
|
* @warning A call to UART_read() does @b NOT re-enable receive.
|
|
*/
|
|
#define UART_CMD_RXDISABLE (4)
|
|
/** @}*/
|
|
|
|
/** @}*/
|
|
|
|
#define UART_ERROR (UART_STATUS_ERROR)
|
|
|
|
/*!
|
|
* @brief Wait forever define
|
|
*/
|
|
#define UART_WAIT_FOREVER (~(0U))
|
|
|
|
/*!
|
|
* @brief A handle that is returned from a UART_open() call.
|
|
*/
|
|
typedef struct UART_Config_ *UART_Handle;
|
|
|
|
/*!
|
|
* @brief The definition of a callback function used by the UART driver
|
|
* when used in #UART_MODE_CALLBACK
|
|
* The callback can occur in task or HWI context.
|
|
*
|
|
* @param UART_Handle UART_Handle
|
|
*
|
|
* @param buf Pointer to read/write buffer
|
|
*
|
|
* @param count Number of elements read/written
|
|
*/
|
|
typedef void (*UART_Callback) (UART_Handle handle, void *buf, size_t count);
|
|
|
|
/*!
|
|
* @brief UART mode settings
|
|
*
|
|
* This enum defines the read and write modes for the configured UART.
|
|
*/
|
|
typedef enum UART_Mode_ {
|
|
/*!
|
|
* Uses a semaphore to block while data is being sent. Context of the call
|
|
* must be a Task.
|
|
*/
|
|
UART_MODE_BLOCKING,
|
|
|
|
/*!
|
|
* Non-blocking and will return immediately. When UART_write() or
|
|
* UART_read() has finished, the callback function is called from either
|
|
* the caller's context or from an interrupt context.
|
|
*/
|
|
UART_MODE_CALLBACK
|
|
} UART_Mode;
|
|
|
|
/*!
|
|
* @brief UART return mode settings
|
|
*
|
|
* This enumeration defines the return modes for UART_read() and
|
|
* UART_readPolling(). This mode only functions when in #UART_DATA_TEXT mode.
|
|
*
|
|
* #UART_RETURN_FULL unblocks or performs a callback when the read buffer has
|
|
* been filled.
|
|
* #UART_RETURN_NEWLINE unblocks or performs a callback whenever a newline
|
|
* character has been received.
|
|
*
|
|
* UART operation | UART_RETURN_FULL | UART_RETURN_NEWLINE |
|
|
* -------------- | ---------------- | ------------------- |
|
|
* UART_read() | Returns when buffer is full | Returns when buffer is full or newline was read |
|
|
* UART_write() | Sends data as is | Sends data with an additional newline at the end |
|
|
*
|
|
* @pre UART driver must be used in #UART_DATA_TEXT mode.
|
|
*/
|
|
typedef enum UART_ReturnMode_ {
|
|
/*! Unblock/callback when buffer is full. */
|
|
UART_RETURN_FULL,
|
|
|
|
/*! Unblock/callback when newline character is received. */
|
|
UART_RETURN_NEWLINE
|
|
} UART_ReturnMode;
|
|
|
|
/*!
|
|
* @brief UART data mode settings
|
|
*
|
|
* This enumeration defines the data mode for reads and writes.
|
|
*
|
|
* In #UART_DATA_BINARY, data is passed as is, with no processing.
|
|
*
|
|
* In #UART_DATA_TEXT mode, the driver will examine the #UART_ReturnMode
|
|
* value, to determine whether or not to unblock/callback when a newline
|
|
* is received. Read actions replace a carriage return with a newline,
|
|
* and write actions add a carriage return before a newline. This
|
|
* effectively treats all device line endings as LF, and all host PC line
|
|
* endings as CRLF.
|
|
*/
|
|
typedef enum UART_DataMode_ {
|
|
UART_DATA_BINARY = 0, /*!< Data is not processed */
|
|
UART_DATA_TEXT = 1 /*!< Data is processed according to above */
|
|
} UART_DataMode;
|
|
|
|
/*!
|
|
* @brief UART echo settings
|
|
*
|
|
* This enumeration defines if the driver will echo data when uses in
|
|
* #UART_DATA_TEXT mode. This only applies to data received by the UART.
|
|
*
|
|
* #UART_ECHO_ON will echo back characters it received while in #UART_DATA_TEXT
|
|
* mode.
|
|
* #UART_ECHO_OFF will not echo back characters it received in #UART_DATA_TEXT
|
|
* mode.
|
|
*
|
|
* @pre UART driver must be used in #UART_DATA_TEXT mode.
|
|
*/
|
|
typedef enum UART_Echo_ {
|
|
UART_ECHO_OFF = 0, /*!< Data is not echoed */
|
|
UART_ECHO_ON = 1 /*!< Data is echoed */
|
|
} UART_Echo;
|
|
|
|
/*!
|
|
* @brief UART data length settings
|
|
*
|
|
* This enumeration defines the UART data lengths.
|
|
*/
|
|
typedef enum UART_LEN_ {
|
|
UART_LEN_5 = 0, /*!< Data length is 5 bits */
|
|
UART_LEN_6 = 1, /*!< Data length is 6 bits */
|
|
UART_LEN_7 = 2, /*!< Data length is 7 bits */
|
|
UART_LEN_8 = 3 /*!< Data length is 8 bits */
|
|
} UART_LEN;
|
|
|
|
/*!
|
|
* @brief UART stop bit settings
|
|
*
|
|
* This enumeration defines the UART stop bits.
|
|
*/
|
|
typedef enum UART_STOP_ {
|
|
UART_STOP_ONE = 0, /*!< One stop bit */
|
|
UART_STOP_TWO = 1 /*!< Two stop bits */
|
|
} UART_STOP;
|
|
|
|
/*!
|
|
* @brief UART parity type settings
|
|
*
|
|
* This enumeration defines the UART parity types.
|
|
*/
|
|
typedef enum UART_PAR_ {
|
|
UART_PAR_NONE = 0, /*!< No parity */
|
|
UART_PAR_EVEN = 1, /*!< Parity bit is even */
|
|
UART_PAR_ODD = 2, /*!< Parity bit is odd */
|
|
UART_PAR_ZERO = 3, /*!< Parity bit is always zero */
|
|
UART_PAR_ONE = 4 /*!< Parity bit is always one */
|
|
} UART_PAR;
|
|
|
|
/*!
|
|
* @brief UART Parameters
|
|
*
|
|
* UART parameters are used with the UART_open() call. Default values for
|
|
* these parameters are set using UART_Params_init().
|
|
*
|
|
* @sa UART_Params_init()
|
|
*/
|
|
typedef struct UART_Params_ {
|
|
UART_Mode readMode; /*!< Mode for all read calls */
|
|
UART_Mode writeMode; /*!< Mode for all write calls */
|
|
uint32_t readTimeout; /*!< Timeout for read calls in blocking mode. */
|
|
uint32_t writeTimeout; /*!< Timeout for write calls in blocking mode. */
|
|
UART_Callback readCallback; /*!< Pointer to read callback function for callback mode. */
|
|
UART_Callback writeCallback; /*!< Pointer to write callback function for callback mode. */
|
|
UART_ReturnMode readReturnMode; /*!< Receive return mode */
|
|
UART_DataMode readDataMode; /*!< Type of data being read */
|
|
UART_DataMode writeDataMode; /*!< Type of data being written */
|
|
UART_Echo readEcho; /*!< Echo received data back */
|
|
uint32_t baudRate; /*!< Baud rate for UART */
|
|
UART_LEN dataLength; /*!< Data length for UART */
|
|
UART_STOP stopBits; /*!< Stop bits for UART */
|
|
UART_PAR parityType; /*!< Parity bit type for UART */
|
|
void *custom; /*!< Custom argument used by driver implementation */
|
|
} UART_Params;
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_CloseFxn().
|
|
*/
|
|
typedef void (*UART_CloseFxn) (UART_Handle handle);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_ControlFxn().
|
|
*/
|
|
typedef int_fast16_t (*UART_ControlFxn) (UART_Handle handle, uint_fast16_t cmd, void *arg);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_InitFxn().
|
|
*/
|
|
typedef void (*UART_InitFxn) (UART_Handle handle);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_OpenFxn().
|
|
*/
|
|
typedef UART_Handle (*UART_OpenFxn) (UART_Handle handle, UART_Params *params);
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_ReadFxn().
|
|
*/
|
|
typedef int_fast32_t (*UART_ReadFxn) (UART_Handle handle, void *buffer,
|
|
size_t size);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_ReadPollingFxn().
|
|
*/
|
|
typedef int_fast32_t (*UART_ReadPollingFxn) (UART_Handle handle, void *buffer,
|
|
size_t size);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_ReadCancelFxn().
|
|
*/
|
|
typedef void (*UART_ReadCancelFxn) (UART_Handle handle);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_WriteFxn().
|
|
*/
|
|
typedef int_fast32_t (*UART_WriteFxn) (UART_Handle handle, const void *buffer,
|
|
size_t size);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_WritePollingFxn().
|
|
*/
|
|
typedef int_fast32_t (*UART_WritePollingFxn) (UART_Handle handle,
|
|
const void *buffer, size_t size);
|
|
|
|
/*!
|
|
* @brief A function pointer to a driver specific implementation of
|
|
* UART_WriteCancelFxn().
|
|
*/
|
|
typedef void (*UART_WriteCancelFxn) (UART_Handle handle);
|
|
|
|
/*!
|
|
* @brief The definition of a UART function table that contains the
|
|
* required set of functions to control a specific UART driver
|
|
* implementation.
|
|
*/
|
|
typedef struct UART_FxnTable_ {
|
|
/*! Function to close the specified peripheral */
|
|
UART_CloseFxn closeFxn;
|
|
|
|
/*! Function to implementation specific control function */
|
|
UART_ControlFxn controlFxn;
|
|
|
|
/*! Function to initialize the given data object */
|
|
UART_InitFxn initFxn;
|
|
|
|
/*! Function to open the specified peripheral */
|
|
UART_OpenFxn openFxn;
|
|
|
|
/*! Function to read from the specified peripheral */
|
|
UART_ReadFxn readFxn;
|
|
|
|
/*! Function to read via polling from the specified peripheral */
|
|
UART_ReadPollingFxn readPollingFxn;
|
|
|
|
/*! Function to cancel a read from the specified peripheral */
|
|
UART_ReadCancelFxn readCancelFxn;
|
|
|
|
/*! Function to write from the specified peripheral */
|
|
UART_WriteFxn writeFxn;
|
|
|
|
/*! Function to write via polling from the specified peripheral */
|
|
UART_WritePollingFxn writePollingFxn;
|
|
|
|
/*! Function to cancel a write from the specified peripheral */
|
|
UART_WriteCancelFxn writeCancelFxn;
|
|
} UART_FxnTable;
|
|
|
|
/*!
|
|
* @brief UART Global configuration
|
|
*
|
|
* The UART_Config structure contains a set of pointers used to characterize
|
|
* the UART driver implementation.
|
|
*
|
|
* This structure needs to be defined before calling UART_init() and it must
|
|
* not be changed thereafter.
|
|
*
|
|
* @sa UART_init()
|
|
*/
|
|
typedef struct UART_Config_ {
|
|
/*! Pointer to a table of driver-specific implementations of UART APIs */
|
|
UART_FxnTable const *fxnTablePtr;
|
|
|
|
/*! Pointer to a driver specific data object */
|
|
void *object;
|
|
|
|
/*! Pointer to a driver specific hardware attributes structure */
|
|
void const *hwAttrs;
|
|
} UART_Config;
|
|
|
|
/*!
|
|
* @brief Function to close a UART peripheral specified by the UART handle
|
|
*
|
|
* @pre UART_open() has been called.
|
|
* @pre Ongoing asynchronous read or write have been canceled using
|
|
* UART_readCancel() or UART_writeCancel() respectively.
|
|
*
|
|
* @param handle A #UART_Handle returned from UART_open()
|
|
*
|
|
* @sa UART_open()
|
|
*/
|
|
extern void UART_close(UART_Handle handle);
|
|
|
|
/*!
|
|
* @brief Function performs implementation specific features on a given
|
|
* #UART_Handle.
|
|
*
|
|
* Commands for %UART_control() can originate from UART.h or from implementation
|
|
* specific UART*.h (_UARTCC26XX.h_, _UARTMSP432.h_, etc.. ) files.
|
|
* While commands from UART.h are API portable across driver implementations,
|
|
* not all implementations may support all these commands.
|
|
* Conversely, commands from driver implementation specific UART*.h files add
|
|
* unique driver capabilities but are not API portable across all UART driver
|
|
* implementations.
|
|
*
|
|
* Commands supported by UART.h follow a UART_CMD_\<cmd\> naming
|
|
* convention.<br>
|
|
* Commands supported by UART*.h follow a UART*_CMD_\<cmd\> naming
|
|
* convention.<br>
|
|
* Each control command defines @b arg differently. The types of @b arg are
|
|
* documented with each command.
|
|
*
|
|
* See @ref UART_CMD "UART_control command codes" for command codes.
|
|
*
|
|
* See @ref UART_STATUS "UART_control return status codes" for status codes.
|
|
*
|
|
* @pre UART_open() has to be called.
|
|
*
|
|
* @param handle A UART handle returned from UART_open()
|
|
*
|
|
* @param cmd UART.h or UART*.h commands.
|
|
*
|
|
* @param arg An optional R/W (read/write) command argument
|
|
* accompanied with cmd
|
|
*
|
|
* @return Implementation specific return codes. Negative values indicate
|
|
* unsuccessful operations.
|
|
*
|
|
* @sa UART_open()
|
|
*/
|
|
extern int_fast16_t UART_control(UART_Handle handle, uint_fast16_t cmd, void *arg);
|
|
|
|
/*!
|
|
* @brief Function to initialize the UART module
|
|
*
|
|
* @pre The UART_config structure must exist and be persistent before this
|
|
* function can be called. This function must also be called before
|
|
* any other UART driver APIs.
|
|
*/
|
|
extern void UART_init(void);
|
|
|
|
/*!
|
|
* @brief Function to initialize a given UART peripheral
|
|
*
|
|
* Function to initialize a given UART peripheral specified by the
|
|
* particular index value.
|
|
*
|
|
* @pre UART_init() has been called
|
|
*
|
|
* @param index Logical peripheral number for the UART indexed into
|
|
* the UART_config table
|
|
*
|
|
* @param params Pointer to a parameter block. If NULL, default
|
|
* parameter values will be used. All the fields in
|
|
* this structure are RO (read-only).
|
|
*
|
|
* @return A #UART_Handle upon success. NULL if an error occurs, or if the
|
|
* indexed UART peripheral is already opened.
|
|
*
|
|
* @sa UART_init()
|
|
* @sa UART_close()
|
|
*/
|
|
extern UART_Handle UART_open(uint_least8_t index, UART_Params *params);
|
|
|
|
/*!
|
|
* @brief Function to initialize the UART_Params struct to its defaults
|
|
*
|
|
* @param params An pointer to UART_Params structure for
|
|
* initialization
|
|
*
|
|
* Defaults values are:
|
|
* readMode = UART_MODE_BLOCKING;
|
|
* writeMode = UART_MODE_BLOCKING;
|
|
* readTimeout = UART_WAIT_FOREVER;
|
|
* writeTimeout = UART_WAIT_FOREVER;
|
|
* readCallback = NULL;
|
|
* writeCallback = NULL;
|
|
* readReturnMode = UART_RETURN_NEWLINE;
|
|
* readDataMode = UART_DATA_TEXT;
|
|
* writeDataMode = UART_DATA_TEXT;
|
|
* readEcho = UART_ECHO_ON;
|
|
* baudRate = 115200;
|
|
* dataLength = UART_LEN_8;
|
|
* stopBits = UART_STOP_ONE;
|
|
* parityType = UART_PAR_NONE;
|
|
*/
|
|
extern void UART_Params_init(UART_Params *params);
|
|
|
|
/*!
|
|
* @brief Function that writes data to a UART with interrupts enabled.
|
|
*
|
|
* %UART_write() writes data from a memory buffer to the UART interface.
|
|
* The source is specified by \a buffer and the number of bytes to write
|
|
* is given by \a size.
|
|
*
|
|
* In #UART_MODE_BLOCKING, UART_write() blocks task execution until all
|
|
* the data in buffer has been written.
|
|
*
|
|
* In #UART_MODE_CALLBACK, %UART_write() does not block task execution.
|
|
* Instead, a callback function specified by UART_Params::writeCallback is
|
|
* called when the transfer is finished. The buffer passed to UART_write()
|
|
* in #UART_MODE_CALLBACK is not copied. The buffer must remain coherent
|
|
* until all the characters have been sent (ie until the tx callback has
|
|
* been called with a byte count equal to that passed to UART_write()).
|
|
* The callback function can occur in the caller's task context or in a HWI or
|
|
* SWI context, depending on the device implementation.
|
|
* An unfinished asynchronous write operation must always be canceled using
|
|
* UART_writeCancel() before calling UART_close().
|
|
*
|
|
* %UART_write() is mutually exclusive to UART_writePolling(). For an opened
|
|
* UART peripheral, either UART_write() or UART_writePolling() can be used,
|
|
* but not both.
|
|
*
|
|
* @warning Do not call %UART_write() from its own callback function when in
|
|
* #UART_MODE_CALLBACK.
|
|
*
|
|
* @sa UART_writePolling()
|
|
*
|
|
* @param handle A #UART_Handle returned by UART_open()
|
|
*
|
|
* @param buffer A read-only pointer to buffer containing data to
|
|
* be written to the UART
|
|
*
|
|
* @param size The number of bytes in the buffer that should be written
|
|
* to the UART
|
|
*
|
|
* @return Returns the number of bytes that have been written to the UART.
|
|
* If an error occurs, #UART_STATUS_ERROR is returned.
|
|
* In #UART_MODE_CALLBACK mode, the return value is always 0.
|
|
*/
|
|
extern int_fast32_t UART_write(UART_Handle handle, const void *buffer, size_t size);
|
|
|
|
/*!
|
|
* @brief Function that writes data to a UART, polling the peripheral to
|
|
* wait until new data can be written. Usage of this API is mutually
|
|
* exclusive with usage of UART_write().
|
|
*
|
|
* This function initiates an operation to write data to a UART controller.
|
|
*
|
|
* UART_writePolling() will not return until all the data was written to the
|
|
* UART (or to its FIFO if applicable).
|
|
*
|
|
* @sa UART_write()
|
|
*
|
|
* @param handle A #UART_Handle returned by UART_open()
|
|
*
|
|
* @param buffer A read-only pointer to the buffer containing the data to
|
|
* be written to the UART
|
|
*
|
|
* @param size The number of bytes in the buffer that should be written
|
|
* to the UART
|
|
*
|
|
* @return Returns the number of bytes that have been written to the UART.
|
|
* If an error occurs, #UART_STATUS_ERROR is returned.
|
|
*/
|
|
extern int_fast32_t UART_writePolling(UART_Handle handle, const void *buffer, size_t size);
|
|
|
|
/*!
|
|
* @brief Function that cancels a UART_write() function call.
|
|
*
|
|
* This function cancels an asynchronous UART_write() operation and is only
|
|
* applicable in #UART_MODE_CALLBACK.
|
|
* UART_writeCancel() calls the registered TX callback function no matter how many bytes
|
|
* were sent. It is the application's responsibility to check the count argument in
|
|
* the callback function and handle cases where only a subset of the bytes were sent.
|
|
*
|
|
* @param handle A #UART_Handle returned by UART_open()
|
|
*/
|
|
extern void UART_writeCancel(UART_Handle handle);
|
|
|
|
/*!
|
|
* @brief Function that reads data from a UART with interrupt enabled.
|
|
*
|
|
* %UART_read() reads data from a UART controller. The destination is specified
|
|
* by \a buffer and the number of bytes to read is given by \a size.
|
|
*
|
|
* In #UART_MODE_BLOCKING, %UART_read() blocks task execution until all
|
|
* the data in buffer has been read.
|
|
*
|
|
* In #UART_MODE_CALLBACK, %UART_read() does not block task execution.
|
|
* Instead, a callback function specified by UART_Params::readCallback
|
|
* is called when the transfer is finished.
|
|
* The callback function can occur in the caller's context or in HWI or SWI
|
|
* context, depending on the device-specific implementation.
|
|
* An unfinished asynchronous read operation must always be canceled using
|
|
* UART_readCancel() before calling UART_close().
|
|
*
|
|
* %UART_read() is mutually exclusive to UART_readPolling(). For an opened
|
|
* UART peripheral, either %UART_read() or UART_readPolling() can be used,
|
|
* but not both.
|
|
*
|
|
* @warning Do not call %UART_read() from its own callback function when in
|
|
* #UART_MODE_CALLBACK.
|
|
*
|
|
* @sa UART_readPolling()
|
|
*
|
|
* @param handle A #UART_Handle returned by UART_open()
|
|
*
|
|
* @param buffer A pointer to an empty buffer to which
|
|
* received data should be written
|
|
*
|
|
* @param size The number of bytes to be written into buffer
|
|
*
|
|
* @return Returns the number of bytes that have been read from the UART,
|
|
* #UART_STATUS_ERROR on an error.
|
|
*/
|
|
extern int_fast32_t UART_read(UART_Handle handle, void *buffer, size_t size);
|
|
|
|
/*!
|
|
* @brief Function that reads data from a UART without interrupts. This API
|
|
* must be used mutually exclusive with UART_read().
|
|
*
|
|
* This function initiates an operation to read data from a UART peripheral.
|
|
*
|
|
* %UART_readPolling() will not return until size data was read to the UART.
|
|
*
|
|
* @sa UART_read()
|
|
*
|
|
* @param handle A #UART_Handle returned by UART_open()
|
|
*
|
|
* @param buffer A pointer to an empty buffer in which
|
|
* received data should be written to
|
|
*
|
|
* @param size The number of bytes to be written into buffer
|
|
*
|
|
* @return Returns the number of bytes that have been read from the UART,
|
|
* #UART_STATUS_ERROR on an error.
|
|
*/
|
|
extern int_fast32_t UART_readPolling(UART_Handle handle, void *buffer, size_t size);
|
|
|
|
/*!
|
|
* @brief Function that cancels a UART_read() function call.
|
|
*
|
|
* This function cancels an asynchronous UART_read() operation and is only
|
|
* applicable in #UART_MODE_CALLBACK.
|
|
* UART_readCancel() calls the registered RX callback function no matter how many bytes
|
|
* were received. It is the application's responsibility to check the count argument in
|
|
* the callback function and handle cases where only a subset of the bytes were received.
|
|
*
|
|
* @param handle A #UART_Handle returned by UART_open()
|
|
*/
|
|
extern void UART_readCancel(UART_Handle handle);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ti_drivers_UART__include */
|