112 lines
2.2 KiB
C
112 lines
2.2 KiB
C
/*
|
|
* Copyright (c) 2018 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
struct op_common {
|
|
uint16_t version;
|
|
uint16_t code;
|
|
uint32_t status;
|
|
} __packed;
|
|
|
|
struct devlist_device {
|
|
char path[256];
|
|
char busid[32];
|
|
|
|
uint32_t busnum;
|
|
uint32_t devnum;
|
|
uint32_t speed;
|
|
|
|
uint16_t idVendor;
|
|
uint16_t idProduct;
|
|
uint16_t bcdDevice;
|
|
|
|
uint8_t bDeviceClass;
|
|
uint8_t bDeviceSubClass;
|
|
uint8_t bDeviceProtocol;
|
|
uint8_t bConfigurationValue;
|
|
uint8_t bNumConfigurations;
|
|
uint8_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 {
|
|
uint32_t command;
|
|
uint32_t seqnum;
|
|
uint32_t devid;
|
|
uint32_t direction;
|
|
uint32_t ep;
|
|
} __packed;
|
|
|
|
struct usbip_submit {
|
|
uint32_t transfer_flags;
|
|
int32_t transfer_buffer_length;
|
|
int32_t start_frame;
|
|
int32_t number_of_packets;
|
|
int32_t interval;
|
|
uint8_t bmRequestType;
|
|
uint8_t bRequest;
|
|
uint16_t wValue;
|
|
uint16_t wIndex;
|
|
uint16_t wLength;
|
|
} __packed;
|
|
|
|
struct usbip_unlink {
|
|
uint32_t seqnum;
|
|
} __packed;
|
|
|
|
struct usbip_submit_rsp {
|
|
struct usbip_header_common common;
|
|
|
|
int32_t status;
|
|
int32_t actual_length;
|
|
int32_t start_frame;
|
|
int32_t number_of_packets;
|
|
int32_t error_count;
|
|
|
|
uint64_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(uint8_t *buf, size_t len);
|
|
bool usbip_send_common(uint8_t ep, uint32_t data_len);
|
|
int usbip_send(uint8_t ep, const uint8_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);
|