Add support for CLI on AUX1/AUX2

This commit is contained in:
Raphael Coeffic
2022-03-20 16:30:59 +01:00
parent e5f7da0802
commit d39f3e058c
3 changed files with 58 additions and 4 deletions
@@ -141,6 +141,24 @@ static void* auxSerialInit(const etx_serial_init* params)
return aux_serial_init(&auxSerialState, params);
}
void (*aux1RxCb)(uint8_t*, uint32_t);
static void aux1_on_rx_byte(uint8_t data)
{
if (aux1RxCb) aux1RxCb(&data, 1);
}
void aux1SetRxCb(void*, void (*cb)(uint8_t*, uint32_t))
{
aux1RxCb = cb;
if (aux1RxCb) {
auxSerialCb.on_receive = aux1_on_rx_byte;
stm32_usart_deinit_rx_dma(&auxUSART);
} else {
auxSerialCb.on_receive = nullptr;
}
}
const etx_serial_driver_t AuxSerialDriver = {
.init = auxSerialInit,
.deinit = aux_serial_deinit,
@@ -149,7 +167,7 @@ const etx_serial_driver_t AuxSerialDriver = {
.waitForTxCompleted = aux_wait_tx_completed,
.getByte = aux_get_byte,
.getBaudrate = nullptr,
.setReceiveCb = nullptr,
.setReceiveCb = aux1SetRxCb,
.setBaudrateCb = nullptr,
};
@@ -202,15 +220,33 @@ static uint8_t aux2SerialOnSend(uint8_t* data)
static etx_serial_callbacks_t aux2SerialCb = {
.on_send = aux2SerialOnSend,
.on_receive = nullptr,
.on_receive = nullptr, // TODO: clear on DeInit
.on_error = nullptr,
};
void* aux2SerialInit(const etx_serial_init* params)
static void* aux2SerialInit(const etx_serial_init* params)
{
return aux_serial_init(&aux2SerialState, params);
}
void (*aux2RxCb)(uint8_t*, uint32_t);
static void aux2_on_rx_byte(uint8_t data)
{
if (aux2RxCb) aux2RxCb(&data, 1);
}
void aux2SetRxCb(void*, void (*cb)(uint8_t*, uint32_t))
{
aux2RxCb = cb;
if (aux2RxCb) {
aux2SerialCb.on_receive = aux2_on_rx_byte;
stm32_usart_deinit_rx_dma(&aux2USART);
} else {
aux2SerialCb.on_receive = nullptr;
}
}
extern "C" void AUX2_SERIAL_USART_IRQHandler(void)
{
DEBUG_INTERRUPT(INT_SER2);
@@ -225,7 +261,7 @@ const etx_serial_driver_t Aux2SerialDriver = {
.waitForTxCompleted = aux_wait_tx_completed,
.getByte = aux_get_byte,
.getBaudrate = nullptr,
.setReceiveCb = nullptr,
.setReceiveCb = aux2SetRxCb,
.setBaudrateCb = nullptr,
};
@@ -24,6 +24,8 @@
void stm32_usart_init_rx_dma(const stm32_usart_t* usart, void* buffer, uint32_t length)
{
if (!usart->rxDMA) return;
// Disable IRQ based RX
LL_USART_DisableIT_RXNE(usart->USARTx);
@@ -49,6 +51,18 @@ void stm32_usart_init_rx_dma(const stm32_usart_t* usart, void* buffer, uint32_t
LL_DMA_EnableStream(usart->rxDMA, usart->rxDMA_Stream);
}
void stm32_usart_deinit_rx_dma(const stm32_usart_t* usart)
{
if (!usart->rxDMA) return;
LL_DMA_DeInit(usart->rxDMA, usart->rxDMA_Stream);
// Enable IRQ based RX
LL_USART_EnableIT_RXNE(usart->USARTx);
NVIC_SetPriority(usart->IRQn, usart->IRQ_Prio);
NVIC_EnableIRQ(usart->IRQn);
}
void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params)
{
LL_USART_DeInit(usart->USARTx);
@@ -118,6 +132,9 @@ void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params)
void stm32_usart_deinit(const stm32_usart_t* usart)
{
if (usart->rxDMA) {
LL_DMA_DeInit(usart->rxDMA, usart->rxDMA_Stream);
}
if (usart->txDMA) {
LL_DMA_DeInit(usart->txDMA, usart->txDMA_Stream);
}
@@ -50,6 +50,7 @@ struct stm32_usart_t {
void stm32_usart_init(const stm32_usart_t* usart, const etx_serial_init* params);
void stm32_usart_init_rx_dma(const stm32_usart_t* usart, void* buffer, uint32_t length);
void stm32_usart_deinit(const stm32_usart_t* usart);
void stm32_usart_deinit_rx_dma(const stm32_usart_t* usart);
void stm32_usart_send_byte(const stm32_usart_t* usart, uint8_t byte);
void stm32_usart_send_buffer(const stm32_usart_t* usart, const uint8_t * data, uint32_t size);
void stm32_usart_wait_for_tx_dma(const stm32_usart_t* usart);