@@ -96,6 +96,7 @@ struct rmt_obj_s
96
96
void * arg ;
97
97
TaskHandle_t rxTaskHandle ;
98
98
bool rx_completed ;
99
+ bool tx_not_rx ;
99
100
};
100
101
101
102
/**
@@ -109,15 +110,15 @@ static xSemaphoreHandle g_rmt_objlocks[MAX_CHANNELS] = {
109
110
};
110
111
111
112
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 },
116
117
#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 },
121
122
#endif
122
123
};
123
124
@@ -248,14 +249,34 @@ static bool _rmtCreateRxTask(rmt_obj_t* rmt)
248
249
return true;
249
250
}
250
251
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
+ }
251
272
252
273
/**
253
274
* Public method definitions
254
275
*/
255
276
256
277
bool rmtSetCarrier (rmt_obj_t * rmt , bool carrier_en , bool carrier_level , uint32_t low , uint32_t high )
257
278
{
258
- if (!rmt || low > 0xFFFF || high > 0xFFFF ) {
279
+ if (!_rmtCheckTXnotRX ( rmt , RMT_TX_MODE ) || low > 0xFFFF || high > 0xFFFF ) {
259
280
return false;
260
281
}
261
282
size_t channel = rmt -> channel ;
@@ -268,7 +289,7 @@ bool rmtSetCarrier(rmt_obj_t* rmt, bool carrier_en, bool carrier_level, uint32_t
268
289
269
290
bool rmtSetFilter (rmt_obj_t * rmt , bool filter_en , uint32_t filter_level )
270
291
{
271
- if (!rmt || filter_level > 0xFF ) {
292
+ if (!_rmtCheckTXnotRX ( rmt , RMT_RX_MODE ) || filter_level > 0xFF ) {
272
293
return false;
273
294
}
274
295
size_t channel = rmt -> channel ;
@@ -281,7 +302,7 @@ bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
281
302
282
303
bool rmtSetRxThreshold (rmt_obj_t * rmt , uint32_t value )
283
304
{
284
- if (!rmt || value > 0xFFFF ) {
305
+ if (!_rmtCheckTXnotRX ( rmt , RMT_RX_MODE ) || value > 0xFFFF ) {
285
306
return false;
286
307
}
287
308
size_t channel = rmt -> channel ;
@@ -306,14 +327,17 @@ bool rmtDeinit(rmt_obj_t *rmt)
306
327
307
328
RMT_MUTEX_LOCK (rmt -> channel );
308
329
// 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
+ }
311
339
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 );
317
341
318
342
size_t from = rmt -> channel ;
319
343
size_t to = rmt -> buffers + rmt -> channel ;
@@ -330,6 +354,7 @@ bool rmtDeinit(rmt_obj_t *rmt)
330
354
#if !CONFIG_DISABLE_HAL_LOCKS
331
355
if (g_rmt_objlocks [from ] != NULL ) {
332
356
vSemaphoreDelete (g_rmt_objlocks [from ]);
357
+ g_rmt_objlocks [from ] = NULL ;
333
358
}
334
359
#endif
335
360
@@ -338,10 +363,9 @@ bool rmtDeinit(rmt_obj_t *rmt)
338
363
339
364
bool rmtLoop (rmt_obj_t * rmt , rmt_data_t * data , size_t size )
340
365
{
341
- if (!rmt ) {
366
+ if (!_rmtCheckTXnotRX ( rmt , RMT_TX_MODE ) ) {
342
367
return false;
343
368
}
344
-
345
369
int channel = rmt -> channel ;
346
370
RMT_MUTEX_LOCK (channel );
347
371
rmt_tx_stop (channel );
@@ -353,10 +377,9 @@ bool rmtLoop(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
353
377
354
378
bool rmtWrite (rmt_obj_t * rmt , rmt_data_t * data , size_t size )
355
379
{
356
- if (!rmt ) {
380
+ if (!_rmtCheckTXnotRX ( rmt , RMT_TX_MODE ) ) {
357
381
return false;
358
382
}
359
-
360
383
int channel = rmt -> channel ;
361
384
RMT_MUTEX_LOCK (channel );
362
385
rmt_tx_stop (channel );
@@ -368,10 +391,9 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
368
391
369
392
bool rmtWriteBlocking (rmt_obj_t * rmt , rmt_data_t * data , size_t size )
370
393
{
371
- if (!rmt ) {
394
+ if (!_rmtCheckTXnotRX ( rmt , RMT_TX_MODE ) ) {
372
395
return false;
373
396
}
374
-
375
397
int channel = rmt -> channel ;
376
398
RMT_MUTEX_LOCK (channel );
377
399
rmt_tx_stop (channel );
@@ -383,18 +405,17 @@ bool rmtWriteBlocking(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
383
405
384
406
bool rmtReadData (rmt_obj_t * rmt , uint32_t * data , size_t size )
385
407
{
386
- if (!rmt ) {
408
+ if (!_rmtCheckTXnotRX ( rmt , RMT_RX_MODE ) ) {
387
409
return false;
388
410
}
389
-
390
411
rmtReadAsync (rmt , (rmt_data_t * ) data , size , NULL , false, 0 );
391
412
return true;
392
413
}
393
414
394
415
395
416
bool rmtBeginReceive (rmt_obj_t * rmt )
396
417
{
397
- if (!rmt ) {
418
+ if (!_rmtCheckTXnotRX ( rmt , RMT_RX_MODE ) ) {
398
419
return false;
399
420
}
400
421
int channel = rmt -> channel ;
@@ -418,7 +439,7 @@ bool rmtReceiveCompleted(rmt_obj_t* rmt)
418
439
419
440
bool rmtRead (rmt_obj_t * rmt , rmt_rx_data_cb_t cb , void * arg )
420
441
{
421
- if (!rmt || ! cb ) {
442
+ if (!_rmtCheckTXnotRX ( rmt , RMT_RX_MODE ) ) {
422
443
return false;
423
444
}
424
445
int channel = rmt -> channel ;
@@ -449,15 +470,19 @@ bool rmtEnd(rmt_obj_t* rmt)
449
470
int channel = rmt -> channel ;
450
471
451
472
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
+ }
454
479
RMT_MUTEX_UNLOCK (channel );
455
480
return true;
456
481
}
457
482
458
483
bool rmtReadAsync (rmt_obj_t * rmt , rmt_data_t * data , size_t size , void * eventFlag , bool waitForData , uint32_t timeout )
459
484
{
460
- if (!rmt ) {
485
+ if (!_rmtCheckTXnotRX ( rmt , RMT_RX_MODE ) ) {
461
486
return false;
462
487
}
463
488
int channel = rmt -> channel ;
@@ -568,6 +593,7 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
568
593
rmt -> data_size = 0 ;
569
594
rmt -> rx_completed = false;
570
595
rmt -> events = NULL ;
596
+ rmt -> tx_not_rx = tx_not_rx ;
571
597
572
598
#if !CONFIG_DISABLE_HAL_LOCKS
573
599
if (g_rmt_objlocks [channel ] == NULL ) {
0 commit comments