@@ -94,6 +94,7 @@ struct rmt_obj_s
9494 transaction_state_t tx_state ;
9595 rmt_rx_data_cb_t cb ;
9696 bool data_alloc ;
97+ void * arg ;
9798};
9899
99100/**
@@ -104,14 +105,14 @@ static xSemaphoreHandle g_rmt_objlocks[MAX_CHANNELS] = {
104105};
105106
106107static rmt_obj_t g_rmt_objects [MAX_CHANNELS ] = {
107- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
108- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
109- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
110- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
111- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
112- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
113- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
114- { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false},
108+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
109+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
110+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
111+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
112+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
113+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
114+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
115+ { false, NULL , 0 , 0 , 0 , 0 , 0 , NULL , E_NO_INTR , E_INACTIVE , NULL , false, NULL },
115116};
116117
117118/**
@@ -324,6 +325,7 @@ bool rmtReadData(rmt_obj_t* rmt, uint32_t* data, size_t size)
324325 return true;
325326}
326327
328+
327329bool rmtBeginReceive (rmt_obj_t * rmt )
328330{
329331 if (!rmt ) {
@@ -357,14 +359,15 @@ bool rmtReceiveCompleted(rmt_obj_t* rmt)
357359 }
358360}
359361
360- bool rmtRead (rmt_obj_t * rmt , rmt_rx_data_cb_t cb )
362+ bool rmtRead (rmt_obj_t * rmt , rmt_rx_data_cb_t cb , void * arg )
361363{
362364 if (!rmt && !cb ) {
363365 return false;
364366 }
365367 int channel = rmt -> channel ;
366368
367369 RMT_MUTEX_LOCK (channel );
370+ rmt -> arg = arg ;
368371 rmt -> intr_mode = E_RX_INTR ;
369372 rmt -> tx_state = E_FIRST_HALF ;
370373 rmt -> cb = cb ;
@@ -391,6 +394,19 @@ bool rmtRead(rmt_obj_t* rmt, rmt_rx_data_cb_t cb)
391394 return true;
392395}
393396
397+ bool rmtEnd (rmt_obj_t * rmt ) {
398+ if (!rmt ) {
399+ return false;
400+ }
401+ int channel = rmt -> channel ;
402+
403+ RMT_MUTEX_LOCK (channel );
404+ RMT .conf_ch [channel ].conf1 .rx_en = 1 ;
405+ RMT_MUTEX_UNLOCK (channel );
406+
407+ return true;
408+ }
409+
394410bool rmtReadAsync (rmt_obj_t * rmt , rmt_data_t * data , size_t size , void * eventFlag , bool waitForData , uint32_t timeout )
395411{
396412 if (!rmt ) {
@@ -523,6 +539,8 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
523539 rmt -> tx_not_rx = tx_not_rx ;
524540 rmt -> buffers = buffers ;
525541 rmt -> channel = channel ;
542+ rmt -> arg = NULL ;
543+
526544 _initPin (pin , channel , tx_not_rx );
527545
528546 // Initialize the registers in default mode:
@@ -544,6 +562,7 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
544562 RMT .conf_ch [channel ].conf1 .idle_out_lv = 0 ; // signal level for idle
545563 RMT .conf_ch [channel ].conf1 .idle_out_en = 1 ; // enable idle
546564 RMT .conf_ch [channel ].conf1 .ref_always_on = 0 ; // base clock
565+
547566 RMT .apb_conf .fifo_mask = 1 ;
548567
549568 if (tx_not_rx ) {
@@ -659,7 +678,7 @@ static void IRAM_ATTR _rmt_isr(void* arg)
659678 }
660679 if (g_rmt_objects [ch ].cb ) {
661680 // actually received data ptr
662- (g_rmt_objects [ch ].cb )(data_received , _rmt_get_mem_len (ch ));
681+ (g_rmt_objects [ch ].cb )(data_received , _rmt_get_mem_len (ch ), g_rmt_objects [ ch ]. arg );
663682
664683 // restart the reception
665684 RMT .conf_ch [ch ].conf1 .mem_owner = 1 ;
0 commit comments