Finished UDP socket init
This commit is contained in:
parent
65a9552816
commit
36df284dca
5 changed files with 84 additions and 63 deletions
|
|
@ -9,49 +9,49 @@ pub mod common {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const SOCKET0: u8 = 0b000_00001;
|
pub const SOCKET0: u8 = 0b000_00001;
|
||||||
pub mod socket0 {
|
pub const SOCKET0_BUFFER_TX: u8 = 0b000_00010;
|
||||||
pub const TX_BUFFER: u8 = 0b000_00010;
|
pub const SOCKET0_BUFFER_RX: u8 = 0b000_00011;
|
||||||
pub const RX_BUFFER: u8 = 0b000_00011;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET1: u8 = 0b000_00101;
|
pub const SOCKET1: u8 = 0b000_00101;
|
||||||
pub mod socket1 {
|
pub const SOCKET1_BUFFER_TX: u8 = 0b000_00110;
|
||||||
pub const TX_BUFFER: u8 = 0b000_00110;
|
pub const SOCKET1_BUFFER_RX: u8 = 0b000_00111;
|
||||||
pub const RX_BUFFER: u8 = 0b000_00111;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET2: u8 = 0b000_01001;
|
pub const SOCKET2: u8 = 0b000_01001;
|
||||||
pub mod socket2 {
|
pub const SOCKET2_BUFFER_TX: u8 = 0b000_01010;
|
||||||
pub const TX_BUFFER: u8 = 0b000_01010;
|
pub const SOCKET2_BUFFER_RX: u8 = 0b000_01011;
|
||||||
pub const RX_BUFFER: u8 = 0b000_01011;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET3: u8 = 0b000_01101;
|
pub const SOCKET3: u8 = 0b000_01101;
|
||||||
pub mod socket3 {
|
pub const SOCKET3_BUFFER_TX: u8 = 0b000_01110;
|
||||||
pub const TX_BUFFER: u8 = 0b000_01110;
|
pub const SOCKET3_BUFFER_RX: u8 = 0b000_01111;
|
||||||
pub const RX_BUFFER: u8 = 0b000_01111;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET4: u8 = 0b000_10001;
|
pub const SOCKET4: u8 = 0b000_10001;
|
||||||
pub mod socket4 {
|
pub const SOCKET4_BUFFER_TX: u8 = 0b000_10010;
|
||||||
pub const TX_BUFFER: u8 = 0b000_10010;
|
pub const SOCKET4_BUFFER_RX: u8 = 0b000_10011;
|
||||||
pub const RX_BUFFER: u8 = 0b000_10011;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET5: u8 = 0b000_10101;
|
pub const SOCKET5: u8 = 0b000_10101;
|
||||||
pub mod socket5 {
|
pub const SOCKET5_BUFFER_TX: u8 = 0b000_10110;
|
||||||
pub const TX_BUFFER: u8 = 0b000_10110;
|
pub const SOCKET5_BUFFER_RX: u8 = 0b000_10111;
|
||||||
pub const RX_BUFFER: u8 = 0b000_10111;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET6: u8 = 0b000_11001;
|
pub const SOCKET6: u8 = 0b000_11001;
|
||||||
pub mod socket6 {
|
pub const SOCKET6_BUFFER_TX: u8 = 0b000_11010;
|
||||||
pub const TX_BUFFER: u8 = 0b000_11010;
|
pub const SOCKET6_BUFFER_RX: u8 = 0b000_11011;
|
||||||
pub const RX_BUFFER: u8 = 0b000_11011;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const SOCKET7: u8 = 0b000_11101;
|
pub const SOCKET7: u8 = 0b000_11101;
|
||||||
pub mod socket7 {
|
pub const SOCKET7_BUFFER_TX: u8 = 0b000_11110;
|
||||||
pub const TX_BUFFER: u8 = 0b000_11110;
|
pub const SOCKET7_BUFFER_RX: u8 = 0b000_11111;
|
||||||
pub const RX_BUFFER: 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;
|
||||||
}
|
}
|
||||||
|
|
@ -1,10 +1,30 @@
|
||||||
|
use byteorder::{BigEndian, ByteOrder};
|
||||||
|
|
||||||
use crate::register;
|
use crate::register;
|
||||||
|
use crate::bus::ActiveBus;
|
||||||
|
use crate::register::socketn;
|
||||||
|
|
||||||
pub trait Socket {
|
pub trait Socket {
|
||||||
fn is_owned_by(&self, sockets: &OwnedSockets) -> bool;
|
fn is_owned_by(&self, sockets: &OwnedSockets) -> bool;
|
||||||
fn register(&self) -> u8;
|
fn register(&self) -> u8;
|
||||||
fn tx_buffer(&self) -> u8;
|
fn tx_buffer(&self) -> u8;
|
||||||
fn rx_buffer(&self) -> u8;
|
fn rx_buffer(&self) -> u8;
|
||||||
|
fn set_mode<SpiBus: ActiveBus>(&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<SpiBus: ActiveBus>(&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<SpiBus: ActiveBus>(&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 = (
|
pub type OwnedSockets = (
|
||||||
|
|
@ -37,10 +57,10 @@ impl Socket for Socket0 {
|
||||||
register::SOCKET0
|
register::SOCKET0
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket0::TX_BUFFER
|
register::SOCKET0_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket0::RX_BUFFER
|
register::SOCKET0_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket1 {}
|
pub struct Socket1 {}
|
||||||
|
|
@ -52,10 +72,10 @@ impl Socket for Socket1 {
|
||||||
register::SOCKET1
|
register::SOCKET1
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket1::TX_BUFFER
|
register::SOCKET1_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket1::RX_BUFFER
|
register::SOCKET1_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket2 {}
|
pub struct Socket2 {}
|
||||||
|
|
@ -67,10 +87,10 @@ impl Socket for Socket2 {
|
||||||
register::SOCKET2
|
register::SOCKET2
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket2::TX_BUFFER
|
register::SOCKET2_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket2::RX_BUFFER
|
register::SOCKET2_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket3 {}
|
pub struct Socket3 {}
|
||||||
|
|
@ -82,10 +102,10 @@ impl Socket for Socket3 {
|
||||||
register::SOCKET3
|
register::SOCKET3
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket3::TX_BUFFER
|
register::SOCKET3_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket3::RX_BUFFER
|
register::SOCKET3_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket4 {}
|
pub struct Socket4 {}
|
||||||
|
|
@ -97,10 +117,10 @@ impl Socket for Socket4 {
|
||||||
register::SOCKET4
|
register::SOCKET4
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket4::TX_BUFFER
|
register::SOCKET4_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket4::RX_BUFFER
|
register::SOCKET4_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket5 {}
|
pub struct Socket5 {}
|
||||||
|
|
@ -112,10 +132,10 @@ impl Socket for Socket5 {
|
||||||
register::SOCKET5
|
register::SOCKET5
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket5::TX_BUFFER
|
register::SOCKET5_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket5::RX_BUFFER
|
register::SOCKET5_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket6 {}
|
pub struct Socket6 {}
|
||||||
|
|
@ -127,10 +147,10 @@ impl Socket for Socket6 {
|
||||||
register::SOCKET6
|
register::SOCKET6
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket6::TX_BUFFER
|
register::SOCKET6_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket6::RX_BUFFER
|
register::SOCKET6_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub struct Socket7 {}
|
pub struct Socket7 {}
|
||||||
|
|
@ -142,9 +162,9 @@ impl Socket for Socket7 {
|
||||||
register::SOCKET7
|
register::SOCKET7
|
||||||
}
|
}
|
||||||
fn tx_buffer(&self) -> u8 {
|
fn tx_buffer(&self) -> u8 {
|
||||||
register::socket7::TX_BUFFER
|
register::SOCKET7_BUFFER_TX
|
||||||
}
|
}
|
||||||
fn rx_buffer(&self) -> u8 {
|
fn rx_buffer(&self) -> u8 {
|
||||||
register::socket7::RX_BUFFER
|
register::SOCKET7_BUFFER_RX
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ impl<'a, SocketImpl: Socket> InactiveUdpSocket<'a, SocketImpl> {
|
||||||
pub fn activate<SpiBus: ActiveBus, NetworkImpl: Network>(self, w5500: W5500<SpiBus, NetworkImpl>) -> Result<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>, ForeignSocketError> {
|
pub fn activate<SpiBus: ActiveBus, NetworkImpl: Network>(self, w5500: W5500<SpiBus, NetworkImpl>) -> Result<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>, ForeignSocketError> {
|
||||||
let (bus, network, sockets) = w5500.release();
|
let (bus, network, sockets) = w5500.release();
|
||||||
if self.socket.is_owned_by(&sockets) {
|
if self.socket.is_owned_by(&sockets) {
|
||||||
Ok(UdpSocket::new(bus, network, sockets, self.socket))
|
Ok(UdpSocket { bus, network, sockets, socket: self.socket })
|
||||||
} else {
|
} else {
|
||||||
Err(ForeignSocketError {})
|
Err(ForeignSocketError {})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ use crate::socket::Socket;
|
||||||
use crate::w5500::W5500;
|
use crate::w5500::W5500;
|
||||||
use crate::udp::inactive_udp_socket::InactiveUdpSocket;
|
use crate::udp::inactive_udp_socket::InactiveUdpSocket;
|
||||||
use crate::socket::OwnedSockets;
|
use crate::socket::OwnedSockets;
|
||||||
|
use register::socketn;
|
||||||
|
|
||||||
pub struct UdpSocket<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> {
|
pub struct UdpSocket<'a, SpiBus: ActiveBus, NetworkImpl: Network, SocketImpl: Socket> {
|
||||||
bus: SpiBus,
|
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> {
|
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 {
|
pub fn new(port: u16, mut bus: SpiBus, network: NetworkImpl, sockets: OwnedSockets, socket: &'a mut SocketImpl) -> Result<Self, SpiBus::Error> {
|
||||||
// TODO setup socket in UDP mode
|
socket.reset_interrupt(&mut bus, socketn::Interrupt::SendOk)?;
|
||||||
// self.0.reset_interrupt(socket, Interrupt::SendOk)?;
|
socket.set_source_port(&mut bus, port)?;
|
||||||
// self.0.write_u16(socket.at(SocketRegister::LocalPort), port)?;
|
socket.set_mode(&mut bus, socketn::Protocol::Udp)?;
|
||||||
// self.0.write_to(
|
|
||||||
// socket.at(SocketRegister::Mode),
|
|
||||||
// &[
|
|
||||||
// Protocol::UDP as u8, // Socket Mode Register
|
|
||||||
// SocketCommand::Open as u8, // Socket Command Register
|
|
||||||
// ],
|
|
||||||
// )?;
|
|
||||||
|
|
||||||
UdpSocket { bus, network, sockets, socket }
|
Ok(UdpSocket { bus, network, sockets, socket })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deactivate(self) -> (InactiveUdpSocket<'a, SocketImpl>, W5500<SpiBus, NetworkImpl>) {
|
pub fn deactivate(self) -> (InactiveUdpSocket<'a, SocketImpl>, W5500<SpiBus, NetworkImpl>) {
|
||||||
|
|
|
||||||
13
src/w5500.rs
13
src/w5500.rs
|
|
@ -52,12 +52,14 @@ impl<SpiBus: ActiveBus, NetworkImpl: Network> W5500<SpiBus, NetworkImpl> {
|
||||||
|
|
||||||
pub fn open_udp_socket<'a, SocketImpl: Socket>(
|
pub fn open_udp_socket<'a, SocketImpl: Socket>(
|
||||||
self,
|
self,
|
||||||
|
port: u16,
|
||||||
socket: &'a mut SocketImpl,
|
socket: &'a mut SocketImpl,
|
||||||
) -> Result<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>, ForeignSocketError> {
|
) -> Result<UdpSocket<'a, SpiBus, NetworkImpl, SocketImpl>, OpenSocketError<SpiBus::Error>> {
|
||||||
if socket.is_owned_by(&self.sockets) {
|
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 {
|
} else {
|
||||||
Err(ForeignSocketError {})
|
Err(OpenSocketError::ForeignSocketError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -82,4 +84,9 @@ impl<Spi: FullDuplex<u8>, NetworkImpl: Network> W5500<ActiveThreeWire<Spi>, Netw
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum OpenSocketError<BusError> {
|
||||||
|
ForeignSocketError,
|
||||||
|
BusError(BusError),
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ForeignSocketError {}
|
pub struct ForeignSocketError {}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue