Fix PIO code origins handling
This commit is contained in:
parent
3410740b4a
commit
5868a1ade9
35
src/main.c
35
src/main.c
|
@ -91,6 +91,11 @@ static size_t iq_queue_pos = 0;
|
||||||
|
|
||||||
static uint32_t rnd = 0;
|
static uint32_t rnd = 0;
|
||||||
|
|
||||||
|
static int origin_lo = -1;
|
||||||
|
static int origin_rx = -1;
|
||||||
|
static int origin_fb = -1;
|
||||||
|
static int origin_ad = 0;
|
||||||
|
|
||||||
inline static __unused uint32_t rnd_next()
|
inline static __unused uint32_t rnd_next()
|
||||||
{
|
{
|
||||||
rnd = rnd * 0x41c64e6d + 12345;
|
rnd = rnd * 0x41c64e6d + 12345;
|
||||||
|
@ -120,23 +125,23 @@ static void init_lo()
|
||||||
pio_program_t prog = {
|
pio_program_t prog = {
|
||||||
.instructions = insn,
|
.instructions = insn,
|
||||||
.length = sizeof(insn) / sizeof(*insn),
|
.length = sizeof(insn) / sizeof(*insn),
|
||||||
.origin = -1,
|
.origin = origin_lo,
|
||||||
};
|
};
|
||||||
|
|
||||||
pio_sm_restart(PIO, LO_SM);
|
pio_sm_restart(PIO, LO_SM);
|
||||||
pio_sm_clear_fifos(PIO, LO_SM);
|
pio_sm_clear_fifos(PIO, LO_SM);
|
||||||
|
|
||||||
if (pio_can_add_program(PIO, &prog))
|
if (pio_can_add_program(PIO, &prog))
|
||||||
prog.origin = pio_add_program(PIO, &prog);
|
origin_lo = pio_add_program(PIO, &prog);
|
||||||
|
|
||||||
pio_sm_config pc = pio_get_default_sm_config();
|
pio_sm_config pc = pio_get_default_sm_config();
|
||||||
sm_config_set_out_pins(&pc, LO_PIN, 1);
|
sm_config_set_out_pins(&pc, LO_PIN, 1);
|
||||||
sm_config_set_set_pins(&pc, LO_PIN, 1);
|
sm_config_set_set_pins(&pc, LO_PIN, 1);
|
||||||
sm_config_set_wrap(&pc, prog.origin, prog.origin + prog.length - 1);
|
sm_config_set_wrap(&pc, origin_lo, origin_lo + prog.length - 1);
|
||||||
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
||||||
sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_TX);
|
sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_TX);
|
||||||
sm_config_set_out_shift(&pc, false, true, 32);
|
sm_config_set_out_shift(&pc, false, true, 32);
|
||||||
pio_sm_init(PIO, LO_SM, prog.origin, &pc);
|
pio_sm_init(PIO, LO_SM, origin_lo, &pc);
|
||||||
|
|
||||||
pio_sm_set_consecutive_pindirs(PIO, LO_SM, LO_PIN, 1, GPIO_IN);
|
pio_sm_set_consecutive_pindirs(PIO, LO_SM, LO_PIN, 1, GPIO_IN);
|
||||||
pio_sm_exec_wait_blocking(PIO, LO_SM, pio_encode_set(pio_pins, 0));
|
pio_sm_exec_wait_blocking(PIO, LO_SM, pio_encode_set(pio_pins, 0));
|
||||||
|
@ -163,14 +168,14 @@ static void init_fb()
|
||||||
pio_program_t prog = {
|
pio_program_t prog = {
|
||||||
.instructions = insn,
|
.instructions = insn,
|
||||||
.length = sizeof(insn) / sizeof(*insn),
|
.length = sizeof(insn) / sizeof(*insn),
|
||||||
.origin = -1,
|
.origin = origin_fb,
|
||||||
};
|
};
|
||||||
|
|
||||||
pio_sm_restart(PIO, FB_SM);
|
pio_sm_restart(PIO, FB_SM);
|
||||||
pio_sm_clear_fifos(PIO, FB_SM);
|
pio_sm_clear_fifos(PIO, FB_SM);
|
||||||
|
|
||||||
if (pio_can_add_program(PIO, &prog))
|
if (pio_can_add_program(PIO, &prog))
|
||||||
prog.origin = pio_add_program(PIO, &prog);
|
origin_fb = pio_add_program(PIO, &prog);
|
||||||
|
|
||||||
pio_sm_config pc = pio_get_default_sm_config();
|
pio_sm_config pc = pio_get_default_sm_config();
|
||||||
sm_config_set_sideset(&pc, 1, false, true);
|
sm_config_set_sideset(&pc, 1, false, true);
|
||||||
|
@ -178,9 +183,9 @@ static void init_fb()
|
||||||
sm_config_set_out_pins(&pc, FB_PIN, 1);
|
sm_config_set_out_pins(&pc, FB_PIN, 1);
|
||||||
sm_config_set_set_pins(&pc, FB_PIN, 1);
|
sm_config_set_set_pins(&pc, FB_PIN, 1);
|
||||||
sm_config_set_sideset_pins(&pc, FB_PIN);
|
sm_config_set_sideset_pins(&pc, FB_PIN);
|
||||||
sm_config_set_wrap(&pc, prog.origin, prog.origin + prog.length - 1);
|
sm_config_set_wrap(&pc, origin_fb, origin_fb + prog.length - 1);
|
||||||
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
||||||
pio_sm_init(PIO, FB_SM, prog.origin, &pc);
|
pio_sm_init(PIO, FB_SM, origin_fb, &pc);
|
||||||
|
|
||||||
pio_sm_set_consecutive_pindirs(PIO, FB_SM, FB_PIN, 1, GPIO_OUT);
|
pio_sm_set_consecutive_pindirs(PIO, FB_SM, FB_PIN, 1, GPIO_OUT);
|
||||||
}
|
}
|
||||||
|
@ -197,22 +202,22 @@ static void init_rx()
|
||||||
pio_program_t prog = {
|
pio_program_t prog = {
|
||||||
.instructions = insn,
|
.instructions = insn,
|
||||||
.length = sizeof(insn) / sizeof(*insn),
|
.length = sizeof(insn) / sizeof(*insn),
|
||||||
.origin = -1,
|
.origin = origin_rx,
|
||||||
};
|
};
|
||||||
|
|
||||||
pio_sm_restart(PIO, RX_SM);
|
pio_sm_restart(PIO, RX_SM);
|
||||||
pio_sm_clear_fifos(PIO, RX_SM);
|
pio_sm_clear_fifos(PIO, RX_SM);
|
||||||
|
|
||||||
if (pio_can_add_program(PIO, &prog))
|
if (pio_can_add_program(PIO, &prog))
|
||||||
prog.origin = pio_add_program(PIO, &prog);
|
origin_rx = pio_add_program(PIO, &prog);
|
||||||
|
|
||||||
pio_sm_config pc = pio_get_default_sm_config();
|
pio_sm_config pc = pio_get_default_sm_config();
|
||||||
sm_config_set_in_pins(&pc, RX_PIN);
|
sm_config_set_in_pins(&pc, RX_PIN);
|
||||||
sm_config_set_wrap(&pc, prog.origin, prog.origin + prog.length - 1);
|
sm_config_set_wrap(&pc, origin_rx, origin_rx + prog.length - 1);
|
||||||
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
||||||
sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_RX);
|
sm_config_set_fifo_join(&pc, PIO_FIFO_JOIN_RX);
|
||||||
sm_config_set_in_shift(&pc, false, true, 32);
|
sm_config_set_in_shift(&pc, false, true, 32);
|
||||||
pio_sm_init(PIO, RX_SM, prog.origin, &pc);
|
pio_sm_init(PIO, RX_SM, origin_rx, &pc);
|
||||||
|
|
||||||
pio_sm_set_consecutive_pindirs(PIO, RX_SM, RX_PIN, 1, GPIO_IN);
|
pio_sm_set_consecutive_pindirs(PIO, RX_SM, RX_PIN, 1, GPIO_IN);
|
||||||
}
|
}
|
||||||
|
@ -253,7 +258,7 @@ static void init_ad()
|
||||||
pio_program_t prog = {
|
pio_program_t prog = {
|
||||||
.instructions = insn,
|
.instructions = insn,
|
||||||
.length = sizeof(insn) / sizeof(*insn),
|
.length = sizeof(insn) / sizeof(*insn),
|
||||||
.origin = 0,
|
.origin = origin_ad,
|
||||||
};
|
};
|
||||||
|
|
||||||
pio_sm_restart(PIO, AD_SM);
|
pio_sm_restart(PIO, AD_SM);
|
||||||
|
@ -263,11 +268,11 @@ static void init_ad()
|
||||||
pio_add_program(PIO, &prog);
|
pio_add_program(PIO, &prog);
|
||||||
|
|
||||||
pio_sm_config pc = pio_get_default_sm_config();
|
pio_sm_config pc = pio_get_default_sm_config();
|
||||||
sm_config_set_wrap(&pc, prog.origin, prog.origin + 15);
|
sm_config_set_wrap(&pc, origin_ad, origin_ad + 15);
|
||||||
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
sm_config_set_clkdiv_int_frac(&pc, 1, 0);
|
||||||
sm_config_set_in_shift(&pc, false, true, 32);
|
sm_config_set_in_shift(&pc, false, true, 32);
|
||||||
sm_config_set_out_shift(&pc, false, true, 32);
|
sm_config_set_out_shift(&pc, false, true, 32);
|
||||||
pio_sm_init(PIO, AD_SM, prog.origin, &pc);
|
pio_sm_init(PIO, AD_SM, origin_ad, &pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STEP_BASE ((UINT_MAX + 1.0) / CLK_SYS_HZ)
|
#define STEP_BASE ((UINT_MAX + 1.0) / CLK_SYS_HZ)
|
||||||
|
|
Loading…
Reference in a new issue