aboutsummaryrefslogtreecommitdiff
path: root/embassy-net-wiznet/src
diff options
context:
space:
mode:
authorChris Dell <[email protected]>2025-09-08 22:15:16 +0100
committerChris Dell <[email protected]>2025-09-08 22:15:16 +0100
commitb9023296f66ae8663485c37e8139c9832aae4849 (patch)
tree4635c52c726b04a04273d0a33536c19feac3ab38 /embassy-net-wiznet/src
parenta6cd24907aa43a8178a16b0db3d6b376f67f7540 (diff)
Add Wiznet W6100 driver
Diffstat (limited to 'embassy-net-wiznet/src')
-rw-r--r--embassy-net-wiznet/src/chip/mod.rs3
-rw-r--r--embassy-net-wiznet/src/chip/w5100s.rs1
-rw-r--r--embassy-net-wiznet/src/chip/w5500.rs1
-rw-r--r--embassy-net-wiznet/src/chip/w6100.rs83
-rw-r--r--embassy-net-wiznet/src/device.rs2
5 files changed, 89 insertions, 1 deletions
diff --git a/embassy-net-wiznet/src/chip/mod.rs b/embassy-net-wiznet/src/chip/mod.rs
index 2e7a9ed6c..6e6e5cb78 100644
--- a/embassy-net-wiznet/src/chip/mod.rs
+++ b/embassy-net-wiznet/src/chip/mod.rs
@@ -4,6 +4,8 @@ pub use w5500::W5500;
4mod w5100s; 4mod w5100s;
5use embedded_hal_async::spi::SpiDevice; 5use embedded_hal_async::spi::SpiDevice;
6pub use w5100s::W5100S; 6pub use w5100s::W5100S;
7mod w6100;
8pub use w6100::W6100;
7 9
8pub(crate) trait SealedChip { 10pub(crate) trait SealedChip {
9 type Address; 11 type Address;
@@ -29,6 +31,7 @@ pub(crate) trait SealedChip {
29 const SOCKET_RX_DATA_READ_PTR: Self::Address; 31 const SOCKET_RX_DATA_READ_PTR: Self::Address;
30 const SOCKET_INTR_MASK: Self::Address; 32 const SOCKET_INTR_MASK: Self::Address;
31 const SOCKET_INTR: Self::Address; 33 const SOCKET_INTR: Self::Address;
34 const SOCKET_INTR_CLR: Self::Address;
32 35
33 const SOCKET_MODE_VALUE: u8; 36 const SOCKET_MODE_VALUE: u8;
34 37
diff --git a/embassy-net-wiznet/src/chip/w5100s.rs b/embassy-net-wiznet/src/chip/w5100s.rs
index 4c4b7ab16..1eef2369e 100644
--- a/embassy-net-wiznet/src/chip/w5100s.rs
+++ b/embassy-net-wiznet/src/chip/w5100s.rs
@@ -29,6 +29,7 @@ impl super::SealedChip for W5100S {
29 const SOCKET_RX_DATA_READ_PTR: Self::Address = SOCKET_BASE + 0x28; 29 const SOCKET_RX_DATA_READ_PTR: Self::Address = SOCKET_BASE + 0x28;
30 const SOCKET_INTR_MASK: Self::Address = SOCKET_BASE + 0x2C; 30 const SOCKET_INTR_MASK: Self::Address = SOCKET_BASE + 0x2C;
31 const SOCKET_INTR: Self::Address = SOCKET_BASE + 0x02; 31 const SOCKET_INTR: Self::Address = SOCKET_BASE + 0x02;
32 const SOCKET_INTR_CLR: Self::Address = SOCKET_BASE + 0x02;
32 33
33 const SOCKET_MODE_VALUE: u8 = (1 << 2) | (1 << 6); 34 const SOCKET_MODE_VALUE: u8 = (1 << 2) | (1 << 6);
34 35
diff --git a/embassy-net-wiznet/src/chip/w5500.rs b/embassy-net-wiznet/src/chip/w5500.rs
index 5cfcb94e4..198ba3226 100644
--- a/embassy-net-wiznet/src/chip/w5500.rs
+++ b/embassy-net-wiznet/src/chip/w5500.rs
@@ -33,6 +33,7 @@ impl super::SealedChip for W5500 {
33 const SOCKET_RX_DATA_READ_PTR: Self::Address = (RegisterBlock::Socket0, 0x28); 33 const SOCKET_RX_DATA_READ_PTR: Self::Address = (RegisterBlock::Socket0, 0x28);
34 const SOCKET_INTR_MASK: Self::Address = (RegisterBlock::Socket0, 0x2C); 34 const SOCKET_INTR_MASK: Self::Address = (RegisterBlock::Socket0, 0x2C);
35 const SOCKET_INTR: Self::Address = (RegisterBlock::Socket0, 0x02); 35 const SOCKET_INTR: Self::Address = (RegisterBlock::Socket0, 0x02);
36 const SOCKET_INTR_CLR: Self::Address = (RegisterBlock::Socket0, 0x02);
36 37
37 const SOCKET_MODE_VALUE: u8 = (1 << 2) | (1 << 7); 38 const SOCKET_MODE_VALUE: u8 = (1 << 2) | (1 << 7);
38 39
diff --git a/embassy-net-wiznet/src/chip/w6100.rs b/embassy-net-wiznet/src/chip/w6100.rs
new file mode 100644
index 000000000..740b0edaf
--- /dev/null
+++ b/embassy-net-wiznet/src/chip/w6100.rs
@@ -0,0 +1,83 @@
1use embedded_hal_async::spi::{Operation, SpiDevice};
2
3#[repr(u8)]
4pub enum RegisterBlock {
5 Common = 0x00,
6 Socket0 = 0x01,
7 TxBuf = 0x02,
8 RxBuf = 0x03,
9}
10
11/// Wiznet W6100 chip.
12pub enum W6100 {}
13
14impl super::Chip for W6100 {}
15impl super::SealedChip for W6100 {
16 type Address = (RegisterBlock, u16);
17
18 const CHIP_VERSION: u8 = 0x46;
19
20 const COMMON_MODE: Self::Address = (RegisterBlock::Common, 0x2004);
21 const COMMON_MAC: Self::Address = (RegisterBlock::Common, 0x4120);
22 // SIMR (SOCKET Interrupt Mask Register)
23 const COMMON_SOCKET_INTR: Self::Address = (RegisterBlock::Common, 0x2114);
24 const COMMON_PHY_CFG: Self::Address = (RegisterBlock::Common, 0x3000);
25 const COMMON_VERSION: Self::Address = (RegisterBlock::Common, 0x0002);
26
27 const SOCKET_MODE: Self::Address = (RegisterBlock::Socket0, 0x0000);
28 const SOCKET_COMMAND: Self::Address = (RegisterBlock::Socket0, 0x0010);
29 const SOCKET_RXBUF_SIZE: Self::Address = (RegisterBlock::Socket0, 0x0220);
30 const SOCKET_TXBUF_SIZE: Self::Address = (RegisterBlock::Socket0, 0x0200);
31 const SOCKET_TX_FREE_SIZE: Self::Address = (RegisterBlock::Socket0, 0x0204);
32 const SOCKET_TX_DATA_WRITE_PTR: Self::Address = (RegisterBlock::Socket0, 0x020C);
33 const SOCKET_RECVD_SIZE: Self::Address = (RegisterBlock::Socket0, 0x0224);
34 const SOCKET_RX_DATA_READ_PTR: Self::Address = (RegisterBlock::Socket0, 0x0228);
35 // Sn_IMR (SOCKET n Interrupt Mask Register)
36 const SOCKET_INTR_MASK: Self::Address = (RegisterBlock::Socket0, 0x0024);
37 // Sn_IR (SOCKET n Interrupt Register)
38 const SOCKET_INTR: Self::Address = (RegisterBlock::Socket0, 0x0020);
39 // Sn_IRCLR (Sn_IR Clear Register)
40 const SOCKET_INTR_CLR: Self::Address = (RegisterBlock::Socket0, 0x0028);
41
42 // MACRAW mode. See Page 57 of https://docs.wiznet.io/img/products/w6100/w6100_ds_v105e.pdf
43 // Note: Bit 7 is MAC filter. On the W5500 this is normally turned ON however the W6100 will not successfully retrieve an IP address with this enabled. Disabling for now and will have live with the extra noise.
44 const SOCKET_MODE_VALUE: u8 = 0b0000_0111;
45
46 const BUF_SIZE: u16 = 0x1000;
47 const AUTO_WRAP: bool = true;
48
49 fn rx_addr(addr: u16) -> Self::Address {
50 (RegisterBlock::RxBuf, addr)
51 }
52
53 fn tx_addr(addr: u16) -> Self::Address {
54 (RegisterBlock::TxBuf, addr)
55 }
56
57 async fn bus_read<SPI: SpiDevice>(
58 spi: &mut SPI,
59 address: Self::Address,
60 data: &mut [u8],
61 ) -> Result<(), SPI::Error> {
62 let address_phase = address.1.to_be_bytes();
63 let control_phase = [(address.0 as u8) << 3];
64 let operations = &mut [
65 Operation::Write(&address_phase),
66 Operation::Write(&control_phase),
67 Operation::TransferInPlace(data),
68 ];
69 spi.transaction(operations).await
70 }
71
72 async fn bus_write<SPI: SpiDevice>(spi: &mut SPI, address: Self::Address, data: &[u8]) -> Result<(), SPI::Error> {
73 let address_phase = address.1.to_be_bytes();
74 let control_phase = [(address.0 as u8) << 3 | 0b0000_0100];
75 let data_phase = data;
76 let operations = &mut [
77 Operation::Write(&address_phase[..]),
78 Operation::Write(&control_phase),
79 Operation::Write(&data_phase),
80 ];
81 spi.transaction(operations).await
82 }
83}
diff --git a/embassy-net-wiznet/src/device.rs b/embassy-net-wiznet/src/device.rs
index d2b6bb0c3..8ef92b022 100644
--- a/embassy-net-wiznet/src/device.rs
+++ b/embassy-net-wiznet/src/device.rs
@@ -125,7 +125,7 @@ impl<C: Chip, SPI: SpiDevice> WiznetDevice<C, SPI> {
125 125
126 async fn reset_interrupt(&mut self, code: Interrupt) -> Result<(), SPI::Error> { 126 async fn reset_interrupt(&mut self, code: Interrupt) -> Result<(), SPI::Error> {
127 let data = [code as u8]; 127 let data = [code as u8];
128 self.bus_write(C::SOCKET_INTR, &data).await 128 self.bus_write(C::SOCKET_INTR_CLR, &data).await
129 } 129 }
130 130
131 async fn get_tx_write_ptr(&mut self) -> Result<u16, SPI::Error> { 131 async fn get_tx_write_ptr(&mut self) -> Result<u16, SPI::Error> {