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