Added module containing new register address representations, added chip mode init/reset

This commit is contained in:
Jonah Dahlquist 2019-08-08 12:11:13 -05:00 committed by Jonah Dahlquist
commit ce36644d9c
7 changed files with 43 additions and 9 deletions

View file

@ -37,8 +37,8 @@ impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> ActiveBus for ActiveFourWire<Sp
type Error = FourWireError<Spi::Error, ChipSelect::Error>; type Error = FourWireError<Spi::Error, ChipSelect::Error>;
fn transfer_frame<'a>( fn transfer_frame<'a>(
&mut self, &mut self,
address: u16,
block: u8, block: u8,
address: u16,
is_write: bool, is_write: bool,
data: &'a mut [u8], data: &'a mut [u8],
) -> Result<&'a mut [u8], nb::Error<Self::Error>> { ) -> Result<&'a mut [u8], nb::Error<Self::Error>> {

View file

@ -16,8 +16,8 @@ pub trait ActiveBus {
fn transfer_frame<'a>( fn transfer_frame<'a>(
&mut self, &mut self,
address: u16,
block: u8, block: u8,
address: u16,
is_write: bool, is_write: bool,
data: &'a mut [u8], data: &'a mut [u8],
) -> Result<&'a mut [u8], Self::Error>; ) -> Result<&'a mut [u8], Self::Error>;

View file

@ -46,8 +46,8 @@ impl<Spi: FullDuplex<u8>> ActiveBus for ActiveThreeWire<Spi> {
/// (address 29) AA /// (address 29) AA
fn transfer_frame<'a>( fn transfer_frame<'a>(
&mut self, &mut self,
mut address: u16,
block: u8, block: u8,
mut address: u16,
is_write: bool, is_write: bool,
data: &'a mut [u8], data: &'a mut [u8],
) -> Result<&'a mut [u8], nb::Error<Self::Error>> { ) -> Result<&'a mut [u8], nb::Error<Self::Error>> {

View file

@ -944,3 +944,4 @@ pub mod bus;
pub mod inactive_w5500; pub mod inactive_w5500;
pub mod uninitialized_w5500; pub mod uninitialized_w5500;
pub mod w5500; pub mod w5500;
mod register;

6
src/register.rs Normal file
View file

@ -0,0 +1,6 @@
pub const COMMON: u8 = 0;
pub mod common {
pub const MODE: u16 = 0;
}

View file

@ -2,19 +2,36 @@ use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire};
use embedded_hal::digital::v2::OutputPin; use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::FullDuplex; use embedded_hal::spi::FullDuplex;
use w5500::W5500; use w5500::W5500;
use crate::Settings;
use register;
pub struct UninitializedW5500<SpiBus: ActiveBus> { pub struct UninitializedW5500<SpiBus: ActiveBus> {
bus: SpiBus, bus: SpiBus,
} }
impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> { impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
pub fn initialize(self) -> W5500<SpiBus> { pub fn initialize(mut self, settings: Settings) -> Result<W5500<SpiBus>, SpiBus::Error> {
// TODO actually initialize chip self.set_mode(settings)?;
W5500::new(self.bus) // TODO set up IP/etc
// TODO give ownership of all sockets
Ok(W5500::new(self.bus))
} }
pub fn new(bus: SpiBus) -> UninitializedW5500<SpiBus> { pub fn new(bus: SpiBus) -> UninitializedW5500<SpiBus> {
UninitializedW5500 { bus: bus } UninitializedW5500 { bus: bus }
} }
fn set_mode(
&mut self,
settings: Settings,
) -> Result<(), SpiBus::Error> {
let mut mode = [0];
mode[0] |= settings.on_wake_on_lan as u8;
mode[0] |= settings.on_ping_request as u8;
mode[0] |= settings.connection_type as u8;
mode[0] |= settings.arp_responses as u8;
block!(self.bus.transfer_frame(register::COMMON, register::common::MODE, true, &mut mode))?;
Ok(())
}
} }
impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin> impl<Spi: FullDuplex<u8>, ChipSelect: OutputPin>

View file

@ -3,6 +3,7 @@ use crate::uninitialized_w5500::UninitializedW5500;
use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire, FourWire, ThreeWire}; use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire, FourWire, ThreeWire};
use embedded_hal::digital::v2::OutputPin; use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::FullDuplex; use embedded_hal::spi::FullDuplex;
use register;
pub struct W5500<SpiBus: ActiveBus> { pub struct W5500<SpiBus: ActiveBus> {
bus: SpiBus, bus: SpiBus,
@ -12,10 +13,19 @@ impl<SpiBus: ActiveBus> W5500<SpiBus> {
pub fn new(bus: SpiBus) -> Self { pub fn new(bus: SpiBus) -> Self {
W5500 { bus } W5500 { bus }
} }
pub fn reset(self) -> UninitializedW5500<SpiBus> { pub fn reset(mut self) -> Result<UninitializedW5500<SpiBus>, SpiBus::Error> {
// TODO reset chip // TODO accept all sockets back
UninitializedW5500::new(self.bus) self.clear_mode()?;
Ok(UninitializedW5500::new(self.bus))
} }
fn clear_mode(&mut self) -> Result<(), SpiBus::Error> {
// reset bit
let mut mode = [0b10000000];
block!(self.bus.transfer_frame(register::COMMON, register::common::MODE, true, &mut mode))?;
Ok(())
}
//TODO open_udp_socket //TODO open_udp_socket
} }