Re-wrote socket implementations to be more compatible with embedded-nal
This commit is contained in:
parent
b1e83e3d05
commit
f546ff2011
17 changed files with 673 additions and 1603 deletions
|
|
@ -1,11 +1,10 @@
|
|||
use crate::network::{Dhcp, Manual, Network};
|
||||
use crate::{IpAddress, MacAddress, Mode};
|
||||
use crate::{MacAddress, Mode};
|
||||
use bus::{ActiveBus, ActiveFourWire, ActiveThreeWire};
|
||||
use embedded_hal::digital::v2::OutputPin;
|
||||
use embedded_hal::spi::FullDuplex;
|
||||
use embedded_nal::Ipv4Addr;
|
||||
use register;
|
||||
use socket::OwnedSockets;
|
||||
use socket::{Socket0, Socket1, Socket2, Socket3, Socket4, Socket5, Socket6, Socket7};
|
||||
use w5500::W5500;
|
||||
|
||||
pub struct UninitializedW5500<SpiBus: ActiveBus> {
|
||||
|
|
@ -17,6 +16,7 @@ pub enum InitializeError<SpiError> {
|
|||
SpiError(SpiError),
|
||||
ChipNotConnected,
|
||||
}
|
||||
// TODO add From impl and remove map_errs
|
||||
|
||||
impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
||||
pub fn new(bus: SpiBus) -> UninitializedW5500<SpiBus> {
|
||||
|
|
@ -27,7 +27,7 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
|||
self,
|
||||
mac: MacAddress,
|
||||
mode_options: Mode,
|
||||
) -> Result<(W5500<SpiBus, Dhcp>, OwnedSockets), InitializeError<SpiBus::Error>> {
|
||||
) -> Result<W5500<SpiBus, Dhcp>, InitializeError<SpiBus::Error>> {
|
||||
let network = Dhcp::new(mac);
|
||||
self.initialize_with_network(network, mode_options)
|
||||
}
|
||||
|
|
@ -35,23 +35,24 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
|||
pub fn initialize_manual(
|
||||
self,
|
||||
mac: MacAddress,
|
||||
ip: IpAddress,
|
||||
ip: Ipv4Addr,
|
||||
mode_options: Mode,
|
||||
) -> Result<(W5500<SpiBus, Manual>, OwnedSockets), InitializeError<SpiBus::Error>> {
|
||||
let mut gateway = ip;
|
||||
gateway.address[3] = 1;
|
||||
let subnet = IpAddress::new(255, 255, 255, 0);
|
||||
) -> Result<W5500<SpiBus, Manual>, InitializeError<SpiBus::Error>> {
|
||||
let mut ip_bytes = ip.octets();
|
||||
ip_bytes[3] = 1;
|
||||
let gateway = Ipv4Addr::from(ip_bytes);
|
||||
let subnet = Ipv4Addr::new(255, 255, 255, 0);
|
||||
self.initialize_advanced(mac, ip, gateway, subnet, mode_options)
|
||||
}
|
||||
|
||||
pub fn initialize_advanced(
|
||||
self,
|
||||
mac: MacAddress,
|
||||
ip: IpAddress,
|
||||
gateway: IpAddress,
|
||||
subnet: IpAddress,
|
||||
ip: Ipv4Addr,
|
||||
gateway: Ipv4Addr,
|
||||
subnet: Ipv4Addr,
|
||||
mode_options: Mode,
|
||||
) -> Result<(W5500<SpiBus, Manual>, OwnedSockets), InitializeError<SpiBus::Error>> {
|
||||
) -> Result<W5500<SpiBus, Manual>, InitializeError<SpiBus::Error>> {
|
||||
let network = Manual::new(mac, ip, gateway, subnet);
|
||||
self.initialize_with_network(network, mode_options)
|
||||
}
|
||||
|
|
@ -60,35 +61,21 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
|||
mut self,
|
||||
mut network: NetworkImpl,
|
||||
mode_options: Mode,
|
||||
) -> Result<(W5500<SpiBus, NetworkImpl>, OwnedSockets), InitializeError<SpiBus::Error>> {
|
||||
) -> Result<W5500<SpiBus, NetworkImpl>, InitializeError<SpiBus::Error>> {
|
||||
self.assert_chip_version(0x4)?;
|
||||
|
||||
// RESET
|
||||
/*
|
||||
let mut mode = [0b10000000];
|
||||
self
|
||||
.bus
|
||||
.transfer_frame(register::COMMON, register::common::MODE, true, &mut mode)
|
||||
self.bus
|
||||
.write_frame(register::COMMON, register::common::MODE, &mut mode)
|
||||
.map_err(|e| InitializeError::SpiError(e))?;
|
||||
*/
|
||||
|
||||
|
||||
self.set_mode(mode_options)
|
||||
.map_err(|e| InitializeError::SpiError(e))?;
|
||||
network
|
||||
.refresh(&mut self.bus)
|
||||
.map_err(|e| InitializeError::SpiError(e))?;
|
||||
let sockets = (
|
||||
Socket0 {},
|
||||
Socket1 {},
|
||||
Socket2 {},
|
||||
Socket3 {},
|
||||
Socket4 {},
|
||||
Socket5 {},
|
||||
Socket6 {},
|
||||
Socket7 {},
|
||||
);
|
||||
Ok((W5500::new(self.bus, network), sockets))
|
||||
Ok(W5500::new(self.bus, network))
|
||||
}
|
||||
|
||||
fn assert_chip_version(
|
||||
|
|
@ -96,13 +83,9 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
|||
expected_version: u8,
|
||||
) -> Result<(), InitializeError<SpiBus::Error>> {
|
||||
let mut version = [0];
|
||||
self.bus.transfer_frame(
|
||||
register::COMMON,
|
||||
register::common::VERSION,
|
||||
false,
|
||||
&mut version
|
||||
)
|
||||
.map_err(|e| InitializeError::SpiError(e))?;
|
||||
self.bus
|
||||
.read_frame(register::COMMON, register::common::VERSION, &mut version)
|
||||
.map_err(|e| InitializeError::SpiError(e))?;
|
||||
if version[0] != expected_version {
|
||||
Err(InitializeError::ChipNotConnected)
|
||||
} else {
|
||||
|
|
@ -116,9 +99,8 @@ impl<SpiBus: ActiveBus> UninitializedW5500<SpiBus> {
|
|||
mode[0] |= mode_options.on_ping_request as u8;
|
||||
mode[0] |= mode_options.connection_type as u8;
|
||||
mode[0] |= mode_options.arp_responses as u8;
|
||||
self
|
||||
.bus
|
||||
.transfer_frame(register::COMMON, register::common::MODE, true, &mut mode)?;
|
||||
self.bus
|
||||
.write_frame(register::COMMON, register::common::MODE, &mut mode)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue