diff options
| author | pennae <[email protected]> | 2023-05-05 19:49:34 +0200 |
|---|---|---|
| committer | pennae <[email protected]> | 2023-05-06 11:44:04 +0200 |
| commit | 41ec4170a5ae9920fe31327252ba1bba754b6d9f (patch) | |
| tree | 17a090cda266286958fe0ef5d32281cf647d4744 /examples | |
| parent | 5f7ef8bed0d665c2f59351194fbc155203321d24 (diff) | |
rp/pio: add load_program, use_program
programs contain information we could pull from them directly and use to
validate other configuration of the state machine instead of asking the
user to pull them out and hand them to us bit by bit. unfortunately
programs do not specify how many in or out bits they use, so we can only
handle side-set and wrapping jumps like this. it's still something though.
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/rp/src/bin/pio_async.rs | 25 | ||||
| -rw-r--r-- | examples/rp/src/bin/pio_dma.rs | 7 | ||||
| -rw-r--r-- | examples/rp/src/bin/pio_hd44780.rs | 16 | ||||
| -rw-r--r-- | examples/rp/src/bin/ws2812-pio.rs | 13 |
4 files changed, 13 insertions, 48 deletions
diff --git a/examples/rp/src/bin/pio_async.rs b/examples/rp/src/bin/pio_async.rs index 461ea3ff9..9f47c2316 100644 --- a/examples/rp/src/bin/pio_async.rs +++ b/examples/rp/src/bin/pio_async.rs | |||
| @@ -5,11 +5,10 @@ use defmt::info; | |||
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_rp::peripherals::PIO0; | 6 | use embassy_rp::peripherals::PIO0; |
| 7 | use embassy_rp::pio::{Common, Irq, Pio, PioPin, ShiftDirection, StateMachine}; | 7 | use embassy_rp::pio::{Common, Irq, Pio, PioPin, ShiftDirection, StateMachine}; |
| 8 | use embassy_rp::pio_instr_util; | ||
| 9 | use embassy_rp::relocate::RelocatedProgram; | 8 | use embassy_rp::relocate::RelocatedProgram; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 9 | use {defmt_rtt as _, panic_probe as _}; |
| 11 | 10 | ||
| 12 | fn setup_pio_task_sm0(pio: &mut Common<PIO0>, sm: &mut StateMachine<PIO0, 0>, pin: impl PioPin) { | 11 | fn setup_pio_task_sm0<'a>(pio: &mut Common<'a, PIO0>, sm: &mut StateMachine<'a, PIO0, 0>, pin: impl PioPin) { |
| 13 | // Setup sm0 | 12 | // Setup sm0 |
| 14 | 13 | ||
| 15 | // Send data serially to pin | 14 | // Send data serially to pin |
| @@ -22,15 +21,12 @@ fn setup_pio_task_sm0(pio: &mut Common<PIO0>, sm: &mut StateMachine<PIO0, 0>, pi | |||
| 22 | ); | 21 | ); |
| 23 | 22 | ||
| 24 | let relocated = RelocatedProgram::new(&prg.program); | 23 | let relocated = RelocatedProgram::new(&prg.program); |
| 24 | sm.use_program(&pio.load_program(&relocated), &[]); | ||
| 25 | let out_pin = pio.make_pio_pin(pin); | 25 | let out_pin = pio.make_pio_pin(pin); |
| 26 | let pio_pins = [&out_pin]; | 26 | let pio_pins = [&out_pin]; |
| 27 | sm.set_out_pins(&pio_pins); | 27 | sm.set_out_pins(&pio_pins); |
| 28 | pio.write_instr(relocated.origin() as usize, relocated.code()); | ||
| 29 | pio_instr_util::exec_jmp(sm, relocated.origin()); | ||
| 30 | sm.set_clkdiv((125e6 / 20.0 / 2e2 * 256.0) as u32); | 28 | sm.set_clkdiv((125e6 / 20.0 / 2e2 * 256.0) as u32); |
| 31 | sm.set_set_range(0, 1); | 29 | sm.set_set_range(0, 1); |
| 32 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 33 | sm.set_wrap(source, target); | ||
| 34 | 30 | ||
| 35 | sm.set_autopull(true); | 31 | sm.set_autopull(true); |
| 36 | sm.set_out_shift_dir(ShiftDirection::Left); | 32 | sm.set_out_shift_dir(ShiftDirection::Left); |
| @@ -48,20 +44,16 @@ async fn pio_task_sm0(mut sm: StateMachine<'static, PIO0, 0>) { | |||
| 48 | } | 44 | } |
| 49 | } | 45 | } |
| 50 | 46 | ||
| 51 | fn setup_pio_task_sm1(pio: &mut Common<PIO0>, sm: &mut StateMachine<PIO0, 1>) { | 47 | fn setup_pio_task_sm1<'a>(pio: &mut Common<'a, PIO0>, sm: &mut StateMachine<'a, PIO0, 1>) { |
| 52 | // Setupm sm1 | 48 | // Setupm sm1 |
| 53 | 49 | ||
| 54 | // Read 0b10101 repeatedly until ISR is full | 50 | // Read 0b10101 repeatedly until ISR is full |
| 55 | let prg = pio_proc::pio_asm!(".origin 8", "set x, 0x15", ".wrap_target", "in x, 5 [31]", ".wrap",); | 51 | let prg = pio_proc::pio_asm!(".origin 8", "set x, 0x15", ".wrap_target", "in x, 5 [31]", ".wrap",); |
| 56 | 52 | ||
| 57 | let relocated = RelocatedProgram::new(&prg.program); | 53 | let relocated = RelocatedProgram::new(&prg.program); |
| 58 | pio.write_instr(relocated.origin() as usize, relocated.code()); | 54 | sm.use_program(&pio.load_program(&relocated), &[]); |
| 59 | pio_instr_util::exec_jmp(sm, relocated.origin()); | ||
| 60 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); | 55 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); |
| 61 | sm.set_set_range(0, 0); | 56 | sm.set_set_range(0, 0); |
| 62 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 63 | sm.set_wrap(source, target); | ||
| 64 | |||
| 65 | sm.set_autopush(true); | 57 | sm.set_autopush(true); |
| 66 | sm.set_in_shift_dir(ShiftDirection::Right); | 58 | sm.set_in_shift_dir(ShiftDirection::Right); |
| 67 | } | 59 | } |
| @@ -75,7 +67,7 @@ async fn pio_task_sm1(mut sm: StateMachine<'static, PIO0, 1>) { | |||
| 75 | } | 67 | } |
| 76 | } | 68 | } |
| 77 | 69 | ||
| 78 | fn setup_pio_task_sm2(pio: &mut Common<PIO0>, sm: &mut StateMachine<PIO0, 2>) { | 70 | fn setup_pio_task_sm2<'a>(pio: &mut Common<'a, PIO0>, sm: &mut StateMachine<'a, PIO0, 2>) { |
| 79 | // Setup sm2 | 71 | // Setup sm2 |
| 80 | 72 | ||
| 81 | // Repeatedly trigger IRQ 3 | 73 | // Repeatedly trigger IRQ 3 |
| @@ -89,12 +81,7 @@ fn setup_pio_task_sm2(pio: &mut Common<PIO0>, sm: &mut StateMachine<PIO0, 2>) { | |||
| 89 | ".wrap", | 81 | ".wrap", |
| 90 | ); | 82 | ); |
| 91 | let relocated = RelocatedProgram::new(&prg.program); | 83 | let relocated = RelocatedProgram::new(&prg.program); |
| 92 | pio.write_instr(relocated.origin() as usize, relocated.code()); | 84 | sm.use_program(&pio.load_program(&relocated), &[]); |
| 93 | |||
| 94 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 95 | sm.set_wrap(source, target); | ||
| 96 | |||
| 97 | pio_instr_util::exec_jmp(sm, relocated.origin()); | ||
| 98 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); | 85 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); |
| 99 | } | 86 | } |
| 100 | 87 | ||
diff --git a/examples/rp/src/bin/pio_dma.rs b/examples/rp/src/bin/pio_dma.rs index c664482e5..1c4e127c7 100644 --- a/examples/rp/src/bin/pio_dma.rs +++ b/examples/rp/src/bin/pio_dma.rs | |||
| @@ -6,7 +6,7 @@ use embassy_executor::Spawner; | |||
| 6 | use embassy_futures::join::join; | 6 | use embassy_futures::join::join; |
| 7 | use embassy_rp::pio::{Pio, ShiftDirection}; | 7 | use embassy_rp::pio::{Pio, ShiftDirection}; |
| 8 | use embassy_rp::relocate::RelocatedProgram; | 8 | use embassy_rp::relocate::RelocatedProgram; |
| 9 | use embassy_rp::{pio_instr_util, Peripheral}; | 9 | use embassy_rp::Peripheral; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 11 | 11 | ||
| 12 | fn swap_nibbles(v: u32) -> u32 { | 12 | fn swap_nibbles(v: u32) -> u32 { |
| @@ -38,11 +38,8 @@ async fn main(_spawner: Spawner) { | |||
| 38 | ); | 38 | ); |
| 39 | 39 | ||
| 40 | let relocated = RelocatedProgram::new(&prg.program); | 40 | let relocated = RelocatedProgram::new(&prg.program); |
| 41 | common.write_instr(relocated.origin() as usize, relocated.code()); | 41 | sm.use_program(&common.load_program(&relocated), &[]); |
| 42 | pio_instr_util::exec_jmp(&mut sm, relocated.origin()); | ||
| 43 | sm.set_clkdiv((125e6 / 10e3 * 256.0) as u32); | 42 | sm.set_clkdiv((125e6 / 10e3 * 256.0) as u32); |
| 44 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 45 | sm.set_wrap(source, target); | ||
| 46 | sm.set_autopull(true); | 43 | sm.set_autopull(true); |
| 47 | sm.set_autopush(true); | 44 | sm.set_autopush(true); |
| 48 | sm.set_pull_threshold(32); | 45 | sm.set_pull_threshold(32); |
diff --git a/examples/rp/src/bin/pio_hd44780.rs b/examples/rp/src/bin/pio_hd44780.rs index 17b2440cf..c3466b554 100644 --- a/examples/rp/src/bin/pio_hd44780.rs +++ b/examples/rp/src/bin/pio_hd44780.rs | |||
| @@ -123,15 +123,9 @@ impl<'l> HD44780<'l> { | |||
| 123 | embassy_rp::pio_instr_util::set_pindir(&mut sm0, 0b11111); | 123 | embassy_rp::pio_instr_util::set_pindir(&mut sm0, 0b11111); |
| 124 | 124 | ||
| 125 | let relocated = RelocatedProgram::new(&prg.program); | 125 | let relocated = RelocatedProgram::new(&prg.program); |
| 126 | common.write_instr(relocated.origin() as usize, relocated.code()); | 126 | sm0.use_program(&common.load_program(&relocated), &[&e]); |
| 127 | embassy_rp::pio_instr_util::exec_jmp(&mut sm0, relocated.origin()); | ||
| 128 | sm0.set_clkdiv(125 * 256); | 127 | sm0.set_clkdiv(125 * 256); |
| 129 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 130 | sm0.set_wrap(source, target); | ||
| 131 | sm0.set_side_enable(true); | ||
| 132 | sm0.set_out_pins(&[&db4, &db5, &db6, &db7]); | 128 | sm0.set_out_pins(&[&db4, &db5, &db6, &db7]); |
| 133 | sm0.set_sideset_base_pin(&e); | ||
| 134 | sm0.set_sideset_count(2); | ||
| 135 | sm0.set_out_shift_dir(ShiftDirection::Left); | 129 | sm0.set_out_shift_dir(ShiftDirection::Left); |
| 136 | sm0.set_fifo_join(FifoJoin::TxOnly); | 130 | sm0.set_fifo_join(FifoJoin::TxOnly); |
| 137 | sm0.set_autopull(true); | 131 | sm0.set_autopull(true); |
| @@ -199,17 +193,11 @@ impl<'l> HD44780<'l> { | |||
| 199 | ); | 193 | ); |
| 200 | 194 | ||
| 201 | let relocated = RelocatedProgram::new(&prg.program); | 195 | let relocated = RelocatedProgram::new(&prg.program); |
| 202 | common.write_instr(relocated.origin() as usize, relocated.code()); | 196 | sm0.use_program(&common.load_program(&relocated), &[&e]); |
| 203 | embassy_rp::pio_instr_util::exec_jmp(&mut sm0, relocated.origin()); | ||
| 204 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 205 | sm0.set_clkdiv(8 * 256); // ~64ns/insn | 197 | sm0.set_clkdiv(8 * 256); // ~64ns/insn |
| 206 | sm0.set_side_enable(false); | ||
| 207 | sm0.set_jmp_pin(db7pin); | 198 | sm0.set_jmp_pin(db7pin); |
| 208 | sm0.set_wrap(source, target); | ||
| 209 | sm0.set_set_pins(&[&rs, &rw]); | 199 | sm0.set_set_pins(&[&rs, &rw]); |
| 210 | sm0.set_out_pins(&[&db4, &db5, &db6, &db7]); | 200 | sm0.set_out_pins(&[&db4, &db5, &db6, &db7]); |
| 211 | sm0.set_sideset_base_pin(&e); | ||
| 212 | sm0.set_sideset_count(1); | ||
| 213 | sm0.set_out_shift_dir(ShiftDirection::Left); | 201 | sm0.set_out_shift_dir(ShiftDirection::Left); |
| 214 | sm0.set_fifo_join(FifoJoin::TxOnly); | 202 | sm0.set_fifo_join(FifoJoin::TxOnly); |
| 215 | 203 | ||
diff --git a/examples/rp/src/bin/ws2812-pio.rs b/examples/rp/src/bin/ws2812-pio.rs index 2e6860d8b..889970541 100644 --- a/examples/rp/src/bin/ws2812-pio.rs +++ b/examples/rp/src/bin/ws2812-pio.rs | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_rp::pio::{Common, FifoJoin, Instance, Pio, PioPin, ShiftDirection, StateMachine}; | 7 | use embassy_rp::pio::{Common, FifoJoin, Instance, Pio, PioPin, ShiftDirection, StateMachine}; |
| 8 | use embassy_rp::pio_instr_util; | ||
| 9 | use embassy_rp::relocate::RelocatedProgram; | 8 | use embassy_rp::relocate::RelocatedProgram; |
| 10 | use embassy_time::{Duration, Timer}; | 9 | use embassy_time::{Duration, Timer}; |
| 11 | use smart_leds::RGB8; | 10 | use smart_leds::RGB8; |
| @@ -45,15 +44,11 @@ impl<'d, P: Instance, const S: usize> Ws2812<'d, P, S> { | |||
| 45 | 44 | ||
| 46 | let prg = a.assemble_with_wrap(wrap_source, wrap_target); | 45 | let prg = a.assemble_with_wrap(wrap_source, wrap_target); |
| 47 | 46 | ||
| 48 | let relocated = RelocatedProgram::new(&prg); | ||
| 49 | pio.write_instr(relocated.origin() as usize, relocated.code()); | ||
| 50 | pio_instr_util::exec_jmp(&mut sm, relocated.origin()); | ||
| 51 | |||
| 52 | // Pin config | 47 | // Pin config |
| 53 | let out_pin = pio.make_pio_pin(pin); | 48 | let out_pin = pio.make_pio_pin(pin); |
| 54 | sm.set_set_pins(&[&out_pin]); | 49 | |
| 55 | sm.set_sideset_base_pin(&out_pin); | 50 | let relocated = RelocatedProgram::new(&prg); |
| 56 | sm.set_sideset_count(1); | 51 | sm.use_program(&pio.load_program(&relocated), &[&out_pin]); |
| 57 | 52 | ||
| 58 | // Clock config | 53 | // Clock config |
| 59 | // TODO CLOCK_FREQ should come from embassy_rp | 54 | // TODO CLOCK_FREQ should come from embassy_rp |
| @@ -70,8 +65,6 @@ impl<'d, P: Instance, const S: usize> Ws2812<'d, P, S> { | |||
| 70 | } | 65 | } |
| 71 | 66 | ||
| 72 | sm.set_clkdiv((int << 8) | frac); | 67 | sm.set_clkdiv((int << 8) | frac); |
| 73 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 74 | sm.set_wrap(source, target); | ||
| 75 | 68 | ||
| 76 | // FIFO config | 69 | // FIFO config |
| 77 | sm.set_autopull(true); | 70 | sm.set_autopull(true); |
