@@ -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
111112static 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
256277bool 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
269290bool 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
282303bool 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
339364bool 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
354378bool 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
369392bool 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
384406bool 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
395416bool 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
419440bool 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
458483bool 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