diff options
Diffstat (limited to 'common/libs/usbforward/protocol.h')
-rw-r--r-- | common/libs/usbforward/protocol.h | 153 |
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 |