rp/pio: mark pio_instr_util unsafe

none of these are safe. the x/y functions mangle the fifos, the set
functions require the state machine to be stopped to be in any way safe,
the out functions do both of those things at once. only the jump
instruction is marginally safe, but running this on an active program is
bound to cause problems.
This commit is contained in:
pennae 2023-05-05 20:46:10 +02:00
parent 37b460637d
commit 2873cb93ee

View File

@ -2,7 +2,7 @@ use pio::{InSource, InstructionOperands, JmpCondition, OutDestination, SetDestin
use crate::pio::{Instance, StateMachine}; use crate::pio::{Instance, StateMachine};
pub fn set_x<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, value: u32) { pub unsafe fn set_x<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, value: u32) {
const OUT: u16 = InstructionOperands::OUT { const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::X, destination: OutDestination::X,
bit_count: 32, bit_count: 32,
@ -12,7 +12,7 @@ pub fn set_x<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, val
sm.exec_instr(OUT); sm.exec_instr(OUT);
} }
pub fn get_x<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>) -> u32 { pub unsafe fn get_x<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>) -> u32 {
const IN: u16 = InstructionOperands::IN { const IN: u16 = InstructionOperands::IN {
source: InSource::X, source: InSource::X,
bit_count: 32, bit_count: 32,
@ -22,7 +22,7 @@ pub fn get_x<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>) ->
sm.rx().pull() sm.rx().pull()
} }
pub fn set_y<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, value: u32) { pub unsafe fn set_y<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, value: u32) {
const OUT: u16 = InstructionOperands::OUT { const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::Y, destination: OutDestination::Y,
bit_count: 32, bit_count: 32,
@ -32,7 +32,7 @@ pub fn set_y<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, val
sm.exec_instr(OUT); sm.exec_instr(OUT);
} }
pub fn get_y<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>) -> u32 { pub unsafe fn get_y<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>) -> u32 {
const IN: u16 = InstructionOperands::IN { const IN: u16 = InstructionOperands::IN {
source: InSource::Y, source: InSource::Y,
bit_count: 32, bit_count: 32,
@ -43,7 +43,7 @@ pub fn get_y<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>) ->
sm.rx().pull() sm.rx().pull()
} }
pub fn set_pindir<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u8) { pub unsafe fn set_pindir<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u8) {
let set: u16 = InstructionOperands::SET { let set: u16 = InstructionOperands::SET {
destination: SetDestination::PINDIRS, destination: SetDestination::PINDIRS,
data, data,
@ -52,7 +52,7 @@ pub fn set_pindir<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>
sm.exec_instr(set); sm.exec_instr(set);
} }
pub fn set_pin<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u8) { pub unsafe fn set_pin<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u8) {
let set: u16 = InstructionOperands::SET { let set: u16 = InstructionOperands::SET {
destination: SetDestination::PINS, destination: SetDestination::PINS,
data, data,
@ -61,7 +61,7 @@ pub fn set_pin<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, d
sm.exec_instr(set); sm.exec_instr(set);
} }
pub fn set_out_pin<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u32) { pub unsafe fn set_out_pin<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u32) {
const OUT: u16 = InstructionOperands::OUT { const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::PINS, destination: OutDestination::PINS,
bit_count: 32, bit_count: 32,
@ -70,7 +70,7 @@ pub fn set_out_pin<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM
sm.tx().push(data); sm.tx().push(data);
sm.exec_instr(OUT); sm.exec_instr(OUT);
} }
pub fn set_out_pindir<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u32) { pub unsafe fn set_out_pindir<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, data: u32) {
const OUT: u16 = InstructionOperands::OUT { const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::PINDIRS, destination: OutDestination::PINDIRS,
bit_count: 32, bit_count: 32,
@ -80,7 +80,7 @@ pub fn set_out_pindir<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO,
sm.exec_instr(OUT); sm.exec_instr(OUT);
} }
pub fn exec_jmp<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, to_addr: u8) { pub unsafe fn exec_jmp<PIO: Instance, const SM: usize>(sm: &mut StateMachine<PIO, SM>, to_addr: u8) {
let jmp: u16 = InstructionOperands::JMP { let jmp: u16 = InstructionOperands::JMP {
address: to_addr, address: to_addr,
condition: JmpCondition::Always, condition: JmpCondition::Always,