void _usbd_control_in(u8 ea) { (void)ea; struct usb_setup_data *req = &control_state.req; switch (control_state.state) { case DATA_IN: usb_control_send_chunk(); break; case LAST_DATA_IN: control_state.state = STATUS_OUT; break; case STATUS_IN: if (control_state.complete) control_state.complete(&control_state.req); /* Exception: Handle SET ADDRESS function here... */ if ((req->bmRequestType == 0) && (req->bRequest == USB_REQ_SET_ADDRESS)) _usbd_hw_set_address(req->wValue); control_state.state = IDLE; break; default: usbd_ep_stall_set(0, 1); } }
void _usbd_control_in(usbd_device *usbd_dev, uint8_t ea) { (void)ea; struct usb_setup_data *req = &(usbd_dev->control_state.req); switch (usbd_dev->control_state.state) { case DATA_IN: usb_control_send_chunk(usbd_dev); break; case LAST_DATA_IN: usbd_dev->control_state.state = STATUS_OUT; break; case STATUS_IN: if (usbd_dev->control_state.complete) { usbd_dev->control_state.complete(usbd_dev, &(usbd_dev->control_state.req)); } /* Exception: Handle SET ADDRESS function here... */ if ((req->bmRequestType == 0) && (req->bRequest == USB_REQ_SET_ADDRESS)) { usbd_dev->driver->set_address(usbd_dev, req->wValue); } usbd_dev->control_state.state = IDLE; break; default: stall_transaction(usbd_dev); } }
/* Handle commands and read requests. */ static void usb_control_setup_read(struct usb_setup_data *req) { control_state.ctrl_buf = _usbd_device.ctrl_buf; control_state.ctrl_len = req->wLength; if (usb_control_request_dispatch(req)) { if (control_state.ctrl_len) { /* Go to data out stage if handled. */ usb_control_send_chunk(); } else { /* Go to status stage if handled. */ usbd_ep_write_packet(0, NULL, 0); control_state.state = STATUS_IN; } } else { /* Stall endpoint on failure. */ usbd_ep_stall_set(0, 1); } }
/* Handle commands and read requests. */ static void usb_control_setup_read(usbd_device *usbd_dev, struct usb_setup_data *req) { usbd_dev->control_state.ctrl_buf = usbd_dev->ctrl_buf; usbd_dev->control_state.ctrl_len = req->wLength; if (usb_control_request_dispatch(usbd_dev, req)) { if (usbd_dev->control_state.ctrl_len) { /* Go to data out stage if handled. */ usb_control_send_chunk(usbd_dev); } else { /* Go to status stage if handled. */ usbd_ep_write_packet(usbd_dev, 0, NULL, 0); usbd_dev->control_state.state = STATUS_IN; } } else { /* Stall endpoint on failure. */ stall_transaction(usbd_dev); } }