stm32f4-uart-bootloader

Simple UART bootloader for STM32F4 MCU's
git clone git://git.mdnr.space/stm32f4-uart-bootloader
Log | Files | Refs | Submodules | README | LICENSE

bl-packet.c (2367B)


      1 #include "bl-packet.h"
      2 #include "shared/protocol.h"
      3 #include "shared/ring-buffer.h"
      4 #include "shared/drv-usart-dma.h"
      5 #include "bl/stimer.h"
      6 #include "libopencm3/stm32/f4/nvic.h"
      7 
      8 RingBuffer_t dbgRxRingBuf;
      9 RingBuffer_t dbgTxRingBuf;
     10 RingBuffer_t gsmRxRingBuf;
     11 RingBuffer_t gsmTxRingBuf;
     12 
     13 bool packetReceived = false;
     14 uint8_t buffer[255] = {0};
     15 
     16 void packet_init(void) {
     17     ring_buffer_setup(&dbgRxRingBuf, dbg.dma.rxBuf, DMA_RX_BUFFER_SIZE);
     18     ring_buffer_setup(&dbgTxRingBuf, dbg.dma.txBuf, DMA_TX_BUFFER_SIZE);
     19     ring_buffer_setup(&gsmRxRingBuf, gsm.dma.rxBuf, DMA_RX_BUFFER_SIZE);
     20     ring_buffer_setup(&gsmTxRingBuf, gsm.dma.txBuf, DMA_TX_BUFFER_SIZE);
     21     usart_enable(gsm.port);
     22     usart_enable(dbg.port);
     23 }
     24 
     25 static void packet_tx_enqueue_data(const USART_t *usart, const uint8_t *data, const uint16_t len) {
     26     res_usart_write(usart, data, len);
     27 }
     28 
     29 void packet_send_nack(void) {
     30     uint8_t packet[4] = {PROTOCOL_TAG_NACK, 0, 30, 0};
     31     packet_tx_enqueue_data(comm, packet, sizeof packet);
     32 }
     33 
     34 void packet_send_ack(void) {
     35     uint8_t packet[4] = {PROTOCOL_TAG_ACK, 0, 152, 3};
     36     packet_tx_enqueue_data(comm, packet, sizeof packet);
     37 }
     38 
     39 uint8_t *bl_packet_received(void) {
     40     if (!packetReceived) {
     41         return 0;
     42     } else {
     43         packetReceived = false;
     44         return buffer;
     45     }
     46 }
     47 
     48 void usart2_isr(void) {
     49     (void)USART_SR(USART2);
     50     (void)USART_DR(USART2); // This read sequence clears the idle interrupt flag
     51     gsmRxRingBuf.tail = res_usart_dma_get_buffer_tail(&gsm);
     52     uint16_t len = (DMA_RX_BUFFER_SIZE - 1) & (gsmRxRingBuf.tail - gsmRxRingBuf.head);
     53     ring_buffer_read_chunk(&gsmRxRingBuf, buffer, len);
     54     comm = &gsm;
     55     packetReceived = true;
     56     // protocol_handle_packet(buffer);
     57 }
     58 
     59 void usart1_isr(void) {
     60     (void)USART_SR(USART1);
     61     (void)USART_DR(USART1); // This read sequence clears the idle interrupt flag
     62     dbgRxRingBuf.tail = res_usart_dma_get_buffer_tail(&dbg);
     63     uint16_t len = (DMA_RX_BUFFER_SIZE - 1) & (dbgRxRingBuf.tail - dbgRxRingBuf.head);
     64     ring_buffer_read_chunk(&dbgRxRingBuf, buffer, len);
     65     comm = &dbg;
     66     packetReceived = true;
     67 }
     68 
     69 void dma1_stream5_isr(void) {
     70     // TODO: deactivate dma interrupt if nothing is done here
     71     dma_clear_interrupt_flags(DMA1, DMA_STREAM5, DMA_TCIF);
     72 }
     73 
     74 void dma2_stream2_isr(void) {
     75     dma_clear_interrupt_flags(DMA2, DMA_STREAM2, DMA_TCIF);
     76 }
     77 
     78