@@ -80,8 +80,9 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu
80
80
}
81
81
// We add one to the maxlen version to ensure that two symbols at lease are
82
82
// 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 * )port_malloc (self -> raw_symbols_size , true);
85
86
if (self -> raw_symbols == NULL ) {
86
87
m_free (self -> buffer );
87
88
m_malloc_fail (self -> raw_symbols_size );
@@ -109,17 +110,26 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu
109
110
.clk_src = RMT_CLK_SRC_DEFAULT ,
110
111
// 2 us resolution so we can capture 65ms pulses. The RMT period is only 15 bits.
111
112
.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
113
115
};
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
+ port_free (self -> raw_symbols );
120
+ raise_esp_error (result );
121
+ }
116
122
117
123
rmt_rx_event_callbacks_t rx_callback = {
118
124
.on_recv_done = _done_callback
119
125
};
120
126
rmt_rx_register_event_callbacks (self -> channel , & rx_callback , self );
121
127
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
+ port_free (self -> raw_symbols );
131
+ raise_esp_error (result );
132
+ }
123
133
}
124
134
125
135
bool common_hal_pulseio_pulsein_deinited (pulseio_pulsein_obj_t * self ) {
0 commit comments