Hi, I have a question on libopencm3-examples\examples\stm32\f1\lisa-m-1\usb_hid\usbhid.c .
It defines static enum usbd_request_return_codes dfu_control_request( usbd_device *dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void (**complete)(usbd_device *dev, struct usb_setup_data *req)) { (void)buf; (void)len; (void)dev; if ((req->bmRequestType != 0x21) || (req->bRequest != DFU_DETACH)) return USBD_REQ_NOTSUPP; /* Only accept class request. */ *complete = dfu_detach_complete; return USBD_REQ_HANDLED; } Which is registered in USBD using usbd_register_control_callback( dev, USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, dfu_control_request); My question is, why does dfu_control_request() check bmRequestType with "if ((req->bmRequestType != 0x21)" ? usb_control_request_dispatch() filters requests on the registered request-type using "if ((req->bmRequestType & cb[i].type_mask) == cb[i].type)" So the check in dfu_control_request() is redundant and just confusing for the reader. It would be nice if the callback typedefs in libopencm3/include/libopencm3/usb/usbd.h Had the same kind of doxygen declaration as the other functions. This would most Likely eliminate these kind of misunderstandings of what the presumptions of the callback was. Kind regards Mats Webjörn Tel +46 8 584 238 80 Webjörn IngenjörsKonsult AB Mobil +46 70 639 16 99 Solhemsbackarna 75A SE-163 56 SPÅNGA Sweden
_______________________________________________ libopencm3-devel mailing list libopencm3-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libopencm3-devel