Compare commits
1 Commits
embassy-ne
...
embassy-ne
Author | SHA1 | Date | |
---|---|---|---|
4a2dd7b944 |
@ -6,7 +6,8 @@ keywords = ["embedded", "ADIN1110", "embassy-net", "embedded-hal-async", "ethern
|
|||||||
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
repository = "https://github.com/embassy-rs/embassy"
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
heapless = "0.8"
|
heapless = "0.8"
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
/// CRC32 lookup table.
|
|
||||||
pub const CRC32R_LOOKUP_TABLE: [u32; 256] = [
|
pub const CRC32R_LOOKUP_TABLE: [u32; 256] = [
|
||||||
0x0000_0000,
|
0x0000_0000,
|
||||||
0x7707_3096,
|
0x7707_3096,
|
||||||
@ -264,9 +263,8 @@ pub const CRC32R_LOOKUP_TABLE: [u32; 256] = [
|
|||||||
pub struct ETH_FCS(pub u32);
|
pub struct ETH_FCS(pub u32);
|
||||||
|
|
||||||
impl ETH_FCS {
|
impl ETH_FCS {
|
||||||
const CRC32_OK: u32 = 0x2144_df1c;
|
pub const CRC32_OK: u32 = 0x2144_df1c;
|
||||||
|
|
||||||
/// Create a new frame check sequence from `data`.
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn new(data: &[u8]) -> Self {
|
pub fn new(data: &[u8]) -> Self {
|
||||||
let fcs = data.iter().fold(u32::MAX, |crc, byte| {
|
let fcs = data.iter().fold(u32::MAX, |crc, byte| {
|
||||||
@ -276,7 +274,6 @@ impl ETH_FCS {
|
|||||||
Self(fcs)
|
Self(fcs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the frame check sequence with `data`.
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn update(self, data: &[u8]) -> Self {
|
pub fn update(self, data: &[u8]) -> Self {
|
||||||
let fcs = data.iter().fold(self.0 ^ u32::MAX, |crc, byte| {
|
let fcs = data.iter().fold(self.0 ^ u32::MAX, |crc, byte| {
|
||||||
@ -286,19 +283,16 @@ impl ETH_FCS {
|
|||||||
Self(fcs)
|
Self(fcs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the frame check sequence is correct.
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn crc_ok(&self) -> bool {
|
pub fn crc_ok(&self) -> bool {
|
||||||
self.0 == Self::CRC32_OK
|
self.0 == Self::CRC32_OK
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Switch byte order.
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn hton_bytes(&self) -> [u8; 4] {
|
pub fn hton_bytes(&self) -> [u8; 4] {
|
||||||
self.0.to_le_bytes()
|
self.0.to_le_bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Switch byte order as a u32.
|
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn hton(&self) -> u32 {
|
pub fn hton(&self) -> u32 {
|
||||||
self.0.to_le()
|
self.0.to_le()
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#![allow(clippy::missing_errors_doc)]
|
#![allow(clippy::missing_errors_doc)]
|
||||||
#![allow(clippy::missing_panics_doc)]
|
#![allow(clippy::missing_panics_doc)]
|
||||||
#![doc = include_str!("../README.md")]
|
#![doc = include_str!("../README.md")]
|
||||||
#![warn(missing_docs)]
|
|
||||||
|
|
||||||
// must go first!
|
// must go first!
|
||||||
mod fmt;
|
mod fmt;
|
||||||
@ -27,9 +26,8 @@ use embedded_hal_async::digital::Wait;
|
|||||||
use embedded_hal_async::spi::{Error, Operation, SpiDevice};
|
use embedded_hal_async::spi::{Error, Operation, SpiDevice};
|
||||||
use heapless::Vec;
|
use heapless::Vec;
|
||||||
pub use mdio::MdioBus;
|
pub use mdio::MdioBus;
|
||||||
pub use phy::Phy10BaseT1x;
|
pub use phy::{Phy10BaseT1x, RegsC22, RegsC45};
|
||||||
use phy::{RegsC22, RegsC45};
|
pub use regs::{Config0, Config2, SpiRegisters as sr, Status0, Status1};
|
||||||
use regs::{Config0, Config2, SpiRegisters as sr, Status0, Status1};
|
|
||||||
|
|
||||||
use crate::fmt::Bytes;
|
use crate::fmt::Bytes;
|
||||||
use crate::regs::{LedCntrl, LedFunc, LedPol, LedPolarity, SpiHeader};
|
use crate::regs::{LedCntrl, LedFunc, LedPol, LedPolarity, SpiHeader};
|
||||||
@ -448,7 +446,6 @@ pub struct Runner<'d, SPI, INT, RST> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, SPI, INT, RST> {
|
impl<'d, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, SPI, INT, RST> {
|
||||||
/// Run the driver.
|
|
||||||
#[allow(clippy::too_many_lines)]
|
#[allow(clippy::too_many_lines)]
|
||||||
pub async fn run(mut self) -> ! {
|
pub async fn run(mut self) -> ! {
|
||||||
loop {
|
loop {
|
||||||
|
@ -39,7 +39,6 @@ enum Reg13Op {
|
|||||||
///
|
///
|
||||||
/// Clause 45 methodes are bases on <https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf>
|
/// Clause 45 methodes are bases on <https://www.ieee802.org/3/efm/public/nov02/oam/pannell_oam_1_1102.pdf>
|
||||||
pub trait MdioBus {
|
pub trait MdioBus {
|
||||||
/// Error type.
|
|
||||||
type Error;
|
type Error;
|
||||||
|
|
||||||
/// Read, Clause 22
|
/// Read, Clause 22
|
||||||
|
@ -2,7 +2,6 @@ use core::fmt::{Debug, Display};
|
|||||||
|
|
||||||
use bitfield::{bitfield, bitfield_bitrange, bitfield_fields};
|
use bitfield::{bitfield, bitfield_bitrange, bitfield_fields};
|
||||||
|
|
||||||
#[allow(missing_docs)]
|
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||||
|
@ -6,6 +6,7 @@ keywords = ["embedded", "wiznet", "embassy-net", "embedded-hal-async", "ethernet
|
|||||||
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
categories = ["embedded", "hardware-support", "no-std", "network-programming", "async"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
repository = "https://github.com/embassy-rs/embassy"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embedded-hal = { version = "1.0.0-rc.3" }
|
embedded-hal = { version = "1.0.0-rc.3" }
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
//! Wiznet W5100s and W5500 family driver.
|
||||||
mod w5500;
|
mod w5500;
|
||||||
pub use w5500::W5500;
|
pub use w5500::W5500;
|
||||||
mod w5100s;
|
mod w5100s;
|
||||||
@ -45,4 +46,5 @@ pub(crate) mod sealed {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait for Wiznet chips.
|
||||||
pub trait Chip: sealed::Chip {}
|
pub trait Chip: sealed::Chip {}
|
||||||
|
@ -4,6 +4,7 @@ const SOCKET_BASE: u16 = 0x400;
|
|||||||
const TX_BASE: u16 = 0x4000;
|
const TX_BASE: u16 = 0x4000;
|
||||||
const RX_BASE: u16 = 0x6000;
|
const RX_BASE: u16 = 0x6000;
|
||||||
|
|
||||||
|
/// Wizard W5100S chip.
|
||||||
pub enum W5100S {}
|
pub enum W5100S {}
|
||||||
|
|
||||||
impl super::Chip for W5100S {}
|
impl super::Chip for W5100S {}
|
||||||
|
@ -8,6 +8,7 @@ pub enum RegisterBlock {
|
|||||||
RxBuf = 0x03,
|
RxBuf = 0x03,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wiznet W5500 chip.
|
||||||
pub enum W5500 {}
|
pub enum W5500 {}
|
||||||
|
|
||||||
impl super::Chip for W5500 {}
|
impl super::Chip for W5500 {}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![allow(async_fn_in_trait)]
|
#![allow(async_fn_in_trait)]
|
||||||
#![doc = include_str!("../README.md")]
|
#![doc = include_str!("../README.md")]
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
pub mod chip;
|
pub mod chip;
|
||||||
mod device;
|
mod device;
|
||||||
@ -47,6 +48,7 @@ pub struct Runner<'d, C: Chip, SPI: SpiDevice, INT: Wait, RST: OutputPin> {
|
|||||||
|
|
||||||
/// You must call this in a background task for the driver to operate.
|
/// You must call this in a background task for the driver to operate.
|
||||||
impl<'d, C: Chip, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, C, SPI, INT, RST> {
|
impl<'d, C: Chip, SPI: SpiDevice, INT: Wait, RST: OutputPin> Runner<'d, C, SPI, INT, RST> {
|
||||||
|
/// Run the driver.
|
||||||
pub async fn run(mut self) -> ! {
|
pub async fn run(mut self) -> ! {
|
||||||
let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split();
|
let (state_chan, mut rx_chan, mut tx_chan) = self.ch.split();
|
||||||
let mut tick = Ticker::every(Duration::from_millis(500));
|
let mut tick = Ticker::every(Duration::from_millis(500));
|
||||||
|
Reference in New Issue
Block a user