115 lines
2.7 KiB
C
115 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2016 Open-RnD Sp. z o.o.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @brief Driver for UART port on STM32 family processor.
|
|
*
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_SERIAL_UART_STM32_H_
|
|
#define ZEPHYR_DRIVERS_SERIAL_UART_STM32_H_
|
|
|
|
#include <zephyr/drivers/pinctrl.h>
|
|
#include <zephyr/drivers/reset.h>
|
|
#include <zephyr/drivers/uart.h>
|
|
|
|
#include <stm32_ll_usart.h>
|
|
|
|
#define STM32_UART_DEFAULT_BAUDRATE 115200
|
|
#define STM32_UART_DEFAULT_PARITY UART_CFG_PARITY_NONE
|
|
#define STM32_UART_DEFAULT_STOP_BITS UART_CFG_STOP_BITS_1
|
|
#define STM32_UART_DEFAULT_DATA_BITS UART_CFG_DATA_BITS_8
|
|
|
|
/* device config */
|
|
struct uart_stm32_config {
|
|
/* USART instance */
|
|
USART_TypeDef *usart;
|
|
/* Reset controller device configuration */
|
|
const struct reset_dt_spec reset;
|
|
/* clock subsystem driving this peripheral */
|
|
const struct stm32_pclken *pclken;
|
|
/* number of clock subsystems */
|
|
size_t pclk_len;
|
|
/* switch to enable single wire / half duplex feature */
|
|
bool single_wire;
|
|
/* enable tx/rx pin swap */
|
|
bool tx_rx_swap;
|
|
/* enable rx pin inversion */
|
|
bool rx_invert;
|
|
/* enable tx pin inversion */
|
|
bool tx_invert;
|
|
/* enable de signal */
|
|
bool de_enable;
|
|
/* de signal assertion time in 1/16 of a bit */
|
|
uint8_t de_assert_time;
|
|
/* de signal deassertion time in 1/16 of a bit */
|
|
uint8_t de_deassert_time;
|
|
/* enable de pin inversion */
|
|
bool de_invert;
|
|
/* enable fifo */
|
|
bool fifo_enable;
|
|
/* pin muxing */
|
|
const struct pinctrl_dev_config *pcfg;
|
|
#if defined(CONFIG_UART_INTERRUPT_DRIVEN) || defined(CONFIG_UART_ASYNC_API) || \
|
|
defined(CONFIG_PM)
|
|
uart_irq_config_func_t irq_config_func;
|
|
#endif
|
|
#if defined(CONFIG_PM)
|
|
/* Device defined as wake-up source */
|
|
bool wakeup_source;
|
|
uint32_t wakeup_line;
|
|
#endif /* CONFIG_PM */
|
|
};
|
|
|
|
#ifdef CONFIG_UART_ASYNC_API
|
|
struct uart_dma_stream {
|
|
const struct device *dma_dev;
|
|
uint32_t dma_channel;
|
|
struct dma_config dma_cfg;
|
|
uint8_t priority;
|
|
bool src_addr_increment;
|
|
bool dst_addr_increment;
|
|
int fifo_threshold;
|
|
struct dma_block_config blk_cfg;
|
|
uint8_t *buffer;
|
|
size_t buffer_length;
|
|
size_t offset;
|
|
volatile size_t counter;
|
|
int32_t timeout;
|
|
struct k_work_delayable timeout_work;
|
|
bool enabled;
|
|
};
|
|
#endif
|
|
|
|
/* driver data */
|
|
struct uart_stm32_data {
|
|
/* clock device */
|
|
const struct device *clock;
|
|
/* uart config */
|
|
struct uart_config *uart_cfg;
|
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
|
uart_irq_callback_user_data_t user_cb;
|
|
void *user_data;
|
|
#endif
|
|
|
|
#ifdef CONFIG_UART_ASYNC_API
|
|
const struct device *uart_dev;
|
|
uart_callback_t async_cb;
|
|
void *async_user_data;
|
|
struct uart_dma_stream dma_rx;
|
|
struct uart_dma_stream dma_tx;
|
|
uint8_t *rx_next_buffer;
|
|
size_t rx_next_buffer_len;
|
|
#endif
|
|
#ifdef CONFIG_PM
|
|
bool tx_poll_stream_on;
|
|
bool tx_int_stream_on;
|
|
bool pm_policy_state_on;
|
|
#endif
|
|
};
|
|
|
|
#endif /* ZEPHYR_DRIVERS_SERIAL_UART_STM32_H_ */
|