* tx/rx: Rename wrap_addr to start_addr for clarity * Fix RX logic, when advancing the tail pointer, not retrieving the stored RX buffer start address but the default value instead * Fix TX logic, when advancing the head pointer for next transmission, not retrieving the stored TX buffer end address but the default value instead * Rename SPI-related const's to match the datasheet: RERXDATA→RRXDATA, WEGPDATA→WGPDATA * Remove useless const's for SRAM default addresses for TX buffer * Simplify code
135 lines
3.0 KiB
Rust
135 lines
3.0 KiB
Rust
use crate::RAW_FRAME_LENGTH_MAX;
|
|
|
|
/// SRAM Addresses
|
|
pub const ERXST_DEFAULT: u16 = 0x5340;
|
|
pub const ERXTAIL_DEFAULT: u16 = 0x5ffe;
|
|
pub const RX_MAX_ADDRESS: u16 = 0x5fff;
|
|
|
|
/// Receive Status Vector Length
|
|
pub const RSV_LENGTH: usize = 6;
|
|
|
|
/// Struct for RX Buffer on the hardware
|
|
/// TODO: Should be a singleton
|
|
pub struct RxBuffer {
|
|
start_addr: u16,
|
|
next_addr: u16,
|
|
tail_addr: u16
|
|
}
|
|
|
|
impl RxBuffer {
|
|
pub fn new() -> Self {
|
|
RxBuffer {
|
|
start_addr: ERXST_DEFAULT,
|
|
next_addr: ERXST_DEFAULT,
|
|
tail_addr: ERXTAIL_DEFAULT
|
|
}
|
|
}
|
|
|
|
pub fn set_start_addr(&mut self, addr: u16) {
|
|
self.start_addr = addr;
|
|
}
|
|
pub fn get_start_addr(& self) -> u16{
|
|
self.start_addr
|
|
}
|
|
|
|
pub fn set_next_addr(&mut self, addr: u16) {
|
|
self.next_addr = addr;
|
|
}
|
|
pub fn get_next_addr(& self) -> u16 {
|
|
self.next_addr
|
|
}
|
|
|
|
pub fn set_tail_addr(&mut self, addr: u16) {
|
|
self.tail_addr = addr;
|
|
}
|
|
pub fn get_tail_addr(& self) -> u16{
|
|
self.tail_addr
|
|
}
|
|
}
|
|
|
|
/// Struct for RX Packet
|
|
/// TODO: Generalise MAC addresses
|
|
pub struct RxPacket {
|
|
rsv: Rsv,
|
|
frame: [u8; RAW_FRAME_LENGTH_MAX],
|
|
frame_length: usize
|
|
}
|
|
|
|
impl RxPacket {
|
|
pub fn new() -> Self {
|
|
RxPacket {
|
|
rsv: Rsv::new(),
|
|
frame: [0; RAW_FRAME_LENGTH_MAX],
|
|
frame_length: 0
|
|
}
|
|
}
|
|
|
|
pub fn write_to_rsv(&mut self, raw_rsv: &[u8]) {
|
|
self.rsv.write_to_rsv(raw_rsv);
|
|
}
|
|
pub fn read_raw_rsv(&self) -> &[u8] {
|
|
self.rsv.read_raw_rsv()
|
|
}
|
|
|
|
pub fn update_frame_length(&mut self) {
|
|
self.rsv.set_frame_length();
|
|
self.frame_length = self.rsv.get_frame_length() as usize;
|
|
}
|
|
|
|
pub fn get_frame_length(&self) -> usize {
|
|
self.frame_length
|
|
}
|
|
|
|
pub fn copy_frame_from(&mut self, raw_frame: &[u8]) {
|
|
for i in 0..self.frame_length {
|
|
self.frame[i] = raw_frame[i];
|
|
}
|
|
}
|
|
pub fn write_frame_to(&self, frame: &mut [u8]) {
|
|
for i in 0..self.frame_length {
|
|
frame[i] = self.frame[i];
|
|
}
|
|
}
|
|
|
|
pub fn get_mut_frame(&mut self) -> &mut [u8] {
|
|
&mut self.frame
|
|
}
|
|
|
|
/// TODO: Mostly for debugging only?
|
|
pub fn get_frame_byte(&self, i: usize) -> u8 {
|
|
self.frame[i]
|
|
}
|
|
}
|
|
|
|
/// Struct for Receive Status Vector
|
|
/// See: Table 9-1, ENC424J600 Data Sheet
|
|
struct Rsv {
|
|
raw_rsv: [u8; RSV_LENGTH],
|
|
// TODO: Add more definitions
|
|
frame_length: u16
|
|
}
|
|
|
|
impl Rsv {
|
|
fn new() -> Self {
|
|
Rsv {
|
|
raw_rsv: [0; RSV_LENGTH],
|
|
frame_length: 0_u16
|
|
}
|
|
}
|
|
|
|
fn write_to_rsv(&mut self, raw_rsv: &[u8]) {
|
|
for i in 0..RSV_LENGTH {
|
|
self.raw_rsv[i] = raw_rsv[i];
|
|
}
|
|
}
|
|
fn read_raw_rsv(&self) -> &[u8] {
|
|
&self.raw_rsv
|
|
}
|
|
|
|
fn set_frame_length(&mut self) {
|
|
self.frame_length = (self.raw_rsv[0] as u16) | ((self.raw_rsv[1] as u16) << 8);
|
|
}
|
|
fn get_frame_length(&self) -> u16 {
|
|
self.frame_length
|
|
}
|
|
} |