Content-Length: 318621 | pFad | https://github.com/bill88t/circuitpython/commit/85db016b8c6464ba256f155000a5946b78109ad6

56 espressif: use dma for pulseio · bill88t/circuitpython@85db016 · GitHub
Skip to content

Commit 85db016

Browse files
authored
espressif: use dma for pulseio
1 parent e13d0af commit 85db016

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

ports/espressif/common-hal/pulseio/PulseIn.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu
8080
}
8181
// We add one to the maxlen version to ensure that two symbols at lease are
8282
// captured because we may skip the first portion of a symbol.
83-
self->raw_symbols_size = MIN(64, maxlen / 2 + 1) * sizeof(rmt_symbol_word_t);
84-
self->raw_symbols = (rmt_symbol_word_t *)m_malloc_without_collect(self->raw_symbols_size);
83+
self->raw_symbols_size = (maxlen / 2 + 1) * sizeof(rmt_symbol_word_t);
84+
// RMT DMA mode cannot access PSRAM -> ensure raw_symbols is in internal ram
85+
self->raw_symbols = (rmt_symbol_word_t *)heap_caps_malloc(self->raw_symbols_size, MALLOC_CAP_INTERNAL);
8586
if (self->raw_symbols == NULL) {
8687
m_free(self->buffer);
8788
m_malloc_fail(self->raw_symbols_size);
@@ -109,17 +110,26 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu
109110
.clk_src = RMT_CLK_SRC_DEFAULT,
110111
// 2 us resolution so we can capture 65ms pulses. The RMT period is only 15 bits.
111112
.resolution_hz = 1000000 / 2,
112-
.mem_block_symbols = SOC_RMT_MEM_WORDS_PER_CHANNEL,
113+
.mem_block_symbols = self->raw_symbols_size,
114+
.flags.with_dma = 1
113115
};
114-
// If we fail here, the buffers allocated above will be garbage collected.
115-
CHECK_ESP_RESULT(rmt_new_rx_channel(&config, &self->channel));
116+
// If we fail here, the self->buffer will be garbage collected.
117+
esp_err_t result = rmt_new_rx_channel(&config, &self->channel);
118+
if (result != ESP_OK){
119+
heap_caps_free(self->raw_symbols);
120+
raise_esp_error(result);
121+
}
116122

117123
rmt_rx_event_callbacks_t rx_callback = {
118124
.on_recv_done = _done_callback
119125
};
120126
rmt_rx_register_event_callbacks(self->channel, &rx_callback, self);
121127
rmt_enable(self->channel);
122-
rmt_receive(self->channel, self->raw_symbols, self->raw_symbols_size, &rx_config);
128+
result = rmt_receive(self->channel, self->raw_symbols, self->raw_symbols_size, &rx_config);
129+
if (result != ESP_OK){
130+
heap_caps_free(self->raw_symbols);
131+
raise_esp_error(result);
132+
}
123133
}
124134

125135
bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t *self) {

0 commit comments

Comments
 (0)








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: https://github.com/bill88t/circuitpython/commit/85db016b8c6464ba256f155000a5946b78109ad6

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy