diff options
| -rw-r--r-- | embassy-net-adin1110/src/lib.rs | 11 | ||||
| -rw-r--r-- | embassy-net-adin1110/src/mdio.rs | 175 | ||||
| -rw-r--r-- | embassy-net-adin1110/src/phy.rs | 1 |
3 files changed, 98 insertions, 89 deletions
diff --git a/embassy-net-adin1110/src/lib.rs b/embassy-net-adin1110/src/lib.rs index e0af7bde9..53f361284 100644 --- a/embassy-net-adin1110/src/lib.rs +++ b/embassy-net-adin1110/src/lib.rs | |||
| @@ -32,6 +32,7 @@ pub use regs::{Config0, Config2, SpiRegisters as sr, Status0, Status1}; | |||
| 32 | use crate::fmt::Bytes; | 32 | use crate::fmt::Bytes; |
| 33 | use crate::regs::{LedCntrl, LedFunc, LedPol, LedPolarity, SpiHeader}; | 33 | use crate::regs::{LedCntrl, LedFunc, LedPol, LedPolarity, SpiHeader}; |
| 34 | 34 | ||
| 35 | /// ADIN1110 intern PHY ID | ||
| 35 | pub const PHYID: u32 = 0x0283_BC91; | 36 | pub const PHYID: u32 = 0x0283_BC91; |
| 36 | 37 | ||
| 37 | /// Error values ADIN1110 | 38 | /// Error values ADIN1110 |
| @@ -53,7 +54,9 @@ pub enum AdinError<E> { | |||
| 53 | MDIO_ACC_TIMEOUT, | 54 | MDIO_ACC_TIMEOUT, |
| 54 | } | 55 | } |
| 55 | 56 | ||
| 57 | /// Type alias `Result` type with `AdinError` as error type. | ||
| 56 | pub type AEResult<T, SPIError> = core::result::Result<T, AdinError<SPIError>>; | 58 | pub type AEResult<T, SPIError> = core::result::Result<T, AdinError<SPIError>>; |
| 59 | |||
| 57 | /// Internet PHY address | 60 | /// Internet PHY address |
| 58 | pub const MDIO_PHY_ADDR: u8 = 0x01; | 61 | pub const MDIO_PHY_ADDR: u8 = 0x01; |
| 59 | 62 | ||
| @@ -104,6 +107,7 @@ impl<const N_RX: usize, const N_TX: usize> State<N_RX, N_TX> { | |||
| 104 | } | 107 | } |
| 105 | } | 108 | } |
| 106 | 109 | ||
| 110 | /// ADIN1110 embassy-net driver | ||
| 107 | #[derive(Debug)] | 111 | #[derive(Debug)] |
| 108 | pub struct ADIN1110<SPI> { | 112 | pub struct ADIN1110<SPI> { |
| 109 | /// SPI bus | 113 | /// SPI bus |
| @@ -116,6 +120,7 @@ pub struct ADIN1110<SPI> { | |||
| 116 | } | 120 | } |
| 117 | 121 | ||
| 118 | impl<SPI: SpiDevice> ADIN1110<SPI> { | 122 | impl<SPI: SpiDevice> ADIN1110<SPI> { |
| 123 | /// Create a new ADIN1110 instance. | ||
| 119 | pub fn new(spi: SPI, spi_crc: bool, append_fcs_on_tx: bool) -> Self { | 124 | pub fn new(spi: SPI, spi_crc: bool, append_fcs_on_tx: bool) -> Self { |
| 120 | Self { | 125 | Self { |
| 121 | spi, | 126 | spi, |
| @@ -124,6 +129,7 @@ impl<SPI: SpiDevice> ADIN1110<SPI> { | |||
| 124 | } | 129 | } |
| 125 | } | 130 | } |
| 126 | 131 | ||
| 132 | /// Read a SPI register | ||
| 127 | pub async fn read_reg(&mut self, reg: sr) -> AEResult<u32, SPI::Error> { | 133 | pub async fn read_reg(&mut self, reg: sr) -> AEResult<u32, SPI::Error> { |
| 128 | let mut tx_buf = Vec::<u8, 16>::new(); | 134 | let mut tx_buf = Vec::<u8, 16>::new(); |
| 129 | 135 | ||
| @@ -162,6 +168,7 @@ impl<SPI: SpiDevice> ADIN1110<SPI> { | |||
| 162 | Ok(value) | 168 | Ok(value) |
| 163 | } | 169 | } |
| 164 | 170 | ||
| 171 | /// Write a SPI register | ||
| 165 | pub async fn write_reg(&mut self, reg: sr, value: u32) -> AEResult<(), SPI::Error> { | 172 | pub async fn write_reg(&mut self, reg: sr, value: u32) -> AEResult<(), SPI::Error> { |
| 166 | let mut tx_buf = Vec::<u8, 16>::new(); | 173 | let mut tx_buf = Vec::<u8, 16>::new(); |
| 167 | 174 | ||
| @@ -427,9 +434,9 @@ impl<SPI: SpiDevice> mdio::MdioBus for ADIN1110<SPI> { | |||
| 427 | } | 434 | } |
| 428 | } | 435 | } |
| 429 | 436 | ||
| 430 | /// Background runner for the ADIN110. | 437 | /// Background runner for the ADIN1110. |
| 431 | /// | 438 | /// |
| 432 | /// You must call `.run()` in a background task for the ADIN1100 to operate. | 439 | /// You must call `.run()` in a background task for the ADIN1110 to operate. |
| 433 | pub struct Runner<'d, SPI, INT, RST> { | 440 | pub struct Runner<'d, SPI, INT, RST> { |
| 434 | mac: ADIN1110<SPI>, | 441 | mac: ADIN1110<SPI>, |
| 435 | ch: ch::Runner<'d, MTU>, | 442 | ch: ch::Runner<'d, MTU>, |
diff --git a/embassy-net-adin1110/src/mdio.rs b/embassy-net-adin1110/src/mdio.rs index 68477006a..1ae5f0043 100644 --- a/embassy-net-adin1110/src/mdio.rs +++ b/embassy-net-adin1110/src/mdio.rs | |||
| @@ -32,11 +32,12 @@ enum Reg13Op { | |||
| 32 | PostReadIncAddr = 0b10 << 14, | 32 | PostReadIncAddr = 0b10 << 14, |
| 33 | Read = 0b11 << 14, | 33 | Read = 0b11 << 14, |
| 34 | } | 34 | } |
| 35 | |||
| 35 | /// `MdioBus` trait | 36 | /// `MdioBus` trait |
| 36 | /// Driver needs to implement the Clause 22 | 37 | /// Driver needs to implement the Clause 22 |
| 37 | /// Optional Clause 45 is the device supports this. | 38 | /// Optional Clause 45 is the device supports this. |
| 38 | /// | 39 | /// |
| 39 | /// Claus 45 methodes are bases on <https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf> | 40 | /// Clause 45 methodes are bases on <https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf> |
| 40 | pub trait MdioBus { | 41 | pub trait MdioBus { |
| 41 | type Error; | 42 | type Error; |
| 42 | 43 | ||
| @@ -87,89 +88,89 @@ pub trait MdioBus { | |||
| 87 | } | 88 | } |
| 88 | } | 89 | } |
| 89 | 90 | ||
| 90 | // #[cfg(test)] | 91 | #[cfg(test)] |
| 91 | // mod tests { | 92 | mod tests { |
| 92 | // use core::convert::Infallible; | 93 | use core::convert::Infallible; |
| 93 | 94 | ||
| 94 | // use super::{MdioBus, PhyAddr, RegC22, RegVal}; | 95 | use super::{MdioBus, PhyAddr, RegC22, RegVal}; |
| 95 | 96 | ||
| 96 | // #[derive(Debug, PartialEq, Eq)] | 97 | #[derive(Debug, PartialEq, Eq)] |
| 97 | // enum A { | 98 | enum A { |
| 98 | // Read(PhyAddr, RegC22), | 99 | Read(PhyAddr, RegC22), |
| 99 | // Write(PhyAddr, RegC22, RegVal), | 100 | Write(PhyAddr, RegC22, RegVal), |
| 100 | // } | 101 | } |
| 101 | 102 | ||
| 102 | // struct MockMdioBus(Vec<A>); | 103 | struct MockMdioBus(Vec<A>); |
| 103 | 104 | ||
| 104 | // impl MockMdioBus { | 105 | impl MockMdioBus { |
| 105 | // pub fn clear(&mut self) { | 106 | pub fn clear(&mut self) { |
| 106 | // self.0.clear(); | 107 | self.0.clear(); |
| 107 | // } | 108 | } |
| 108 | // } | 109 | } |
| 109 | 110 | ||
| 110 | // impl MdioBus for MockMdioBus { | 111 | impl MdioBus for MockMdioBus { |
| 111 | // type Error = Infallible; | 112 | type Error = Infallible; |
| 112 | 113 | ||
| 113 | // fn write_cl22( | 114 | async fn write_cl22( |
| 114 | // &mut self, | 115 | &mut self, |
| 115 | // phy_id: super::PhyAddr, | 116 | phy_id: super::PhyAddr, |
| 116 | // reg: super::RegC22, | 117 | reg: super::RegC22, |
| 117 | // reg_val: super::RegVal, | 118 | reg_val: super::RegVal, |
| 118 | // ) -> Result<(), Self::Error> { | 119 | ) -> Result<(), Self::Error> { |
| 119 | // self.0.push(A::Write(phy_id, reg, reg_val)); | 120 | self.0.push(A::Write(phy_id, reg, reg_val)); |
| 120 | // Ok(()) | 121 | Ok(()) |
| 121 | // } | 122 | } |
| 122 | 123 | ||
| 123 | // fn read_cl22( | 124 | async fn read_cl22( |
| 124 | // &mut self, | 125 | &mut self, |
| 125 | // phy_id: super::PhyAddr, | 126 | phy_id: super::PhyAddr, |
| 126 | // reg: super::RegC22, | 127 | reg: super::RegC22, |
| 127 | // ) -> Result<super::RegVal, Self::Error> { | 128 | ) -> Result<super::RegVal, Self::Error> { |
| 128 | // self.0.push(A::Read(phy_id, reg)); | 129 | self.0.push(A::Read(phy_id, reg)); |
| 129 | // Ok(0) | 130 | Ok(0) |
| 130 | // } | 131 | } |
| 131 | // } | 132 | } |
| 132 | 133 | ||
| 133 | // #[test] | 134 | #[futures_test::test] |
| 134 | // fn read_test() { | 135 | async fn read_test() { |
| 135 | // let mut mdiobus = MockMdioBus(Vec::with_capacity(20)); | 136 | let mut mdiobus = MockMdioBus(Vec::with_capacity(20)); |
| 136 | 137 | ||
| 137 | // mdiobus.clear(); | 138 | mdiobus.clear(); |
| 138 | // mdiobus.read_cl22(0x01, 0x00).unwrap(); | 139 | mdiobus.read_cl22(0x01, 0x00).await.unwrap(); |
| 139 | // assert_eq!(mdiobus.0, vec![A::Read(0x01, 0x00)]); | 140 | assert_eq!(mdiobus.0, vec![A::Read(0x01, 0x00)]); |
| 140 | 141 | ||
| 141 | // mdiobus.clear(); | 142 | mdiobus.clear(); |
| 142 | // mdiobus.read_cl45(0x01, (0xBB, 0x1234)).unwrap(); | 143 | mdiobus.read_cl45(0x01, (0xBB, 0x1234)).await.unwrap(); |
| 143 | // assert_eq!( | 144 | assert_eq!( |
| 144 | // mdiobus.0, | 145 | mdiobus.0, |
| 145 | // vec![ | 146 | vec![ |
| 146 | // #[allow(clippy::identity_op)] | 147 | #[allow(clippy::identity_op)] |
| 147 | // A::Write(0x01, 13, (0b00 << 14) | 27), | 148 | A::Write(0x01, 13, (0b00 << 14) | 27), |
| 148 | // A::Write(0x01, 14, 0x1234), | 149 | A::Write(0x01, 14, 0x1234), |
| 149 | // A::Write(0x01, 13, (0b11 << 14) | 27), | 150 | A::Write(0x01, 13, (0b11 << 14) | 27), |
| 150 | // A::Read(0x01, 14) | 151 | A::Read(0x01, 14) |
| 151 | // ] | 152 | ] |
| 152 | // ); | 153 | ); |
| 153 | // } | 154 | } |
| 154 | 155 | ||
| 155 | // #[test] | 156 | #[futures_test::test] |
| 156 | // fn write_test() { | 157 | async fn write_test() { |
| 157 | // let mut mdiobus = MockMdioBus(Vec::with_capacity(20)); | 158 | let mut mdiobus = MockMdioBus(Vec::with_capacity(20)); |
| 158 | 159 | ||
| 159 | // mdiobus.clear(); | 160 | mdiobus.clear(); |
| 160 | // mdiobus.write_cl22(0x01, 0x00, 0xABCD).unwrap(); | 161 | mdiobus.write_cl22(0x01, 0x00, 0xABCD).await.unwrap(); |
| 161 | // assert_eq!(mdiobus.0, vec![A::Write(0x01, 0x00, 0xABCD)]); | 162 | assert_eq!(mdiobus.0, vec![A::Write(0x01, 0x00, 0xABCD)]); |
| 162 | 163 | ||
| 163 | // mdiobus.clear(); | 164 | mdiobus.clear(); |
| 164 | // mdiobus.write_cl45(0x01, (0xBB, 0x1234), 0xABCD).unwrap(); | 165 | mdiobus.write_cl45(0x01, (0xBB, 0x1234), 0xABCD).await.unwrap(); |
| 165 | // assert_eq!( | 166 | assert_eq!( |
| 166 | // mdiobus.0, | 167 | mdiobus.0, |
| 167 | // vec![ | 168 | vec![ |
| 168 | // A::Write(0x01, 13, 27), | 169 | A::Write(0x01, 13, 27), |
| 169 | // A::Write(0x01, 14, 0x1234), | 170 | A::Write(0x01, 14, 0x1234), |
| 170 | // A::Write(0x01, 13, (0b01 << 14) | 27), | 171 | A::Write(0x01, 13, (0b01 << 14) | 27), |
| 171 | // A::Write(0x01, 14, 0xABCD) | 172 | A::Write(0x01, 14, 0xABCD) |
| 172 | // ] | 173 | ] |
| 173 | // ); | 174 | ); |
| 174 | // } | 175 | } |
| 175 | // } | 176 | } |
diff --git a/embassy-net-adin1110/src/phy.rs b/embassy-net-adin1110/src/phy.rs index 176ad019b..d54d843d2 100644 --- a/embassy-net-adin1110/src/phy.rs +++ b/embassy-net-adin1110/src/phy.rs | |||
| @@ -111,6 +111,7 @@ pub mod RegsC45 { | |||
| 111 | } | 111 | } |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | /// 10-BASE-T1x PHY functions. | ||
| 114 | pub struct Phy10BaseT1x(u8); | 115 | pub struct Phy10BaseT1x(u8); |
| 115 | 116 | ||
| 116 | impl Default for Phy10BaseT1x { | 117 | impl Default for Phy10BaseT1x { |
