#![no_implicit_prelude]
#![cfg(feature = "cyw")]
extern crate core;
use core::result::Result::{self, Err, Ok};
use crate::Board;
use crate::cyw::device::Device;
use crate::pin::{PinDirection, PinID, PinState};
use crate::pio::state::Stopped;
use crate::pio::{Config, Pio, PioID, Program, Shift, Slot, State};
mod data;
mod device;
const FREQ: u32 = 50_000_000u32;
#[derive(Debug)]
pub enum CywError {
Code,
NoBluetooth,
InitFailure,
InvalidFrequency,
}
pub struct Cyw43 {
dev: Device,
}
impl Cyw43 {
pub fn new(p: &Board) -> Result<Cyw43, CywError> {
let m = p.system_freq();
let (mut f, mut d, mut r) = (1u32, 0u32, 50_000_000u32);
while r >= FREQ {
r = m / (f + (d / 0x100));
if r == FREQ {
d += 1;
} else {
f += 1;
}
if f > 0xFFFF || d > 0xFF {
return Err(CywError::InvalidFrequency);
}
}
let c = Program::new(-1, 7, 0, [
0x6001, 0x1040, 0xE080, 0xA042, 0x5001, 0x0084, 0x20A0, 0xC000, ]);
let mut v = Pio::get(p, PioID::Pio0);
let i = v.install(&c).or(Err(CywError::Code))?;
let mut s = Config::new_program(&i)
.sideset_pin(PinID::Pin29)
.output_pin(PinID::Pin24)
.input_pin(PinID::Pin24)
.set_pin(PinID::Pin24)
.pull(true, 0, Shift::Left)
.push(true, 0, Shift::Left)
.clock_div(f as u16, d as u8)
.configure(unsafe { v.state_unsafe(Slot::Index0) });
s.set_pins_direction(PinDirection::Out, &[PinID::Pin24, PinID::Pin29]);
s.set_pins_state(PinState::Low, &[PinID::Pin24, PinID::Pin29]);
s.set_pin_sync_bypass(PinID::Pin24);
Ok(Cyw43 {
dev: Device::new(p, i.offset(), s, PinID::Pin23, PinID::Pin25),
})
}
#[inline]
pub fn create(p: &Board, offset: u8, sm: State<'_, Stopped>, pwr: PinID, cs: PinID) -> Cyw43 {
Cyw43 {
dev: Device::new(p, offset, sm, pwr, cs),
}
}
pub fn init(&mut self, bluetooth: bool) -> Result<(), CywError> {
Ok(())
}
}