1use std::fmt;
2
3const BXR_USB_ERROR_OFFSET: u32 = 10_000;
4const BXR_USB_CRC: u32 = BXR_USB_ERROR_OFFSET + 0x01;
5const BXR_USB_BTSTUFF: u32 = BXR_USB_ERROR_OFFSET + 0x02;
6const BXR_USB_DATA_TOGGLE_MISMATCH: u32 = BXR_USB_ERROR_OFFSET + 0x03;
7const BXR_USB_STALL_PID: u32 = BXR_USB_ERROR_OFFSET + 0x04;
8const BXR_USB_DEV_NOT_RESPONDING: u32 = BXR_USB_ERROR_OFFSET + 0x05;
9const BXR_USB_PID_CHECK_FAILURE: u32 = BXR_USB_ERROR_OFFSET + 0x06;
10const BXR_USB_UNEXPECTED_PID: u32 = BXR_USB_ERROR_OFFSET + 0x07;
11const BXR_USB_DATA_OVERRUN: u32 = BXR_USB_ERROR_OFFSET + 0x08;
12const BXR_USB_DATA_UNDERRUN: u32 = BXR_USB_ERROR_OFFSET + 0x09;
13const BXR_USB_BUFFER_OVERRUN: u32 = BXR_USB_ERROR_OFFSET + 0x0C;
14const BXR_USB_BUFFER_UNDERRUN: u32 = BXR_USB_ERROR_OFFSET + 0x0D;
15const BXR_USB_NOT_ACCESSED: u32 = BXR_USB_ERROR_OFFSET + 0x0F;
16const BXR_USB_FIFO: u32 = BXR_USB_ERROR_OFFSET + 0x10;
17const BXR_USB_ENDPOINT_HALTED: u32 = BXR_USB_ERROR_OFFSET + 0x30;
18const BXR_USB_NO_MEMORY: u32 = BXR_USB_ERROR_OFFSET + 0x100;
19const BXR_USB_INVALID_URB_FUNCTION: u32 = BXR_USB_ERROR_OFFSET + 0x101;
20const BXR_USB_INVALID_PARAMETER: u32 = BXR_USB_ERROR_OFFSET + 0x102;
21const BXR_USB_ERROR_BUSY: u32 = BXR_USB_ERROR_OFFSET + 0x103;
22const BXR_USB_REQUEST_FAILED: u32 = BXR_USB_ERROR_OFFSET + 0x104;
23const BXR_USB_INVALID_PIPE_HANDLE: u32 = BXR_USB_ERROR_OFFSET + 0x105;
24const BXR_USB_NO_BANDWIDTH: u32 = BXR_USB_ERROR_OFFSET + 0x106;
25const BXR_USB_INTERNAL_HC_ERROR: u32 = BXR_USB_ERROR_OFFSET + 0x107;
26const BXR_USB_ERROR_SHORT_TRANSFER: u32 = BXR_USB_ERROR_OFFSET + 0x108;
27const BXR_USB_BAD_START_FRAME: u32 = BXR_USB_ERROR_OFFSET + 0x109;
28const BXR_USB_ISOCH_REQUEST_FAILED: u32 = BXR_USB_ERROR_OFFSET + 0x10A;
29const BXR_USB_FRAME_CONTROL_OWNED: u32 = BXR_USB_ERROR_OFFSET + 0x10B;
30const BXR_USB_FRAME_CONTROL_NOT_OWNED: u32 = BXR_USB_ERROR_OFFSET + 0x10C;
31const BXR_USB_CANCELED: u32 = BXR_USB_ERROR_OFFSET + 0x200;
32const BXR_USB_CANCELING: u32 = BXR_USB_ERROR_OFFSET + 0x201;
33const BXR_USB_ALREADY_CONFIGURED: u32 = BXR_USB_ERROR_OFFSET + 0x202;
34const BXR_USB_UNCONFIGURED: u32 = BXR_USB_ERROR_OFFSET + 0x203;
35const BXR_USB_NO_SUCH_DEVICE: u32 = BXR_USB_ERROR_OFFSET + 0x204;
36const BXR_USB_DEVICE_NOT_FOUND: u32 = BXR_USB_ERROR_OFFSET + 0x205;
37const BXR_USB_NOT_SUPPORTED: u32 = BXR_USB_ERROR_OFFSET + 0x206;
38const BXR_USB_IO_PENDING: u32 = BXR_USB_ERROR_OFFSET + 0x207;
39const BXR_USB_IO_TIMEOUT: u32 = BXR_USB_ERROR_OFFSET + 0x208;
40const BXR_USB_DEVICE_REMOVED: u32 = BXR_USB_ERROR_OFFSET + 0x209;
41const BXR_USB_PIPE_NOT_LINKED: u32 = BXR_USB_ERROR_OFFSET + 0x20A;
42const BXR_USB_CONNECTED_PIPES: u32 = BXR_USB_ERROR_OFFSET + 0x20B;
43const BXR_USB_DEVICE_LOCKED: u32 = BXR_USB_ERROR_OFFSET + 0x20C;
44
45#[repr(u32)]
47#[derive(Clone, Copy, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
48pub enum UsbError {
49 CRC = BXR_USB_CRC,
50 BTStuff = BXR_USB_BTSTUFF,
51 DataToggleMismatch = BXR_USB_DATA_TOGGLE_MISMATCH,
52 StallPid = BXR_USB_STALL_PID,
53 DevNotResponding = BXR_USB_DEV_NOT_RESPONDING,
54 PidCheckFailure = BXR_USB_PID_CHECK_FAILURE,
55 UnexpectedPid = BXR_USB_UNEXPECTED_PID,
56 DataOverrun = BXR_USB_DATA_OVERRUN,
57 DataUnderrun = BXR_USB_DATA_UNDERRUN,
58 BufferOverrun = BXR_USB_BUFFER_OVERRUN,
59 BufferUnderrun = BXR_USB_BUFFER_UNDERRUN,
60 NotAccessed = BXR_USB_NOT_ACCESSED,
61 Fifo = BXR_USB_FIFO,
62 EndpointHalted = BXR_USB_ENDPOINT_HALTED,
63 NoMemory = BXR_USB_NO_MEMORY,
64 InvalidUrbFunction = BXR_USB_INVALID_URB_FUNCTION,
65 InvalidParameter = BXR_USB_INVALID_PARAMETER,
66 ErrorBusy = BXR_USB_ERROR_BUSY,
67 RequestFailed = BXR_USB_REQUEST_FAILED,
68 InvalidPipeHandle = BXR_USB_INVALID_PIPE_HANDLE,
69 NoBandwidth = BXR_USB_NO_BANDWIDTH,
70 InternalHcError = BXR_USB_INTERNAL_HC_ERROR,
71 ErrorShortTransfer = BXR_USB_ERROR_SHORT_TRANSFER,
72 BadStartFrame = BXR_USB_BAD_START_FRAME,
73 IsochRequestFailed = BXR_USB_ISOCH_REQUEST_FAILED,
74 FrameControlOwned = BXR_USB_FRAME_CONTROL_OWNED,
75 FrameControlNotOwned = BXR_USB_FRAME_CONTROL_NOT_OWNED,
76 Canceled = BXR_USB_CANCELED,
77 Canceling = BXR_USB_CANCELING,
78 AlreadyConfigured = BXR_USB_ALREADY_CONFIGURED,
79 Unconfigured = BXR_USB_UNCONFIGURED,
80 NoSuchDevice = BXR_USB_NO_SUCH_DEVICE,
81 DeviceNotFound = BXR_USB_DEVICE_NOT_FOUND,
82 NotSupported = BXR_USB_NOT_SUPPORTED,
83 IoPending = BXR_USB_IO_PENDING,
84 IoTimeout = BXR_USB_IO_TIMEOUT,
85 DeviceRemoved = BXR_USB_DEVICE_REMOVED,
86 PipeNotLinked = BXR_USB_PIPE_NOT_LINKED,
87 ConnectedPipes = BXR_USB_CONNECTED_PIPES,
88 DeviceLocked = BXR_USB_DEVICE_LOCKED,
89}
90
91impl From<u32> for UsbError {
92 fn from(val: u32) -> Self {
93 match val {
94 BXR_USB_CRC => Self::CRC,
95 BXR_USB_BTSTUFF => Self::BTStuff,
96 BXR_USB_DATA_TOGGLE_MISMATCH => Self::DataToggleMismatch,
97 BXR_USB_STALL_PID => Self::StallPid,
98 BXR_USB_DEV_NOT_RESPONDING => Self::DevNotResponding,
99 BXR_USB_PID_CHECK_FAILURE => Self::PidCheckFailure,
100 BXR_USB_UNEXPECTED_PID => Self::UnexpectedPid,
101 BXR_USB_DATA_OVERRUN => Self::DataOverrun,
102 BXR_USB_DATA_UNDERRUN => Self::DataUnderrun,
103 BXR_USB_BUFFER_OVERRUN => Self::BufferOverrun,
104 BXR_USB_BUFFER_UNDERRUN => Self::BufferUnderrun,
105 BXR_USB_NOT_ACCESSED => Self::NotAccessed,
106 BXR_USB_FIFO => Self::Fifo,
107 BXR_USB_ENDPOINT_HALTED => Self::EndpointHalted,
108 BXR_USB_NO_MEMORY => Self::NoMemory,
109 BXR_USB_INVALID_URB_FUNCTION => Self::InvalidUrbFunction,
110 BXR_USB_INVALID_PARAMETER => Self::InvalidParameter,
111 BXR_USB_ERROR_BUSY => Self::ErrorBusy,
112 BXR_USB_REQUEST_FAILED => Self::RequestFailed,
113 BXR_USB_INVALID_PIPE_HANDLE => Self::InvalidPipeHandle,
114 BXR_USB_NO_BANDWIDTH => Self::NoBandwidth,
115 BXR_USB_INTERNAL_HC_ERROR => Self::InternalHcError,
116 BXR_USB_ERROR_SHORT_TRANSFER => Self::ErrorShortTransfer,
117 BXR_USB_BAD_START_FRAME => Self::BadStartFrame,
118 BXR_USB_ISOCH_REQUEST_FAILED => Self::IsochRequestFailed,
119 BXR_USB_FRAME_CONTROL_OWNED => Self::FrameControlOwned,
120 BXR_USB_FRAME_CONTROL_NOT_OWNED => Self::FrameControlNotOwned,
121 BXR_USB_CANCELED => Self::Canceled,
122 BXR_USB_CANCELING => Self::Canceling,
123 BXR_USB_ALREADY_CONFIGURED => Self::AlreadyConfigured,
124 BXR_USB_UNCONFIGURED => Self::Unconfigured,
125 BXR_USB_NO_SUCH_DEVICE => Self::NoSuchDevice,
126 BXR_USB_DEVICE_NOT_FOUND => Self::DeviceNotFound,
127 BXR_USB_NOT_SUPPORTED => Self::NotSupported,
128 BXR_USB_IO_PENDING => Self::IoPending,
129 BXR_USB_IO_TIMEOUT => Self::IoTimeout,
130 BXR_USB_DEVICE_REMOVED => Self::DeviceRemoved,
131 BXR_USB_PIPE_NOT_LINKED => Self::PipeNotLinked,
132 BXR_USB_CONNECTED_PIPES => Self::ConnectedPipes,
133 BXR_USB_DEVICE_LOCKED => Self::DeviceLocked,
134 _ => Self::NotSupported,
135 }
136 }
137}
138
139impl From<UsbError> for u32 {
140 fn from(err: UsbError) -> Self {
141 err as u32
142 }
143}
144
145impl From<&UsbError> for u32 {
146 fn from(err: &UsbError) -> Self {
147 (*err).into()
148 }
149}
150
151impl From<UsbError> for &'static str {
152 fn from(err: UsbError) -> Self {
153 match err {
154 UsbError::CRC => "CRC",
155 UsbError::BTStuff => "BTStuff",
156 UsbError::DataToggleMismatch => "DataToggleMismatch",
157 UsbError::StallPid => "StallPid",
158 UsbError::DevNotResponding => "DevNotResponding",
159 UsbError::PidCheckFailure => "PidCheckFailure",
160 UsbError::UnexpectedPid => "UnexpectedPid",
161 UsbError::DataOverrun => "DataOverrun",
162 UsbError::DataUnderrun => "DataUnderrun",
163 UsbError::BufferOverrun => "BufferOverrun",
164 UsbError::BufferUnderrun => "BufferUnderrun",
165 UsbError::NotAccessed => "NotAccessed",
166 UsbError::Fifo => "Fifo",
167 UsbError::EndpointHalted => "EndpointHalted",
168 UsbError::NoMemory => "NoMemory",
169 UsbError::InvalidUrbFunction => "InvalidUrbFunction",
170 UsbError::InvalidParameter => "InvalidParameter",
171 UsbError::ErrorBusy => "ErrorBusy",
172 UsbError::RequestFailed => "RequestFailed",
173 UsbError::InvalidPipeHandle => "InvalidPipeHandle",
174 UsbError::NoBandwidth => "NoBandwidth",
175 UsbError::InternalHcError => "InternalHcError",
176 UsbError::ErrorShortTransfer => "ErrorShortTransfer",
177 UsbError::BadStartFrame => "BadStartFrame",
178 UsbError::IsochRequestFailed => "IsochRequestFailed",
179 UsbError::FrameControlOwned => "FrameControlOwned",
180 UsbError::FrameControlNotOwned => "FrameControlNotOwned",
181 UsbError::Canceled => "Canceled",
182 UsbError::Canceling => "Canceling",
183 UsbError::AlreadyConfigured => "AlreadyConfigured",
184 UsbError::Unconfigured => "Unconfigured",
185 UsbError::NoSuchDevice => "NoSuchDevice",
186 UsbError::DeviceNotFound => "DeviceNotFound",
187 UsbError::NotSupported => "NotSupported",
188 UsbError::IoPending => "IoPending",
189 UsbError::IoTimeout => "IoTimeout",
190 UsbError::DeviceRemoved => "DeviceRemoved",
191 UsbError::PipeNotLinked => "PipeNotLinked",
192 UsbError::ConnectedPipes => "ConnectedPipes",
193 UsbError::DeviceLocked => "DeviceLocked",
194 }
195 }
196}
197
198impl From<&UsbError> for &'static str {
199 fn from(err: &UsbError) -> Self {
200 (*err).into()
201 }
202}
203
204impl fmt::Display for UsbError {
205 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
206 write!(f, r#""{}""#, <&str>::from(self))
207 }
208}