sam4l/usbc/
debug.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5use core::fmt;
6
7pub struct HexBuf<'a>(pub &'a [u8]);
8
9impl fmt::Debug for HexBuf<'_> {
10    #[allow(unused_must_use)]
11    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
12        write!(f, "[");
13        for (i, b) in self.0.iter().enumerate() {
14            write!(f, "{}{:.02x}", if i > 0 { " " } else { "" }, b);
15        }
16        write!(f, "]")
17    }
18}
19
20// Bitfields for UDINT, UDINTCLR, UDINTESET
21pub const UDINT_SUSP: u32 = 1 << 0;
22pub const UDINT_SOF: u32 = 1 << 2;
23pub const UDINT_EORST: u32 = 1 << 3;
24pub const UDINT_WAKEUP: u32 = 1 << 4;
25pub const UDINT_EORSM: u32 = 1 << 5;
26pub const UDINT_UPRSM: u32 = 1 << 6;
27
28pub struct UdintFlags(pub u32);
29
30impl fmt::Debug for UdintFlags {
31    #[allow(unused_must_use)]
32    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33        let w: u32 = self.0;
34
35        write!(f, "{{");
36        if w & UDINT_WAKEUP != 0 {
37            write!(f, "w");
38        }
39        if w & UDINT_SOF != 0 {
40            write!(f, "s");
41        }
42
43        if w & UDINT_SUSP != 0 {
44            write!(f, " SUSP");
45        }
46        if w & UDINT_EORST != 0 {
47            write!(f, " EORST");
48        }
49        if w & UDINT_EORSM != 0 {
50            write!(f, " EORSM");
51        }
52        if w & UDINT_UPRSM != 0 {
53            write!(f, " UPRSM");
54        }
55
56        for i in 0..9 {
57            if w & (1 << (12 + i)) != 0 {
58                write!(f, " EP{}", i);
59            }
60        }
61        write!(f, "}}")
62    }
63}
64
65macro_rules! debug_flags {
66    ( $tyname:ident {$( $flag:ident = $offset:expr; )*} ) => {
67
68        pub struct $tyname(pub u32);
69
70        impl fmt::Debug for $tyname {
71            fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
72                let w: u32 = self.0;
73                write!(f, "{{")?;
74                $(
75                    if w & (1 << $offset) != 0 {
76                        write!(f, "{} ", stringify!($flag))?;
77                    }
78                )*
79                write!(f, "}}")
80            }
81        }
82    };
83}
84
85debug_flags!(UeconFlags {
86    BUSY1E = 25;
87    BUSY0E = 24;
88    STALLRQ = 19;
89    RSTDT = 18;
90    FIFOCON = 14;
91    KILLBK = 13;
92    NBUSYBKE = 12;
93    // RAMACERE = 11;
94    NREPLY = 8;
95    // STALLEDE_CRCERRE = 6;
96    RXSTPE = 2;
97    TXINE = 0;
98    NAKINE = 4;
99    NAKOUTE = 3;
100    RXOUTE = 1;
101});
102
103// Bitfields for UESTAn
104pub const TXIN: u32 = 1 << 0;
105pub const RXOUT: u32 = 1 << 1;
106pub const RXSTP: u32 = 1 << 2;
107pub const ERRORF: u32 = 1 << 2;
108pub const NAKOUT: u32 = 1 << 3;
109pub const NAKIN: u32 = 1 << 4;
110pub const STALLED: u32 = 1 << 6;
111pub const CRCERR: u32 = 1 << 6;
112pub const RAMACERR: u32 = 1 << 11;
113pub const CTRLDIR: u32 = 1 << 17;
114pub const STALLRQ: u32 = 1 << 19;
115
116pub struct UestaFlags(pub u32);
117
118impl fmt::Debug for UestaFlags {
119    #[allow(unused_must_use)]
120    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
121        let w: u32 = self.0;
122
123        write!(f, "{{");
124        if w & TXIN != 0 {
125            write!(f, "TXIN ");
126        }
127        if w & RXOUT != 0 {
128            write!(f, "RXOUT ");
129        }
130        if w & RXSTP != 0 {
131            write!(f, "RXSTP");
132        }
133        if w & ERRORF != 0 {
134            write!(f, "/ERRORF ");
135        }
136        if w & NAKOUT != 0 {
137            write!(f, "NAKOUT ");
138        }
139        if w & NAKIN != 0 {
140            write!(f, "NAKIN ");
141        }
142        if w & STALLED != 0 {
143            write!(f, "STALLED");
144        }
145        if w & CRCERR != 0 {
146            write!(f, "/CRCERR ");
147        }
148        if w & RAMACERR != 0 {
149            write!(f, "RAMACERR ");
150        }
151        write!(f, "NBUSYBK={} ", (w >> 12) & 0x3);
152        write!(f, "CURBK={} ", (w >> 14) & 0x3);
153        write!(f, "CTRLDIR={}", if w & CTRLDIR != 0 { "IN" } else { "OUT" });
154        write!(f, "}}")
155    }
156}
157
158/*
159pub fn debug_regs() {
160    debug!(
161        "    registers:\
162         \n    USBFSM={:08x}\
163         \n    USBCON={:08x}\
164         \n    USBSTA={:08x}\
165         \n     UDESC={:08x}\
166         \n     UDCON={:08x}\
167         \n    UDINTE={:08x}\
168         \n     UDINT={:08x}\
169         \n     UERST={:08x}\
170         \n    UECFG0={:08x}\
171         \n    UECON0={:08x}",
172        USBFSM.read(),
173        USBCON.read(),
174        USBSTA.read(),
175        UDESC.read(),
176        UDCON.read(),
177        UDINTE.read(),
178        UDINT.read(),
179        UERST.read(),
180        UECFG0.read(),
181        UECON0.read()
182    );
183}
184*/