4646 * Typedefs for internal stuctures, enums
4747 */
4848typedef enum {
49- e_no_intr = 0 ,
50- e_tx_intr = 1 ,
51- e_txthr_intr = 2 ,
52- e_rx_intr = 4 ,
49+ E_NO_INTR = 0 ,
50+ E_TX_INTR = 1 ,
51+ E_TXTHR_INTR = 2 ,
52+ E_RX_INTR = 4 ,
5353} intr_mode_t ;
5454
5555typedef enum {
56- e_inactive = 0 ,
57- e_first_half = 1 ,
58- e_last_data = 2 ,
59- e_end_trans = 4 ,
60- e_set_conti = 8 ,
56+ E_INACTIVE = 0 ,
57+ E_FIRST_HALF = 1 ,
58+ E_LAST_DATA = 2 ,
59+ E_END_TRANS = 4 ,
60+ E_SET_CONTI = 8 ,
6161} transaction_state_t ;
6262
6363struct rmt_obj_s
@@ -68,8 +68,8 @@ struct rmt_obj_s
6868 int channel ;
6969 bool tx_not_rx ;
7070 int buffers ;
71- int remaining_to_send ;
72- uint32_t * remaining_ptr ;
71+ int data_size ;
72+ uint32_t * data_ptr ;
7373 intr_mode_t intr_mode ;
7474 transaction_state_t tx_state ;
7575 rmt_rx_data_cb_t cb ;
@@ -84,14 +84,14 @@ static xSemaphoreHandle g_rmt_objlocks[MAX_CHANNELS] = {
8484};
8585
8686static rmt_obj_t g_rmt_objects [MAX_CHANNELS ] = {
87- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
88- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
89- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
90- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
91- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
92- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
93- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
94- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , e_no_intr , e_inactive , NULL , false},
87+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
88+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
89+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
90+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
91+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
92+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
93+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
94+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
9595};
9696
9797/**
@@ -187,19 +187,23 @@ bool rmtDeinit(rmt_obj_t *rmt)
187187 }
188188
189189 size_t from = rmt -> channel ;
190+ size_t to = rmt -> buffers + rmt -> channel ;
191+ size_t i ;
190192
191193#if !CONFIG_DISABLE_HAL_LOCKS
192194 if (g_rmt_objlocks [from ] != NULL ) {
193195 vSemaphoreDelete (g_rmt_objlocks [from ]);
194196 }
195197#endif
196198
197- size_t to = rmt -> buffers + rmt -> channel ;
198- size_t i ;
199+ if (g_rmt_objects [from ].data_alloc ) {
200+ free (g_rmt_objects [from ].data_ptr );
201+ }
199202
200203 for (i = from ; i < to ; i ++ ) {
201204 g_rmt_objects [i ].allocated = false;
202205 }
206+
203207 g_rmt_objects [from ].channel = 0 ;
204208 g_rmt_objects [from ].buffers = 0 ;
205209
@@ -213,7 +217,7 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
213217 }
214218
215219 int channel = rmt -> channel ;
216- int allocated_size = 64 * rmt -> buffers ;
220+ int allocated_size = MAX_DATA_PER_CHANNEL * rmt -> buffers ;
217221
218222 if (size > allocated_size ) {
219223
@@ -224,10 +228,10 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
224228 esp_intr_alloc (ETS_RMT_INTR_SOURCE , (int )ESP_INTR_FLAG_IRAM , _rmt_isr , NULL , & intr_handle );
225229 }
226230
227- rmt -> remaining_to_send = size - MAX_DATA_PER_ITTERATION ;
228- rmt -> remaining_ptr = ((uint32_t * )data ) + MAX_DATA_PER_ITTERATION ;
229- rmt -> intr_mode = e_tx_intr | e_txthr_intr ;
230- rmt -> tx_state = e_set_conti | e_first_half ;
231+ rmt -> data_size = size - MAX_DATA_PER_ITTERATION ;
232+ rmt -> data_ptr = ((uint32_t * )data ) + MAX_DATA_PER_ITTERATION ;
233+ rmt -> intr_mode = E_TX_INTR | E_TXTHR_INTR ;
234+ rmt -> tx_state = E_SET_CONTI | E_FIRST_HALF ;
231235
232236 // init the tx limit for interruption
233237 RMT .tx_lim_ch [channel ].limit = half_tx_nr ;
@@ -243,9 +247,9 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
243247 RMTMEM .chan [channel ].data32 [MAX_DATA_PER_ITTERATION ].val = 0 ;
244248
245249 // clear and enable both Tx completed and half tx event
246- RMT .int_clr .val | = _INT_TX_END (channel );
247- RMT .int_clr .val | = _INT_THR_EVNT (channel );
248- RMT .int_clr .val | = _INT_ERROR (channel );
250+ RMT .int_clr .val = _INT_TX_END (channel );
251+ RMT .int_clr .val = _INT_THR_EVNT (channel );
252+ RMT .int_clr .val = _INT_ERROR (channel );
249253
250254 RMT .int_ena .val |= _INT_TX_END (channel );
251255 RMT .int_ena .val |= _INT_THR_EVNT (channel );
@@ -261,7 +265,6 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
261265 }
262266}
263267
264-
265268bool rmtReadData (rmt_obj_t * rmt , uint32_t * data , size_t size )
266269{
267270 if (!rmt ) {
@@ -289,7 +292,7 @@ bool rmtBeginReceive(rmt_obj_t* rmt)
289292 }
290293 int channel = rmt -> channel ;
291294
292- RMT .int_clr .val | = _INT_ERROR (channel );
295+ RMT .int_clr .val = _INT_ERROR (channel );
293296 RMT .int_ena .val |= _INT_ERROR (channel );
294297
295298 RMT .conf_ch [channel ].conf1 .mem_owner = 1 ;
@@ -308,7 +311,7 @@ bool rmtReceiveCompleted(rmt_obj_t* rmt)
308311
309312 if (RMT .int_raw .val & _INT_RX_END (channel )) {
310313 // RX end flag
311- RMT .int_clr .val | = _INT_RX_END (channel );
314+ RMT .int_clr .val = _INT_RX_END (channel );
312315 return true;
313316 } else {
314317 return false;
@@ -323,13 +326,13 @@ bool rmtRead(rmt_obj_t* rmt, rmt_rx_data_cb_t cb)
323326 int channel = rmt -> channel ;
324327
325328 RMT_MUTEX_LOCK (channel );
326- rmt -> intr_mode = e_rx_intr ;
327- rmt -> tx_state = e_first_half ;
329+ rmt -> intr_mode = E_RX_INTR ;
330+ rmt -> tx_state = E_FIRST_HALF ;
328331 rmt -> cb = cb ;
329332 // allocate internally two buffers which would alternate
330333 if (!rmt -> data_alloc ) {
331- rmt -> remaining_ptr = (uint32_t * )malloc (2 * MAX_DATA_PER_CHANNEL * (rmt -> buffers )* sizeof (uint32_t ));
332- rmt -> remaining_to_send = MAX_DATA_PER_CHANNEL * rmt -> buffers ;
334+ rmt -> data_ptr = (uint32_t * )malloc (2 * MAX_DATA_PER_CHANNEL * (rmt -> buffers )* sizeof (uint32_t ));
335+ rmt -> data_size = MAX_DATA_PER_CHANNEL * rmt -> buffers ;
333336 rmt -> data_alloc = true;
334337 }
335338
@@ -366,12 +369,12 @@ bool rmtReadAsync(rmt_obj_t* rmt, rmt_data_t* data, size_t size, void* eventFlag
366369 }
367370
368371 if (data && size > 0 ) {
369- rmt -> remaining_ptr = (uint32_t * )data ;
370- rmt -> remaining_to_send = size ;
372+ rmt -> data_ptr = (uint32_t * )data ;
373+ rmt -> data_size = size ;
371374 }
372375
373376 RMT_MUTEX_LOCK (channel );
374- rmt -> intr_mode = e_rx_intr ;
377+ rmt -> intr_mode = E_RX_INTR ;
375378
376379 RMT .conf_ch [channel ].conf1 .mem_owner = 1 ;
377380
@@ -596,28 +599,28 @@ static void IRAM_ATTR _rmt_isr(void* arg)
596599 RMT .int_clr .val = _INT_RX_END (ch ); // TODO: replace clear interrupts
597600 RMT .int_ena .val &= ~_INT_RX_END (ch );
598601
599- if ((g_rmt_objects [ch ].intr_mode )& e_rx_intr ) {
602+ if ((g_rmt_objects [ch ].intr_mode ) & E_RX_INTR ) {
600603 if (g_rmt_objects [ch ].events ) {
601604 xEventGroupSetBits (g_rmt_objects [ch ].events , RMT_FLAG_RX_DONE );
602605 }
603- if (g_rmt_objects [ch ].remaining_ptr && g_rmt_objects [ch ].remaining_to_send > 0 ) {
606+ if (g_rmt_objects [ch ].data_ptr && g_rmt_objects [ch ].data_size > 0 ) {
604607 size_t i ;
605- uint32_t * data = g_rmt_objects [ch ].remaining_ptr ;
608+ uint32_t * data = g_rmt_objects [ch ].data_ptr ;
606609 if (g_rmt_objects [ch ].cb ) {
607- if (g_rmt_objects [ch ].tx_state & e_first_half ) {
608- g_rmt_objects [ch ].tx_state &= ~e_first_half ;
610+ if (g_rmt_objects [ch ].tx_state & E_FIRST_HALF ) {
611+ g_rmt_objects [ch ].tx_state &= ~E_FIRST_HALF ;
609612 } else {
610- g_rmt_objects [ch ].tx_state |= e_first_half ;
613+ g_rmt_objects [ch ].tx_state |= E_FIRST_HALF ;
611614 data += MAX_DATA_PER_CHANNEL * (g_rmt_objects [ch ].buffers );
612615 }
613616 }
614- for (i = 0 ; i < g_rmt_objects [ch ].remaining_to_send ; i ++ ) {
617+ for (i = 0 ; i < g_rmt_objects [ch ].data_size ; i ++ ) {
615618 * data ++ = RMTMEM .chan [ch ].data32 [i ].val ;
616619 }
617620 // configured callback
618621 if (g_rmt_objects [ch ].cb ) {
619622 // actually received data ptr
620- uint32_t * data = g_rmt_objects [ch ].remaining_ptr ;
623+ uint32_t * data = g_rmt_objects [ch ].data_ptr ;
621624 (g_rmt_objects [ch ].cb )(data , _rmt_get_mem_len (ch ));
622625
623626 // restart the reception
@@ -627,7 +630,7 @@ static void IRAM_ATTR _rmt_isr(void* arg)
627630 RMT .int_ena .val |= _INT_RX_END (ch );
628631 } else {
629632 // if not callback provide, expect only one Rx
630- g_rmt_objects [ch ].intr_mode &= ~e_rx_intr ;
633+ g_rmt_objects [ch ].intr_mode &= ~E_RX_INTR ;
631634 }
632635 }
633636 } else {
@@ -639,7 +642,7 @@ static void IRAM_ATTR _rmt_isr(void* arg)
639642
640643 }
641644
642- if (intr_val & _INT_ERROR (ch )) {
645+ if (intr_val & _INT_ERROR (ch )) {
643646 digitalWrite (2 , 1 );
644647 // clear the flag
645648 RMT .int_clr .val = _INT_ERROR (ch );
@@ -656,79 +659,79 @@ static void IRAM_ATTR _rmt_isr(void* arg)
656659 RMT .conf_ch [ch ].conf1 .mem_wr_rst = 0 ;
657660 }
658661
659- if (intr_val & _INT_TX_END (ch )) {
662+ if (intr_val & _INT_TX_END (ch )) {
660663
661664 RMT .int_clr .val = _INT_TX_END (ch );
662665
663- if (g_rmt_objects [ch ].tx_state & e_last_data ) {
664- g_rmt_objects [ch ].tx_state = e_end_trans ;
666+ if (g_rmt_objects [ch ].tx_state & E_LAST_DATA ) {
667+ g_rmt_objects [ch ].tx_state = E_END_TRANS ;
665668 RMT .conf_ch [ch ].conf1 .tx_conti_mode = 0 ;
666669 int half_tx_nr = MAX_DATA_PER_ITTERATION /2 ;
667670 int i ;
668- if (g_rmt_objects [ch ].tx_state & e_first_half ) {
671+ if (g_rmt_objects [ch ].tx_state & E_FIRST_HALF ) {
669672 for (i = 0 ; i < half_tx_nr ; i ++ ) {
670673 RMTMEM .chan [ch ].data32 [i ].val = 0x000F000F ;
671674 }
672675 RMTMEM .chan [ch ].data32 [i ].val = 0 ;
673- g_rmt_objects [ch ].tx_state &= ~e_first_half ;
676+ g_rmt_objects [ch ].tx_state &= ~E_FIRST_HALF ;
674677 } else {
675678 for (i = 0 ; i < half_tx_nr ; i ++ ) {
676679 RMTMEM .chan [ch ].data32 [half_tx_nr + i ].val = 0x000F000F ;
677680 }
678681 RMTMEM .chan [ch ].data32 [i ].val = 0 ;
679- g_rmt_objects [ch ].tx_state |= e_first_half ;
682+ g_rmt_objects [ch ].tx_state |= E_FIRST_HALF ;
680683 }
681684
682- } else if (g_rmt_objects [ch ].tx_state & e_end_trans ) {
685+ } else if (g_rmt_objects [ch ].tx_state & E_END_TRANS ) {
683686 RMT .conf_ch [ch ].conf1 .tx_conti_mode = 0 ;
684687 RMT .int_ena .val &= ~_INT_TX_END (ch );
685688 RMT .int_ena .val &= ~_INT_THR_EVNT (ch );
686- g_rmt_objects [ch ].intr_mode = e_no_intr ;
687- g_rmt_objects [ch ].tx_state = e_inactive ;
689+ g_rmt_objects [ch ].intr_mode = E_NO_INTR ;
690+ g_rmt_objects [ch ].tx_state = E_INACTIVE ;
688691 }
689692 }
690693
691- if (intr_val & _INT_THR_EVNT (ch )) {
694+ if (intr_val & _INT_THR_EVNT (ch )) {
692695 // clear the flag
693- RMT .int_clr .val | _INT_THR_EVNT (ch );
696+ RMT .int_clr .val = _INT_THR_EVNT (ch );
694697
695698 // initial setup of continuous mode
696- if (g_rmt_objects [ch ].tx_state & e_set_conti ) {
699+ if (g_rmt_objects [ch ].tx_state & E_SET_CONTI ) {
697700 RMT .conf_ch [ch ].conf1 .tx_conti_mode = 1 ;
698- g_rmt_objects [ch ].intr_mode &= ~e_set_conti ;
701+ g_rmt_objects [ch ].intr_mode &= ~E_SET_CONTI ;
699702 }
700703
701704 // check if still any data to be sent
702- uint32_t * data = g_rmt_objects [ch ].remaining_ptr ;
705+ uint32_t * data = g_rmt_objects [ch ].data_ptr ;
703706 if (data )
704707 {
705- int remaining_size = g_rmt_objects [ch ].remaining_to_send ;
708+ int remaining_size = g_rmt_objects [ch ].data_size ;
706709 int half_tx_nr = MAX_DATA_PER_ITTERATION /2 ;
707710 int i ;
708711
709712 // will the remaining data occupy the entire halfbuffer
710713 if (remaining_size > half_tx_nr ) {
711- if (g_rmt_objects [ch ].tx_state & e_first_half ) {
714+ if (g_rmt_objects [ch ].tx_state & E_FIRST_HALF ) {
712715 // ets_printf("first\n");
713716 RMTMEM .chan [ch ].data32 [0 ].val = data [0 ] - 1 ;
714717 for (i = 1 ; i < half_tx_nr ; i ++ ) {
715718 RMTMEM .chan [ch ].data32 [i ].val = data [i ];
716719 }
717- g_rmt_objects [ch ].tx_state &= ~e_first_half ;
720+ g_rmt_objects [ch ].tx_state &= ~E_FIRST_HALF ;
718721 } else {
719722 // ets_printf("second\n");
720723 for (i = 0 ; i < half_tx_nr ; i ++ ) {
721724 RMTMEM .chan [ch ].data32 [half_tx_nr + i ].val = data [i ];
722725 }
723- g_rmt_objects [ch ].tx_state |= e_first_half ;
726+ g_rmt_objects [ch ].tx_state |= E_FIRST_HALF ;
724727 }
725- g_rmt_objects [ch ].remaining_to_send -= half_tx_nr ;
726- g_rmt_objects [ch ].remaining_ptr += half_tx_nr ;
728+ g_rmt_objects [ch ].data_size -= half_tx_nr ;
729+ g_rmt_objects [ch ].data_ptr += half_tx_nr ;
727730 } else {
728731 // less remaining data than buffer size -> fill in with fake (inactive) pulses
729- ets_printf ("last chunk..." );
730- if (g_rmt_objects [ch ].tx_state & e_first_half ) {
731- ets_printf ("first\n" );
732+ // ets_printf("last chunk...");
733+ if (g_rmt_objects [ch ].tx_state & E_FIRST_HALF ) {
734+ // ets_printf("first\n");
732735 RMTMEM .chan [ch ].data32 [0 ].val = data [0 ] - 1 ;
733736 for (i = 1 ; i < half_tx_nr ; i ++ ) {
734737 if (i < remaining_size ) {
@@ -737,27 +740,27 @@ static void IRAM_ATTR _rmt_isr(void* arg)
737740 RMTMEM .chan [ch ].data32 [i ].val = 0x000F000F ;
738741 }
739742 }
740- g_rmt_objects [ch ].tx_state &= ~e_first_half ;
743+ g_rmt_objects [ch ].tx_state &= ~E_FIRST_HALF ;
741744 } else {
742- ets_printf ("second\n" );
745+ // ets_printf("second\n");
743746 for (i = 0 ; i < half_tx_nr ; i ++ ) {
744747 if (i < remaining_size ) {
745748 RMTMEM .chan [ch ].data32 [half_tx_nr + i ].val = data [i ];
746749 } else {
747750 RMTMEM .chan [ch ].data32 [half_tx_nr + i ].val = 0x000F000F ;
748751 }
749752 }
750- g_rmt_objects [ch ].tx_state |= e_first_half ;
753+ g_rmt_objects [ch ].tx_state |= E_FIRST_HALF ;
751754 }
752755 RMTMEM .chan [ch ].data32 [MAX_DATA_PER_ITTERATION ].val = 0 ;
753756 // mark
754- g_rmt_objects [ch ].remaining_ptr = NULL ;
757+ g_rmt_objects [ch ].data_ptr = NULL ;
755758 }
756759 } else {
757760 // no data left, just copy the fake (inactive) pulses
758- if ( (!(g_rmt_objects [ch ].tx_state & e_last_data )) &&
759- (!(g_rmt_objects [ch ].tx_state & e_end_trans )) ) {
760- g_rmt_objects [ch ].tx_state |= e_last_data ;
761+ if ( (!(g_rmt_objects [ch ].tx_state & E_LAST_DATA )) &&
762+ (!(g_rmt_objects [ch ].tx_state & E_END_TRANS )) ) {
763+ g_rmt_objects [ch ].tx_state |= E_END_TRANS ;
761764 } else {
762765 // ...do_nothing
763766 }
0 commit comments