diff options
| author | Simon Berg <[email protected]> | 2022-12-06 21:42:30 +0100 |
|---|---|---|
| committer | Simon Berg <[email protected]> | 2022-12-09 20:18:41 +0100 |
| commit | cd59046e6c179809ee19fb2592e65cf5a0a07980 (patch) | |
| tree | 7a51a46e07ec5a71022375a99a10d266f47e86e9 /examples | |
| parent | 35db6e639bf5de017551164e9cbfaa2e5e46fca3 (diff) | |
Added RelocateProgram class for adjusting PIO-programs for different origins.
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/rp/src/bin/pio_async.rs | 31 | ||||
| -rw-r--r-- | examples/rp/src/bin/pio_dma.rs | 10 |
2 files changed, 25 insertions, 16 deletions
diff --git a/examples/rp/src/bin/pio_async.rs b/examples/rp/src/bin/pio_async.rs index e9211db3b..45a8c73f7 100644 --- a/examples/rp/src/bin/pio_async.rs +++ b/examples/rp/src/bin/pio_async.rs | |||
| @@ -6,6 +6,7 @@ use embassy_executor::Spawner; | |||
| 6 | use embassy_rp::gpio::{AnyPin, Pin}; | 6 | use embassy_rp::gpio::{AnyPin, Pin}; |
| 7 | use embassy_rp::pio::{Pio0, PioPeripherial, PioStateMachine, PioStateMachineInstance, ShiftDirection, Sm0, Sm1, Sm2}; | 7 | use embassy_rp::pio::{Pio0, PioPeripherial, PioStateMachine, PioStateMachineInstance, ShiftDirection, Sm0, Sm1, Sm2}; |
| 8 | use embassy_rp::pio_instr_util; | 8 | use embassy_rp::pio_instr_util; |
| 9 | use embassy_rp::relocate::RelocatedProgram; | ||
| 9 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 10 | 11 | ||
| 11 | #[embassy_executor::task] | 12 | #[embassy_executor::task] |
| @@ -21,15 +22,17 @@ async fn pio_task_sm0(mut sm: PioStateMachineInstance<Pio0, Sm0>, pin: AnyPin) { | |||
| 21 | ".wrap", | 22 | ".wrap", |
| 22 | ); | 23 | ); |
| 23 | 24 | ||
| 24 | let origin = prg.program.origin.unwrap_or(0); | 25 | let relocated = RelocatedProgram::new(&prg.program); |
| 25 | let out_pin = sm.make_pio_pin(pin); | 26 | let out_pin = sm.make_pio_pin(pin); |
| 26 | let pio_pins = [&out_pin]; | 27 | let pio_pins = [&out_pin]; |
| 27 | sm.set_out_pins(&pio_pins); | 28 | sm.set_out_pins(&pio_pins); |
| 28 | sm.write_instr(origin as usize, &prg.program.code); | 29 | sm.write_instr(relocated.origin() as usize, relocated.code()); |
| 29 | pio_instr_util::exec_jmp(&mut sm, origin); | 30 | pio_instr_util::exec_jmp(&mut sm, relocated.origin()); |
| 30 | sm.set_clkdiv((125e6 / 20.0 / 2e2 * 256.0) as u32); | 31 | sm.set_clkdiv((125e6 / 20.0 / 2e2 * 256.0) as u32); |
| 31 | sm.set_set_range(0, 1); | 32 | sm.set_set_range(0, 1); |
| 32 | sm.set_wrap(prg.program.wrap.source + origin, prg.program.wrap.target + origin); | 33 | let pio::Wrap { source, target } = relocated.wrap(); |
| 34 | sm.set_wrap(source, target); | ||
| 35 | |||
| 33 | sm.set_autopull(true); | 36 | sm.set_autopull(true); |
| 34 | sm.set_out_shift_dir(ShiftDirection::Left); | 37 | sm.set_out_shift_dir(ShiftDirection::Left); |
| 35 | 38 | ||
| @@ -50,12 +53,14 @@ async fn pio_task_sm1(mut sm: PioStateMachineInstance<Pio0, Sm1>) { | |||
| 50 | // Read 0b10101 repeatedly until ISR is full | 53 | // Read 0b10101 repeatedly until ISR is full |
| 51 | let prg = pio_proc::pio_asm!(".origin 8", "set x, 0x15", ".wrap_target", "in x, 5 [31]", ".wrap",); | 54 | let prg = pio_proc::pio_asm!(".origin 8", "set x, 0x15", ".wrap_target", "in x, 5 [31]", ".wrap",); |
| 52 | 55 | ||
| 53 | let origin = prg.program.origin.unwrap_or(0); | 56 | let relocated = RelocatedProgram::new(&prg.program); |
| 54 | sm.write_instr(origin as usize, &prg.program.code); | 57 | sm.write_instr(relocated.origin() as usize, relocated.code()); |
| 55 | pio_instr_util::exec_jmp(&mut sm, origin); | 58 | pio_instr_util::exec_jmp(&mut sm, relocated.origin()); |
| 56 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); | 59 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); |
| 57 | sm.set_set_range(0, 0); | 60 | sm.set_set_range(0, 0); |
| 58 | sm.set_wrap(prg.program.wrap.source + origin, prg.program.wrap.target + origin); | 61 | let pio::Wrap { source, target } = relocated.wrap(); |
| 62 | sm.set_wrap(source, target); | ||
| 63 | |||
| 59 | sm.set_autopush(true); | 64 | sm.set_autopush(true); |
| 60 | sm.set_in_shift_dir(ShiftDirection::Right); | 65 | sm.set_in_shift_dir(ShiftDirection::Right); |
| 61 | sm.set_enable(true); | 66 | sm.set_enable(true); |
| @@ -79,11 +84,13 @@ async fn pio_task_sm2(mut sm: PioStateMachineInstance<Pio0, Sm2>) { | |||
| 79 | "irq 3 [15]", | 84 | "irq 3 [15]", |
| 80 | ".wrap", | 85 | ".wrap", |
| 81 | ); | 86 | ); |
| 82 | let origin = prg.program.origin.unwrap_or(0); | 87 | let relocated = RelocatedProgram::new(&prg.program); |
| 88 | sm.write_instr(relocated.origin() as usize, relocated.code()); | ||
| 89 | |||
| 90 | let pio::Wrap { source, target } = relocated.wrap(); | ||
| 91 | sm.set_wrap(source, target); | ||
| 83 | 92 | ||
| 84 | sm.write_instr(origin as usize, &prg.program.code); | 93 | pio_instr_util::exec_jmp(&mut sm, relocated.origin()); |
| 85 | sm.set_wrap(prg.program.wrap.source + origin, prg.program.wrap.target + origin); | ||
| 86 | pio_instr_util::exec_jmp(&mut sm, origin); | ||
| 87 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); | 94 | sm.set_clkdiv((125e6 / 2e3 * 256.0) as u32); |
| 88 | sm.set_enable(true); | 95 | sm.set_enable(true); |
| 89 | loop { | 96 | loop { |
diff --git a/examples/rp/src/bin/pio_dma.rs b/examples/rp/src/bin/pio_dma.rs index bdcdf200c..b19ef4083 100644 --- a/examples/rp/src/bin/pio_dma.rs +++ b/examples/rp/src/bin/pio_dma.rs | |||
| @@ -5,6 +5,7 @@ use defmt::info; | |||
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_futures::join::join; | 6 | use embassy_futures::join::join; |
| 7 | use embassy_rp::pio::{PioPeripherial, PioStateMachine, ShiftDirection}; | 7 | use embassy_rp::pio::{PioPeripherial, PioStateMachine, ShiftDirection}; |
| 8 | use embassy_rp::relocate::RelocatedProgram; | ||
| 8 | use embassy_rp::{pio_instr_util, Peripheral}; | 9 | use embassy_rp::{pio_instr_util, Peripheral}; |
| 9 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 10 | 11 | ||
| @@ -32,11 +33,12 @@ async fn main(_spawner: Spawner) { | |||
| 32 | ".wrap", | 33 | ".wrap", |
| 33 | ); | 34 | ); |
| 34 | 35 | ||
| 35 | let origin = prg.program.origin.unwrap_or(0); | 36 | let relocated = RelocatedProgram::new(&prg.program); |
| 36 | sm.write_instr(origin as usize, &prg.program.code); | 37 | sm.write_instr(relocated.origin() as usize, relocated.code()); |
| 37 | pio_instr_util::exec_jmp(&mut sm, origin); | 38 | pio_instr_util::exec_jmp(&mut sm, relocated.origin()); |
| 38 | sm.set_clkdiv((125e6 / 10e3 * 256.0) as u32); | 39 | sm.set_clkdiv((125e6 / 10e3 * 256.0) as u32); |
| 39 | sm.set_wrap(prg.program.wrap.source + origin, prg.program.wrap.target + origin); | 40 | let pio::Wrap { source, target } = relocated.wrap(); |
| 41 | sm.set_wrap(source, target); | ||
| 40 | sm.set_autopull(true); | 42 | sm.set_autopull(true); |
| 41 | sm.set_autopush(true); | 43 | sm.set_autopush(true); |
| 42 | sm.set_pull_threshold(32); | 44 | sm.set_pull_threshold(32); |
