Skip to content

Commit f1c1dd6

Browse files
committed
modified of rmt interface for simpler/easier usage
1 parent d2f3e69 commit f1c1dd6

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

Diff for: cores/esp32/esp32-hal-rmt.c

+12-8
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ static xSemaphoreHandle g_rmt_block_lock = NULL;
9191

9292
static void _initPin(int pin, int channel, bool tx_not_rx);
9393

94+
static bool _rmtSendOnce(rmt_obj_t* rmt, uint32_t* data, size_t size);
95+
96+
9497
static void IRAM_ATTR _rmt_isr(void* arg);
9598

9699

@@ -125,16 +128,17 @@ bool rmtDeinit(rmt_obj_t *rmt)
125128
return true;
126129
}
127130

128-
bool rmtSendQueued(rmt_obj_t* rmt, uint32_t* data, size_t size)
131+
bool rmtSent(rmt_obj_t* rmt, uint32_t* data, size_t size)
129132
{
130133
if (!rmt) {
131134
return false;
132135
}
133136

134137
int channel = rmt->channel;
138+
int allocated_size = 64 * rmt->buffers;
139+
140+
if (size > allocated_size) {
135141

136-
if (size > MAX_DATA_PER_ITTERATION) {
137-
// if (size > MAX_DATA_PER_CHANNEL) {
138142
int half_tx_nr = MAX_DATA_PER_ITTERATION/2;
139143
RMT_MUTEX_LOCK(channel);
140144
// setup interrupt handler if not yet installed for half and full tx
@@ -172,10 +176,10 @@ bool rmtSendQueued(rmt_obj_t* rmt, uint32_t* data, size_t size)
172176
RMT_MUTEX_UNLOCK(channel);
173177

174178
// start the transation
175-
return rmtSend(rmt, data, MAX_DATA_PER_ITTERATION);
179+
return _rmtSendOnce(rmt, data, MAX_DATA_PER_ITTERATION);
176180
} else {
177181
// use one-go mode if data fits one buffer
178-
return rmtSend(rmt, data, size);
182+
return _rmtSendOnce(rmt, data, size);
179183
}
180184
}
181185

@@ -269,7 +273,7 @@ bool rmtReceiveAsync(rmt_obj_t* rmt, size_t idle_thres, uint32_t* data, size_t s
269273
}
270274

271275

272-
bool rmtSend(rmt_obj_t* rmt, uint32_t* data, size_t size)
276+
bool _rmtSendOnce(rmt_obj_t* rmt, uint32_t* data, size_t size)
273277
{
274278
if (!rmt) {
275279
return false;
@@ -339,9 +343,9 @@ float rmtSetTick(rmt_obj_t* rmt, float tick)
339343
}
340344
}
341345

342-
rmt_obj_t* rmtInit(int pin, bool tx_not_rx, int entries, int period)
346+
rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
343347
{
344-
int buffers = 1 + entries/MAX_DATA_PER_CHANNEL;
348+
int buffers = memsize;
345349
rmt_obj_t* rmt;
346350
size_t i;
347351
size_t j;

Diff for: cores/esp32/esp32-hal-rmt.h

+17-12
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,24 @@ extern "C" {
1010

1111
struct rmt_obj_s;
1212

13+
typedef enum {
14+
e_reserve_64_items = 1,
15+
e_reserve_128_items = 2,
16+
e_reserve_192_items = 3,
17+
e_reserve_256_items = 4,
18+
e_reserve_320_items = 5,
19+
e_reserve_384_items = 6,
20+
e_reserve_448_items = 7,
21+
e_reserve_512_items = 8,
22+
} rmt_reserve_memsize_t;
23+
1324
typedef struct rmt_obj_s rmt_obj_t;
1425

1526
/**
1627
* Initialize the object
1728
*
1829
*/
19-
rmt_obj_t* rmtInit(int pin, bool tx_not_rx, int entries, int period);
30+
rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize);
2031

2132
/**
2233
* Sets the clock/divider of timebase the nearest tick to the supplied value in nanoseconds
@@ -25,22 +36,17 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, int entries, int period);
2536
float rmtSetTick(rmt_obj_t* rmt, float tick);
2637

2738
/**
28-
* Sending data in one-go mode (more data must span over multiple channels)
39+
* Sending data in one-go mode or continual mode
40+
* (more data being send while updating buffers in interrupts)
2941
*
3042
*/
3143
bool rmtSend(rmt_obj_t* rmt, uint32_t* data, size_t size);
3244

33-
/**
34-
* Sending data in one-go mode (more data being send while updating buffers in interrupts)
35-
*
36-
*/
37-
bool rmtSendQueued(rmt_obj_t* rmt, uint32_t* data, size_t size);
38-
3945
/**
4046
* Initiates simple data receive without interrupts
4147
*
4248
*/
43-
bool rmtReceive(rmt_obj_t* rmt, size_t idle_thres);
49+
bool rmtBeginReceive(rmt_obj_t* rmt, size_t idle_thres);
4450

4551
/**
4652
* Wait method for synchronous receive
@@ -54,11 +60,10 @@ bool rmtWaitForData(rmt_obj_t* rmt, uint32_t* data, size_t size);
5460
*/
5561
bool rmtReceiveAsync(rmt_obj_t* rmt, size_t idle_thres, uint32_t* data, size_t size, void* event_flags);
5662

57-
58-
5963
// TODO:
64+
// * add timeout to waiForData
65+
// * try to eliminate idle_thres from the receiving functions
6066
// * carrier interface
61-
// * mutexes
6267
// * uninstall interrupt when all channels are deinit
6368
// * send only-conti mode with circular-buffer
6469
// * put sanity checks to some macro or inlines

0 commit comments

Comments
 (0)