From ce36644d9cb3892b5766c0574c70e313f045f3f7 Mon Sep 17 00:00:00 2001 From: Jonah Dahlquist Date: Thu, 8 Aug 2019 12:11:13 -0500 Subject: [PATCH] Added module containing new register address representations, added chip mode init/reset --- src/bus/four_wire.rs | 2 +- src/bus/mod.rs | 2 +- src/bus/three_wire.rs | 2 +- src/lib.rs | 1 + src/register.rs | 6 ++++++ src/uninitialized_w5500.rs | 23 ++++++++++++++++++++--- src/w5500.rs | 16 +++++++++++++--- 7 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 src/register.rs diff --git a/src/bus/four_wire.rs b/src/bus/four_wire.rs index e486b9e..9604737 100644 --- a/src/bus/four_wire.rs +++ b/src/bus/four_wire.rs @@ -37,8 +37,8 @@ impl, ChipSelect: OutputPin> ActiveBus for ActiveFourWire; fn transfer_frame<'a>( &mut self, - address: u16, block: u8, + address: u16, is_write: bool, data: &'a mut [u8], ) -> Result<&'a mut [u8], nb::Error> { diff --git a/src/bus/mod.rs b/src/bus/mod.rs index 128f0c3..45884b6 100644 --- a/src/bus/mod.rs +++ b/src/bus/mod.rs @@ -16,8 +16,8 @@ pub trait ActiveBus { fn transfer_frame<'a>( &mut self, - address: u16, block: u8, + address: u16, is_write: bool, data: &'a mut [u8], ) -> Result<&'a mut [u8], Self::Error>; diff --git a/src/bus/three_wire.rs b/src/bus/three_wire.rs index 01b2a5f..483e78b 100644 --- a/src/bus/three_wire.rs +++ b/src/bus/three_wire.rs @@ -46,8 +46,8 @@ impl> ActiveBus for ActiveThreeWire { /// (address 29) AA fn transfer_frame<'a>( &mut self, - mut address: u16, block: u8, + mut address: u16, is_write: bool, data: &'a mut [u8], ) -> Result<&'a mut [u8], nb::Error> { diff --git a/src/lib.rs b/src/lib.rs index 266ebbe..919223c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -944,3 +944,4 @@ pub mod bus; pub mod inactive_w5500; pub mod uninitialized_w5500; pub mod w5500; +mod register; diff --git a/src/register.rs b/src/register.rs new file mode 100644 index 0000000..043056a --- /dev/null +++ b/src/register.rs @@ -0,0 +1,6 @@ + +pub const COMMON: u8 = 0; + +pub mod common { + pub const MODE: u16 = 0; +} diff --git a/src/uninitialized_w5500.rs b/src/uninitialized_w5500.rs index 638c84e..34157b8 100644 --- a/src/uninitialized_w5500.rs +++ b/src/uninitialized_w5500.rs @@ -2,19 +2,36 @@ use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire}; use embedded_hal::digital::v2::OutputPin; use embedded_hal::spi::FullDuplex; use w5500::W5500; +use crate::Settings; +use register; pub struct UninitializedW5500 { bus: SpiBus, } impl UninitializedW5500 { - pub fn initialize(self) -> W5500 { - // TODO actually initialize chip - W5500::new(self.bus) + pub fn initialize(mut self, settings: Settings) -> Result, SpiBus::Error> { + self.set_mode(settings)?; + // TODO set up IP/etc + // TODO give ownership of all sockets + Ok(W5500::new(self.bus)) } pub fn new(bus: SpiBus) -> UninitializedW5500 { 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, ChipSelect: OutputPin> diff --git a/src/w5500.rs b/src/w5500.rs index 02acdad..d159927 100644 --- a/src/w5500.rs +++ b/src/w5500.rs @@ -3,6 +3,7 @@ use crate::uninitialized_w5500::UninitializedW5500; use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire, FourWire, ThreeWire}; use embedded_hal::digital::v2::OutputPin; use embedded_hal::spi::FullDuplex; +use register; pub struct W5500 { bus: SpiBus, @@ -12,10 +13,19 @@ impl W5500 { pub fn new(bus: SpiBus) -> Self { W5500 { bus } } - pub fn reset(self) -> UninitializedW5500 { - // TODO reset chip - UninitializedW5500::new(self.bus) + pub fn reset(mut self) -> Result, SpiBus::Error> { + // TODO accept all sockets back + 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 }