/* * Copyright (c) 2018 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ struct op_common { u16_t version; u16_t code; u32_t status; } __packed; struct devlist_device { char path[256]; char busid[32]; u32_t busnum; u32_t devnum; u32_t speed; u16_t idVendor; u16_t idProduct; u16_t bcdDevice; u8_t bDeviceClass; u8_t bDeviceSubClass; u8_t bDeviceProtocol; u8_t bConfigurationValue; u8_t bNumConfigurations; u8_t bNumInterfaces; } __packed; #define OP_REQUEST (0x80 << 8) #define OP_REPLY (0x00 << 8) /* Devlist */ #define OP_DEVLIST 0x05 #define OP_REQ_DEVLIST (OP_REQUEST | OP_DEVLIST) #define OP_REP_DEVLIST (OP_REPLY | OP_DEVLIST) /* Import USB device */ #define OP_IMPORT 0x03 #define OP_REQ_IMPORT (OP_REQUEST | OP_IMPORT) #define OP_REP_IMPORT (OP_REPLY | OP_IMPORT) /* USBIP requests */ #define USBIP_CMD_SUBMIT 0x0001 #define USBIP_CMD_UNLINK 0x0002 #define USBIP_RET_SUBMIT 0x0003 #define USBIP_RET_UNLINK 0x0004 /* USBIP direction */ #define USBIP_DIR_OUT 0x00 #define USBIP_DIR_IN 0x01 struct usbip_header_common { u32_t command; u32_t seqnum; u32_t devid; u32_t direction; u32_t ep; } __packed; struct usbip_submit { u32_t transfer_flags; s32_t transfer_buffer_length; s32_t start_frame; s32_t number_of_packets; s32_t interval; } __packed; struct usbip_unlink { u32_t seqnum; } __packed; struct usbip_submit_rsp { struct usbip_header_common common; s32_t status; s32_t actual_length; s32_t start_frame; s32_t number_of_packets; s32_t error_count; u64_t setup; } __packed; struct usbip_header { struct usbip_header_common common; union { struct usbip_submit submit; struct usbip_unlink unlink; } u; } __packed; /* Function definitions */ int usbip_recv(u8_t *buf, size_t len); bool usbip_send_common(u8_t ep, u32_t data_len); int usbip_send(u8_t ep, const u8_t *data, size_t len); void usbip_start(void); int handle_usb_control(struct usbip_header *hdr); int handle_usb_data(struct usbip_header *hdr); bool usbip_skip_setup(void);