blob: f6d1d35eda2548999efaf8788227f631dc38875a [file] [log] [blame]
/*
* Copyright (c) 2016-2022 Arm Limited. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* \file uart_cmsdk_drv.h
* \brief Generic driver for ARM UART.
*/
#ifndef __UART_CMSDK_DRV_H__
#define __UART_CMSDK_DRV_H__
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ARM UART device configuration structure */
struct uart_cmsdk_dev_cfg_t
{
const uint32_t base; /*!< UART base address */
const uint32_t default_baudrate; /*!< Default baudrate */
};
/* ARM UART device data structure */
struct uart_cmsdk_dev_data_t
{
uint32_t state; /*!< Indicates if the uart driver
* is initialized and enabled
*/
uint32_t system_clk; /*!< System clock */
uint32_t baudrate; /*!< Baudrate */
};
/* ARM UART device structure */
struct uart_cmsdk_dev_t
{
const struct uart_cmsdk_dev_cfg_t * const cfg; /*!< UART configuration */
struct uart_cmsdk_dev_data_t * const data; /*!< UART data */
};
/* ARM UART enumeration types */
enum uart_cmsdk_error_t
{
UART_CMSDK_ERR_NONE = 0, /*!< No error */
UART_CMSDK_ERR_INVALID_ARG, /*!< Error invalid input argument */
UART_CMSDK_ERR_INVALID_BAUD, /*!< Invalid baudrate */
UART_CMSDK_ERR_NOT_INIT, /*!< Error UART not initialized */
UART_CMSDK_ERR_NOT_READY, /*!< Error UART not ready */
};
enum uart_cmsdk_irq_t
{
UART_CMSDK_IRQ_RX, /*!< RX interrupt source */
UART_CMSDK_IRQ_TX, /*!< TX interrupt source */
UART_CMSDK_IRQ_COMBINED /*!< RX-TX combined interrupt source */
};
/**
* \brief Initializes UART. It uses the default baudrate to configure
* the peripheral at this point.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
* \param[in] system_clk System clock used by the device.
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_init(struct uart_cmsdk_dev_t * dev, uint32_t system_clk);
/**
* \brief Sets the UART baudrate.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
* \param[in] baudrate New baudrate.
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_set_baudrate(struct uart_cmsdk_dev_t * dev, uint32_t baudrate);
/**
* \brief Gets the UART baudrate.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return Returns the UART baudrate.
*
* \note This function doesn't check if dev is NULL.
*/
uint32_t uart_cmsdk_get_baudrate(struct uart_cmsdk_dev_t * dev);
/**
* \brief Sets system clock.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
* \param[in] system_clk System clock used by the device.
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_set_clock(struct uart_cmsdk_dev_t * dev, uint32_t system_clk);
/**
* \brief Reads one byte from UART dev.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
* \param[in] byte Pointer to byte.
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note For better performance, this function doesn't check if dev and byte
* pointer are NULL, and if the driver is initialized.
*/
enum uart_cmsdk_error_t uart_cmsdk_read(struct uart_cmsdk_dev_t * dev, uint8_t * byte);
/**
* \brief Writes a byte to UART dev.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
* \param[in] byte Byte to write.
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note For better performance, this function doesn't check if dev is NULL and
* if the driver is initialized to have better performance.
*/
enum uart_cmsdk_error_t uart_cmsdk_write(struct uart_cmsdk_dev_t * dev, uint8_t byte);
/**
* \brief Enables TX interrupt.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_irq_tx_enable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Disables TX interrupt.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \note This function doesn't check if dev is NULL.
*/
void uart_cmsdk_irq_tx_disable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Verifies if Tx is ready to send more data.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return 1 if TX is ready, 0 otherwise.
*
* \note This function doesn't check if dev is NULL.
*/
uint32_t uart_cmsdk_tx_ready(struct uart_cmsdk_dev_t * dev);
/**
* \brief Enables RX interrupt.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_irq_rx_enable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Disables RX interrupt
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \note This function doesn't check if dev is NULL.
*/
void uart_cmsdk_irq_rx_disable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Verifies if Rx has data.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return 1 if RX has data, 0 otherwise.
*
* \note This function doesn't check if dev is NULL.
*/
uint32_t uart_cmsdk_rx_ready(struct uart_cmsdk_dev_t * dev);
/**
* \brief Clears UART interrupt.
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
* \param[in] irq IRQ source to clean \ref uart_cmsdk_irq_t
*
* \note This function doesn't check if dev is NULL.
*/
void uart_cmsdk_clear_interrupt(struct uart_cmsdk_dev_t * dev, enum uart_cmsdk_irq_t irq);
/**
* \brief Enables TX
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_tx_enable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Disables TX
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \note This function doesn't check if dev is NULL.
*/
void uart_cmsdk_tx_disable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Enables RX
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \return Returns error code as specified in \ref uart_cmsdk_error_t
*
* \note This function doesn't check if dev is NULL.
*/
enum uart_cmsdk_error_t uart_cmsdk_rx_enable(struct uart_cmsdk_dev_t * dev);
/**
* \brief Disables RX
*
* \param[in] dev UART device struct \ref uart_cmsdk_dev_t
*
* \note This function doesn't check if dev is NULL.
*/
void uart_cmsdk_rx_disable(struct uart_cmsdk_dev_t * dev);
#ifdef __cplusplus
}
#endif
#endif /* __UART_CMSDK_DRV_H__ */