git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2090 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
d7e91ec701
commit
8c836a17ff
|
@ -20,6 +20,7 @@
|
|||
/**
|
||||
* @file STM32/spi_lld.c
|
||||
* @brief STM32 SPI subsystem low level driver source.
|
||||
*
|
||||
* @addtogroup STM32_SPI
|
||||
* @{
|
||||
*/
|
||||
|
@ -381,14 +382,13 @@ void spi_lld_ignore(SPIDriver *spip, size_t n) {
|
|||
/**
|
||||
* @brief Exchanges data on the SPI bus.
|
||||
* @details This function performs a simultaneous transmit/receive operation.
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below or
|
||||
* equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*
|
||||
* @param[in] spip pointer to the @p SPIDriver object
|
||||
* @param[in] n number of words to be exchanged
|
||||
* @param[in] txbuf the pointer to the transmit buffer
|
||||
* @param[out] rxbuf the pointer to the receive buffer
|
||||
*
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below or
|
||||
* equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*/
|
||||
void spi_lld_exchange(SPIDriver *spip, size_t n,
|
||||
const void *txbuf, void *rxbuf) {
|
||||
|
@ -400,13 +400,12 @@ void spi_lld_exchange(SPIDriver *spip, size_t n,
|
|||
|
||||
/**
|
||||
* @brief Sends data ever the SPI bus.
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below or
|
||||
* equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*
|
||||
* @param[in] spip pointer to the @p SPIDriver object
|
||||
* @param[in] n number of words to send
|
||||
* @param[in] txbuf the pointer to the transmit buffer
|
||||
*
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below or
|
||||
* equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*/
|
||||
void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
|
||||
|
||||
|
@ -417,13 +416,12 @@ void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf) {
|
|||
|
||||
/**
|
||||
* @brief Receives data from the SPI bus.
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below or
|
||||
* equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*
|
||||
* @param[in] spip pointer to the @p SPIDriver object
|
||||
* @param[in] n number of words to receive
|
||||
* @param[out] rxbuf the pointer to the receive buffer
|
||||
*
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below or
|
||||
* equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*/
|
||||
void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf) {
|
||||
|
||||
|
|
|
@ -155,17 +155,11 @@
|
|||
* @brief Driver configuration structure.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* @brief The chip select line port.
|
||||
*/
|
||||
/** @brief The chip select line port.*/
|
||||
ioportid_t spc_ssport;
|
||||
/**
|
||||
* @brief The chip select line pad number.
|
||||
*/
|
||||
/** @brief The chip select line pad number.*/
|
||||
uint16_t spc_sspad;
|
||||
/**
|
||||
* @brief SPI initialization data.
|
||||
*/
|
||||
/** @brief SPI initialization data.*/
|
||||
uint16_t spc_cr1;
|
||||
} SPIConfig;
|
||||
|
||||
|
@ -173,44 +167,28 @@ typedef struct {
|
|||
* @brief Structure representing a SPI driver.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* @brief Driver state.
|
||||
*/
|
||||
/** @brief Driver state.*/
|
||||
spistate_t spd_state;
|
||||
#if SPI_USE_MUTUAL_EXCLUSION || defined(__DOXYGEN__)
|
||||
#if CH_USE_MUTEXES || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Mutex protecting the bus.
|
||||
*/
|
||||
/** @brief Mutex protecting the bus.*/
|
||||
Mutex spd_mutex;
|
||||
#elif CH_USE_SEMAPHORES
|
||||
Semaphore spd_semaphore;
|
||||
#endif
|
||||
#endif /* SPI_USE_MUTUAL_EXCLUSION */
|
||||
/**
|
||||
* @brief Current configuration data.
|
||||
*/
|
||||
/** @brief Current configuration data.*/
|
||||
const SPIConfig *spd_config;
|
||||
/* End of the mandatory fields.*/
|
||||
/**
|
||||
* @brief Thread waiting for I/O completion.
|
||||
*/
|
||||
/** @brief Thread waiting for I/O completion.*/
|
||||
Thread *spd_thread;
|
||||
/**
|
||||
* @brief Pointer to the SPIx registers block.
|
||||
*/
|
||||
/** @brief Pointer to the SPIx registers block.*/
|
||||
SPI_TypeDef *spd_spi;
|
||||
/**
|
||||
* @brief Pointer to the receive DMA channel registers block.
|
||||
*/
|
||||
/** @brief Pointer to the receive DMA channel registers block.*/
|
||||
DMA_Channel_TypeDef *spd_dmarx;
|
||||
/**
|
||||
* @brief Pointer to the transmit DMA channel registers block.
|
||||
*/
|
||||
/** @brief Pointer to the transmit DMA channel registers block.*/
|
||||
DMA_Channel_TypeDef *spd_dmatx;
|
||||
/**
|
||||
* @brief DMA priority bit mask.
|
||||
*/
|
||||
/** @brief DMA priority bit mask.*/
|
||||
uint32_t spd_dmaprio;
|
||||
} SPIDriver;
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
/**
|
||||
* @file stm32_dma.h
|
||||
* @brief STM32 DMA helper driver header.
|
||||
* @note This file requires definitions from the ST STM32 header file
|
||||
* stm3232f10x.h.
|
||||
*
|
||||
* @addtogroup STM32_DMA
|
||||
* @{
|
||||
|
@ -52,10 +54,53 @@
|
|||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief STM32 DMA channel memory structure.
|
||||
*/
|
||||
typedef struct {
|
||||
volatile uint32_t CCR;
|
||||
volatile uint32_t CNDTR;
|
||||
volatile uint32_t CPAR;
|
||||
volatile uint32_t CMAR;
|
||||
volatile uint32_t dummy;
|
||||
} stm32_dma_channel_t;
|
||||
|
||||
/**
|
||||
* @brief STM32 DMA subsystem memory structure.
|
||||
* @note This structure has been redefined here because it is convenient to
|
||||
* have the channels organized as an array, the ST header does not
|
||||
* do that.
|
||||
*/
|
||||
typedef struct {
|
||||
volatile uint32_t ISR;
|
||||
volatile uint32_t IFCR;
|
||||
stm32_dma_channel_t channels[7];
|
||||
} stm32_dma_t:
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#define STM32_DMA1_BASE (AHBPERIPH_BASE + 0x0000)
|
||||
#define STM32_DMA1 ((stm32_dma_t *)STM32_DMA1_BASE)
|
||||
#define STM32_DMA1_CH1 (STM32_DMA1->channels[0])
|
||||
#define STM32_DMA1_CH2 (STM32_DMA1->channels[1])
|
||||
#define STM32_DMA1_CH3 (STM32_DMA1->channels[2])
|
||||
#define STM32_DMA1_CH4 (STM32_DMA1->channels[3])
|
||||
#define STM32_DMA1_CH5 (STM32_DMA1->channels[4])
|
||||
#define STM32_DMA1_CH6 (STM32_DMA1->channels[5])
|
||||
#define STM32_DMA1_CH7 (STM32_DMA1->channels[6])
|
||||
|
||||
#if defined(STM32F10X_HD) || defined (STM32F10X_CL) || defined(__DOXYGEN__)
|
||||
#define STM32_DMA2_BASE (AHBPERIPH_BASE + 0x0400)
|
||||
#define STM32_DMA2 ((stm32_dma_t *)STM32_DMA2_BASE)
|
||||
#define STM32_DMA2_CH1 (STM32_DMA2->channels[0])
|
||||
#define STM32_DMA2_CH2 (STM32_DMA2->channels[1])
|
||||
#define STM32_DMA2_CH3 (STM32_DMA2->channels[2])
|
||||
#define STM32_DMA2_CH4 (STM32_DMA2->channels[3])
|
||||
#define STM32_DMA2_CH5 (STM32_DMA2->channels[4])
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -0,0 +1,248 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file STM32/uart_lld.c
|
||||
* @brief STM32 low level UART driver code.
|
||||
*
|
||||
* @addtogroup STM32_UART
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
#if CH_HAL_USE_UART || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/** @brief USART1 UART driver identifier.*/
|
||||
#if STM32_UART_USE_USART1 || defined(__DOXYGEN__)
|
||||
UARTDriver UARTD1;
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#define dma_setup(dmap, cndtr, cmar, ccr) { \
|
||||
(dmap)->CNDTR = (uint32_t)(cndtr); \
|
||||
(dmap)->CMAR = (uint32_t)(cmar); \
|
||||
(dmap)->CCR = (uint32_t)(ccr); \
|
||||
}
|
||||
|
||||
#define dma_disable(dmap) { \
|
||||
(dmap)->CCR = 0; \
|
||||
}
|
||||
|
||||
#define dma_rx_setup(uartp, cndtr, cmar, ccr) \
|
||||
dma_setup((uartp)->ud_dmarx, (cndtr), (cmar), (uartp)->ud_dmaccr|(ccr))
|
||||
|
||||
#define dma_tx_setup(uartp, cndtr, cmar, ccr) { \
|
||||
dma_setup((uartp)->ud_dmatx, (cndtr), (cmar), (uartp)->ud_dmaccr|(ccr))
|
||||
|
||||
/**
|
||||
* @brief USART initialization.
|
||||
* @details This function must be invoked with interrupts disabled.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
*/
|
||||
static void usart_start(UARTDriver *uartp) {
|
||||
USART_TypeDef *u = uartp->ud_usart;
|
||||
|
||||
/* Baud rate setting.*/
|
||||
if (uartp->ud_usart == USART1)
|
||||
u->BRR = STM32_PCLK2 / uartp->ud_config->uc_speed;
|
||||
else
|
||||
u->BRR = STM32_PCLK1 / uartp->ud_config->uc_speed;
|
||||
|
||||
/* Note that some bits are enforced because required for correct driver
|
||||
operations.*/
|
||||
u->CR1 = uartp->ud_config->uc_cr1 | USART_CR1_UE | USART_CR1_PEIE |
|
||||
USART_CR1_TE | USART_CR1_RE;
|
||||
u->CR2 = uartp->ud_config->uc_cr2 | USART_CR2_LBDIE;
|
||||
u->CR3 = uartp->ud_config->uc_cr3 | USART_CR3_EIE;
|
||||
(void)u->SR; /* SR reset step 1.*/
|
||||
(void)u->DR; /* SR reset step 2.*/
|
||||
|
||||
/* RX DMA channel preparation, circular 1 frame transfers, an interrupt is
|
||||
generated for each received character.*/
|
||||
dma_rx_setup(uartp, 1, &uartp->ud_rxbuf,
|
||||
DMA_CCR1_TCIE | DMA_CCR1_TEIE | DMA_CCR1_CIRC | DMA_CCR1_EN);
|
||||
|
||||
/* TX DMA channel preparation, simply disabled.*/
|
||||
dma_disable(uartp->ud_dmatx);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief USART de-initialization.
|
||||
* @details This function must be invoked with interrupts disabled.
|
||||
*
|
||||
* @param[in] u pointer to an USART I/O block
|
||||
*/
|
||||
static void usart_stop(UARTDriver *uartp) {
|
||||
|
||||
/* Stops RX and TX DMA channels.*/
|
||||
dma_disable(uartp->ud_dmarx);
|
||||
dma_disable(uartp->ud_dmatx);
|
||||
|
||||
/* Stops USART operations.*/
|
||||
uartp->ud_usart->CR1 = 0;
|
||||
uartp->ud_usart->CR2 = 0;
|
||||
uartp->ud_usart->CR3 = 0;
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Low level UART driver initialization.
|
||||
*/
|
||||
void uart_lld_init(void) {
|
||||
|
||||
#if STM32_UART_USE_USART1
|
||||
RCC->APB2RSTR = RCC_APB2RSTR_USART1RST;
|
||||
RCC->APB2RSTR = 0;
|
||||
uartObjectInit(&UARTD1);
|
||||
UARTD1.ud_usart = USART1;
|
||||
UARTD1.ud_dmarx = DMA1_Channel4;
|
||||
UARTD1.ud_dmatx = DMA1_Channel5;
|
||||
UARTD1.ud_dmaccr = 0;
|
||||
UARTD1.ud_dmarmsk = 0xF << (4 - 1);
|
||||
UARTD1.ud_dmatmsk = 0xF << (5 - 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configures and activates the UART peripheral.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
*/
|
||||
void uart_lld_start(UARTDriver *uartp) {
|
||||
|
||||
if (uartp->ud_state == UART_STOP) {
|
||||
#if STM32_UART_USE_USART1
|
||||
if (&UARTD1 == uartp) {
|
||||
dmaEnable(DMA1_ID); /* NOTE: Must be enabled before the IRQs.*/
|
||||
NVICEnableVector(USART1_IRQn,
|
||||
CORTEX_PRIORITY_MASK(STM32_UART_USART1_IRQ_PRIORITY));
|
||||
NVICEnableVector(DMA1_Channel4_IRQn,
|
||||
CORTEX_PRIORITY_MASK(STM32_UART_USART1_IRQ_PRIORITY));
|
||||
NVICEnableVector(DMA1_Channel5_IRQn,
|
||||
CORTEX_PRIORITY_MASK(STM32_UART_USART1_IRQ_PRIORITY));
|
||||
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Static DMA setup, the transfer size depends on the USART settings,
|
||||
it is 16 bits if M=1 and PCE=0 else it is 8 bits.*/
|
||||
uartp->ud_dmaccr = STM32_UART_USART1_DMA_PRIORITY << 12;
|
||||
if ((uartp->ud_config->uc_cr1 & (USART_CR1_M | USART_CR1_PCE)) == USART_CR1_M)
|
||||
uartp->ud_dmaccr |= DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0;
|
||||
uartp->ud_dmarx->CPAR = (uint32_t)&uartp->ud_usart->DR;
|
||||
uartp->ud_dmatx->CPAR = (uint32_t)&uartp->ud_usart->DR;
|
||||
}
|
||||
uartp->ud_txstate = UART_TX_IDLE;
|
||||
uartp->ud_rxstate = UART_RX_IDLE;
|
||||
usart_start(uartp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Deactivates the UART peripheral.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
*/
|
||||
void uart_lld_stop(UARTDriver *uartp) {
|
||||
|
||||
if (uartp->ud_state == SD_READY) {
|
||||
usart_stop(uartp);
|
||||
|
||||
#if STM32_UART_USE_USART1
|
||||
if (&UARTD1 == uartp) {
|
||||
NVICDisableVector(USART1_IRQn);
|
||||
NVICDisableVector(DMA1_Channel4_IRQn);
|
||||
NVICDisableVector(DMA1_Channel5_IRQn);
|
||||
dmaDisable(DMA1_ID);
|
||||
RCC->APB2ENR &= ~RCC_APB2ENR_USART1EN;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Starts a transmission on the UART peripheral.
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below
|
||||
* or equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
* @param[in] n number of data frames to send
|
||||
* @param[in] txbuf the pointer to the transmit buffer
|
||||
*/
|
||||
void uart_lld_start_send(UARTDriver *uartp, size_t n, const void *txbuf) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Stops any ongoing transmission.
|
||||
* @note Stopping a transmission also suppresses the transmission callbacks.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
*/
|
||||
void uart_lld_stop_send(UARTDriver *uartp) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Starts a receive operation on the UART peripheral.
|
||||
* @note The buffers are organized as uint8_t arrays for data sizes below
|
||||
* or equal to 8 bits else it is organized as uint16_t arrays.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
* @param[in] n number of data frames to send
|
||||
* @param[in] rxbuf the pointer to the receive buffer
|
||||
*/
|
||||
void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Stops any ongoing receive operation.
|
||||
* @note Stopping a receive operation also suppresses the receive callbacks.
|
||||
*
|
||||
* @param[in] uartp pointer to the @p UARTDriver object
|
||||
*/
|
||||
void uart_lld_stop_receive(UARTDriver *uartp) {
|
||||
|
||||
}
|
||||
|
||||
#endif /* CH_HAL_USE_UART */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file STM32/uart_lld.h
|
||||
* @brief STM32 low level UART driver header.
|
||||
*
|
||||
* @addtogroup STM32_UART
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _UART_LLD_H_
|
||||
#define _UART_LLD_H_
|
||||
|
||||
#if CH_HAL_USE_UART || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver constants. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief UART driver on USART1 enable switch.
|
||||
* @details If set to @p TRUE the support for USART1 is included.
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#if !defined(STM32_UART_USE_USART1) || defined(__DOXYGEN__)
|
||||
#define STM32_UART_USE_USART1 TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief USART1 interrupt priority level setting.
|
||||
*/
|
||||
#if !defined(STM32_UART_USART1_IRQ_PRIO) || defined(__DOXYGEN__)
|
||||
#define STM32_UART_USART1_IRQ_PRIORITY 12
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief USART1 DMA priority (0..3|lowest..highest).
|
||||
* @note The priority level is used for both the TX and RX DMA channels but
|
||||
* because of the channels ordering the RX channel has always priority
|
||||
* over the TX channel.
|
||||
*/
|
||||
#if !defined(STM32_UART_USART1_DMA_PRIO) || defined(__DOXYGEN__)
|
||||
#define STM32_UART_USART1_DMA_PRIORITY 1
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief UART driver condition flags type.
|
||||
*/
|
||||
typedef uint32_t uartflags_t;
|
||||
|
||||
/**
|
||||
* @brief Driver configuration structure.
|
||||
* @note It could be empty on some architectures.
|
||||
*/
|
||||
typedef struct {
|
||||
/** @brief End of transmission buffer callback.*/
|
||||
uartcb_t uc_txend1;
|
||||
/** @brief Physical end of transmission callback.*/
|
||||
uartcb_t uc_txend2;
|
||||
/** @brief Receive buffer filled callback.*/
|
||||
uartcb_t uc_rxend;
|
||||
/** @brief Character received while out if the @p UART_RECEIVE state.*/
|
||||
uartcb_t uc_rxchar;
|
||||
/** @brief Receive error callback.*/
|
||||
uartcb_t uc_rxerr;
|
||||
/* End of the mandatory fields.*/
|
||||
/** @brief Bit rate.*/
|
||||
uint32_t uc_speed;
|
||||
/** @brief Initialization value for the CR1 register.*/
|
||||
uint16_t uc_cr1;
|
||||
/** @brief Initialization value for the CR2 register.*/
|
||||
uint16_t uc_cr2;
|
||||
/** @brief Initialization value for the CR3 register.*/
|
||||
uint16_t uc_cr3;
|
||||
} UARTConfig;
|
||||
|
||||
/**
|
||||
* @brief Structure representing an UART driver.
|
||||
*/
|
||||
typedef struct {
|
||||
/** @brief Driver state.*/
|
||||
uartstate_t ud_state;
|
||||
/** @brief Current configuration data.*/
|
||||
const UARTConfig *ud_config;
|
||||
/** @brief Transmitter state.*/
|
||||
uarttxstate_t ud_txstate;
|
||||
/** @brief Receiver state.*/
|
||||
uartrxstate_t ud_rxstate;
|
||||
/** @brief UART driver status flags.*/
|
||||
uartflags_t ud_flags;
|
||||
/* End of the mandatory fields.*/
|
||||
/** @brief Default receive buffer while into @p UART_RX_IDLE state.*/
|
||||
uint16_t ud_rxbuf;
|
||||
/** @brief Pointer to the USART registers block.*/
|
||||
USART_TypeDef *ud_usart;
|
||||
/** @brief Pointer to the receive DMA channel registers block.*/
|
||||
DMA_Channel_TypeDef *ud_dmarx;
|
||||
/** @brief Receive DMA flags mask*/
|
||||
uint32_t ud_dmarmsk;
|
||||
/** @brief Pointer to the transmit DMA channel registers block.*/
|
||||
DMA_Channel_TypeDef *ud_dmatx;
|
||||
/** @brief Transmit DMA flags mask*/
|
||||
uint32_t ud_dmatmsk;
|
||||
/** @brief DMA priority bit mask.*/
|
||||
uint32_t ud_dmaccr;
|
||||
} UARTDriver;
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void uart_lld_init(void);
|
||||
void uart_lld_start(UARTDriver *uartp);
|
||||
void uart_lld_stop(UARTDriver *uartp);
|
||||
void uart_lld_start_send(UARTDriver *uartp, size_t n, const void *txbuf);
|
||||
void uart_lld_stop_send(UARTDriver *uartp);
|
||||
void uart_lld_start_receive(UARTDriver *uartp, size_t n, void *rxbuf);
|
||||
void uart_lld_stop_receive(UARTDriver *uartp);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CH_HAL_USE_UART */
|
||||
|
||||
#endif /* _UART_LLD_H_ */
|
||||
|
||||
/** @} */
|
Loading…
Reference in New Issue