diff --git a/src/device/usbd.c b/src/device/usbd.c index b79ccae2..17914fb6 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -104,7 +104,6 @@ static usbd_class_driver_t const usbd_class_drivers[] = }, #endif - #if CFG_TUD_HID { .class_code = TUSB_CLASS_HID, @@ -243,10 +242,12 @@ void tud_task (void) switch ( event.event_id ) { case DCD_EVENT_SETUP_RECEIVED: - // Process control request, if failed control endpoint is stalled + // Process control request if ( !process_control_request(event.rhport, &event.setup_received) ) { - usbd_control_stall(event.rhport); + // Failed -> stall both control endpoint IN and OUT + dcd_edpt_stall(event.rhport, 0); + dcd_edpt_stall(event.rhport, 0 | TUSB_DIR_IN_MASK); } break; diff --git a/src/device/usbd.h b/src/device/usbd.h index e8f3f2bc..614b4f31 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -74,10 +74,10 @@ void tud_task (void); // APPLICATION CALLBACK (WEAK is optional) //--------------------------------------------------------------------+ -/** Callback invoked when device is mounted (configured) */ +// Callback invoked when device is mounted (configured) ATTR_WEAK void tud_mount_cb(void); -/** Callback invoked when device is unmounted (bus reset/unplugged) */ +// Callback invoked when device is unmounted (bus reset/unplugged) ATTR_WEAK void tud_umount_cb(void); //void tud_device_suspended_cb(void); diff --git a/src/device/usbd_control.c b/src/device/usbd_control.c index 094d2fb4..d907aca3 100644 --- a/src/device/usbd_control.c +++ b/src/device/usbd_control.c @@ -60,13 +60,6 @@ void usbd_control_reset (uint8_t rhport) tu_varclr(&_control_state); } -void usbd_control_stall(uint8_t rhport) -{ - // when stalling control endpoint both IN and OUt will be stalled - dcd_edpt_stall(rhport, EDPT_CTRL_OUT); - dcd_edpt_stall(rhport, EDPT_CTRL_IN); -} - bool usbd_control_status(uint8_t rhport, tusb_control_request_t const * request) { // status direction is reversed to one in the setup packet @@ -147,8 +140,9 @@ bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result TU_ASSERT( usbd_control_status(rhport, &_control_state.request) ); }else { - // stall due to callback - usbd_control_stall(rhport); + // Stall both IN and OUT control endpoint + dcd_edpt_stall(rhport, EDPT_CTRL_OUT); + dcd_edpt_stall(rhport, EDPT_CTRL_IN); } } else diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h index dee194f0..dab67581 100644 --- a/src/device/usbd_pvt.h +++ b/src/device/usbd_pvt.h @@ -49,10 +49,6 @@ bool usbd_control_xfer(uint8_t rhport, tusb_control_request_t const * request, v // Send STATUS (zero length) packet bool usbd_control_status(uint8_t rhport, tusb_control_request_t const * request); -// Stall control endpoint (both IN and OUT) until new setup packet arrived -void usbd_control_stall(uint8_t rhport); - - void usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr); void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr); bool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr);