diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-05-31 01:01:30 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-05-31 01:01:30 +0200 |
| commit | d70994e4a8ea695f07b777fa99d7db4e5d4a7122 (patch) | |
| tree | e40d00e3f5493cce9ef65e8daa524a174f5fc407 | |
| parent | 82d765689aa0f922d0b43e402eaa3d911b2d461d (diff) | |
net-w5500: integrate into main repo.
| -rw-r--r-- | embassy-net-w5500/Cargo.toml | 12 | ||||
| -rw-r--r-- | embassy-net-w5500/src/device.rs | 33 | ||||
| -rw-r--r-- | embassy-net-w5500/src/lib.rs | 12 | ||||
| -rw-r--r-- | embassy-net-w5500/src/socket.rs | 53 | ||||
| -rw-r--r-- | embassy-net-w5500/src/spi.rs | 17 | ||||
| -rw-r--r-- | examples/rp/Cargo.toml | 4 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_multisocket.rs | 25 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_tcp_client.rs | 13 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_tcp_server.rs | 13 | ||||
| -rw-r--r-- | examples/rp/src/bin/ethernet_w5500_udp.rs | 22 |
10 files changed, 55 insertions, 149 deletions
diff --git a/embassy-net-w5500/Cargo.toml b/embassy-net-w5500/Cargo.toml index 1921e812d..3f19e3d39 100644 --- a/embassy-net-w5500/Cargo.toml +++ b/embassy-net-w5500/Cargo.toml | |||
| @@ -10,17 +10,7 @@ edition = "2021" | |||
| 10 | [dependencies] | 10 | [dependencies] |
| 11 | embedded-hal = { version = "1.0.0-alpha.10" } | 11 | embedded-hal = { version = "1.0.0-alpha.10" } |
| 12 | embedded-hal-async = { version = "=0.2.0-alpha.1" } | 12 | embedded-hal-async = { version = "=0.2.0-alpha.1" } |
| 13 | embassy-net-driver-channel = { version = "0.1.0" } | 13 | embassy-net-driver-channel = { version = "0.1.0", path = "../embassy-net-driver-channel"} |
| 14 | embassy-time = { version = "0.1.0" } | 14 | embassy-time = { version = "0.1.0" } |
| 15 | embassy-futures = { version = "0.1.0" } | 15 | embassy-futures = { version = "0.1.0" } |
| 16 | defmt = { version = "0.3", optional = true } | 16 | defmt = { version = "0.3", optional = true } |
| 17 | |||
| 18 | [patch.crates-io] | ||
| 19 | embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 20 | embassy-time = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 21 | embassy-futures = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 22 | embassy-sync = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 23 | embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 24 | embassy-net = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 25 | embassy-net-driver = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
| 26 | embassy-net-driver-channel = { git = "https://github.com/embassy-rs/embassy", rev = "e179e7cf85810f0aa7ef8027d8d48f6d21f64dac" } | ||
diff --git a/embassy-net-w5500/src/device.rs b/embassy-net-w5500/src/device.rs index 8158bc98e..9874df0d6 100644 --- a/embassy-net-w5500/src/device.rs +++ b/embassy-net-w5500/src/device.rs | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | use embedded_hal_async::spi::SpiDevice; | ||
| 2 | |||
| 1 | use crate::socket; | 3 | use crate::socket; |
| 2 | use crate::spi::SpiInterface; | 4 | use crate::spi::SpiInterface; |
| 3 | use embedded_hal_async::spi::SpiDevice; | ||
| 4 | 5 | ||
| 5 | pub const MODE: u16 = 0x00; | 6 | pub const MODE: u16 = 0x00; |
| 6 | pub const MAC: u16 = 0x09; | 7 | pub const MAC: u16 = 0x09; |
| @@ -27,12 +28,10 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 27 | pub async fn new(spi: SPI, mac_addr: [u8; 6]) -> Result<W5500<SPI>, SPI::Error> { | 28 | pub async fn new(spi: SPI, mac_addr: [u8; 6]) -> Result<W5500<SPI>, SPI::Error> { |
| 28 | let mut bus = SpiInterface(spi); | 29 | let mut bus = SpiInterface(spi); |
| 29 | // Reset device | 30 | // Reset device |
| 30 | bus.write_frame(RegisterBlock::Common, MODE, &[0x80]) | 31 | bus.write_frame(RegisterBlock::Common, MODE, &[0x80]).await?; |
| 31 | .await?; | ||
| 32 | 32 | ||
| 33 | // Enable interrupt pin | 33 | // Enable interrupt pin |
| 34 | bus.write_frame(RegisterBlock::Common, SOCKET_INTR, &[0x01]) | 34 | bus.write_frame(RegisterBlock::Common, SOCKET_INTR, &[0x01]).await?; |
| 35 | .await?; | ||
| 36 | // Enable receive interrupt | 35 | // Enable receive interrupt |
| 37 | bus.write_frame( | 36 | bus.write_frame( |
| 38 | RegisterBlock::Socket0, | 37 | RegisterBlock::Socket0, |
| @@ -42,8 +41,7 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 42 | .await?; | 41 | .await?; |
| 43 | 42 | ||
| 44 | // Set MAC address | 43 | // Set MAC address |
| 45 | bus.write_frame(RegisterBlock::Common, MAC, &mac_addr) | 44 | bus.write_frame(RegisterBlock::Common, MAC, &mac_addr).await?; |
| 46 | .await?; | ||
| 47 | 45 | ||
| 48 | // Set the raw socket RX/TX buffer sizes to 16KB | 46 | // Set the raw socket RX/TX buffer sizes to 16KB |
| 49 | bus.write_frame(RegisterBlock::Socket0, socket::TXBUF_SIZE, &[16]) | 47 | bus.write_frame(RegisterBlock::Socket0, socket::TXBUF_SIZE, &[16]) |
| @@ -53,8 +51,7 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 53 | 51 | ||
| 54 | // MACRAW mode with MAC filtering. | 52 | // MACRAW mode with MAC filtering. |
| 55 | let mode: u8 = (1 << 2) | (1 << 7); | 53 | let mode: u8 = (1 << 2) | (1 << 7); |
| 56 | bus.write_frame(RegisterBlock::Socket0, socket::MODE, &[mode]) | 54 | bus.write_frame(RegisterBlock::Socket0, socket::MODE, &[mode]).await?; |
| 57 | .await?; | ||
| 58 | socket::command(&mut bus, socket::Command::Open).await?; | 55 | socket::command(&mut bus, socket::Command::Open).await?; |
| 59 | 56 | ||
| 60 | Ok(Self { bus }) | 57 | Ok(Self { bus }) |
| @@ -70,17 +67,9 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 70 | &mut buffer[..rx_size - offset as usize] | 67 | &mut buffer[..rx_size - offset as usize] |
| 71 | }; | 68 | }; |
| 72 | 69 | ||
| 73 | let read_ptr = socket::get_rx_read_ptr(&mut self.bus) | 70 | let read_ptr = socket::get_rx_read_ptr(&mut self.bus).await?.wrapping_add(offset); |
| 74 | .await? | 71 | self.bus.read_frame(RegisterBlock::RxBuf, read_ptr, read_buffer).await?; |
| 75 | .wrapping_add(offset); | 72 | socket::set_rx_read_ptr(&mut self.bus, read_ptr.wrapping_add(read_buffer.len() as u16)).await?; |
| 76 | self.bus | ||
| 77 | .read_frame(RegisterBlock::RxBuf, read_ptr, read_buffer) | ||
| 78 | .await?; | ||
| 79 | socket::set_rx_read_ptr( | ||
| 80 | &mut self.bus, | ||
| 81 | read_ptr.wrapping_add(read_buffer.len() as u16), | ||
| 82 | ) | ||
| 83 | .await?; | ||
| 84 | 73 | ||
| 85 | Ok(read_buffer.len()) | 74 | Ok(read_buffer.len()) |
| 86 | } | 75 | } |
| @@ -125,9 +114,7 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 125 | pub async fn write_frame(&mut self, frame: &[u8]) -> Result<usize, SPI::Error> { | 114 | pub async fn write_frame(&mut self, frame: &[u8]) -> Result<usize, SPI::Error> { |
| 126 | while socket::get_tx_free_size(&mut self.bus).await? < frame.len() as u16 {} | 115 | while socket::get_tx_free_size(&mut self.bus).await? < frame.len() as u16 {} |
| 127 | let write_ptr = socket::get_tx_write_ptr(&mut self.bus).await?; | 116 | let write_ptr = socket::get_tx_write_ptr(&mut self.bus).await?; |
| 128 | self.bus | 117 | self.bus.write_frame(RegisterBlock::TxBuf, write_ptr, frame).await?; |
| 129 | .write_frame(RegisterBlock::TxBuf, write_ptr, frame) | ||
| 130 | .await?; | ||
| 131 | socket::set_tx_write_ptr(&mut self.bus, write_ptr.wrapping_add(frame.len() as u16)).await?; | 118 | socket::set_tx_write_ptr(&mut self.bus, write_ptr.wrapping_add(frame.len() as u16)).await?; |
| 132 | socket::command(&mut self.bus, socket::Command::Send).await?; | 119 | socket::command(&mut self.bus, socket::Command::Send).await?; |
| 133 | Ok(frame.len()) | 120 | Ok(frame.len()) |
diff --git a/embassy-net-w5500/src/lib.rs b/embassy-net-w5500/src/lib.rs index bf14b05b4..6821373e3 100644 --- a/embassy-net-w5500/src/lib.rs +++ b/embassy-net-w5500/src/lib.rs | |||
| @@ -4,7 +4,6 @@ mod device; | |||
| 4 | mod socket; | 4 | mod socket; |
| 5 | mod spi; | 5 | mod spi; |
| 6 | 6 | ||
| 7 | use crate::device::W5500; | ||
| 8 | use embassy_futures::select::{select, Either}; | 7 | use embassy_futures::select::{select, Either}; |
| 9 | use embassy_net_driver_channel as ch; | 8 | use embassy_net_driver_channel as ch; |
| 10 | use embassy_net_driver_channel::driver::LinkState; | 9 | use embassy_net_driver_channel::driver::LinkState; |
| @@ -12,6 +11,8 @@ use embassy_time::{Duration, Timer}; | |||
| 12 | use embedded_hal::digital::OutputPin; | 11 | use embedded_hal::digital::OutputPin; |
| 13 | use embedded_hal_async::digital::Wait; | 12 | use embedded_hal_async::digital::Wait; |
| 14 | use embedded_hal_async::spi::SpiDevice; | 13 | use embedded_hal_async::spi::SpiDevice; |
| 14 | |||
| 15 | use crate::device::W5500; | ||
| 15 | const MTU: usize = 1514; | 16 | const MTU: usize = 1514; |
| 16 | 17 | ||
| 17 | /// Type alias for the embassy-net driver for W5500 | 18 | /// Type alias for the embassy-net driver for W5500 |
| @@ -77,14 +78,7 @@ impl<'d, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, SPI, INT, RST> { | |||
| 77 | } | 78 | } |
| 78 | 79 | ||
| 79 | /// Obtain a driver for using the W5500 with [`embassy-net`](crates.io/crates/embassy-net). | 80 | /// Obtain a driver for using the W5500 with [`embassy-net`](crates.io/crates/embassy-net). |
| 80 | pub async fn new< | 81 | pub async fn new<'a, const N_RX: usize, const N_TX: usize, SPI: SpiDevice, INT: Wait, RST: OutputPin>( |
| 81 | 'a, | ||
| 82 | const N_RX: usize, | ||
| 83 | const N_TX: usize, | ||
| 84 | SPI: SpiDevice, | ||
| 85 | INT: Wait, | ||
| 86 | RST: OutputPin, | ||
| 87 | >( | ||
| 88 | mac_addr: [u8; 6], | 82 | mac_addr: [u8; 6], |
| 89 | state: &'a mut State<N_RX, N_TX>, | 83 | state: &'a mut State<N_RX, N_TX>, |
| 90 | spi_dev: SPI, | 84 | spi_dev: SPI, |
diff --git a/embassy-net-w5500/src/socket.rs b/embassy-net-w5500/src/socket.rs index 3f64d04d1..3d65583c1 100644 --- a/embassy-net-w5500/src/socket.rs +++ b/embassy-net-w5500/src/socket.rs | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | use embedded_hal_async::spi::SpiDevice; | ||
| 2 | |||
| 1 | use crate::device::RegisterBlock; | 3 | use crate::device::RegisterBlock; |
| 2 | use crate::spi::SpiInterface; | 4 | use crate::spi::SpiInterface; |
| 3 | use embedded_hal_async::spi::SpiDevice; | ||
| 4 | 5 | ||
| 5 | pub const MODE: u16 = 0x00; | 6 | pub const MODE: u16 = 0x00; |
| 6 | pub const COMMAND: u16 = 0x01; | 7 | pub const COMMAND: u16 = 0x01; |
| @@ -25,79 +26,55 @@ pub enum Interrupt { | |||
| 25 | Receive = 0b00100_u8, | 26 | Receive = 0b00100_u8, |
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | pub async fn reset_interrupt<SPI: SpiDevice>( | 29 | pub async fn reset_interrupt<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>, code: Interrupt) -> Result<(), SPI::Error> { |
| 29 | bus: &mut SpiInterface<SPI>, | ||
| 30 | code: Interrupt, | ||
| 31 | ) -> Result<(), SPI::Error> { | ||
| 32 | let data = [code as u8]; | 30 | let data = [code as u8]; |
| 33 | bus.write_frame(RegisterBlock::Socket0, INTR, &data).await | 31 | bus.write_frame(RegisterBlock::Socket0, INTR, &data).await |
| 34 | } | 32 | } |
| 35 | 33 | ||
| 36 | pub async fn get_tx_write_ptr<SPI: SpiDevice>( | 34 | pub async fn get_tx_write_ptr<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>) -> Result<u16, SPI::Error> { |
| 37 | bus: &mut SpiInterface<SPI>, | ||
| 38 | ) -> Result<u16, SPI::Error> { | ||
| 39 | let mut data = [0u8; 2]; | 35 | let mut data = [0u8; 2]; |
| 40 | bus.read_frame(RegisterBlock::Socket0, TX_DATA_WRITE_PTR, &mut data) | 36 | bus.read_frame(RegisterBlock::Socket0, TX_DATA_WRITE_PTR, &mut data) |
| 41 | .await?; | 37 | .await?; |
| 42 | Ok(u16::from_be_bytes(data)) | 38 | Ok(u16::from_be_bytes(data)) |
| 43 | } | 39 | } |
| 44 | 40 | ||
| 45 | pub async fn set_tx_write_ptr<SPI: SpiDevice>( | 41 | pub async fn set_tx_write_ptr<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>, ptr: u16) -> Result<(), SPI::Error> { |
| 46 | bus: &mut SpiInterface<SPI>, | ||
| 47 | ptr: u16, | ||
| 48 | ) -> Result<(), SPI::Error> { | ||
| 49 | let data = ptr.to_be_bytes(); | 42 | let data = ptr.to_be_bytes(); |
| 50 | bus.write_frame(RegisterBlock::Socket0, TX_DATA_WRITE_PTR, &data) | 43 | bus.write_frame(RegisterBlock::Socket0, TX_DATA_WRITE_PTR, &data).await |
| 51 | .await | ||
| 52 | } | 44 | } |
| 53 | 45 | ||
| 54 | pub async fn get_rx_read_ptr<SPI: SpiDevice>( | 46 | pub async fn get_rx_read_ptr<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>) -> Result<u16, SPI::Error> { |
| 55 | bus: &mut SpiInterface<SPI>, | ||
| 56 | ) -> Result<u16, SPI::Error> { | ||
| 57 | let mut data = [0u8; 2]; | 47 | let mut data = [0u8; 2]; |
| 58 | bus.read_frame(RegisterBlock::Socket0, RX_DATA_READ_PTR, &mut data) | 48 | bus.read_frame(RegisterBlock::Socket0, RX_DATA_READ_PTR, &mut data) |
| 59 | .await?; | 49 | .await?; |
| 60 | Ok(u16::from_be_bytes(data)) | 50 | Ok(u16::from_be_bytes(data)) |
| 61 | } | 51 | } |
| 62 | 52 | ||
| 63 | pub async fn set_rx_read_ptr<SPI: SpiDevice>( | 53 | pub async fn set_rx_read_ptr<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>, ptr: u16) -> Result<(), SPI::Error> { |
| 64 | bus: &mut SpiInterface<SPI>, | ||
| 65 | ptr: u16, | ||
| 66 | ) -> Result<(), SPI::Error> { | ||
| 67 | let data = ptr.to_be_bytes(); | 54 | let data = ptr.to_be_bytes(); |
| 68 | bus.write_frame(RegisterBlock::Socket0, RX_DATA_READ_PTR, &data) | 55 | bus.write_frame(RegisterBlock::Socket0, RX_DATA_READ_PTR, &data).await |
| 69 | .await | ||
| 70 | } | 56 | } |
| 71 | 57 | ||
| 72 | pub async fn command<SPI: SpiDevice>( | 58 | pub async fn command<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>, command: Command) -> Result<(), SPI::Error> { |
| 73 | bus: &mut SpiInterface<SPI>, | ||
| 74 | command: Command, | ||
| 75 | ) -> Result<(), SPI::Error> { | ||
| 76 | let data = [command as u8]; | 59 | let data = [command as u8]; |
| 77 | bus.write_frame(RegisterBlock::Socket0, COMMAND, &data) | 60 | bus.write_frame(RegisterBlock::Socket0, COMMAND, &data).await |
| 78 | .await | ||
| 79 | } | 61 | } |
| 80 | 62 | ||
| 81 | pub async fn get_rx_size<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>) -> Result<u16, SPI::Error> { | 63 | pub async fn get_rx_size<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>) -> Result<u16, SPI::Error> { |
| 82 | loop { | 64 | loop { |
| 83 | // Wait until two sequential reads are equal | 65 | // Wait until two sequential reads are equal |
| 84 | let mut res0 = [0u8; 2]; | 66 | let mut res0 = [0u8; 2]; |
| 85 | bus.read_frame(RegisterBlock::Socket0, RECVD_SIZE, &mut res0) | 67 | bus.read_frame(RegisterBlock::Socket0, RECVD_SIZE, &mut res0).await?; |
| 86 | .await?; | ||
| 87 | let mut res1 = [0u8; 2]; | 68 | let mut res1 = [0u8; 2]; |
| 88 | bus.read_frame(RegisterBlock::Socket0, RECVD_SIZE, &mut res1) | 69 | bus.read_frame(RegisterBlock::Socket0, RECVD_SIZE, &mut res1).await?; |
| 89 | .await?; | ||
| 90 | if res0 == res1 { | 70 | if res0 == res1 { |
| 91 | break Ok(u16::from_be_bytes(res0)); | 71 | break Ok(u16::from_be_bytes(res0)); |
| 92 | } | 72 | } |
| 93 | } | 73 | } |
| 94 | } | 74 | } |
| 95 | 75 | ||
| 96 | pub async fn get_tx_free_size<SPI: SpiDevice>( | 76 | pub async fn get_tx_free_size<SPI: SpiDevice>(bus: &mut SpiInterface<SPI>) -> Result<u16, SPI::Error> { |
| 97 | bus: &mut SpiInterface<SPI>, | ||
| 98 | ) -> Result<u16, SPI::Error> { | ||
| 99 | let mut data = [0; 2]; | 77 | let mut data = [0; 2]; |
| 100 | bus.read_frame(RegisterBlock::Socket0, TX_FREE_SIZE, &mut data) | 78 | bus.read_frame(RegisterBlock::Socket0, TX_FREE_SIZE, &mut data).await?; |
| 101 | .await?; | ||
| 102 | Ok(u16::from_be_bytes(data)) | 79 | Ok(u16::from_be_bytes(data)) |
| 103 | } | 80 | } |
diff --git a/embassy-net-w5500/src/spi.rs b/embassy-net-w5500/src/spi.rs index 55d311888..6cd52c44d 100644 --- a/embassy-net-w5500/src/spi.rs +++ b/embassy-net-w5500/src/spi.rs | |||
| @@ -1,17 +1,13 @@ | |||
| 1 | use crate::device::RegisterBlock; | ||
| 2 | use embedded_hal_async::spi::{Operation, SpiDevice}; | 1 | use embedded_hal_async::spi::{Operation, SpiDevice}; |
| 3 | 2 | ||
| 3 | use crate::device::RegisterBlock; | ||
| 4 | |||
| 4 | #[derive(Debug)] | 5 | #[derive(Debug)] |
| 5 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 6 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 6 | pub struct SpiInterface<SPI>(pub SPI); | 7 | pub struct SpiInterface<SPI>(pub SPI); |
| 7 | 8 | ||
| 8 | impl<SPI: SpiDevice> SpiInterface<SPI> { | 9 | impl<SPI: SpiDevice> SpiInterface<SPI> { |
| 9 | pub async fn read_frame( | 10 | pub async fn read_frame(&mut self, block: RegisterBlock, address: u16, data: &mut [u8]) -> Result<(), SPI::Error> { |
| 10 | &mut self, | ||
| 11 | block: RegisterBlock, | ||
| 12 | address: u16, | ||
| 13 | data: &mut [u8], | ||
| 14 | ) -> Result<(), SPI::Error> { | ||
| 15 | let address_phase = address.to_be_bytes(); | 11 | let address_phase = address.to_be_bytes(); |
| 16 | let control_phase = [(block as u8) << 3]; | 12 | let control_phase = [(block as u8) << 3]; |
| 17 | let operations = &mut [ | 13 | let operations = &mut [ |
| @@ -22,12 +18,7 @@ impl<SPI: SpiDevice> SpiInterface<SPI> { | |||
| 22 | self.0.transaction(operations).await | 18 | self.0.transaction(operations).await |
| 23 | } | 19 | } |
| 24 | 20 | ||
| 25 | pub async fn write_frame( | 21 | pub async fn write_frame(&mut self, block: RegisterBlock, address: u16, data: &[u8]) -> Result<(), SPI::Error> { |
| 26 | &mut self, | ||
| 27 | block: RegisterBlock, | ||
| 28 | address: u16, | ||
| 29 | data: &[u8], | ||
| 30 | ) -> Result<(), SPI::Error> { | ||
| 31 | let address_phase = address.to_be_bytes(); | 22 | let address_phase = address.to_be_bytes(); |
| 32 | let control_phase = [(block as u8) << 3 | 0b0000_0100]; | 23 | let control_phase = [(block as u8) << 3 | 0b0000_0100]; |
| 33 | let data_phase = data; | 24 | let data_phase = data; |
diff --git a/examples/rp/Cargo.toml b/examples/rp/Cargo.toml index f77377a6f..58b701915 100644 --- a/examples/rp/Cargo.toml +++ b/examples/rp/Cargo.toml | |||
| @@ -12,7 +12,8 @@ embassy-executor = { version = "0.2.0", path = "../../embassy-executor", feature | |||
| 12 | embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["nightly", "unstable-traits", "defmt", "defmt-timestamp-uptime"] } | 12 | embassy-time = { version = "0.1.0", path = "../../embassy-time", features = ["nightly", "unstable-traits", "defmt", "defmt-timestamp-uptime"] } |
| 13 | embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = ["defmt", "unstable-traits", "nightly", "unstable-pac", "time-driver", "critical-section-impl"] } | 13 | embassy-rp = { version = "0.1.0", path = "../../embassy-rp", features = ["defmt", "unstable-traits", "nightly", "unstable-pac", "time-driver", "critical-section-impl"] } |
| 14 | embassy-usb = { version = "0.1.0", path = "../../embassy-usb", features = ["defmt"] } | 14 | embassy-usb = { version = "0.1.0", path = "../../embassy-usb", features = ["defmt"] } |
| 15 | embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "nightly", "tcp", "dhcpv4", "medium-ethernet"] } | 15 | embassy-net = { version = "0.1.0", path = "../../embassy-net", features = ["defmt", "nightly", "tcp", "udp", "dhcpv4", "medium-ethernet"] } |
| 16 | embassy-net-w5500 = { version = "0.1.0", path = "../../embassy-net-w5500", features = ["defmt"] } | ||
| 16 | embassy-futures = { version = "0.1.0", path = "../../embassy-futures" } | 17 | embassy-futures = { version = "0.1.0", path = "../../embassy-futures" } |
| 17 | embassy-usb-logger = { version = "0.1.0", path = "../../embassy-usb-logger" } | 18 | embassy-usb-logger = { version = "0.1.0", path = "../../embassy-usb-logger" } |
| 18 | embassy-lora = { version = "0.1.0", path = "../../embassy-lora", features = ["time", "defmt"] } | 19 | embassy-lora = { version = "0.1.0", path = "../../embassy-lora", features = ["time", "defmt"] } |
| @@ -48,6 +49,7 @@ static_cell = "1.0.0" | |||
| 48 | log = "0.4" | 49 | log = "0.4" |
| 49 | pio-proc = "0.2" | 50 | pio-proc = "0.2" |
| 50 | pio = "0.2.1" | 51 | pio = "0.2.1" |
| 52 | rand = { version = "0.8.5", default-features = false } | ||
| 51 | 53 | ||
| 52 | [profile.release] | 54 | [profile.release] |
| 53 | debug = true | 55 | debug = true |
diff --git a/examples/rp/src/bin/ethernet_w5500_multisocket.rs b/examples/rp/src/bin/ethernet_w5500_multisocket.rs index eb3b8de81..c8e6d46a6 100644 --- a/examples/rp/src/bin/ethernet_w5500_multisocket.rs +++ b/examples/rp/src/bin/ethernet_w5500_multisocket.rs | |||
| @@ -15,6 +15,7 @@ use embassy_rp::clocks::RoscRng; | |||
| 15 | use embassy_rp::gpio::{Input, Level, Output, Pull}; | 15 | use embassy_rp::gpio::{Input, Level, Output, Pull}; |
| 16 | use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0}; | 16 | use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0}; |
| 17 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; | 17 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; |
| 18 | use embassy_time::Duration; | ||
| 18 | use embedded_hal_async::spi::ExclusiveDevice; | 19 | use embedded_hal_async::spi::ExclusiveDevice; |
| 19 | use embedded_io::asynch::Write; | 20 | use embedded_io::asynch::Write; |
| 20 | use rand::RngCore; | 21 | use rand::RngCore; |
| @@ -62,14 +63,8 @@ async fn main(spawner: Spawner) { | |||
| 62 | 63 | ||
| 63 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 64 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 64 | let state = singleton!(State::<8, 8>::new()); | 65 | let state = singleton!(State::<8, 8>::new()); |
| 65 | let (device, runner) = embassy_net_w5500::new( | 66 | let (device, runner) = |
| 66 | mac_addr, | 67 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 67 | state, | ||
| 68 | ExclusiveDevice::new(spi, cs), | ||
| 69 | w5500_int, | ||
| 70 | w5500_reset, | ||
| 71 | ) | ||
| 72 | .await; | ||
| 73 | unwrap!(spawner.spawn(ethernet_task(runner))); | 68 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| 74 | 69 | ||
| 75 | // Generate random seed | 70 | // Generate random seed |
| @@ -103,18 +98,14 @@ async fn listen_task(stack: &'static Stack<Device<'static>>, id: u8, port: u16) | |||
| 103 | let mut buf = [0; 4096]; | 98 | let mut buf = [0; 4096]; |
| 104 | loop { | 99 | loop { |
| 105 | let mut socket = embassy_net::tcp::TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); | 100 | let mut socket = embassy_net::tcp::TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); |
| 106 | socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10))); | 101 | socket.set_timeout(Some(Duration::from_secs(10))); |
| 107 | 102 | ||
| 108 | info!("SOCKET {}: Listening on TCP:{}...", id, port); | 103 | info!("SOCKET {}: Listening on TCP:{}...", id, port); |
| 109 | if let Err(e) = socket.accept(port).await { | 104 | if let Err(e) = socket.accept(port).await { |
| 110 | warn!("accept error: {:?}", e); | 105 | warn!("accept error: {:?}", e); |
| 111 | continue; | 106 | continue; |
| 112 | } | 107 | } |
| 113 | info!( | 108 | info!("SOCKET {}: Received connection from {:?}", id, socket.remote_endpoint()); |
| 114 | "SOCKET {}: Received connection from {:?}", | ||
| 115 | id, | ||
| 116 | socket.remote_endpoint() | ||
| 117 | ); | ||
| 118 | 109 | ||
| 119 | loop { | 110 | loop { |
| 120 | let n = match socket.read(&mut buf).await { | 111 | let n = match socket.read(&mut buf).await { |
| @@ -128,11 +119,7 @@ async fn listen_task(stack: &'static Stack<Device<'static>>, id: u8, port: u16) | |||
| 128 | break; | 119 | break; |
| 129 | } | 120 | } |
| 130 | }; | 121 | }; |
| 131 | info!( | 122 | info!("SOCKET {}: rxd {}", id, core::str::from_utf8(&buf[..n]).unwrap()); |
| 132 | "SOCKET {}: rxd {}", | ||
| 133 | id, | ||
| 134 | core::str::from_utf8(&buf[..n]).unwrap() | ||
| 135 | ); | ||
| 136 | 123 | ||
| 137 | if let Err(e) = socket.write_all(&buf[..n]).await { | 124 | if let Err(e) = socket.write_all(&buf[..n]).await { |
| 138 | warn!("write error: {:?}", e); | 125 | warn!("write error: {:?}", e); |
diff --git a/examples/rp/src/bin/ethernet_w5500_tcp_client.rs b/examples/rp/src/bin/ethernet_w5500_tcp_client.rs index e166e0f35..9a7c3ad19 100644 --- a/examples/rp/src/bin/ethernet_w5500_tcp_client.rs +++ b/examples/rp/src/bin/ethernet_w5500_tcp_client.rs | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #![feature(type_alias_impl_trait)] | 7 | #![feature(type_alias_impl_trait)] |
| 8 | 8 | ||
| 9 | use core::str::FromStr; | 9 | use core::str::FromStr; |
| 10 | |||
| 10 | use defmt::*; | 11 | use defmt::*; |
| 11 | use embassy_executor::Spawner; | 12 | use embassy_executor::Spawner; |
| 12 | use embassy_futures::yield_now; | 13 | use embassy_futures::yield_now; |
| @@ -65,14 +66,8 @@ async fn main(spawner: Spawner) { | |||
| 65 | 66 | ||
| 66 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 67 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 67 | let state = singleton!(State::<8, 8>::new()); | 68 | let state = singleton!(State::<8, 8>::new()); |
| 68 | let (device, runner) = embassy_net_w5500::new( | 69 | let (device, runner) = |
| 69 | mac_addr, | 70 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 70 | state, | ||
| 71 | ExclusiveDevice::new(spi, cs), | ||
| 72 | w5500_int, | ||
| 73 | w5500_reset, | ||
| 74 | ) | ||
| 75 | .await; | ||
| 76 | unwrap!(spawner.spawn(ethernet_task(runner))); | 71 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| 77 | 72 | ||
| 78 | // Generate random seed | 73 | // Generate random seed |
| @@ -98,7 +93,7 @@ async fn main(spawner: Spawner) { | |||
| 98 | let mut tx_buffer = [0; 4096]; | 93 | let mut tx_buffer = [0; 4096]; |
| 99 | loop { | 94 | loop { |
| 100 | let mut socket = embassy_net::tcp::TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); | 95 | let mut socket = embassy_net::tcp::TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); |
| 101 | socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10))); | 96 | socket.set_timeout(Some(Duration::from_secs(10))); |
| 102 | 97 | ||
| 103 | led.set_low(); | 98 | led.set_low(); |
| 104 | info!("Connecting..."); | 99 | info!("Connecting..."); |
diff --git a/examples/rp/src/bin/ethernet_w5500_tcp_server.rs b/examples/rp/src/bin/ethernet_w5500_tcp_server.rs index ffd664d15..f02543246 100644 --- a/examples/rp/src/bin/ethernet_w5500_tcp_server.rs +++ b/examples/rp/src/bin/ethernet_w5500_tcp_server.rs | |||
| @@ -16,6 +16,7 @@ use embassy_rp::clocks::RoscRng; | |||
| 16 | use embassy_rp::gpio::{Input, Level, Output, Pull}; | 16 | use embassy_rp::gpio::{Input, Level, Output, Pull}; |
| 17 | use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0}; | 17 | use embassy_rp::peripherals::{PIN_17, PIN_20, PIN_21, SPI0}; |
| 18 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; | 18 | use embassy_rp::spi::{Async, Config as SpiConfig, Spi}; |
| 19 | use embassy_time::Duration; | ||
| 19 | use embedded_hal_async::spi::ExclusiveDevice; | 20 | use embedded_hal_async::spi::ExclusiveDevice; |
| 20 | use embedded_io::asynch::Write; | 21 | use embedded_io::asynch::Write; |
| 21 | use rand::RngCore; | 22 | use rand::RngCore; |
| @@ -64,14 +65,8 @@ async fn main(spawner: Spawner) { | |||
| 64 | 65 | ||
| 65 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 66 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 66 | let state = singleton!(State::<8, 8>::new()); | 67 | let state = singleton!(State::<8, 8>::new()); |
| 67 | let (device, runner) = embassy_net_w5500::new( | 68 | let (device, runner) = |
| 68 | mac_addr, | 69 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 69 | state, | ||
| 70 | ExclusiveDevice::new(spi, cs), | ||
| 71 | w5500_int, | ||
| 72 | w5500_reset, | ||
| 73 | ) | ||
| 74 | .await; | ||
| 75 | unwrap!(spawner.spawn(ethernet_task(runner))); | 70 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| 76 | 71 | ||
| 77 | // Generate random seed | 72 | // Generate random seed |
| @@ -98,7 +93,7 @@ async fn main(spawner: Spawner) { | |||
| 98 | let mut buf = [0; 4096]; | 93 | let mut buf = [0; 4096]; |
| 99 | loop { | 94 | loop { |
| 100 | let mut socket = embassy_net::tcp::TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); | 95 | let mut socket = embassy_net::tcp::TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); |
| 101 | socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10))); | 96 | socket.set_timeout(Some(Duration::from_secs(10))); |
| 102 | 97 | ||
| 103 | led.set_low(); | 98 | led.set_low(); |
| 104 | info!("Listening on TCP:1234..."); | 99 | info!("Listening on TCP:1234..."); |
diff --git a/examples/rp/src/bin/ethernet_w5500_udp.rs b/examples/rp/src/bin/ethernet_w5500_udp.rs index 08ffeb244..2c54f711e 100644 --- a/examples/rp/src/bin/ethernet_w5500_udp.rs +++ b/examples/rp/src/bin/ethernet_w5500_udp.rs | |||
| @@ -9,8 +9,8 @@ | |||
| 9 | use defmt::*; | 9 | use defmt::*; |
| 10 | use embassy_executor::Spawner; | 10 | use embassy_executor::Spawner; |
| 11 | use embassy_futures::yield_now; | 11 | use embassy_futures::yield_now; |
| 12 | use embassy_net::udp::UdpSocket; | 12 | use embassy_net::udp::{PacketMetadata, UdpSocket}; |
| 13 | use embassy_net::{PacketMetadata, Stack, StackResources}; | 13 | use embassy_net::{Stack, StackResources}; |
| 14 | use embassy_net_w5500::*; | 14 | use embassy_net_w5500::*; |
| 15 | use embassy_rp::clocks::RoscRng; | 15 | use embassy_rp::clocks::RoscRng; |
| 16 | use embassy_rp::gpio::{Input, Level, Output, Pull}; | 16 | use embassy_rp::gpio::{Input, Level, Output, Pull}; |
| @@ -62,14 +62,8 @@ async fn main(spawner: Spawner) { | |||
| 62 | 62 | ||
| 63 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; | 63 | let mac_addr = [0x02, 0x00, 0x00, 0x00, 0x00, 0x00]; |
| 64 | let state = singleton!(State::<8, 8>::new()); | 64 | let state = singleton!(State::<8, 8>::new()); |
| 65 | let (device, runner) = embassy_net_w5500::new( | 65 | let (device, runner) = |
| 66 | mac_addr, | 66 | embassy_net_w5500::new(mac_addr, state, ExclusiveDevice::new(spi, cs), w5500_int, w5500_reset).await; |
| 67 | state, | ||
| 68 | ExclusiveDevice::new(spi, cs), | ||
| 69 | w5500_int, | ||
| 70 | w5500_reset, | ||
| 71 | ) | ||
| 72 | .await; | ||
| 73 | unwrap!(spawner.spawn(ethernet_task(runner))); | 67 | unwrap!(spawner.spawn(ethernet_task(runner))); |
| 74 | 68 | ||
| 75 | // Generate random seed | 69 | // Generate random seed |
| @@ -98,13 +92,7 @@ async fn main(spawner: Spawner) { | |||
| 98 | let mut tx_meta = [PacketMetadata::EMPTY; 16]; | 92 | let mut tx_meta = [PacketMetadata::EMPTY; 16]; |
| 99 | let mut buf = [0; 4096]; | 93 | let mut buf = [0; 4096]; |
| 100 | loop { | 94 | loop { |
| 101 | let mut socket = UdpSocket::new( | 95 | let mut socket = UdpSocket::new(stack, &mut rx_meta, &mut rx_buffer, &mut tx_meta, &mut tx_buffer); |
| 102 | stack, | ||
| 103 | &mut rx_meta, | ||
| 104 | &mut rx_buffer, | ||
| 105 | &mut tx_meta, | ||
| 106 | &mut tx_buffer, | ||
| 107 | ); | ||
| 108 | socket.bind(1234).unwrap(); | 96 | socket.bind(1234).unwrap(); |
| 109 | 97 | ||
| 110 | loop { | 98 | loop { |
