@@ -101,6 +101,29 @@ static IRQn_Type usb_irqn(int index)
101101extern " C" usb_status_t _USB_DeviceNotificationTrigger (void * handle, void * msg);
102102#endif
103103
104+ static constexpr c2usb::result to_result (usb_status_t status)
105+ {
106+ switch (status)
107+ {
108+ case kStatus_USB_Success :
109+ return c2usb::result::ok;
110+ case kStatus_USB_Error :
111+ return std::errc::io_error;
112+ case kStatus_USB_Busy :
113+ return std::errc::device_or_resource_busy;
114+ case kStatus_USB_InvalidHandle :
115+ return std::errc::no_such_device;
116+ case kStatus_USB_ControllerNotFound :
117+ return std::errc::no_such_device_or_address;
118+ case kStatus_USB_InvalidParameter :
119+ return std::errc::invalid_argument;
120+ case kStatus_USB_InvalidRequest :
121+ return std::errc::operation_not_supported;
122+ default :
123+ return std::errc::function_not_supported;
124+ }
125+ }
126+
104127void mcux_mac::init (const speeds& speeds)
105128{
106129#if CONFIG_C2USB_MCUX_USB_COEXISTENCE
@@ -123,32 +146,29 @@ void mcux_mac::deinit()
123146
124147bool mcux_mac::set_attached (bool attached)
125148{
126- driver_.device_control (handle (), attached ? kUSB_DeviceControlRun : kUSB_DeviceControlStop );
149+ [[maybe_unused]] auto status =
150+ driver_.device_control (handle (), attached ? kUSB_DeviceControlRun : kUSB_DeviceControlStop );
151+ assert (status == kStatus_USB_Success );
127152 return attached;
128153}
129154
130155usb::result mcux_mac::signal_remote_wakeup ()
131156{
132- auto status = driver_.device_control (handle (), kUSB_DeviceControlResume );
133- switch (status)
134- {
135- case kStatus_USB_Success :
136- return usb::result::ok;
137- default :
138- return usb::result::io_error;
139- }
157+ return to_result (driver_.device_control (handle (), kUSB_DeviceControlResume ));
140158}
141159
142160void mcux_mac::set_address_early ()
143161{
144- driver_.device_control (handle (), kUSB_DeviceControlPreSetDeviceAddress ,
145- &request ().wValue .low_byte ());
162+ [[maybe_unused]] auto status = driver_.device_control (
163+ handle (), kUSB_DeviceControlPreSetDeviceAddress , &request ().wValue .low_byte ());
164+ assert (status == kStatus_USB_Success );
146165}
147166
148167void mcux_mac::set_address_timely ()
149168{
150- driver_.device_control (handle (), kUSB_DeviceControlSetDeviceAddress ,
151- &request ().wValue .low_byte ());
169+ [[maybe_unused]] auto status = driver_.device_control (
170+ handle (), kUSB_DeviceControlSetDeviceAddress , &request ().wValue .low_byte ());
171+ assert (status == kStatus_USB_Success );
152172}
153173
154174usb::speed mcux_mac::speed () const
@@ -178,7 +198,9 @@ void mcux_mac::control_ep_open()
178198void mcux_mac::control_ep_stall ()
179199{
180200 auto addr = endpoint::address::control_out ();
181- driver_.device_control (handle (), kUSB_DeviceControlEndpointStall , &addr);
201+ [[maybe_unused]] auto status =
202+ driver_.device_control (handle (), kUSB_DeviceControlEndpointStall , &addr);
203+ assert (status == kStatus_USB_Success );
182204}
183205
184206bool mcux_mac::ep_init (usb::endpoint::address addr, usb::endpoint::type type, uint16_t mps,
@@ -211,9 +233,8 @@ usb::result mcux_mac::ep_send(ep_handle eph, const std::span<const uint8_t>& dat
211233 {
212234 return usb::result::device_or_resource_busy;
213235 }
214- auto status =
215- driver_.deviceSend (handle (), addr, const_cast <uint8_t *>(data.data ()), data.size ());
216- return (status == kStatus_USB_Success ) ? usb::result::ok : usb::result::not_connected;
236+ return to_result (
237+ driver_.deviceSend (handle (), addr, const_cast <uint8_t *>(data.data ()), data.size ()));
217238}
218239
219240usb::result mcux_mac::ep_receive (ep_handle eph, const std::span<uint8_t >& data)
@@ -223,24 +244,23 @@ usb::result mcux_mac::ep_receive(ep_handle eph, const std::span<uint8_t>& data)
223244 {
224245 return usb::result::device_or_resource_busy;
225246 }
226- auto status = driver_.deviceRecv (handle (), addr, data.data (), data.size ());
227- return (status == kStatus_USB_Success ) ? usb::result::ok : usb::result::not_connected;
247+ return to_result (driver_.deviceRecv (handle (), addr, data.data (), data.size ()));
228248}
229249
230250usb::result mcux_mac::ep_cancel (ep_handle eph)
231251{
232252 auto addr = ep_handle_to_address (eph);
233- auto status = driver_.deviceCancel (handle (), addr);
234- busy_flags_.clear (addr);
235- return (status == kStatus_USB_Success ) ? usb::result::ok : usb::result::not_connected;
253+ return to_result (driver_.deviceCancel (handle (), addr));
236254}
237255
238- usb::result mcux_mac::ep_close (ep_handle eph)
256+ usb::result mcux_mac::ep_close (ep_handle& eph)
239257{
240258 auto addr = ep_handle_to_address (eph);
241- auto status = driver_.device_control (handle (), kUSB_DeviceControlEndpointDeinit , &addr);
242- busy_flags_.clear (addr);
243- return (status == kStatus_USB_Success ) ? usb::result::ok : usb::result::not_connected;
259+ eph = {};
260+ auto result =
261+ to_result (driver_.device_control (handle (), kUSB_DeviceControlEndpointDeinit , &addr));
262+ // busy flag is cleared in cancel callback
263+ return result;
244264}
245265
246266bool mcux_mac::ep_is_stalled (ep_handle eph) const
@@ -269,10 +289,6 @@ void mcux_mac::process_ep_notification(const _usb_device_callback_message_struct
269289 {
270290 // wrong mapping
271291 }
272- else if (message.length == UINT32_MAX )
273- {
274- // callback due to ep_cancel()
275- }
276292 else if (addr.number () == 0 )
277293 {
278294 transfer t{};
@@ -328,11 +344,13 @@ void mcux_mac::process_ep_notification(const _usb_device_callback_message_struct
328344 (t.size () == 0 )); // work around bug in NXP code
329345 }
330346 }
331- else
347+ else // other endpoints
332348 {
333349 busy_flags_.clear (addr);
334- ep_transfer_complete (addr, create_ep_handle (addr),
335- transfer (message.buffer , message.length ));
350+
351+ bool success = (message.length != USB_CANCELLED_TRANSFER_LENGTH );
352+ ep_transfer_complete (addr, transfer (message.buffer , message.length * success, success,
353+ ep_address_to_handle (addr)));
336354 }
337355}
338356
0 commit comments