Skip to main content
Visitor II
July 25, 2024
Solved

USBX, Detect cable disconnected.

  • July 25, 2024
  • 1 reply
  • 785 views

I am running the "Ux_Device_HID_CDC_ACM" example project on a NUCLEO-H563ZI board.

The example runs without issues, i can attach and remove the usb cable and the mouse connection appears and disappear.

The issue is that the USB-stack does not seem to detect that the usb-cable is removed. When I hit the button to move the mouse pointer when the cable is removed the mouse movements que up in the stack and when i attach the cable again the mouse pointer moves the queued movements. This also happen in VCP part of the example. Messages queue up and are transmitted when the cable is attached again.

This is not ok. My real system needs to know when the cable is removed so that actions do not queue up in the stack.

The actual cable disconnection is not the problem, i can think of several ways to detect this. 

 

The question:

How do I bring down the USB stack in a proper way so that messages are not queued up in the stack?

 

    This topic has been closed for replies.
    Best answer by FBL

    Hi @Henrik76 

    You can handle disconnection event in 

    void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
    {
     // Stop USB device
     USBD_Stop(&hUsbDeviceFS);
     // Deinitialize USB device
     USBD_DeInit(&hUsbDeviceFS);
    }

    Otherwise, you can use USBPD stack with no Power Delivery, under usbpd_dpm_core.c, callback reporting events on a specified port from CAD layer.

    void USBPD_DPM_CADCallback(uint8_t PortNum, USBPD_CAD_EVENT State, CCxPin_TypeDef Cc)
    {
    #ifdef _TRACE
     USBPD_TRACE_Add(USBPD_TRACE_CADEVENT, PortNum, (uint8_t)State, NULL, 0);
    #endif /* _TRACE */
    
     switch (State)
     {
    #if defined(USBPDCORE_VPD)
     case USPPD_CAD_EVENT_VPD :
    #endif /* USBPDCORE_VPD */
     case USBPD_CAD_EVENT_ATTEMC :
     case USBPD_CAD_EVENT_ATTACHED :
     {
     USBPD_DPM_UserCableDetection(PortNum, State);
     USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_START);
     break;
     }
     case USBPD_CAD_EVENT_DETACHED :
     case USBPD_CAD_EVENT_EMC :
     {
     USBPD_DPM_UserCableDetection(PortNum, State);
     USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_STOP);
     break;
     }
     default :
     /* nothing to do */
     break;
     }
    }

     

    1 reply

    FBLAnswer
    Technical Moderator
    September 12, 2024

    Hi @Henrik76 

    You can handle disconnection event in 

    void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
    {
     // Stop USB device
     USBD_Stop(&hUsbDeviceFS);
     // Deinitialize USB device
     USBD_DeInit(&hUsbDeviceFS);
    }

    Otherwise, you can use USBPD stack with no Power Delivery, under usbpd_dpm_core.c, callback reporting events on a specified port from CAD layer.

    void USBPD_DPM_CADCallback(uint8_t PortNum, USBPD_CAD_EVENT State, CCxPin_TypeDef Cc)
    {
    #ifdef _TRACE
     USBPD_TRACE_Add(USBPD_TRACE_CADEVENT, PortNum, (uint8_t)State, NULL, 0);
    #endif /* _TRACE */
    
     switch (State)
     {
    #if defined(USBPDCORE_VPD)
     case USPPD_CAD_EVENT_VPD :
    #endif /* USBPDCORE_VPD */
     case USBPD_CAD_EVENT_ATTEMC :
     case USBPD_CAD_EVENT_ATTACHED :
     {
     USBPD_DPM_UserCableDetection(PortNum, State);
     USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_START);
     break;
     }
     case USBPD_CAD_EVENT_DETACHED :
     case USBPD_CAD_EVENT_EMC :
     {
     USBPD_DPM_UserCableDetection(PortNum, State);
     USBPD_DPM_Notification(PortNum, USBPD_NOTIFY_USBSTACK_STOP);
     break;
     }
     default :
     /* nothing to do */
     break;
     }
    }