90 lines
2.3 KiB
C
90 lines
2.3 KiB
C
#include "system/lwesp_ll.h"
|
|
|
|
#include "lwesp/lwesp.h"
|
|
#include "lwesp/lwesp_input.h"
|
|
#include "lwesp/lwesp_mem.h"
|
|
#include "stm32h7xx_hal.h"
|
|
|
|
#include "cmsis_os.h"
|
|
|
|
#define UART_TIMEOUT 1000
|
|
#define UART_BUFFER_SIZE 1024
|
|
|
|
#define HEAP_SIZE 4096
|
|
|
|
#define UART_HANDLE huart4
|
|
|
|
extern UART_HandleTypeDef UART_HANDLE;
|
|
|
|
static uint8_t s_uart_rxbuf[UART_BUFFER_SIZE];
|
|
static uint8_t s_lwesp_heap[HEAP_SIZE];
|
|
static uint8_t s_initialized;
|
|
|
|
static osThreadId_t usart_ll_thread_id;
|
|
static osMessageQueueId_t usart_ll_mbox_id;
|
|
|
|
void usart_rx_event_callback(UART_HandleTypeDef *huart, uint16_t Pos) {
|
|
// Count pos in buffer, notify UART LL thread.
|
|
}
|
|
|
|
void usart_rx_cplt_callback(UART_HandleTypeDef *huart) {
|
|
// Circular DMA is used, so no complete event will be received normally
|
|
}
|
|
|
|
void usart_error_callback(UART_HandleTypeDef *huart) {
|
|
// Error encountered, DMA aborted.
|
|
}
|
|
|
|
static void usart_ll_thread(void *arg) {
|
|
for (;;) {
|
|
}
|
|
}
|
|
|
|
static void configure_uart(uint32_t baudrate) {
|
|
// Register callbacks
|
|
HAL_UART_RegisterCallback(&UART_HANDLE, HAL_UART_RX_COMPLETE_CB_ID, usart_rx_cplt_callback);
|
|
HAL_UART_RegisterCallback(&UART_HANDLE, HAL_UART_ERROR_CB_ID, usart_error_callback);
|
|
HAL_UART_RegisterRxEventCallback(&UART_HANDLE, usart_rx_event_callback);
|
|
|
|
// Enable DMA Rx
|
|
HAL_UART_Receive_DMA(&UART_HANDLE, s_uart_rxbuf, UART_BUFFER_SIZE);
|
|
}
|
|
|
|
static size_t send_data(const void *data, size_t len) {
|
|
HAL_UART_Transmit(&UART_HANDLE, (uint8_t *)data, len, 1000);
|
|
|
|
return len;
|
|
}
|
|
|
|
lwespr_t lwesp_ll_init(lwesp_ll_t *ll) {
|
|
lwesp_mem_region_t mem_regions[] = {{s_lwesp_heap, HEAP_SIZE}};
|
|
|
|
if (!s_initialized) {
|
|
// Internal heap management
|
|
lwesp_mem_assignmemory(mem_regions, LWESP_ARRAYSIZE(mem_regions));
|
|
|
|
// Initialize callbacks
|
|
ll->send_fn = send_data;
|
|
}
|
|
|
|
// Configure UART device and RX ring buffer
|
|
configure_uart(ll->uart.baudrate);
|
|
|
|
if(!s_initialized) {
|
|
const osThreadAttr_t attr = {
|
|
.stack_size = 1024
|
|
};
|
|
|
|
usart_ll_mbox_id = osMessageQueueNew(10, sizeof(void *), NULL);
|
|
usart_ll_thread_id = osThreadNew(usart_ll_thread, usart_ll_mbox_id, &attr);
|
|
}
|
|
|
|
s_initialized = 1;
|
|
|
|
return lwespOK;
|
|
}
|
|
|
|
lwespr_t lwesp_ll_deinit(lwesp_ll_t *ll) {
|
|
//
|
|
return lwespOK;
|
|
} |