From 36df284dcad41978ca8dae4d39e6bcf2a3c5a533 Mon Sep 17 00:00:00 2001 From: Jonah Dahlquist Date: Thu, 5 Sep 2019 20:39:21 -0500 Subject: [PATCH] Finished UDP socket init --- src/register.rs | 62 +++++++++++++++++----------------- src/socket/mod.rs | 52 +++++++++++++++++++--------- src/udp/inactive_udp_socket.rs | 2 +- src/udp/mod.rs | 18 ++++------ src/w5500.rs | 13 +++++-- 5 files changed, 84 insertions(+), 63 deletions(-) diff --git a/src/register.rs b/src/register.rs index 3c9ab98..835b42a 100644 --- a/src/register.rs +++ b/src/register.rs @@ -9,49 +9,49 @@ pub mod common { } pub const SOCKET0: u8 = 0b000_00001; -pub mod socket0 { - pub const TX_BUFFER: u8 = 0b000_00010; - pub const RX_BUFFER: u8 = 0b000_00011; -} +pub const SOCKET0_BUFFER_TX: u8 = 0b000_00010; +pub const SOCKET0_BUFFER_RX: u8 = 0b000_00011; pub const SOCKET1: u8 = 0b000_00101; -pub mod socket1 { - pub const TX_BUFFER: u8 = 0b000_00110; - pub const RX_BUFFER: u8 = 0b000_00111; -} +pub const SOCKET1_BUFFER_TX: u8 = 0b000_00110; +pub const SOCKET1_BUFFER_RX: u8 = 0b000_00111; pub const SOCKET2: u8 = 0b000_01001; -pub mod socket2 { - pub const TX_BUFFER: u8 = 0b000_01010; - pub const RX_BUFFER: u8 = 0b000_01011; -} +pub const SOCKET2_BUFFER_TX: u8 = 0b000_01010; +pub const SOCKET2_BUFFER_RX: u8 = 0b000_01011; pub const SOCKET3: u8 = 0b000_01101; -pub mod socket3 { - pub const TX_BUFFER: u8 = 0b000_01110; - pub const RX_BUFFER: u8 = 0b000_01111; -} +pub const SOCKET3_BUFFER_TX: u8 = 0b000_01110; +pub const SOCKET3_BUFFER_RX: u8 = 0b000_01111; pub const SOCKET4: u8 = 0b000_10001; -pub mod socket4 { - pub const TX_BUFFER: u8 = 0b000_10010; - pub const RX_BUFFER: u8 = 0b000_10011; -} +pub const SOCKET4_BUFFER_TX: u8 = 0b000_10010; +pub const SOCKET4_BUFFER_RX: u8 = 0b000_10011; pub const SOCKET5: u8 = 0b000_10101; -pub mod socket5 { - pub const TX_BUFFER: u8 = 0b000_10110; - pub const RX_BUFFER: u8 = 0b000_10111; -} +pub const SOCKET5_BUFFER_TX: u8 = 0b000_10110; +pub const SOCKET5_BUFFER_RX: u8 = 0b000_10111; pub const SOCKET6: u8 = 0b000_11001; -pub mod socket6 { - pub const TX_BUFFER: u8 = 0b000_11010; - pub const RX_BUFFER: u8 = 0b000_11011; -} +pub const SOCKET6_BUFFER_TX: u8 = 0b000_11010; +pub const SOCKET6_BUFFER_RX: u8 = 0b000_11011; pub const SOCKET7: u8 = 0b000_11101; -pub mod socket7 { - pub const TX_BUFFER: u8 = 0b000_11110; - pub const RX_BUFFER: u8 = 0b000_11111; +pub const SOCKET7_BUFFER_TX: u8 = 0b000_11110; +pub const SOCKET7_BUFFER_RX: u8 = 0b000_11111; + +pub mod socketn { + pub const MODE: u16 = 0x00; + #[repr(u8)] + pub enum Protocol { + Udp = 0b10u8 + } + + pub const INTERRUPT: u16 = 0x02; + #[repr(u8)] + pub enum Interrupt { + SendOk = 0b10000u8 + } + + pub const SOURCE_PORT: u16 = 0x04; } \ No newline at end of file diff --git a/src/socket/mod.rs b/src/socket/mod.rs index df71eb6..5cda10a 100644 --- a/src/socket/mod.rs +++ b/src/socket/mod.rs @@ -1,10 +1,30 @@ +use byteorder::{BigEndian, ByteOrder}; + use crate::register; +use crate::bus::ActiveBus; +use crate::register::socketn; pub trait Socket { fn is_owned_by(&self, sockets: &OwnedSockets) -> bool; fn register(&self) -> u8; fn tx_buffer(&self) -> u8; fn rx_buffer(&self) -> u8; + fn set_mode(&self, bus: &mut SpiBus, mode: socketn::Protocol) -> Result<(), SpiBus::Error> { + let mut mode = [mode as u8]; + block!(bus.transfer_frame(self.register(), socketn::MODE, true, &mut mode))?; + Ok(()) + } + fn reset_interrupt(&self, bus: &mut SpiBus, code: socketn::Interrupt) -> Result<(), SpiBus::Error> { + let mut data = [code as u8]; + block!(bus.transfer_frame(self.register(), socketn::INTERRUPT, true, &mut data))?; + Ok(()) + } + fn set_source_port(&self, bus: &mut SpiBus, port: u16) -> Result<(), SpiBus::Error> { + let mut data = [0u8; 2]; + BigEndian::write_u16(&mut data[..], port); + block!(bus.transfer_frame(self.register(), socketn::SOURCE_PORT, true, &mut data))?; + Ok(()) + } } pub type OwnedSockets = ( @@ -37,10 +57,10 @@ impl Socket for Socket0 { register::SOCKET0 } fn tx_buffer(&self) -> u8 { - register::socket0::TX_BUFFER + register::SOCKET0_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket0::RX_BUFFER + register::SOCKET0_BUFFER_RX } } pub struct Socket1 {} @@ -52,10 +72,10 @@ impl Socket for Socket1 { register::SOCKET1 } fn tx_buffer(&self) -> u8 { - register::socket1::TX_BUFFER + register::SOCKET1_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket1::RX_BUFFER + register::SOCKET1_BUFFER_RX } } pub struct Socket2 {} @@ -67,10 +87,10 @@ impl Socket for Socket2 { register::SOCKET2 } fn tx_buffer(&self) -> u8 { - register::socket2::TX_BUFFER + register::SOCKET2_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket2::RX_BUFFER + register::SOCKET2_BUFFER_RX } } pub struct Socket3 {} @@ -82,10 +102,10 @@ impl Socket for Socket3 { register::SOCKET3 } fn tx_buffer(&self) -> u8 { - register::socket3::TX_BUFFER + register::SOCKET3_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket3::RX_BUFFER + register::SOCKET3_BUFFER_RX } } pub struct Socket4 {} @@ -97,10 +117,10 @@ impl Socket for Socket4 { register::SOCKET4 } fn tx_buffer(&self) -> u8 { - register::socket4::TX_BUFFER + register::SOCKET4_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket4::RX_BUFFER + register::SOCKET4_BUFFER_RX } } pub struct Socket5 {} @@ -112,10 +132,10 @@ impl Socket for Socket5 { register::SOCKET5 } fn tx_buffer(&self) -> u8 { - register::socket5::TX_BUFFER + register::SOCKET5_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket5::RX_BUFFER + register::SOCKET5_BUFFER_RX } } pub struct Socket6 {} @@ -127,10 +147,10 @@ impl Socket for Socket6 { register::SOCKET6 } fn tx_buffer(&self) -> u8 { - register::socket6::TX_BUFFER + register::SOCKET6_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket6::RX_BUFFER + register::SOCKET6_BUFFER_RX } } pub struct Socket7 {} @@ -142,9 +162,9 @@ impl Socket for Socket7 { register::SOCKET7 } fn tx_buffer(&self) -> u8 { - register::socket7::TX_BUFFER + register::SOCKET7_BUFFER_TX } fn rx_buffer(&self) -> u8 { - register::socket7::RX_BUFFER + register::SOCKET7_BUFFER_RX } } diff --git a/src/udp/inactive_udp_socket.rs b/src/udp/inactive_udp_socket.rs index aea55b0..7557894 100644 --- a/src/udp/inactive_udp_socket.rs +++ b/src/udp/inactive_udp_socket.rs @@ -17,7 +17,7 @@ impl<'a, SocketImpl: Socket> InactiveUdpSocket<'a, SocketImpl> { pub fn activate(self, w5500: W5500) -> Result, ForeignSocketError> { let (bus, network, sockets) = w5500.release(); if self.socket.is_owned_by(&sockets) { - Ok(UdpSocket::new(bus, network, sockets, self.socket)) + Ok(UdpSocket { bus, network, sockets, socket: self.socket }) } else { Err(ForeignSocketError {}) } diff --git a/src/udp/mod.rs b/src/udp/mod.rs index a3d4290..1729e57 100644 --- a/src/udp/mod.rs +++ b/src/udp/mod.rs @@ -6,6 +6,7 @@ use crate::socket::Socket; use crate::w5500::W5500; use crate::udp::inactive_udp_socket::InactiveUdpSocket; use crate::socket::OwnedSockets; +use register::socketn; pub struct UdpSocket<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> { bus: SpiBus, @@ -16,19 +17,12 @@ pub struct UdpSocket<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: So } impl<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl> { - pub fn new(bus: SpiBus, network: NetworkImpl, sockets: OwnedSockets, socket: &'a mut SocketImpl) -> Self { - // TODO setup socket in UDP mode - // self.0.reset_interrupt(socket, Interrupt::SendOk)?; - // self.0.write_u16(socket.at(SocketRegister::LocalPort), port)?; - // self.0.write_to( - // socket.at(SocketRegister::Mode), - // &[ - // Protocol::UDP as u8, // Socket Mode Register - // SocketCommand::Open as u8, // Socket Command Register - // ], - // )?; + pub fn new(port: u16, mut bus: SpiBus, network: NetworkImpl, sockets: OwnedSockets, socket: &'a mut SocketImpl) -> Result { + socket.reset_interrupt(&mut bus, socketn::Interrupt::SendOk)?; + socket.set_source_port(&mut bus, port)?; + socket.set_mode(&mut bus, socketn::Protocol::Udp)?; - UdpSocket { bus, network, sockets, socket } + Ok(UdpSocket { bus, network, sockets, socket }) } pub fn deactivate(self) -> (InactiveUdpSocket<'a, SocketImpl>, W5500) { diff --git a/src/w5500.rs b/src/w5500.rs index 5c742b8..2f4071f 100644 --- a/src/w5500.rs +++ b/src/w5500.rs @@ -52,12 +52,14 @@ impl W5500 { pub fn open_udp_socket<'a, SocketImpl: Socket>( self, + port: u16, socket: &'a mut SocketImpl, - ) -> Result, ForeignSocketError> { + ) -> Result, OpenSocketError> { if socket.is_owned_by(&self.sockets) { - Ok(UdpSocket::new(self.bus, self.network, self.sockets, socket)) + UdpSocket::new(port, self.bus, self.network, self.sockets, socket) + .map_err(|e| OpenSocketError::BusError(e)) } else { - Err(ForeignSocketError {}) + Err(OpenSocketError::ForeignSocketError) } } @@ -82,4 +84,9 @@ impl, NetworkImpl: Network> W5500, Netw } } +pub enum OpenSocketError { + ForeignSocketError, + BusError(BusError), +} + pub struct ForeignSocketError {}