Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3a7dfa1

Browse filesBrowse 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
Copy full SHA for 3a7dfa1

File tree

Expand file treeCollapse file tree

1 file changed

+57
-31
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+57
-31
lines changed

‎cores/esp32/esp32-hal-rmt.c

Copy file name to clipboardExpand all lines: cores/esp32/esp32-hal-rmt.c
+57-31Lines changed: 57 additions & 31 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.