#![cfg_attr(docsrs, feature(doc_cfg), feature(doc_auto_cfg))]
#![no_std]
#![allow(async_fn_in_trait)] #![forbid(unsafe_code)]
#![warn(missing_docs)]
pub mod aio;
#[cfg(feature = "eh0")]
pub mod eh0;
#[cfg(feature = "eh1")]
pub mod eh1;
pub mod net;
pub mod spi;
mod addr;
mod registers;
mod specifiers;
use net::{Eui48Addr, Ipv4Addr, SocketAddrV4};
pub use addr::{Reg, SnReg};
pub use registers::{Interrupt, Mode, PhyCfg, SocketInterrupt, SocketInterruptMask, SocketMode};
pub use specifiers::{
BufferSize, DuplexStatus, LinkStatus, OperationMode, Protocol, SocketCommand, SocketStatus,
SpeedStatus,
};
pub const COMMON_BLOCK_OFFSET: u8 = 0x00;
const SOCKET_SPACING: u8 = 0x04;
const SOCKET_BLOCK_OFFSET: u8 = 0x01;
const SOCKET_TX_OFFSET: u8 = 0x02;
const SOCKET_RX_OFFSET: u8 = 0x03;
pub const VERSION: u8 = 0x04;
#[repr(u8)]
#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Debug, Hash)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum Sn {
Sn0 = 0,
Sn1 = 1,
Sn2 = 2,
Sn3 = 3,
Sn4 = 4,
Sn5 = 5,
Sn6 = 6,
Sn7 = 7,
}
impl Sn {
#[inline]
pub const fn block(self) -> u8 {
SOCKET_SPACING * (self as u8) + SOCKET_BLOCK_OFFSET
}
#[inline]
pub const fn tx_block(self) -> u8 {
SOCKET_SPACING * (self as u8) + SOCKET_TX_OFFSET
}
#[inline]
pub const fn rx_block(self) -> u8 {
SOCKET_SPACING * (self as u8) + SOCKET_RX_OFFSET
}
pub const fn bitmask(self) -> u8 {
1 << (self as u8)
}
#[inline]
pub fn iter() -> core::slice::Iter<'static, Self> {
SOCKETS.iter()
}
}
macro_rules! sn_conversion_for {
($ty:ident) => {
impl From<Sn> for $ty {
#[inline]
fn from(s: Sn) -> Self {
s as $ty
}
}
impl TryFrom<$ty> for Sn {
type Error = $ty;
#[inline]
fn try_from(val: $ty) -> Result<Sn, $ty> {
match val {
0 => Ok(Sn::Sn0),
1 => Ok(Sn::Sn1),
2 => Ok(Sn::Sn2),
3 => Ok(Sn::Sn3),
4 => Ok(Sn::Sn4),
5 => Ok(Sn::Sn5),
6 => Ok(Sn::Sn6),
7 => Ok(Sn::Sn7),
x => Err(x),
}
}
}
};
}
sn_conversion_for!(u8);
sn_conversion_for!(u16);
sn_conversion_for!(u32);
sn_conversion_for!(u64);
sn_conversion_for!(u128);
sn_conversion_for!(usize);
sn_conversion_for!(i8);
sn_conversion_for!(i16);
sn_conversion_for!(i32);
sn_conversion_for!(i64);
sn_conversion_for!(i128);
sn_conversion_for!(isize);
pub const SOCKETS: [Sn; 8] = [
Sn::Sn0,
Sn::Sn1,
Sn::Sn2,
Sn::Sn3,
Sn::Sn4,
Sn::Sn5,
Sn::Sn6,
Sn::Sn7,
];
#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Debug, Hash)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct TxPtrs {
pub fsr: u16,
pub wr: u16,
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Debug, Hash)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct RxPtrs {
pub rsr: u16,
pub rd: u16,
}
pub trait Registers {
type Error;
fn read(&mut self, addr: u16, block: u8, data: &mut [u8]) -> Result<(), Self::Error>;
fn write(&mut self, addr: u16, block: u8, data: &[u8]) -> Result<(), Self::Error>;
fn mr(&mut self) -> Result<Mode, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::MR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(Mode::from(reg[0]))
}
fn set_mr(&mut self, mode: Mode) -> Result<(), Self::Error> {
self.write(Reg::MR.addr(), COMMON_BLOCK_OFFSET, &[mode.into()])
}
fn gar(&mut self) -> Result<Ipv4Addr, Self::Error> {
let mut gar: [u8; 4] = [0; 4];
self.read(Reg::GAR0.addr(), COMMON_BLOCK_OFFSET, &mut gar)?;
Ok(gar.into())
}
fn set_gar(&mut self, gar: &Ipv4Addr) -> Result<(), Self::Error> {
self.write(Reg::GAR0.addr(), COMMON_BLOCK_OFFSET, &gar.octets())
}
fn subr(&mut self) -> Result<Ipv4Addr, Self::Error> {
let mut subr: [u8; 4] = [0; 4];
self.read(Reg::SUBR0.addr(), COMMON_BLOCK_OFFSET, &mut subr)?;
Ok(subr.into())
}
fn set_subr(&mut self, subr: &Ipv4Addr) -> Result<(), Self::Error> {
self.write(Reg::SUBR0.addr(), COMMON_BLOCK_OFFSET, &subr.octets())
}
fn shar(&mut self) -> Result<Eui48Addr, Self::Error> {
let mut shar = Eui48Addr::UNSPECIFIED;
self.read(Reg::SHAR0.addr(), COMMON_BLOCK_OFFSET, &mut shar.octets)?;
Ok(shar)
}
fn set_shar(&mut self, shar: &Eui48Addr) -> Result<(), Self::Error> {
self.write(Reg::SHAR0.addr(), COMMON_BLOCK_OFFSET, &shar.octets)
}
fn sipr(&mut self) -> Result<Ipv4Addr, Self::Error> {
let mut sipr: [u8; 4] = [0; 4];
self.read(Reg::SIPR0.addr(), COMMON_BLOCK_OFFSET, &mut sipr)?;
Ok(sipr.into())
}
fn set_sipr(&mut self, sipr: &Ipv4Addr) -> Result<(), Self::Error> {
self.write(Reg::SIPR0.addr(), COMMON_BLOCK_OFFSET, &sipr.octets())
}
fn intlevel(&mut self) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0; 2];
self.read(Reg::INTLEVEL0.addr(), COMMON_BLOCK_OFFSET, &mut buf)?;
Ok(u16::from_be_bytes(buf))
}
fn set_intlevel(&mut self, intlevel: u16) -> Result<(), Self::Error> {
self.write(
Reg::INTLEVEL0.addr(),
COMMON_BLOCK_OFFSET,
&intlevel.to_be_bytes(),
)
}
fn ir(&mut self) -> Result<Interrupt, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::IR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(Interrupt::from(reg[0]))
}
fn set_ir(&mut self, interrupt: Interrupt) -> Result<(), Self::Error> {
self.write(Reg::IR.addr(), COMMON_BLOCK_OFFSET, &[interrupt.into()])
}
fn imr(&mut self) -> Result<Interrupt, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::IMR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(Interrupt::from(reg[0]))
}
fn set_imr(&mut self, mask: Interrupt) -> Result<(), Self::Error> {
self.write(Reg::IMR.addr(), COMMON_BLOCK_OFFSET, &[mask.into()])
}
fn sir(&mut self) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::SIR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(reg[0])
}
fn simr(&mut self) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::SIMR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(reg[0])
}
fn set_simr(&mut self, simr: u8) -> Result<(), Self::Error> {
self.write(Reg::SIMR.addr(), COMMON_BLOCK_OFFSET, &[simr])
}
fn rtr(&mut self) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0; 2];
self.read(Reg::RTR0.addr(), COMMON_BLOCK_OFFSET, &mut buf)?;
Ok(u16::from_be_bytes(buf))
}
fn set_rtr(&mut self, rtr: u16) -> Result<(), Self::Error> {
self.write(Reg::RTR0.addr(), COMMON_BLOCK_OFFSET, &rtr.to_be_bytes())
}
fn rcr(&mut self) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::RCR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(reg[0])
}
fn set_rcr(&mut self, rcr: u8) -> Result<(), Self::Error> {
self.write(Reg::RCR.addr(), COMMON_BLOCK_OFFSET, &[rcr])
}
fn ptimer(&mut self) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::PTIMER.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(reg[0])
}
fn set_ptimer(&mut self, ptimer: u8) -> Result<(), Self::Error> {
self.write(Reg::PTIMER.addr(), COMMON_BLOCK_OFFSET, &[ptimer])
}
fn pmagic(&mut self) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::PMAGIC.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(reg[0])
}
fn set_pmagic(&mut self, pmagic: u8) -> Result<(), Self::Error> {
self.write(Reg::PMAGIC.addr(), COMMON_BLOCK_OFFSET, &[pmagic])
}
fn phar(&mut self) -> Result<Eui48Addr, Self::Error> {
let mut phar = Eui48Addr::UNSPECIFIED;
self.read(Reg::PHAR0.addr(), COMMON_BLOCK_OFFSET, &mut phar.octets)?;
Ok(phar)
}
fn set_phar(&mut self, phar: &Eui48Addr) -> Result<(), Self::Error> {
self.write(Reg::PHAR0.addr(), COMMON_BLOCK_OFFSET, &phar.octets)
}
fn psid(&mut self) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0; 2];
self.read(Reg::PSID0.addr(), COMMON_BLOCK_OFFSET, &mut buf)?;
Ok(u16::from_be_bytes(buf))
}
fn set_psid(&mut self, psid: u16) -> Result<(), Self::Error> {
self.write(Reg::PSID0.addr(), COMMON_BLOCK_OFFSET, &psid.to_be_bytes())
}
fn pmru(&mut self) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0; 2];
self.read(Reg::PMRU0.addr(), COMMON_BLOCK_OFFSET, &mut buf)?;
Ok(u16::from_be_bytes(buf))
}
fn set_pmru(&mut self, pmru: u16) -> Result<(), Self::Error> {
self.write(Reg::PMRU0.addr(), COMMON_BLOCK_OFFSET, &pmru.to_be_bytes())
}
fn uipr(&mut self) -> Result<Ipv4Addr, Self::Error> {
let mut uipr: [u8; 4] = [0; 4];
self.read(Reg::UIPR0.addr(), COMMON_BLOCK_OFFSET, &mut uipr)?;
Ok(uipr.into())
}
fn uportr(&mut self) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0; 2];
self.read(Reg::UPORTR0.addr(), COMMON_BLOCK_OFFSET, &mut buf)?;
Ok(u16::from_be_bytes(buf))
}
fn phycfgr(&mut self) -> Result<PhyCfg, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::PHYCFGR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(PhyCfg::from(reg[0]))
}
fn set_phycfgr(&mut self, phycfg: PhyCfg) -> Result<(), Self::Error> {
self.write(Reg::PHYCFGR.addr(), COMMON_BLOCK_OFFSET, &[phycfg.into()])
}
fn version(&mut self) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(Reg::VERSIONR.addr(), COMMON_BLOCK_OFFSET, &mut reg)?;
Ok(reg[0])
}
fn sn_mr(&mut self, sn: Sn) -> Result<SocketMode, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::MR.addr(), sn.block(), &mut reg)?;
Ok(SocketMode::from(reg[0]))
}
fn set_sn_mr(&mut self, sn: Sn, mode: SocketMode) -> Result<(), Self::Error> {
self.write(SnReg::MR.addr(), sn.block(), &[mode.into()])
}
fn sn_cr(&mut self, sn: Sn) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::CR.addr(), sn.block(), &mut reg)?;
Ok(reg[0])
}
fn set_sn_cr(&mut self, sn: Sn, cmd: SocketCommand) -> Result<(), Self::Error> {
self.write(SnReg::CR.addr(), sn.block(), &[cmd.into()])
}
fn sn_ir(&mut self, sn: Sn) -> Result<SocketInterrupt, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::IR.addr(), sn.block(), &mut reg)?;
Ok(SocketInterrupt::from(reg[0]))
}
fn set_sn_ir<T: Into<u8>>(&mut self, sn: Sn, sn_ir: T) -> Result<(), Self::Error> {
self.write(SnReg::IR.addr(), sn.block(), &[sn_ir.into()])
}
fn sn_sr(&mut self, sn: Sn) -> Result<Result<SocketStatus, u8>, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::SR.addr(), sn.block(), &mut reg)?;
Ok(SocketStatus::try_from(reg[0]))
}
fn sn_port(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::PORT0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn set_sn_port(&mut self, sn: Sn, port: u16) -> Result<(), Self::Error> {
self.write(SnReg::PORT0.addr(), sn.block(), &u16::to_be_bytes(port))
}
fn sn_dhar(&mut self, sn: Sn) -> Result<Eui48Addr, Self::Error> {
let mut dhar: Eui48Addr = Eui48Addr::UNSPECIFIED;
self.read(SnReg::DHAR0.addr(), sn.block(), &mut dhar.octets)?;
Ok(dhar)
}
fn set_sn_dhar(&mut self, sn: Sn, dhar: &Eui48Addr) -> Result<(), Self::Error> {
self.write(SnReg::DHAR0.addr(), sn.block(), &dhar.octets)
}
fn sn_dipr(&mut self, sn: Sn) -> Result<Ipv4Addr, Self::Error> {
let mut dipr: [u8; 4] = [0; 4];
self.read(SnReg::DIPR0.addr(), sn.block(), &mut dipr)?;
Ok(dipr.into())
}
fn set_sn_dipr(&mut self, sn: Sn, dipr: &Ipv4Addr) -> Result<(), Self::Error> {
self.write(SnReg::DIPR0.addr(), sn.block(), &dipr.octets())
}
fn sn_dport(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::DPORT0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn set_sn_dport(&mut self, sn: Sn, port: u16) -> Result<(), Self::Error> {
self.write(SnReg::DPORT0.addr(), sn.block(), &u16::to_be_bytes(port))
}
fn sn_dest(&mut self, sn: Sn) -> Result<SocketAddrV4, Self::Error> {
let mut buf: [u8; 6] = [0; 6];
self.read(SnReg::DIPR0.addr(), sn.block(), &mut buf)?;
Ok(SocketAddrV4::new(
Ipv4Addr::new(buf[0], buf[1], buf[2], buf[3]),
u16::from_be_bytes([buf[4], buf[5]]),
))
}
fn set_sn_dest(&mut self, sn: Sn, addr: &SocketAddrV4) -> Result<(), Self::Error> {
let buf: [u8; 6] = [
addr.ip().octets()[0],
addr.ip().octets()[1],
addr.ip().octets()[2],
addr.ip().octets()[3],
(addr.port() >> 8) as u8,
addr.port() as u8,
];
self.write(SnReg::DIPR0.addr(), sn.block(), &buf)
}
fn sn_mssr(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::MSSR0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn set_sn_mssr(&mut self, sn: Sn, mssr: u16) -> Result<(), Self::Error> {
self.write(SnReg::MSSR0.addr(), sn.block(), &u16::to_be_bytes(mssr))
}
fn sn_tos(&mut self, sn: Sn) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::TOS.addr(), sn.block(), &mut reg)?;
Ok(reg[0])
}
fn set_sn_tos(&mut self, sn: Sn, tos: u8) -> Result<(), Self::Error> {
self.write(SnReg::TOS.addr(), sn.block(), &[tos])
}
fn sn_ttl(&mut self, sn: Sn) -> Result<u8, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::TTL.addr(), sn.block(), &mut reg)?;
Ok(reg[0])
}
fn set_sn_ttl(&mut self, sn: Sn, ttl: u8) -> Result<(), Self::Error> {
self.write(SnReg::TTL.addr(), sn.block(), &[ttl])
}
fn sn_rxbuf_size(&mut self, sn: Sn) -> Result<Result<BufferSize, u8>, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::RXBUF_SIZE.addr(), sn.block(), &mut reg)?;
Ok(BufferSize::try_from(reg[0]))
}
fn set_sn_rxbuf_size(&mut self, sn: Sn, size: BufferSize) -> Result<(), Self::Error> {
self.write(SnReg::RXBUF_SIZE.addr(), sn.block(), &[size.into()])
}
fn sn_txbuf_size(&mut self, sn: Sn) -> Result<Result<BufferSize, u8>, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::TXBUF_SIZE.addr(), sn.block(), &mut reg)?;
Ok(BufferSize::try_from(reg[0]))
}
fn set_sn_txbuf_size(&mut self, sn: Sn, size: BufferSize) -> Result<(), Self::Error> {
self.write(SnReg::TXBUF_SIZE.addr(), sn.block(), &[size.into()])
}
fn sn_tx_fsr(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::TX_FSR0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn sn_tx_rd(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::TX_RD0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn sn_tx_wr(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::TX_WR0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn set_sn_tx_wr(&mut self, sn: Sn, ptr: u16) -> Result<(), Self::Error> {
self.write(SnReg::TX_WR0.addr(), sn.block(), &ptr.to_be_bytes())
}
fn sn_tx_ptrs(&mut self, sn: Sn) -> Result<TxPtrs, Self::Error> {
let mut buf: [u8; 6] = [0; 6];
self.read(SnReg::TX_FSR0.addr(), sn.block(), &mut buf)?;
Ok(TxPtrs {
fsr: u16::from_be_bytes(buf[..2].try_into().unwrap()),
wr: u16::from_be_bytes(buf[4..].try_into().unwrap()),
})
}
fn sn_rx_rsr(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::RX_RSR0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn sn_rx_rd(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::RX_RD0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn set_sn_rx_rd(&mut self, sn: Sn, ptr: u16) -> Result<(), Self::Error> {
self.write(SnReg::RX_RD0.addr(), sn.block(), &ptr.to_be_bytes())
}
fn sn_rx_wr(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut reg: [u8; 2] = [0; 2];
self.read(SnReg::RX_WR0.addr(), sn.block(), &mut reg)?;
Ok(u16::from_be_bytes(reg))
}
fn sn_rx_ptrs(&mut self, sn: Sn) -> Result<RxPtrs, Self::Error> {
let mut buf: [u8; 4] = [0; 4];
self.read(SnReg::RX_RSR0.addr(), sn.block(), &mut buf)?;
Ok(RxPtrs {
rsr: u16::from_be_bytes(buf[..2].try_into().unwrap()),
rd: u16::from_be_bytes(buf[2..].try_into().unwrap()),
})
}
fn sn_imr(&mut self, sn: Sn) -> Result<SocketInterruptMask, Self::Error> {
let mut reg: [u8; 1] = [0];
self.read(SnReg::IMR.addr(), sn.block(), &mut reg)?;
Ok(SocketInterruptMask::from(reg[0]))
}
fn set_sn_imr(&mut self, sn: Sn, mask: SocketInterruptMask) -> Result<(), Self::Error> {
self.write(SnReg::IMR.addr(), sn.block(), &[mask.into()])
}
fn sn_frag(&mut self, sn: Sn) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0; 2];
self.read(SnReg::FRAG0.addr(), sn.block(), &mut buf)?;
Ok(u16::from_be_bytes(buf))
}
fn set_sn_frag(&mut self, sn: Sn, frag: u16) -> Result<(), Self::Error> {
self.write(SnReg::FRAG0.addr(), sn.block(), &u16::to_be_bytes(frag))
}
fn sn_kpalvtr(&mut self, sn: Sn) -> Result<u8, Self::Error> {
let mut buf: [u8; 1] = [0];
self.read(SnReg::KPALVTR.addr(), sn.block(), &mut buf)?;
Ok(buf[0])
}
fn set_sn_kpalvtr(&mut self, sn: Sn, kpalvtr: u8) -> Result<(), Self::Error> {
self.write(SnReg::KPALVTR.addr(), sn.block(), &[kpalvtr])
}
fn set_sn_tx_buf(&mut self, sn: Sn, ptr: u16, buf: &[u8]) -> Result<(), Self::Error> {
self.write(ptr, sn.tx_block(), buf)
}
fn sn_tx_buf(&mut self, sn: Sn, ptr: u16, buf: &mut [u8]) -> Result<(), Self::Error> {
self.read(ptr, sn.tx_block(), buf)
}
fn sn_rx_buf(&mut self, sn: Sn, ptr: u16, buf: &mut [u8]) -> Result<(), Self::Error> {
self.read(ptr, sn.rx_block(), buf)
}
fn set_sn_rx_buf(&mut self, sn: Sn, ptr: u16, buf: &[u8]) -> Result<(), Self::Error> {
self.write(ptr, sn.rx_block(), buf)
}
}