Page 1 of 2

USB stall error

Posted: Wed Apr 27, 2022 2:26 pm
by Viljami
Hello!

If a USB stall error occurs is there any common procedure to clear/solve it?

Re: USB stall error

Posted: Wed Apr 27, 2022 2:51 pm
by Giovanni
Hi,

It depends on the cause of the stall, if it is an unimplemented command then you need to implement the command handler (not all CDC commands are implemented by default).

Giovanni

Re: USB stall error

Posted: Wed Apr 27, 2022 3:04 pm
by Viljami
Giovanni wrote:Hi,

It depends on the cause of the stall, if it is an unimplemented command then you need to implement the command handler (not all CDC commands are implemented by default).

Giovanni


Hello Giovanni and thanks for your quick response!

Could you describe causes which generate USB stalls?

BR

Viljami

Re: USB stall error

Posted: Wed Apr 27, 2022 4:10 pm
by Giovanni
Find all instances of "usb_lld_stall" in hal_usb.c, those are all the possible causes, mainly are unimplemented EP0 commands.

Giovanni

Re: USB stall error

Posted: Tue May 03, 2022 7:57 am
by Viljami
Giovanni wrote:Find all instances of "usb_lld_stall" in hal_usb.c, those are all the possible causes, mainly are unimplemented EP0 commands.

Giovanni


Hello again!

Could you mention USB limitations? I am working with ChibiOS RT version 21.11.1.

BR

Viljami

Re: USB stall error

Posted: Tue May 03, 2022 10:18 am
by Giovanni
Simply you have to implement the EP0 commands you need, there are no intrinsic limitations.

See the "requests_hook_cb" callback in the USBConfig structure. An example of commands implementation is in sduRequestsHook() into hal_serial_usb.c.

It is complex matter, knowledge of USB spec is required. Non answering to a command causes those stalls.

Giovanni

Re: USB stall error

Posted: Thu Aug 25, 2022 12:09 pm
by Viljami
Hello again!

I want tell more about this stall error.

I have a ChibiOS based system which applies my own defined messages. I apply bulk transfer in my system. My system is capable to handle (receive and transmit) the first my own defined USB message but second one fails because of the stall error. A function bool requestsHook(USBDriver *usbp) was an empty implementation which just returned FALSE.

The next step was to debug and implement code for ep0 into bool requestsHook(USBDriver *usbp). I noticed that bool requestsHook(USBDriver *usbp) receives

    * USB_REQ_SET_ADDRESS
    * USB_REQ_SET_CONFIGURATION
    * USB_REQ_GET_DESCRIPTOR

The implemented code did not solve my problem; the earlier stall problem still occurs (the first my own defined USB message is received and transmitted successfully but the second one fails because of the stall error).

Here is the code:

Code: Select all

bool requestsHook(USBDriver *usbp) {
    // (void) usbp;

    if ((usbp->setup[0] & USB_RTYPE_DIR_MASK) == USB_RTYPE_DIR_HOST2DEV)
    {
        if (usbp->setup[1] == USB_REQ_SET_ADDRESS)
        {
            set_address(usbp);
            usbSetupTransfer(usbp, NULL, 0, NULL);
            return true;
        }
        else if (usbp->setup[1] == USB_REQ_SET_CONFIGURATION)
        {
            if (usbp->configuration != usbp->setup[2])
            {
                /* If the USB device is already active then we have to perform the clear
                   procedure on the current configuration.*/
                if (usbp->state == USB_ACTIVE)
                {
                  /* Current configuration cleared.*/
                  osalSysLockFromISR ();
                  usbDisableEndpointsI(usbp);
                  osalSysUnlockFromISR ();
                  usbp->configuration = 0U;
                  usbp->state = USB_SELECTED;
                  _usb_isr_invoke_event_cb(usbp, USB_EVENT_UNCONFIGURED);
                }
                if (usbp->setup[2] != 0U)
                {
                  /* New configuration.*/
                  usbp->configuration = usbp->setup[2];
                  usbp->state = USB_ACTIVE;
                  _usb_isr_invoke_event_cb(usbp, USB_EVENT_CONFIGURED);
                }
            }
            usbSetupTransfer(usbp, NULL, 0, NULL);
            return true;
        }
    }
    else if ((usbp->setup[0] & USB_RTYPE_DIR_MASK) == USB_RTYPE_DIR_DEV2HOST)
    {
        if (usbp->setup[1] == USB_REQ_GET_DESCRIPTOR)
        {
            const USBDescriptor *dp = usbp->config->get_descriptor_cb(usbp, usbp->setup[3],
                                                                      usbp->setup[2],
                                                                      get_hword(&usbp->setup[4]));
            if (dp == NULL)
            {
                return false;
            }

            usbSetupTransfer(usbp, (uint8_t *)dp->ud_string, dp->ud_size, NULL);
            return true;
        }
    }

    return FALSE;
}


BR

Viljami

Re: USB stall error

Posted: Thu Aug 25, 2022 1:04 pm
by Giovanni
Hi,

You are not supposed to process default messages in that handler (USB_REQ_SET_CONFIGURATION, USB_REQ_SET_ADDRESS etc), those are processed in the driver if your installed handler returns false.

Just handle your messages and return true, else return false and the driver will handle default ones, the stall only occurs if both your handle AND the default handler do not recognize some message.

Giovanni

Re: USB stall error

Posted: Thu Aug 25, 2022 1:56 pm
by Viljami
Hello again Giovanni!

As I mentioned in the previous mail

I noticed that bool requestsHook(USBDriver *usbp) receives

* USB_REQ_SET_ADDRESS
* USB_REQ_SET_CONFIGURATION
* USB_REQ_GET_DESCRIPTOR


were the only messages what I catched by debugging; I did not see any my own USB messages in bool requestsHook(USBDriver *usbp).

BR

Viljami

Re: USB stall error

Posted: Thu Aug 25, 2022 7:32 pm
by Giovanni
Hi,

Is it possible your descriptor is wrong somehow? it happens after the host retrieves it.

Giovanni