atsamd_hal/peripherals/usb/d5x/
devicedesc.rs1use bitfield::bitfield;
2use core::fmt::{Debug, Error as FmtError, Formatter};
3use core::mem;
4use core::ptr::null_mut;
5
6type FmtResult = Result<(), FmtError>;
7
8bitfield! {
9    struct PckSize(u32);
10    impl Debug;
11    pub byte_count, set_byte_count: 13, 0;
12    pub multi_packet_size, set_multi_packet_size: 27, 14;
13    pub size, set_size: 30, 28;
14    pub auto_zlp, set_auto_zlp : 31;
15}
16
17bitfield! {
18    struct ExtReg(u16);
19    impl Debug;
20    pub subpid, set_subpid: 3, 0;
21    pub link_state, set_link_state: 7, 4;
22    pub besl, set_besl: 11, 8;
23    pub remote_wake, set_remote_wake: 12;
24}
25
26bitfield! {
27    struct StatusBk(u8);
28    impl Debug;
29    pub crc_error, set_crc_error: 0;
30    pub error_flow, set_error_flow: 1;
31}
32
33#[repr(C)]
34#[derive(Debug)]
35pub struct DeviceDescBank {
36    addr: *mut u8,
38    pcksize: PckSize,
39    extreg: ExtReg,
40    status_bk: StatusBk,
41    _reserved: [u8; 5],
42}
43
44impl DeviceDescBank {
45    fn new() -> Self {
46        debug_assert_eq!(16, mem::size_of::<DeviceDescBank>());
47        Self {
48            addr: null_mut(),
49            pcksize: PckSize(0),
50            extreg: ExtReg(0),
51            status_bk: StatusBk(0),
52            _reserved: [0, 0, 0, 0, 0],
53        }
54    }
55
56    #[allow(unused)]
57    #[allow(unused_variables)]
62    pub fn set_auto_zlp(&mut self, enable: bool) {
63        self.pcksize.set_auto_zlp(enable);
64    }
65
66    pub fn set_endpoint_size(&mut self, size: u16) {
72        let size = match size {
73            1..=8 => 0u32,
74            9..=16 => 1,
75            17..=32 => 2,
76            33..=64 => 3,
77            65..=128 => 4,
78            129..=256 => 5,
79            257..=512 => 6,
80            513..=1023 => 7,
81            _ => unreachable!(),
82        };
83        self.pcksize.set_size(size);
84    }
85
86    #[allow(unused)]
87    pub fn get_endpoint_size(&self) -> u16 {
88        let bits = self.pcksize.size();
89        match bits {
90            0 => 8,
91            1 => 16,
92            2 => 32,
93            3 => 64,
94            4 => 128,
95            5 => 256,
96            6 => 512,
97            7 => 1023,
98            _ => unreachable!(),
99        }
100    }
101
102    pub fn set_multi_packet_size(&mut self, size: u16) {
106        self.pcksize.set_multi_packet_size(size.into());
107    }
108
109    #[allow(dead_code)]
113    pub fn get_multi_packet_size(&self) -> u16 {
114        self.pcksize.multi_packet_size() as u16
115    }
116
117    pub fn set_byte_count(&mut self, size: u16) {
123        self.pcksize.set_byte_count(size.into());
124    }
125
126    pub fn get_byte_count(&self) -> u16 {
132        self.pcksize.byte_count() as u16
133    }
134
135    #[allow(unused)]
136    pub fn link_state(&self) -> u8 {
137        self.extreg.link_state() as u8
139    }
140
141    #[allow(unused)]
142    pub fn besl(&self) -> u8 {
144        self.extreg.besl() as u8
145    }
146
147    #[allow(unused)]
148    pub fn remote_wake(&self) -> bool {
149        self.extreg.remote_wake()
150    }
151
152    #[allow(unused)]
153    pub fn subpid(&self) -> u8 {
157        self.extreg.subpid() as u8
158    }
159
160    #[allow(unused)]
161    pub fn error_flow(&self) -> bool {
168        self.status_bk.error_flow()
169    }
170
171    #[allow(unused)]
172    pub fn crc_error(&self) -> bool {
175        self.status_bk.crc_error()
176    }
177
178    pub fn set_address(&mut self, address: *mut u8) {
179        self.addr = address;
180    }
181
182    pub fn get_address(&self) -> *mut u8 {
183        self.addr
184    }
185}
186
187#[derive(Debug)]
188#[repr(C)]
189pub struct DeviceDescriptor {
190    bank: [DeviceDescBank; 2],
191}
192
193impl DeviceDescriptor {
194    fn new() -> Self {
195        debug_assert_eq!(32, mem::size_of::<DeviceDescriptor>());
196        Self {
197            bank: [DeviceDescBank::new(), DeviceDescBank::new()],
198        }
199    }
200}
201
202pub struct Descriptors {
203    desc: [DeviceDescriptor; 8],
204}
205
206impl Debug for Descriptors {
207    fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
208        for ep in 0..8 {
209            write!(fmt, "\nep{}: {:?}", ep, &self.desc[ep])?;
210        }
211        Ok(())
212    }
213}
214
215impl Descriptors {
216    pub fn new() -> Self {
217        Self {
218            desc: [
219                DeviceDescriptor::new(),
220                DeviceDescriptor::new(),
221                DeviceDescriptor::new(),
222                DeviceDescriptor::new(),
223                DeviceDescriptor::new(),
224                DeviceDescriptor::new(),
225                DeviceDescriptor::new(),
226                DeviceDescriptor::new(),
227            ],
228        }
229    }
230
231    pub fn address(&self) -> u32 {
232        &self.desc as *const _ as u32
233    }
234
235    pub fn bank(&mut self, idx: usize, bank: usize) -> &mut DeviceDescBank {
236        &mut self.desc[idx].bank[bank]
237    }
238}
239
240unsafe impl Send for DeviceDescBank {}