feat(firmware): implement FUSB302 reset
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
871cfc63f0
commit
d4e0d6142d
|
@ -7,5 +7,6 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ch32v00x-hal = { git = "https://github.com/lujoga/ch32v00x-hal.git", branch = "qingke-rt", features = ["ch32v003", "rt"] }
|
ch32v00x-hal = { git = "https://github.com/lujoga/ch32v00x-hal.git", branch = "qingke-rt", features = ["ch32v003", "rt"] }
|
||||||
|
embedded-hal = "0.2.7"
|
||||||
panic-halt = "0.2.0"
|
panic-halt = "0.2.0"
|
||||||
qingke-rt = "0.1.7"
|
qingke-rt = "0.1.7"
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
use embedded_hal::blocking::i2c::{Write, WriteRead};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum Error<RE, WE> {
|
||||||
|
ReadError(RE),
|
||||||
|
WriteError(WE),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait ErrorType {
|
||||||
|
type Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Variant {
|
||||||
|
B,
|
||||||
|
B01,
|
||||||
|
B10,
|
||||||
|
B11,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Variant {
|
||||||
|
fn address(&self) -> u8 {
|
||||||
|
match self {
|
||||||
|
Variant::B => 0b0100_010,
|
||||||
|
Variant::B01 => 0b0100_011,
|
||||||
|
Variant::B10 => 0b0100_100,
|
||||||
|
Variant::B11 => 0b0100_101,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Fusb302<I2C> {
|
||||||
|
i2c: I2C,
|
||||||
|
variant: Variant,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I2C> ErrorType for Fusb302<I2C>
|
||||||
|
where
|
||||||
|
I2C: Write + WriteRead,
|
||||||
|
{
|
||||||
|
type Error = Error<<I2C as WriteRead>::Error, <I2C as Write>::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<I2C> Fusb302<I2C>
|
||||||
|
where
|
||||||
|
I2C: Write + WriteRead,
|
||||||
|
{
|
||||||
|
pub fn new(i2c: I2C, variant: Variant) -> Self {
|
||||||
|
Self { i2c, variant }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn release(self) -> I2C {
|
||||||
|
self.i2c
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset(&mut self) -> Result<(), <Self as ErrorType>::Error> {
|
||||||
|
self.i2c
|
||||||
|
.write(self.variant.address(), &[0x0c, 0b1])
|
||||||
|
.map_err(|err| Error::WriteError(err))
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,14 @@
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
mod fusb302;
|
||||||
|
|
||||||
use ch32v00x_hal as hal;
|
use ch32v00x_hal as hal;
|
||||||
|
|
||||||
|
use core::cell::Cell;
|
||||||
|
|
||||||
|
use fusb302::{Fusb302, Variant};
|
||||||
|
|
||||||
use hal::debug::SDIPrint;
|
use hal::debug::SDIPrint;
|
||||||
use hal::gpio::PinState;
|
use hal::gpio::PinState;
|
||||||
use hal::i2c::{I2c, I2cConfig};
|
use hal::i2c::{I2c, I2cConfig};
|
||||||
|
@ -25,14 +31,14 @@ fn main() -> ! {
|
||||||
let mut _fan = gpioa.pa2.into_push_pull_output_in_state(PinState::High);
|
let mut _fan = gpioa.pa2.into_push_pull_output_in_state(PinState::High);
|
||||||
|
|
||||||
let gpioc = p.GPIOC.split(&mut rcc);
|
let gpioc = p.GPIOC.split(&mut rcc);
|
||||||
let _i2c = I2c::i2c1(
|
let i2c = Cell::new(Some(I2c::i2c1(
|
||||||
p.I2C1,
|
p.I2C1,
|
||||||
gpioc.pc2.into_alternate_open_drain(),
|
gpioc.pc2.into_alternate_open_drain(),
|
||||||
gpioc.pc1.into_alternate_open_drain(),
|
gpioc.pc1.into_alternate_open_drain(),
|
||||||
I2cConfig::fast_mode(),
|
I2cConfig::fast_mode(),
|
||||||
&mut rcc,
|
&mut rcc,
|
||||||
&clocks,
|
&clocks,
|
||||||
);
|
)));
|
||||||
let mut _tec = gpioc.pc4.into_push_pull_output();
|
let mut _tec = gpioc.pc4.into_push_pull_output();
|
||||||
|
|
||||||
let gpiod = p.GPIOD.split(&mut rcc);
|
let gpiod = p.GPIOD.split(&mut rcc);
|
||||||
|
@ -44,5 +50,9 @@ fn main() -> ! {
|
||||||
&clocks,
|
&clocks,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let mut fusb302 = Fusb302::new(i2c.replace(None).unwrap(), Variant::B);
|
||||||
|
fusb302.reset().unwrap();
|
||||||
|
let _ = i2c.replace(Some(fusb302.release()));
|
||||||
|
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue