/* * 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