Skip to content

Commit 506ced8

Browse files
committed
renamed internal structures and enums, fixed formatting
1 parent 4397831 commit 506ced8

File tree

3 files changed

+85
-80
lines changed

3 files changed

+85
-80
lines changed

Diff for: cores/esp32/esp32-hal-rmt.c

+82-79
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,18 @@
4646
* Typedefs for internal stuctures, enums
4747
*/
4848
typedef 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

5555
typedef 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

6363
struct 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

8686
static 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-
265268
bool 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
}

Diff for: cores/esp32/esp32-hal-rmt.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ bool rmtSetCarrier(rmt_obj_t* rmt, bool carrier_en, bool carrier_level, uint32_t
103103
/**
104104
* Setting input filter
105105
*/
106-
bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
106+
bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level);
107107

108108

109109
// TODO:
@@ -112,6 +112,8 @@ bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
112112
// * put sanity checks to some macro or inlines
113113
// * doxy comments
114114
// * error reporting
115+
// * release internal buffers
116+
// * rename internal structures to make it more sensibles
115117

116118
#ifdef __cplusplus
117119
}

0 commit comments

Comments
 (0)