Skip to content

Commit 3a7dfa1

Browse files
authored
Fixes rmtDeinit() and tests RX/TX before operations (espressif#6369)
* Fixes rmtDeinit() and tests RX/TX before operations * Optimizes final binary size * Typo
1 parent 96f8f5e commit 3a7dfa1

File tree

1 file changed

+57
-31
lines changed

1 file changed

+57
-31
lines changed

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

+57-31
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ struct rmt_obj_s
9696
void * arg;
9797
TaskHandle_t rxTaskHandle;
9898
bool rx_completed;
99+
bool tx_not_rx;
99100
};
100101

101102
/**
@@ -109,15 +110,15 @@ static xSemaphoreHandle g_rmt_objlocks[MAX_CHANNELS] = {
109110
};
110111

111112
static rmt_obj_t g_rmt_objects[MAX_CHANNELS] = {
112-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
113-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
114-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
115-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
113+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
114+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
115+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
116+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
116117
#if MAX_CHANNELS > 4
117-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
118-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
119-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
120-
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
118+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
119+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
120+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
121+
{ false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true},
121122
#endif
122123
};
123124

@@ -248,14 +249,34 @@ static bool _rmtCreateRxTask(rmt_obj_t* rmt)
248249
return true;
249250
}
250251

252+
// Helper function to test if an RMT channel is correctly assigned to TX or RX, issuing an error message if necessary
253+
// Also test RMT pointer for NULL and returns false in case it is NULL
254+
// return true when it is correctly assigned, false otherwise
255+
static bool _rmtCheckTXnotRX(rmt_obj_t* rmt, bool tx_not_rx)
256+
{
257+
if (!rmt) { // also returns false on NULL
258+
return false;
259+
}
260+
261+
if (rmt->tx_not_rx == tx_not_rx) { // matches expected RX/TX channel
262+
return true;
263+
}
264+
265+
if (tx_not_rx) { // expected TX channel
266+
log_e("Can't write on a RX RMT Channel");
267+
} else{ // expected RX channel
268+
log_e("Can't read on a TX RMT Channel");
269+
}
270+
return false; // missmatched
271+
}
251272

252273
/**
253274
* Public method definitions
254275
*/
255276

