summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavePutz <dwputz@gmail.com>2021-03-12 16:06:57 -0600
committerGitHub <noreply@github.com>2021-03-12 16:06:57 -0600
commit6628f49852a4963cb2aeaa08fa281eb0e994415e (patch)
tree8dbb524deb06355738b5cc9e6de2f17691f28889
parenta3c3e8a0fa5e06910747f1a95a12b899562a618d (diff)
Use StateMachine.c interrupt setup and simplify SM program
-rw-r--r--ports/raspberrypi/common-hal/pulseio/PulseIn.c37
-rw-r--r--ports/raspberrypi/common-hal/pulseio/PulseIn.h3
2 files changed, 40 insertions, 0 deletions
diff --git a/ports/raspberrypi/common-hal/pulseio/PulseIn.c b/ports/raspberrypi/common-hal/pulseio/PulseIn.c
index 8ddeab930..1a30373fc 100644
--- a/ports/raspberrypi/common-hal/pulseio/PulseIn.c
+++ b/ports/raspberrypi/common-hal/pulseio/PulseIn.c
@@ -25,7 +25,10 @@
*/
#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h"
+<<<<<<< HEAD
+=======
#include "src/rp2_common/hardware_irq/include/hardware/irq.h"
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
#include <stdint.h>
@@ -46,12 +49,16 @@ volatile uint16_t result = 0;
volatile uint16_t buf_index = 0;
uint16_t pulsein_program[] = {
+<<<<<<< HEAD
+ 0x4001, // 1: in pins, 1
+=======
0xe03f, // 0: set x, 31
0x4001, // 1: in pins, 1
0x0041, // 2: jmp x--, 2
0x8060, // 3: push iffull block
0xc020, // 4: irq wait 0
0x0000, // 5: jmp 1
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
};
void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
@@ -73,7 +80,11 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
bool ok = rp2pio_statemachine_construct(&state_machine,
pulsein_program, sizeof(pulsein_program) / sizeof(pulsein_program[0]),
+<<<<<<< HEAD
+ 1000000,
+=======
1000000 * 3,
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
NULL, 0,
NULL, 0,
pin, 1,
@@ -91,11 +102,14 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
self->state_machine.state_machine = state_machine.state_machine;
self->state_machine.sm_config = state_machine.sm_config;
self->state_machine.offset = state_machine.offset;
+<<<<<<< HEAD
+=======
if ( self->state_machine.pio == pio0 ) {
self->pio_interrupt = PIO0_IRQ_0;
} else {
self->pio_interrupt = PIO1_IRQ_0;
}
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
pio_sm_clear_fifos(self->state_machine.pio,self->state_machine.state_machine);
last_level = self->idle_state;
level_count = 0;
@@ -103,9 +117,13 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
buf_index = 0;
pio_sm_set_in_pins(state_machine.pio,state_machine.state_machine,pin->number);
+<<<<<<< HEAD
+ common_hal_rp2pio_statemachine_set_interrupt_handler(&state_machine,&common_hal_pulseio_pulsein_interrupt,NULL,PIO_IRQ0_INTE_SM0_RXNEMPTY_BITS);
+=======
irq_set_exclusive_handler(self->pio_interrupt, common_hal_pulseio_pulsein_interrupt);
hw_clear_bits(&state_machine.pio->inte0, 1u << state_machine.state_machine);
hw_set_bits(&state_machine.pio->inte0, 1u << (state_machine.state_machine+8));
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
// exec a set pindirs to 0 for input
pio_sm_exec(state_machine.pio,state_machine.state_machine,0xe080);
@@ -116,7 +134,10 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
pio_sm_exec(self->state_machine.pio,self->state_machine.state_machine,0x20a0);
}
pio_sm_set_enabled(state_machine.pio, state_machine.state_machine, true);
+<<<<<<< HEAD
+=======
irq_set_enabled(self->pio_interrupt, true);
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
}
bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) {
@@ -127,7 +148,10 @@ void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
if (common_hal_pulseio_pulsein_deinited(self)) {
return;
}
+<<<<<<< HEAD
+=======
irq_set_enabled(self->pio_interrupt, false);
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
pio_sm_unclaim (self->state_machine.pio, self->state_machine.state_machine);
m_free(self->buffer);
@@ -161,17 +185,23 @@ void common_hal_pulseio_pulsein_interrupt() {
}
}
}
+<<<<<<< HEAD
+=======
// clear interrupt
irq_clear(self->pio_interrupt);
hw_clear_bits(&self->state_machine.pio->inte0, 1u << self->state_machine.state_machine);
self->state_machine.pio->irq = 1u << self->state_machine.state_machine;
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
// check for a pulse thats too long (4000 us) or maxlen reached, and reset
if (( level_count > 4000 ) || (buf_index >= self->maxlen)) {
pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
pio_sm_init(self->state_machine.pio, self->state_machine.state_machine, self->state_machine.offset, &self->state_machine.sm_config);
pio_sm_restart(self->state_machine.pio,self->state_machine.state_machine);
pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, true);
+<<<<<<< HEAD
+=======
irq_set_enabled(self->pio_interrupt, true);
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
}
}
void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self,
@@ -189,10 +219,17 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self,
gpio_put(self->pin, !self->idle_state);
common_hal_mcu_delay_us((uint32_t)trigger_duration);
gpio_set_function(self->pin ,GPIO_FUNC_PIO0);
+<<<<<<< HEAD
+ common_hal_mcu_delay_us(225);
+ }
+
+ // Reconfigure the pin for PIO
+=======
}
// Reconfigure the pin for PIO
common_hal_mcu_delay_us(200);
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
gpio_set_function(self->pin, GPIO_FUNC_PIO0);
pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, true);
}
diff --git a/ports/raspberrypi/common-hal/pulseio/PulseIn.h b/ports/raspberrypi/common-hal/pulseio/PulseIn.h
index e99e1ff82..39199e524 100644
--- a/ports/raspberrypi/common-hal/pulseio/PulseIn.h
+++ b/ports/raspberrypi/common-hal/pulseio/PulseIn.h
@@ -42,7 +42,10 @@ typedef struct {
volatile uint16_t start;
volatile uint16_t len;
rp2pio_statemachine_obj_t state_machine;
+<<<<<<< HEAD
+=======
uint16_t pio_interrupt;
+>>>>>>> a3c3e8a0fa5e06910747f1a95a12b899562a618d
} pulseio_pulsein_obj_t;
void pulsein_reset(void);