Files
cls_master/lib/uart_driver/AsyncComm.h
2024-02-02 02:44:24 +01:00

109 lines
3.4 KiB
C

/**
* @file CBSP_AsyncComm.h
* @author owalter
* @brief
* @version 0.1
* @date 28.11.2022
*
* @copyright Copyright © 2022 habemus! electronic + transfer GmbH. All rights reserved.
*/
#ifndef NUN10K22_DISPLAY_CBSP_ASYNCCOMM_H
#define NUN10K22_DISPLAY_CBSP_ASYNCCOMM_H
#include <stdint.h>
#include "cmsis_os.h"
#include "lwrb.h"
#include "main.h"
typedef void (*data_receive_callback)(const void* data, size_t len);
typedef void (*char_receive_callback)(const char* str, size_t len);
typedef void (*bytes_receive_callback)(const uint8_t* str, size_t len);
/**
* \brief Volatile data structure
*
* Variables declared using this structure can not be put to non-volatile memory (such as flash, EEPROM, ..)
*/
typedef struct {
/* OS queue */
osMessageQueueId_t queue; /*!< Message queue */
/* Raw data buffer */
uint8_t dma_rx_buffer[1024]; /*!< DMA buffer for receive data */
size_t old_pos; /*!< Position for data */
/* Tx data buffer */
volatile size_t tx_dma_current_len;
volatile uint8_t tx_running;
lwrb_t tx_rb;
uint8_t tx_rb_data[512];
} uart_desc_volatile_t;
/**
* \brief Non-Volatile data structure
*
* Variables declared using this structure may be put to non-volative memory.
* This is to avoid using RAM for constant data
*/
typedef struct {
/* UART config */
USART_TypeDef* uart; /*!< UART/USART/LPUART instance */
#ifndef USE_HAL_DRIVER
GPIO_TypeDef* uart_tx_port;
GPIO_TypeDef* uart_rx_port;
uint16_t uart_tx_pin;
uint16_t uart_rx_pin;
uint16_t uart_tx_pin_af;
uint16_t uart_rx_pin_af;
/* Interrupts config */
uint8_t prio; /*!< Preemption priority number */
IRQn_Type uart_irq; /*!< UART IRQ instance */
IRQn_Type dma_irq_rx; /*!< DMA IRQ RX instance */
IRQn_Type dma_irq_tx; /*!< DMA IRQ TX instance */
/* DMA config & flags management */
uint32_t dma_rx_req; /*!< RX DMA request */
uint32_t dma_tx_req; /*!< TX DMA request */
#endif
DMA_TypeDef* dma_rx; /*!< RX DMA instance */
uint32_t dma_rx_ch; /*!< RX DMA channel */
void (*dma_rx_clear_tc_fn)(DMA_TypeDef*);
void (*dma_rx_clear_ht_fn)(DMA_TypeDef*);
uint32_t (*dma_rx_is_tc_fn)(DMA_TypeDef*);
uint32_t (*dma_rx_is_ht_fn)(DMA_TypeDef*);
DMA_TypeDef* dma_tx; /*!< TX DMA instance */
uint32_t dma_tx_ch; /*!< TX DMA channel */
void (*dma_tx_clear_tc_fn)(DMA_TypeDef*);
uint32_t (*dma_tx_is_tc_fn)(DMA_TypeDef*);
void (*dma_tx_clear_ht_fn)(DMA_TypeDef*);
void (*dma_tx_clear_gi_fn)(DMA_TypeDef*);
void (*dma_tx_clear_te_fn)(DMA_TypeDef*);
void (*dma_tx_clear_fe_fn)(DMA_TypeDef*);
uart_desc_volatile_t* data; /*!< Pointer to volatile data */
/* receive callback */
data_receive_callback uart_external_receive_callback;
} uart_desc_t;
/* USART related functions */
osThreadId_t usart_init(const uart_desc_t* uart, const osThreadAttr_t* attr);
void usart_dma_irq_handler(const uart_desc_t* uart);
void usart_dma_irq_handler_tx(const uart_desc_t* uart);
void usart_irq_handler(const uart_desc_t* uart);
void usart_send_data(const uart_desc_t* uart, const void* data, size_t len);
/**
* \brief Calculate length of statically allocated array
*/
#define ARRAY_LEN(x) (sizeof(x) / sizeof((x)[0]))
#endif // NUN10K22_DISPLAY_CBSP_ASYNCCOMM_H