コード例 #1
0
ファイル: usb_control.c プロジェクト: henryeherman/libopencm3
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);
	}
}
コード例 #2
0
ファイル: usb_control.c プロジェクト: 0utsider89/libopencm3
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);
	}
}
コード例 #3
0
ファイル: usb_control.c プロジェクト: henryeherman/libopencm3
/* 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);
	}
}
コード例 #4
0
ファイル: usb_control.c プロジェクト: 0utsider89/libopencm3
/* 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);
	}
}