@@ -94,6 +94,7 @@ struct rmt_obj_s
94
94
transaction_state_t tx_state ;
95
95
rmt_rx_data_cb_t cb ;
96
96
bool data_alloc ;
97
+ void * arg ;
97
98
};
98
99
99
100
/**
@@ -104,14 +105,14 @@ static xSemaphoreHandle g_rmt_objlocks[MAX_CHANNELS] = {
104
105
};
105
106
106
107
static 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 },
115
116
};
116
117
117
118
/**
@@ -324,6 +325,7 @@ bool rmtReadData(rmt_obj_t* rmt, uint32_t* data, size_t size)
324
325
return true;
325
326
}
326
327
328
+
327
329
bool rmtBeginReceive (rmt_obj_t * rmt )
328
330
{
329
331
if (!rmt ) {
@@ -357,14 +359,15 @@ bool rmtReceiveCompleted(rmt_obj_t* rmt)
357
359
}
358
360
}
359
361
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 )
361
363
{
362
364
if (!rmt && !cb ) {
363
365
return false;
364
366
}
365
367
int channel = rmt -> channel ;
366
368
367
369
RMT_MUTEX_LOCK (channel );
370
+ rmt -> arg = arg ;
368
371
rmt -> intr_mode = E_RX_INTR ;
369
372
rmt -> tx_state = E_FIRST_HALF ;
370
373
rmt -> cb = cb ;
@@ -391,6 +394,19 @@ bool rmtRead(rmt_obj_t* rmt, rmt_rx_data_cb_t cb)
391
394
return true;
392
395
}
393
396
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
+
394
410
bool rmtReadAsync (rmt_obj_t * rmt , rmt_data_t * data , size_t size , void * eventFlag , bool waitForData , uint32_t timeout )
395
411
{
396
412
if (!rmt ) {
@@ -523,6 +539,8 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
523
539
rmt -> tx_not_rx = tx_not_rx ;
524
540
rmt -> buffers = buffers ;
525
541
rmt -> channel = channel ;
542
+ rmt -> arg = NULL ;
543
+
526
544
_initPin (pin , channel , tx_not_rx );
527
545
528
546
// 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)
544
562
RMT .conf_ch [channel ].conf1 .idle_out_lv = 0 ; // signal level for idle
545
563
RMT .conf_ch [channel ].conf1 .idle_out_en = 1 ; // enable idle
546
564
RMT .conf_ch [channel ].conf1 .ref_always_on = 0 ; // base clock
565
+
547
566
RMT .apb_conf .fifo_mask = 1 ;
548
567
549
568
if (tx_not_rx ) {
@@ -659,7 +678,7 @@ static void IRAM_ATTR _rmt_isr(void* arg)
659
678
}
660
679
if (g_rmt_objects [ch ].cb ) {
661
680
// 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 );
663
682
664
683
// restart the reception
665
684
RMT .conf_ch [ch ].conf1 .mem_owner = 1 ;
0 commit comments