aboutsummaryrefslogtreecommitdiff
path: root/common/libs/usbforward/protocol.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/libs/usbforward/protocol.h')
-rw-r--r--common/libs/usbforward/protocol.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/common/libs/usbforward/protocol.h b/common/libs/usbforward/protocol.h
new file mode 100644
index 000000000..c55c3b6f9
--- /dev/null
+++ b/common/libs/usbforward/protocol.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <stdint.h>
+
+namespace usb_forward {
+
+// Commands that can be executed over serial port.
+// Use magic value to avoid accidental interpretation of commonly seen numbers.
+enum Command : uint32_t {
+ // Get device list.
+ // Request format:
+ // - RequestHeader{}
+ // Response format:
+ // - ResponseHeader{}
+ // - int32_t(num_devices)
+ // - num_devices times:
+ // - DeviceInfo{}
+ // - DeviceInfo.num_interfaces times:
+ // - InterfaceInfo{}
+ CmdDeviceList = 0xcfad0001,
+
+ // Attach specified device.
+ // Request format:
+ // - RequestHeader{}
+ // - AttachRequestHeader{}
+ // Response format:
+ // - ResponseHeader{}
+ CmdAttach,
+
+ // Execute command on attached USB device.
+ // Request format:
+ // - RequestHeader{}
+ // - ControlTransfer{}
+ // - if transfer direction is host -> device
+ // - uint8_t[ControlTransfer.length] data
+ // Response format:
+ // - ResponseHeader{}
+ // - if transfer direction is device -> host
+ // - int32_t(actual length)
+ // - uint8_t[actual length] bytes
+ CmdControlTransfer,
+
+ // Execute transfer on attached USB device.
+ // Request format:
+ // - RequestHeader{}
+ // - DataTransfer{}
+ // - if transfer direction is host -> device
+ // - uint8_t[DataTransfer.length] data
+ // Response format:
+ // - ResponseHeader{}
+ // - if transfer direction is host -> device
+ // - int32_t(actual length)
+ // - int32_t[actual length] bytes
+ CmdDataTransfer,
+
+ // Heartbeat is used to detect whether device is alive.
+ // This is a trivial request/response mechanism.
+ // Response status indicates whether server is ready.
+ // Request format:
+ // - RequestHeader{}
+ // Response format:
+ // - ResponseHeader{}
+ CmdHeartbeat,
+};
+
+// Status represents command execution result, using USB/IP compatible values.
+enum Status : uint32_t {
+ // StatusSuccess indicates successful command execution.
+ StatusSuccess = 0,
+
+ // StatusFailure indicates error during command execution.
+ StatusFailure = 1
+};
+
+struct RequestHeader {
+ Command command;
+ uint32_t tag;
+};
+
+struct ResponseHeader {
+ Status status;
+ uint32_t tag;
+};
+
+// DeviceInfo describes individual USB device that was found attached to the
+// bus.
+struct DeviceInfo {
+ uint16_t vendor_id;
+ uint16_t product_id;
+ uint16_t dev_version;
+ uint8_t dev_class;
+ uint8_t dev_subclass;
+ uint8_t dev_protocol;
+ uint8_t bus_id;
+ uint8_t dev_id;
+ uint8_t speed;
+ uint8_t num_configurations;
+ uint8_t num_interfaces;
+ uint8_t cur_configuration;
+} __attribute__((packed));
+
+// InterfaceInfo describes individual interface attached to a USB device.
+struct InterfaceInfo {
+ uint8_t if_class;
+ uint8_t if_subclass;
+ uint8_t if_protocol;
+ uint8_t if_reserved;
+} __attribute__((packed));
+
+// AttachRequest specifies which device on which bus needs to be attached.
+struct AttachRequest {
+ uint8_t bus_id;
+ uint8_t dev_id;
+} __attribute__((packed));
+
+// ControlTransfer specifies target bus and device along with USB request.
+struct ControlTransfer {
+ uint8_t bus_id;
+ uint8_t dev_id;
+ uint8_t type;
+ uint8_t cmd;
+ uint16_t value;
+ uint16_t index;
+ uint16_t length;
+ uint32_t timeout;
+} __attribute__((packed));
+
+// DataTransfer is used to exchange data between host and device.
+struct DataTransfer {
+ uint8_t bus_id;
+ uint8_t dev_id;
+ uint8_t endpoint_id;
+ uint8_t is_host_to_device;
+ int32_t length;
+ uint32_t timeout;
+} __attribute__((packed));
+
+} // namespace usb_forward