256277
bool rmtSetCarrier(rmt_obj_t* rmt, bool carrier_en, bool carrier_level, uint32_t low, uint32_t high)
257278
{
258-
if (!rmt || low > 0xFFFF || high > 0xFFFF) {
279+
if (!_rmtCheckTXnotRX(rmt, RMT_TX_MODE) || low > 0xFFFF || high > 0xFFFF) {
259280
return false;
260281
}
261282
size_t channel = rmt->channel;
@@ -268,7 +289,7 @@ bool rmtSetCarrier(rmt_obj_t* rmt, bool carrier_en, bool carrier_level, uint32_t
268289

269290
bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
270291
{
271-
if (!rmt || filter_level > 0xFF) {
292+
if (!_rmtCheckTXnotRX(rmt, RMT_RX_MODE) || filter_level > 0xFF) {
272293
return false;
273294
}
274295
size_t channel = rmt->channel;
@@ -281,7 +302,7 @@ bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
281302

282303
bool rmtSetRxThreshold(rmt_obj_t* rmt, uint32_t value)
283304
{
284-
if (!rmt || value > 0xFFFF) {
305+
if (!_rmtCheckTXnotRX(rmt, RMT_RX_MODE) || value > 0xFFFF) {
285306
return false;
286307
}
287308
size_t channel = rmt->channel;
@@ -306,14 +327,17 @@ bool rmtDeinit(rmt_obj_t *rmt)
306327

307328
RMT_MUTEX_LOCK(rmt->channel);
308329
// force stopping rmt processing
309-
rmt_rx_stop(rmt->channel);
310-
rmt_tx_stop(rmt->channel);
330+
if (rmt->tx_not_rx) {
331+
rmt_tx_stop(rmt->channel);
332+
} else {
333+
rmt_rx_stop(rmt->channel);
334+
if(rmt->rxTaskHandle){
335+
vTaskDelete(rmt->rxTaskHandle);
336+
rmt->rxTaskHandle = NULL;
337+
}
338+
}
311339

312-
if(rmt->rxTaskHandle){
313-
vTaskDelete(rmt->rxTaskHandle);
314-
rmt->rxTaskHandle = NULL;
315-
}
316-
rmt_driver_uninstall(rmt->channel);
340+
rmt_driver_uninstall(rmt->channel);
317341

318342
size_t from = rmt->channel;
319343
size_t to = rmt->buffers + rmt->channel;
@@ -330,6 +354,7 @@ bool rmtDeinit(rmt_obj_t *rmt)
330354
#if !CONFIG_DISABLE_HAL_LOCKS
331355
if(g_rmt_objlocks[from] != NULL) {
332356
vSemaphoreDelete(g_rmt_objlocks[from]);
357+
g_rmt_objlocks[from] = NULL;
333358
}
334359
#endif
335360

@@ -338,10 +363,9 @@ bool rmtDeinit(rmt_obj_t *rmt)
338363

339364
bool rmtLoop(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
340365
{
341-
if (!rmt) {
366+
if (!_rmtCheckTXnotRX(rmt, RMT_TX_MODE)) {
342367
return false;
343368
}
344-
345369
int channel = rmt->channel;
346370
RMT_MUTEX_LOCK(channel);
347371
rmt_tx_stop(channel);
@@ -353,10 +377,9 @@ bool rmtLoop(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
353377

354378
bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
355379
{
356-
if (!rmt) {
380+
if (!_rmtCheckTXnotRX(rmt, RMT_TX_MODE)) {
357381
return false;
358382
}
359-
360383
int channel = rmt->channel;
361384
RMT_MUTEX_LOCK(channel);
362385
rmt_tx_stop(channel);
@@ -368,10 +391,9 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
368391

369392
bool rmtWriteBlocking(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
370393
{
371-
if (!rmt) {
394+
if (!_rmtCheckTXnotRX(rmt, RMT_TX_MODE)) {
372395
return false;
373396
}
374-
375397
int channel = rmt->channel;
376398
RMT_MUTEX_LOCK(channel);
377399
rmt_tx_stop(channel);
@@ -383,18 +405,17 @@ bool rmtWriteBlocking(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
383405

384406
bool rmtReadData(rmt_obj_t* rmt, uint32_t* data, size_t size)
385407
{
386-
if (!rmt) {
408+
if (!_rmtCheckTXnotRX(rmt, RMT_RX_MODE)) {
387409
return false;
388410
}
389-
390411
rmtReadAsync(rmt, (rmt_data_t*) data, size, NULL, false, 0);
391412
return true;
392413
}
393414

394415

395416
bool rmtBeginReceive(rmt_obj_t* rmt)
396417
{
397-
if (!rmt) {
418+
if (!_rmtCheckTXnotRX(rmt, RMT_RX_MODE)) {
398419
return false;
399420
}
400421
int channel = rmt->channel;
@@ -418,7 +439,7 @@ bool rmtReceiveCompleted(rmt_obj_t* rmt)
418439

419440
bool rmtRead(rmt_obj_t* rmt, rmt_rx_data_cb_t cb, void * arg)
420441
{
421-
if (!rmt || !cb) {
442+
if (!_rmtCheckTXnotRX(rmt, RMT_RX_MODE)) {
422443
return false;
423444
}
424445
int channel = rmt->channel;
@@ -449,15 +470,19 @@ bool rmtEnd(rmt_obj_t* rmt)
449470
int channel = rmt->channel;
450471

451472
RMT_MUTEX_LOCK(channel);
452-
rmt_rx_stop(channel);
453-
rmt->rx_completed = true;
473+
if (rmt->tx_not_rx) {
474+
rmt_tx_stop(channel);
475+
} else {
476+
rmt_rx_stop(channel);
477+
rmt->rx_completed = true;
478+
}
454479
RMT_MUTEX_UNLOCK(channel);
455480
return true;
456481
}
457482

458483
bool rmtReadAsync(rmt_obj_t* rmt, rmt_data_t* data, size_t size, void* eventFlag, bool waitForData, uint32_t timeout)
459484
{
460-
if (!rmt) {
485+
if (!_rmtCheckTXnotRX(rmt, RMT_RX_MODE)) {
461486
return false;
462487
}
463488
int channel = rmt->channel;
@@ -568,6 +593,7 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
568593
rmt->data_size = 0;
569594
rmt->rx_completed = false;
570595
rmt->events = NULL;
596+
rmt->tx_not_rx = tx_not_rx;
571597

572598
#if !CONFIG_DISABLE_HAL_LOCKS
573599
if(g_rmt_objlocks[channel] == NULL) {

0 commit comments

Comments
 (0)