diff --git a/sys/include/usb/usbus.h b/sys/include/usb/usbus.h index 982b29a8ae..008a6ac7ad 100644 --- a/sys/include/usb/usbus.h +++ b/sys/include/usb/usbus.h @@ -137,17 +137,18 @@ typedef enum { } usbus_state_t; /** - * @brief USBUS setup request state machine + * @brief USBUS control request state machine */ typedef enum { - USBUS_SETUPRQ_READY, /**< Ready for new setup request */ - USBUS_SETUPRQ_INDATA, /**< Request received with expected DATA IN stage */ - USBUS_SETUPRQ_OUTACK, /**< Expecting a zero-length ack out request - from the host */ - USBUS_SETUPRQ_OUTDATA, /**< Data OUT expected */ - USBUS_SETUPRQ_INACK, /**< Expecting a zero-length ack in request - from the host */ -} usbus_setuprq_state_t; + USBUS_CONTROL_REQUEST_STATE_READY, /**< Ready for new control request */ + USBUS_CONTROL_REQUEST_STATE_INDATA, /**< Request received with expected + DATA IN stage */ + USBUS_CONTROL_REQUEST_STATE_OUTACK, /**< Expecting a zero-length ack OUT + request from the host */ + USBUS_CONTROL_REQUEST_STATE_OUTDATA, /**< Data OUT expected */ + USBUS_CONTROL_REQUEST_STATE_INACK, /**< Expecting a zero-length ack IN + request from the host */ +} usbus_control_request_state_t; /** * @brief USBUS string type @@ -314,13 +315,13 @@ typedef struct usbus_handler_driver { usbdev_ep_t *ep, usbus_event_transfer_t event); /** - * @brief setup request handler function + * @brief control request handler function * - * This function receives USB setup requests from the USBUS stack. + * This function receives USB control requests from the USBUS stack. * * @param usbus USBUS context * @param handler handler context - * @param state setup request state + * @param state control request state * @param setup setup packet * * @return Size of the returned data when the request is handled @@ -328,8 +329,9 @@ typedef struct usbus_handler_driver { * host * @return zero when the request is not handled by this handler */ - int (*setup_handler)(usbus_t * usbus, struct usbus_handler *handler, - usbus_setuprq_state_t state, usb_setup_t *request); + int (*control_handler)(usbus_t * usbus, struct usbus_handler *handler, + usbus_control_request_state_t state, + usb_setup_t *request); } usbus_handler_driver_t; /** diff --git a/sys/include/usb/usbus/cdc/ecm.h b/sys/include/usb/usbus/cdc/ecm.h index c74920f59e..e3a51ea811 100644 --- a/sys/include/usb/usbus/cdc/ecm.h +++ b/sys/include/usb/usbus/cdc/ecm.h @@ -28,6 +28,7 @@ #include "net/ethernet/hdr.h" #include "usb/descriptor.h" #include "usb/usbus.h" +#include "usb/usbus/control.h" #include "net/netdev.h" #include "mutex.h" diff --git a/sys/include/usb/usbus/control.h b/sys/include/usb/usbus/control.h index cdf1cb9552..f1293ebed8 100644 --- a/sys/include/usb/usbus/control.h +++ b/sys/include/usb/usbus/control.h @@ -43,13 +43,36 @@ typedef struct { * @brief Endpoint zero event handler */ typedef struct { - usbus_handler_t handler; /**< Inherited generic handler */ - usb_setup_t setup; /**< Last received setup packet */ - usbus_setuprq_state_t setup_state; /**< Setup request state machine */ - usbus_control_slicer_t slicer; /**< Slicer for multipart control - messages */ - usbdev_ep_t *out; /**< EP0 out endpoint */ - usbdev_ep_t *in; /**< EP0 in endpoint */ + + /** + * @brief inherited generic handler + */ + usbus_handler_t handler; + + /** + * @brief Last received setup packet + */ + usb_setup_t setup; + + /** + * @brief Control request state machine state + */ + usbus_control_request_state_t control_request_state; + + /** + * @brief Slicer state for multipart control request messages + */ + usbus_control_slicer_t slicer; + + /** + * @brief EP0 OUT endpoint + */ + usbdev_ep_t *out; + + /** + * @brief EP0 IN endpoint + */ + usbdev_ep_t *in; } usbus_control_handler_t; /** diff --git a/sys/usb/usbus/cdc/ecm/cdc_ecm.c b/sys/usb/usbus/cdc/ecm/cdc_ecm.c index 58b4c1ad1e..6b85f0eef0 100644 --- a/sys/usb/usbus/cdc/ecm/cdc_ecm.c +++ b/sys/usb/usbus/cdc/ecm/cdc_ecm.c @@ -34,8 +34,9 @@ static void _event_handler(usbus_t *usbus, usbus_handler_t *handler, usbus_event_usb_t event); -static int _setup_handler(usbus_t *usbus, usbus_handler_t *handler, - usbus_setuprq_state_t state, usb_setup_t *setup); +static int _control_handler(usbus_t *usbus, usbus_handler_t *handler, + usbus_control_request_state_t state, + usb_setup_t *setup); static void _transfer_handler(usbus_t *usbus, usbus_handler_t *handler, usbdev_ep_t *ep, usbus_event_transfer_t event); static void _init(usbus_t *usbus, usbus_handler_t *handler); @@ -147,7 +148,7 @@ static const usbus_handler_driver_t cdcecm_driver = { .init = _init, .event_handler = _event_handler, .transfer_handler = _transfer_handler, - .setup_handler = _setup_handler, + .control_handler = _control_handler, }; static void _fill_ethernet(usbus_cdcecm_device_t *cdcecm) @@ -237,8 +238,9 @@ static void _init(usbus_t *usbus, usbus_handler_t *handler) usbus_handler_set_flag(handler, USBUS_HANDLER_FLAG_RESET); } -static int _setup_handler(usbus_t *usbus, usbus_handler_t *handler, - usbus_setuprq_state_t state, usb_setup_t *setup) +static int _control_handler(usbus_t *usbus, usbus_handler_t *handler, + usbus_control_request_state_t state, + usb_setup_t *setup) { (void)usbus; (void)state; diff --git a/sys/usb/usbus/usbus_control.c b/sys/usb/usbus/usbus_control.c index 917e70d16c..17574cf137 100644 --- a/sys/usb/usbus/usbus_control.c +++ b/sys/usb/usbus/usbus_control.c @@ -241,10 +241,11 @@ static int _recv_interface_setup(usbus_t *usbus, usb_setup_t *pkt) /* Find interface handler */ for (usbus_interface_t *iface = usbus->iface; iface; iface = iface->next) { if (destination == iface->idx && - iface->handler->driver->setup_handler) { - return iface->handler->driver->setup_handler(usbus, iface->handler, - ep0_handler->setup_state, - pkt); + iface->handler->driver->control_handler) { + return iface->handler->driver->control_handler(usbus, + iface->handler, + ep0_handler->control_request_state, + pkt); } } return -1; @@ -257,15 +258,15 @@ static void _recv_setup(usbus_t *usbus, usbus_control_handler_t *handler) DEBUG("usbus_control: Received setup %x %x @ %d\n", pkt->type, pkt->request, pkt->length); if (usb_setup_is_read(pkt)) { - handler->setup_state = USBUS_SETUPRQ_INDATA; + handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_INDATA; } else { if (pkt->length) { - handler->setup_state = USBUS_SETUPRQ_OUTDATA; + handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_OUTDATA; usbdev_ep_ready(handler->out, 0); } else { - handler->setup_state = USBUS_SETUPRQ_INACK; + handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_INACK; usbdev_ep_ready(handler->in, 0); } } @@ -286,7 +287,7 @@ static void _recv_setup(usbus_t *usbus, usbus_control_handler_t *handler) static const usbopt_enable_t enable = USBOPT_ENABLE; usbdev_ep_set(handler->in, USBOPT_EP_STALL, &enable, sizeof(usbopt_enable_t)); - handler->setup_state = USBUS_SETUPRQ_READY; + handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_READY; } else if (res) { usbus_control_slicer_ready(usbus); @@ -311,7 +312,7 @@ static void _init(usbus_t *usbus, usbus_handler_t *handler) DEBUG("usbus_control: Initializing EP0\n"); usbus_control_handler_t *ep0_handler = (usbus_control_handler_t *)handler; usbus_handler_set_flag(handler, USBUS_HANDLER_FLAG_RESET); - ep0_handler->setup_state = USBUS_SETUPRQ_READY; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_READY; ep0_handler->in = usbus_add_endpoint(usbus, NULL, USB_EP_TYPE_CONTROL, USB_EP_DIR_IN, USBUS_EP0_SIZE)->ep; @@ -323,8 +324,8 @@ static int _handle_tr_complete(usbus_t *usbus, usbus_control_handler_t *ep0_handler, usbdev_ep_t *ep) { - switch (ep0_handler->setup_state) { - case USBUS_SETUPRQ_INACK: + switch (ep0_handler->control_request_state) { + case USBUS_CONTROL_REQUEST_STATE_INACK: if (ep->dir == USB_EP_DIR_IN) { if (usbus->addr && usbus->state == USBUS_STATE_RESET) { usbdev_set(usbus->dev, USBOPT_ADDRESS, &usbus->addr, @@ -332,32 +333,32 @@ static int _handle_tr_complete(usbus_t *usbus, /* Address configured */ usbus->state = USBUS_STATE_ADDR; } - ep0_handler->setup_state = USBUS_SETUPRQ_READY; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_READY; } break; - case USBUS_SETUPRQ_OUTACK: + case USBUS_CONTROL_REQUEST_STATE_OUTACK: if (ep->dir == USB_EP_DIR_OUT) { memset(&ep0_handler->slicer, 0, sizeof(usbus_control_slicer_t)); - ep0_handler->setup_state = USBUS_SETUPRQ_READY; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_READY; } break; - case USBUS_SETUPRQ_INDATA: + case USBUS_CONTROL_REQUEST_STATE_INDATA: if (ep->dir == USB_EP_DIR_IN) { if (usbus_control_slicer_nextslice(usbus)) { _recv_setup(usbus, ep0_handler); - ep0_handler->setup_state = USBUS_SETUPRQ_INDATA; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_INDATA; } else { /* Ready out ZLP */ usbdev_ep_ready(ep0_handler->out, 0); - ep0_handler->setup_state = USBUS_SETUPRQ_OUTACK; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_OUTACK; } } break; - case USBUS_SETUPRQ_OUTDATA: + case USBUS_CONTROL_REQUEST_STATE_OUTDATA: if (ep->dir == USB_EP_DIR_OUT) { /* Ready in ZLP */ - ep0_handler->setup_state = USBUS_SETUPRQ_INACK; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_INACK; size_t len = 0; usbdev_ep_get(ep, USBOPT_EP_AVAILABLE, &len, sizeof(size_t)); DEBUG("Expected len: %d, received: %d\n", @@ -373,7 +374,7 @@ static int _handle_tr_complete(usbus_t *usbus, DEBUG("usbus_control: Invalid state OUTDATA with IN request\n"); } break; - case USBUS_SETUPRQ_READY: + case USBUS_CONTROL_REQUEST_STATE_READY: if (ep->dir == USB_EP_DIR_OUT) { memset(&ep0_handler->slicer, 0, sizeof(usbus_control_slicer_t)); memcpy(&ep0_handler->setup, ep0_handler->out->buf, @@ -403,7 +404,7 @@ static void _handler_ep0_event(usbus_t *usbus, usbus_handler_t *handler, switch (event) { case USBUS_EVENT_USB_RESET: DEBUG("usbus_control: Reset event triggered\n"); - ep0_handler->setup_state = USBUS_SETUPRQ_READY; + ep0_handler->control_request_state = USBUS_CONTROL_REQUEST_STATE_READY; _usbus_config_ep0(ep0_handler); break; default: