fixed linter errors and undone function renaming

This commit is contained in:
g3gg0
2022-12-05 09:36:45 +01:00
parent 8c34f28992
commit 5aae1c3924
4 changed files with 96 additions and 110 deletions

View File

@@ -6,11 +6,9 @@
#define TAG "DigitalSignal" #define TAG "DigitalSignal"
#define F_TIM (64000000.0)
#define F_TIM (64000000.0) #define T_TIM 1562 /* 15.625 ns *100 */
#define T_TIM 1562 /* 15.625 ns *100 */ #define T_TIM_DIV2 781 /* 15.625 ns / 2 *100 */
#define T_TIM_DIV2 781 /* 15.625 ns / 2 *100 */
DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt) { DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt) {
DigitalSignal* signal = malloc(sizeof(DigitalSignal)); DigitalSignal* signal = malloc(sizeof(DigitalSignal));
@@ -32,7 +30,7 @@ DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt) {
signal->dma_config_gpio.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; signal->dma_config_gpio.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP;
signal->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH; signal->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH;
signal->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) &(TIM2->ARR); signal->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) & (TIM2->ARR);
signal->dma_config_timer.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; signal->dma_config_timer.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH;
signal->dma_config_timer.Mode = LL_DMA_MODE_NORMAL; signal->dma_config_timer.Mode = LL_DMA_MODE_NORMAL;
signal->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; signal->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;
@@ -131,7 +129,7 @@ uint32_t digital_signal_get_edge(DigitalSignal* signal, uint32_t edge_num) {
return signal->edge_timings[edge_num]; return signal->edge_timings[edge_num];
} }
void digital_signal_prepare(DigitalSignal* signal) { void digital_signal_prepare_arr(DigitalSignal* signal) {
furi_assert(signal); furi_assert(signal);
furi_assert(signal->gpio); furi_assert(signal->gpio);
furi_assert(signal->gpio->pin); furi_assert(signal->gpio->pin);
@@ -181,8 +179,8 @@ static bool digital_signal_setup_dma(DigitalSignal* signal) {
return false; return false;
} }
signal->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t) signal->gpio_buff; signal->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t)signal->gpio_buff;
signal->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) &(signal->gpio->port->BSRR); signal->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) & (signal->gpio->port->BSRR);
signal->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t)signal->reload_reg_buff; signal->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t)signal->reload_reg_buff;
signal->dma_config_timer.NbData = signal->reload_reg_entries; signal->dma_config_timer.NbData = signal->reload_reg_entries;
@@ -198,7 +196,6 @@ static bool digital_signal_setup_dma(DigitalSignal* signal) {
} }
static void digital_signal_setup_timer() { static void digital_signal_setup_timer() {
digital_signal_stop_timer(); digital_signal_stop_timer();
LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP); LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP);
@@ -228,7 +225,7 @@ void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio) {
/* single signal, add a temporary, terminating edge at the end */ /* single signal, add a temporary, terminating edge at the end */
signal->edge_timings[signal->edge_cnt++] = 10; signal->edge_timings[signal->edge_cnt++] = 10;
digital_signal_prepare(signal); digital_signal_prepare_arr(signal);
digital_signal_setup_dma(signal); digital_signal_setup_dma(signal);
digital_signal_setup_timer(); digital_signal_setup_timer();
@@ -257,7 +254,6 @@ void digital_sequence_alloc_sequence(DigitalSequence* sequence, uint32_t size) {
} }
DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio) { DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio) {
DigitalSequence* sequence = malloc(sizeof(DigitalSequence)); DigitalSequence* sequence = malloc(sizeof(DigitalSequence));
sequence->gpio = gpio; sequence->gpio = gpio;
@@ -277,7 +273,10 @@ void digital_sequence_free(DigitalSequence* sequence) {
free(sequence); free(sequence);
} }
void digital_sequence_set_signal(DigitalSequence* sequence, uint8_t signal_index, DigitalSignal* signal) { void digital_sequence_set_signal(
DigitalSequence* sequence,
uint8_t signal_index,
DigitalSignal* signal) {
furi_assert(sequence); furi_assert(sequence);
furi_assert(signal); furi_assert(signal);
furi_assert(signal_index < sequence->signals_size); furi_assert(signal_index < sequence->signals_size);
@@ -286,7 +285,7 @@ void digital_sequence_set_signal(DigitalSequence* sequence, uint8_t signal_index
signal->gpio = sequence->gpio; signal->gpio = sequence->gpio;
signal->reload_reg_remainder = 0; signal->reload_reg_remainder = 0;
digital_signal_prepare(signal); digital_signal_prepare_arr(signal);
} }
void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time) { void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time) {
@@ -306,52 +305,48 @@ void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index) {
} }
void digital_signal_update_dma(DigitalSignal* signal) { void digital_signal_update_dma(DigitalSignal* signal) {
volatile uint32_t dma1_data[] = { volatile uint32_t dma1_data[] = {
/* R6 */ (uint32_t)&(DMA1_Channel1->CCR), /* R6 */ (uint32_t) & (DMA1_Channel1->CCR),
/* R7 */ DMA1_Channel1->CCR & ~DMA_CCR_EN, /* R7 */ DMA1_Channel1->CCR & ~DMA_CCR_EN,
/* R8 */ 2, /* R8 */ 2,
/* R9 */ (uint32_t)&(signal->gpio->port->BSRR), /* R9 */ (uint32_t) & (signal->gpio->port->BSRR),
/* R10 */ (uint32_t)signal->gpio_buff, /* R10 */ (uint32_t)signal->gpio_buff,
/* R11 */ DMA1_Channel1->CCR | DMA_CCR_EN }; /* R11 */ DMA1_Channel1->CCR | DMA_CCR_EN};
volatile uint32_t dma2_data[] = { volatile uint32_t dma2_data[] = {
/* R0 */ (uint32_t)&(DMA1_Channel2->CCR), /* R0 */ (uint32_t) & (DMA1_Channel2->CCR),
/* R1 */ DMA1_Channel2->CCR & ~DMA_CCR_EN, /* R1 */ DMA1_Channel2->CCR & ~DMA_CCR_EN,
/* R2 */ (uint32_t)signal->reload_reg_entries, /* R2 */ (uint32_t)signal->reload_reg_entries,
/* R3 */ (uint32_t)&(TIM2->ARR), /* R3 */ (uint32_t) & (TIM2->ARR),
/* R4 */ (uint32_t)signal->reload_reg_buff, /* R4 */ (uint32_t)signal->reload_reg_buff,
/* R5 */ DMA1_Channel2->CCR | DMA_CCR_EN }; /* R5 */ DMA1_Channel2->CCR | DMA_CCR_EN};
/* hurry when setting up next transfer */ /* hurry when setting up next transfer */
asm volatile("\t" asm volatile("\t"
"MOV r6, %[data1]\n\t" "MOV r6, %[data1]\n\t"
"MOV r7, %[data2]\n\t" "MOV r7, %[data2]\n\t"
"PUSH {r0-r12}\n\t" "PUSH {r0-r12}\n\t"
"LDM r7, {r0-r5}\n\t" "LDM r7, {r0-r5}\n\t"
"LDM r6, {r6-r11}\n\t" "LDM r6, {r6-r11}\n\t"
"loop:\n\t" "loop:\n\t"
"LDR r12, [r0, #4]\n\t" "LDR r12, [r0, #4]\n\t"
"CMP r12, #0\n\t" "CMP r12, #0\n\t"
"BNE loop\n\t" "BNE loop\n\t"
"STM r6, {r7-r10}\n\t" /* disable channel and set up new parameters */ "STM r6, {r7-r10}\n\t" /* disable channel and set up new parameters */
"STR r11, [r6, #0]\n\t" /* enable channel again */ "STR r11, [r6, #0]\n\t" /* enable channel again */
"STM r0, {r1-r4}\n\t" /* disable channel and set up new parameters */ "STM r0, {r1-r4}\n\t" /* disable channel and set up new parameters */
"STR r5, [r0, #0]\n\t" /* enable channel again */ "STR r5, [r0, #0]\n\t" /* enable channel again */
"POP {r0-r12}\n\t" "POP {r0-r12}\n\t"
: /* no outputs*/
: /* inputs */
[data1] "r" (dma1_data),
[data2] "r" (dma2_data)
: "r6", "r7" );
: /* no outputs*/
: /* inputs */
[data1] "r"(dma1_data), [data2] "r"(dma2_data)
: "r6", "r7");
LL_DMA_ClearFlag_TC1(DMA1); LL_DMA_ClearFlag_TC1(DMA1);
LL_DMA_ClearFlag_TC2(DMA1); LL_DMA_ClearFlag_TC2(DMA1);
@@ -389,12 +384,11 @@ static bool digital_sequence_send_signal(DigitalSequence* sequence, DigitalSigna
} }
DigitalSignal* digital_sequence_bake(DigitalSequence* sequence) { DigitalSignal* digital_sequence_bake(DigitalSequence* sequence) {
uint32_t edges = 0; uint32_t edges = 0;
for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) { for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) {
uint8_t signal_index = sequence->sequence[pos]; uint8_t signal_index = sequence->sequence[pos];
DigitalSignal *sig = sequence->signals[signal_index]; DigitalSignal* sig = sequence->signals[signal_index];
edges += sig->edge_cnt; edges += sig->edge_cnt;
} }
@@ -403,7 +397,7 @@ DigitalSignal* digital_sequence_bake(DigitalSequence* sequence) {
for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) { for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) {
uint8_t signal_index = sequence->sequence[pos]; uint8_t signal_index = sequence->sequence[pos];
DigitalSignal *sig = sequence->signals[signal_index]; DigitalSignal* sig = sequence->signals[signal_index];
digital_signal_append(ret, sig); digital_signal_append(ret, sig);
} }
@@ -429,10 +423,14 @@ bool digital_sequence_send(DigitalSequence* sequence) {
for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) { for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) {
uint8_t signal_index = sequence->sequence[pos]; uint8_t signal_index = sequence->sequence[pos];
DigitalSignal *sig = sequence->signals[signal_index]; DigitalSignal* sig = sequence->signals[signal_index];
if(!sig) { if(!sig) {
FURI_LOG_D(TAG, "digital_sequence_send: Signal at index %u, used at pos %lu is NULL, aborting", signal_index, pos); FURI_LOG_D(
TAG,
"digital_sequence_send: Signal at index %u, used at pos %lu is NULL, aborting",
signal_index,
pos);
break; break;
} }
@@ -473,7 +471,7 @@ bool digital_sequence_send(DigitalSequence* sequence) {
/* undo previously prolonged edges */ /* undo previously prolonged edges */
for(uint32_t pos = 0; pos < sequence->signals_size; pos++) { for(uint32_t pos = 0; pos < sequence->signals_size; pos++) {
DigitalSignal *sig = sequence->signals[pos]; DigitalSignal* sig = sequence->signals[pos];
if(sig && sequence->signals_prolonged[pos]) { if(sig && sequence->signals_prolonged[pos]) {
sig->edge_timings[0]--; sig->edge_timings[0]--;

View File

@@ -13,11 +13,10 @@ extern "C" {
#endif #endif
/* helper for easier signal generation */ /* helper for easier signal generation */
#define DIGITAL_SIGNAL_MS(x) (x*100000000UL) #define DIGITAL_SIGNAL_MS(x) (x * 100000000UL)
#define DIGITAL_SIGNAL_US(x) (x*100000UL) #define DIGITAL_SIGNAL_US(x) (x * 100000UL)
#define DIGITAL_SIGNAL_NS(x) (x*100UL) #define DIGITAL_SIGNAL_NS(x) (x * 100UL)
#define DIGITAL_SIGNAL_PS(x) (x/10UL) #define DIGITAL_SIGNAL_PS(x) (x / 10UL)
typedef struct { typedef struct {
bool start_level; bool start_level;
@@ -45,7 +44,6 @@ typedef struct {
uint32_t send_time; uint32_t send_time;
} DigitalSequence; } DigitalSequence;
DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt); DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt);
void digital_signal_free(DigitalSignal* signal); void digital_signal_free(DigitalSignal* signal);
@@ -66,17 +64,17 @@ uint32_t digital_signal_get_edge(DigitalSignal* signal, uint32_t edge_num);
void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio); void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio);
DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio); DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio);
void digital_sequence_free(DigitalSequence* sequence); void digital_sequence_free(DigitalSequence* sequence);
void digital_sequence_set_signal(DigitalSequence* sequence, uint8_t signal_index, DigitalSignal* signal); void digital_sequence_set_signal(
DigitalSequence* sequence,
uint8_t signal_index,
DigitalSignal* signal);
void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time); void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time);
void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index); void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index);
bool digital_sequence_send(DigitalSequence* sequence); bool digital_sequence_send(DigitalSequence* sequence);
void digital_sequence_clear(DigitalSequence* sequence); void digital_sequence_clear(DigitalSequence* sequence);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -5,7 +5,6 @@
#include "pulse_reader.h" #include "pulse_reader.h"
#define GPIO_PIN_MAP(pin, prefix) \ #define GPIO_PIN_MAP(pin, prefix) \
(((pin) == (LL_GPIO_PIN_0)) ? prefix##0 : \ (((pin) == (LL_GPIO_PIN_0)) ? prefix##0 : \
((pin) == (LL_GPIO_PIN_1)) ? prefix##1 : \ ((pin) == (LL_GPIO_PIN_1)) ? prefix##1 : \
@@ -26,10 +25,7 @@
#define GET_DMAMUX_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_DMAMUX_REQ_GEN_EXTI_LINE) #define GET_DMAMUX_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_DMAMUX_REQ_GEN_EXTI_LINE)
PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size) { PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size) {
PulseReader* signal = malloc(sizeof(PulseReader)); PulseReader* signal = malloc(sizeof(PulseReader));
signal->timer_buffer = malloc(size * sizeof(uint32_t)); signal->timer_buffer = malloc(size * sizeof(uint32_t));
signal->gpio_buffer = malloc(size * sizeof(uint32_t)); signal->gpio_buffer = malloc(size * sizeof(uint32_t));
@@ -43,14 +39,15 @@ PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size) {
pulse_reader_set_bittime(signal, 1); pulse_reader_set_bittime(signal, 1);
signal->dma_config_timer.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; signal->dma_config_timer.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY;
signal->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) &(TIM2->CNT); signal->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) & (TIM2->CNT);
signal->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; signal->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT;
signal->dma_config_timer.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; signal->dma_config_timer.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD;
signal->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t) signal->timer_buffer; signal->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t)signal->timer_buffer;
signal->dma_config_timer.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; signal->dma_config_timer.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;
signal->dma_config_timer.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; signal->dma_config_timer.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD;
signal->dma_config_timer.Mode = LL_DMA_MODE_CIRCULAR; signal->dma_config_timer.Mode = LL_DMA_MODE_CIRCULAR;
signal->dma_config_timer.PeriphRequest = LL_DMAMUX_REQ_GENERATOR0; /* executes LL_DMA_SetPeriphRequest */ signal->dma_config_timer.PeriphRequest =
LL_DMAMUX_REQ_GENERATOR0; /* executes LL_DMA_SetPeriphRequest */
signal->dma_config_timer.Priority = LL_DMA_PRIORITY_VERYHIGH; signal->dma_config_timer.Priority = LL_DMA_PRIORITY_VERYHIGH;
signal->dma_config_gpio.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY; signal->dma_config_gpio.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY;
@@ -59,7 +56,8 @@ PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size) {
signal->dma_config_gpio.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; signal->dma_config_gpio.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;
signal->dma_config_gpio.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; signal->dma_config_gpio.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD;
signal->dma_config_gpio.Mode = LL_DMA_MODE_CIRCULAR; signal->dma_config_gpio.Mode = LL_DMA_MODE_CIRCULAR;
signal->dma_config_gpio.PeriphRequest = LL_DMAMUX_REQ_GENERATOR0; /* executes LL_DMA_SetPeriphRequest */ signal->dma_config_gpio.PeriphRequest =
LL_DMAMUX_REQ_GENERATOR0; /* executes LL_DMA_SetPeriphRequest */
signal->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH; signal->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH;
return signal; return signal;
@@ -67,22 +65,22 @@ PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size) {
void pulse_reader_set_timebase(PulseReader* signal, PulseReaderUnit unit) { void pulse_reader_set_timebase(PulseReader* signal, PulseReaderUnit unit) {
switch(unit) { switch(unit) {
case PulseReaderUnit64MHz: case PulseReaderUnit64MHz:
signal->unit_multiplier = 1; signal->unit_multiplier = 1;
signal->unit_divider = 1; signal->unit_divider = 1;
break; break;
case PulseReaderUnitPicosecond: case PulseReaderUnitPicosecond:
signal->unit_multiplier = 15625; signal->unit_multiplier = 15625;
signal->unit_divider = 1; signal->unit_divider = 1;
break; break;
case PulseReaderUnitNanosecond: case PulseReaderUnitNanosecond:
signal->unit_multiplier = 15625; signal->unit_multiplier = 15625;
signal->unit_divider = 1000; signal->unit_divider = 1000;
break; break;
case PulseReaderUnitMicrosecond: case PulseReaderUnitMicrosecond:
signal->unit_multiplier = 15625; signal->unit_multiplier = 15625;
signal->unit_divider = 1000000; signal->unit_divider = 1000000;
break; break;
} }
} }
@@ -104,7 +102,7 @@ uint32_t pulse_reader_samples(PulseReader* signal) {
void pulse_reader_stop(PulseReader* signal) { void pulse_reader_stop(PulseReader* signal) {
LL_DMA_DisableChannel(DMA1, signal->dma_channel); LL_DMA_DisableChannel(DMA1, signal->dma_channel);
LL_DMA_DisableChannel(DMA1, signal->dma_channel+1); LL_DMA_DisableChannel(DMA1, signal->dma_channel + 1);
LL_DMAMUX_DisableRequestGen(NULL, LL_DMAMUX_REQ_GEN_0); LL_DMAMUX_DisableRequestGen(NULL, LL_DMAMUX_REQ_GEN_0);
LL_TIM_DisableCounter(TIM2); LL_TIM_DisableCounter(TIM2);
} }
@@ -113,8 +111,8 @@ void pulse_reader_start(PulseReader* signal) {
/* configure DMA to read from a timer peripheral */ /* configure DMA to read from a timer peripheral */
signal->dma_config_timer.NbData = signal->size; signal->dma_config_timer.NbData = signal->size;
signal->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) &(signal->gpio->port->IDR); signal->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) & (signal->gpio->port->IDR);
signal->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t) signal->gpio_buffer; signal->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t)signal->gpio_buffer;
signal->dma_config_gpio.NbData = signal->size; signal->dma_config_gpio.NbData = signal->size;
/* start counter */ /* start counter */
@@ -126,14 +124,16 @@ void pulse_reader_start(PulseReader* signal) {
LL_TIM_EnableCounter(TIM2); LL_TIM_EnableCounter(TIM2);
/* generator 0 gets fed by EXTI_LINEn */ /* generator 0 gets fed by EXTI_LINEn */
LL_DMAMUX_SetRequestSignalID(NULL, LL_DMAMUX_REQ_GEN_0, GET_DMAMUX_EXTI_LINE(signal->gpio->pin)); LL_DMAMUX_SetRequestSignalID(
NULL, LL_DMAMUX_REQ_GEN_0, GET_DMAMUX_EXTI_LINE(signal->gpio->pin));
/* trigger on rising edge of the interrupt */ /* trigger on rising edge of the interrupt */
LL_DMAMUX_SetRequestGenPolarity(NULL, LL_DMAMUX_REQ_GEN_0, LL_DMAMUX_REQ_GEN_POL_RISING); LL_DMAMUX_SetRequestGenPolarity(NULL, LL_DMAMUX_REQ_GEN_0, LL_DMAMUX_REQ_GEN_POL_RISING);
/* now enable request generation again */ /* now enable request generation again */
LL_DMAMUX_EnableRequestGen(NULL, LL_DMAMUX_REQ_GEN_0); LL_DMAMUX_EnableRequestGen(NULL, LL_DMAMUX_REQ_GEN_0);
/* we need the EXTI to be configured as interrupt generating line, but no ISR registered */ /* we need the EXTI to be configured as interrupt generating line, but no ISR registered */
furi_hal_gpio_init_ex(signal->gpio, GpioModeInterruptRiseFall, GpioPullNo, GpioSpeedVeryHigh, GpioAltFnUnused); furi_hal_gpio_init_ex(
signal->gpio, GpioModeInterruptRiseFall, GpioPullNo, GpioSpeedVeryHigh, GpioAltFnUnused);
/* capture current timer */ /* capture current timer */
signal->pos = 0; signal->pos = 0;
@@ -149,17 +149,16 @@ void pulse_reader_start(PulseReader* signal) {
} }
uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us) { uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us) {
uint32_t start_time = DWT->CYCCNT; uint32_t start_time = DWT->CYCCNT;
uint32_t timeout_ticks = timeout_us * (F_TIM2/1000000); uint32_t timeout_ticks = timeout_us * (F_TIM2 / 1000000);
do { do {
/* get the DMA's next write position by reading "remaining length" register */ /* get the DMA's next write position by reading "remaining length" register */
uint32_t dma_pos = signal->size - (uint32_t)LL_DMA_GetDataLength(DMA1, signal->dma_channel); uint32_t dma_pos =
signal->size - (uint32_t)LL_DMA_GetDataLength(DMA1, signal->dma_channel);
/* the DMA has advanced in the ringbuffer */ /* the DMA has advanced in the ringbuffer */
if(dma_pos != signal->pos) { if(dma_pos != signal->pos) {
uint32_t delta = signal->timer_buffer[signal->pos] - signal->timer_value; uint32_t delta = signal->timer_buffer[signal->pos] - signal->timer_value;
uint32_t last_gpio_value = signal->gpio_value; uint32_t last_gpio_value = signal->gpio_value;
@@ -179,7 +178,8 @@ uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us) {
/* probably larger values, so choose a wider data type */ /* probably larger values, so choose a wider data type */
if(signal->unit_divider > 1) { if(signal->unit_divider > 1) {
delta_unit = (uint32_t)((uint64_t)delta * (uint64_t)signal->unit_multiplier / signal->unit_divider); delta_unit =
(uint32_t)((uint64_t)delta * (uint64_t)signal->unit_multiplier / signal->unit_divider);
} else { } else {
delta_unit = delta * signal->unit_multiplier; delta_unit = delta * signal->unit_multiplier;
} }

View File

@@ -14,9 +14,9 @@
extern "C" { extern "C" {
#endif #endif
#define PULSE_READER_NO_EDGE 0xFFFFFFFFUL #define PULSE_READER_NO_EDGE 0xFFFFFFFFUL
#define PULSE_READER_LOST_EDGE 0xFFFFFFFEUL #define PULSE_READER_LOST_EDGE 0xFFFFFFFEUL
#define F_TIM2 64000000UL #define F_TIM2 64000000UL
/** /**
* unit of the edge durations to return * unit of the edge durations to return
@@ -28,7 +28,6 @@ typedef enum {
PulseReaderUnitMicrosecond, PulseReaderUnitMicrosecond,
} PulseReaderUnit; } PulseReaderUnit;
typedef struct { typedef struct {
bool start_level; bool start_level;
uint32_t* timer_buffer; uint32_t* timer_buffer;
@@ -47,7 +46,6 @@ typedef struct {
LL_DMA_InitTypeDef dma_config_gpio; LL_DMA_InitTypeDef dma_config_gpio;
} PulseReader; } PulseReader;
/** Allocate a PulseReader object /** Allocate a PulseReader object
* *
* Allocates memory for a ringbuffer and initalizes the object * Allocates memory for a ringbuffer and initalizes the object
@@ -57,7 +55,6 @@ typedef struct {
*/ */
PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size); PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size);
/** Free a PulseReader object /** Free a PulseReader object
* *
* Frees all memory of the given object * Frees all memory of the given object
@@ -66,7 +63,6 @@ PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size);
*/ */
void pulse_reader_free(PulseReader* signal); void pulse_reader_free(PulseReader* signal);
/** Start signal capturing /** Start signal capturing
* *
* Initializes DMA1, TIM2 and DMAMUX_REQ_GEN_0 to automatically capture timer values * Initializes DMA1, TIM2 and DMAMUX_REQ_GEN_0 to automatically capture timer values
@@ -75,7 +71,6 @@ void pulse_reader_free(PulseReader* signal);
*/ */
void pulse_reader_start(PulseReader* signal); void pulse_reader_start(PulseReader* signal);
/** Stop signal capturing /** Stop signal capturing
* *
* Frees DMA1, TIM2 and DMAMUX_REQ_GEN_0 * Frees DMA1, TIM2 and DMAMUX_REQ_GEN_0
@@ -84,7 +79,6 @@ void pulse_reader_start(PulseReader* signal);
*/ */
void pulse_reader_stop(PulseReader* signal); void pulse_reader_stop(PulseReader* signal);
/** Recevie a sample from ringbuffer /** Recevie a sample from ringbuffer
* *
* Waits for the specified time until a new edge gets detected. * Waits for the specified time until a new edge gets detected.
@@ -99,7 +93,6 @@ void pulse_reader_stop(PulseReader* signal);
*/ */
uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us); uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us);
/** Get available samples /** Get available samples
* *
* Get the number of available samples in the ringbuffer * Get the number of available samples in the ringbuffer
@@ -110,7 +103,6 @@ uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us);
*/ */
uint32_t pulse_reader_samples(PulseReader* signal); uint32_t pulse_reader_samples(PulseReader* signal);
/** Set timebase /** Set timebase
* *
* Set the timebase to be used when returning pulse duration. * Set the timebase to be used when returning pulse duration.
@@ -120,7 +112,6 @@ uint32_t pulse_reader_samples(PulseReader* signal);
*/ */
void pulse_reader_set_timebase(PulseReader* signal, PulseReaderUnit unit); void pulse_reader_set_timebase(PulseReader* signal, PulseReaderUnit unit);
/** Set bit time /** Set bit time
* *
* Set the number of timebase units per bit. * Set the number of timebase units per bit.
@@ -134,7 +125,6 @@ void pulse_reader_set_timebase(PulseReader* signal, PulseReaderUnit unit);
*/ */
void pulse_reader_set_bittime(PulseReader* signal, uint32_t bit_time); void pulse_reader_set_bittime(PulseReader* signal, uint32_t bit_time);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif