| /* | |
| * Copyright (C) 2009 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. | |
| */ | |
| #ifndef ANDROID_USB_API_ADB_API_LEGACY_H_ | |
| #define ANDROID_USB_API_ADB_API_LEGACY_H_ | |
| /** \file | |
| This file consists of declarations of constants and structures required | |
| for supporting communications of this API with a legacy (custom) USB | |
| driver. | |
| */ | |
| // Enables compillation for "straight" C | |
| #ifdef __cplusplus | |
| #define EXTERN_C extern "C" | |
| #else | |
| #define EXTERN_C extern | |
| typedef int bool; | |
| #define true 1 | |
| #define false 0 | |
| #endif | |
| /// Name for the default bulk read pipe | |
| #define DEVICE_BULK_READ_PIPE_NAME L"BulkRead" | |
| /// Name for the default bulk write pipe | |
| #define DEVICE_BULK_WRITE_PIPE_NAME L"BulkWrite" | |
| /// Prefix for an index-based pipe name | |
| #define DEVICE_PIPE_NAME_PREFIX L"PIPE_" | |
| /** \name IOCTL codes for the driver | |
| */ | |
| ///@{ | |
| /// Control code for IOCTL that gets USB_DEVICE_DESCRIPTOR | |
| #define ADB_CTL_GET_USB_DEVICE_DESCRIPTOR 10 | |
| /// Control code for IOCTL that gets USB_CONFIGURATION_DESCRIPTOR | |
| #define ADB_CTL_GET_USB_CONFIGURATION_DESCRIPTOR 11 | |
| /// Control code for IOCTL that gets USB_INTERFACE_DESCRIPTOR | |
| #define ADB_CTL_GET_USB_INTERFACE_DESCRIPTOR 12 | |
| /// Control code for IOCTL that gets endpoint information | |
| #define ADB_CTL_GET_ENDPOINT_INFORMATION 13 | |
| /// Control code for bulk read IOCTL | |
| #define ADB_CTL_BULK_READ 14 | |
| /// Control code for bulk write IOCTL | |
| #define ADB_CTL_BULK_WRITE 15 | |
| /// Control code for IOCTL that gets device serial number | |
| #define ADB_CTL_GET_SERIAL_NUMBER 16 | |
| /// IOCTL that gets USB_DEVICE_DESCRIPTOR | |
| #define ADB_IOCTL_GET_USB_DEVICE_DESCRIPTOR \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_GET_USB_DEVICE_DESCRIPTOR, \ | |
| METHOD_BUFFERED, \ | |
| FILE_READ_ACCESS) | |
| /// IOCTL that gets USB_CONFIGURATION_DESCRIPTOR | |
| #define ADB_IOCTL_GET_USB_CONFIGURATION_DESCRIPTOR \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_GET_USB_CONFIGURATION_DESCRIPTOR, \ | |
| METHOD_BUFFERED, \ | |
| FILE_READ_ACCESS) | |
| /// IOCTL that gets USB_INTERFACE_DESCRIPTOR | |
| #define ADB_IOCTL_GET_USB_INTERFACE_DESCRIPTOR \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_GET_USB_INTERFACE_DESCRIPTOR, \ | |
| METHOD_BUFFERED, \ | |
| FILE_READ_ACCESS) | |
| /// IOCTL that gets endpoint information | |
| #define ADB_IOCTL_GET_ENDPOINT_INFORMATION \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_GET_ENDPOINT_INFORMATION, \ | |
| METHOD_BUFFERED, \ | |
| FILE_READ_ACCESS) | |
| /// Bulk read IOCTL | |
| #define ADB_IOCTL_BULK_READ \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_BULK_READ, \ | |
| METHOD_OUT_DIRECT, \ | |
| FILE_READ_ACCESS) | |
| // For bulk write IOCTL we send request data in the form of AdbBulkTransfer | |
| // structure and output buffer is just ULONG that receives number of bytes | |
| // actually written. Since both of these are tiny we can use buffered I/O | |
| // for this IOCTL. | |
| /// Bulk write IOCTL | |
| #define ADB_IOCTL_BULK_WRITE \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_BULK_WRITE, \ | |
| METHOD_BUFFERED, \ | |
| FILE_WRITE_ACCESS) | |
| /// IOCTL that gets device serial number | |
| #define ADB_IOCTL_GET_SERIAL_NUMBER \ | |
| CTL_CODE(FILE_DEVICE_UNKNOWN, \ | |
| ADB_CTL_GET_SERIAL_NUMBER, \ | |
| METHOD_BUFFERED, \ | |
| FILE_READ_ACCESS) | |
| ///@} | |
| /** Structure AdbQueryEndpointInformation formats input for | |
| ADB_IOCTL_GET_ENDPOINT_INFORMATION IOCTL request | |
| */ | |
| struct AdbQueryEndpointInformation { | |
| /// Zero-based endpoint index for which information is queried. | |
| /// See ADB_QUERY_BULK_xxx_ENDPOINT_INDEX for shortcuts. | |
| UCHAR endpoint_index; | |
| }; | |
| /** Structure AdbBulkTransfer formats parameters for ADB_CTL_BULK_READ and | |
| ADB_CTL_BULK_WRITE IOCTL requests. | |
| */ | |
| struct AdbBulkTransfer { | |
| /// Time in milliseconds to complete this request | |
| ULONG time_out; | |
| /// Size of the data to transfer. This parameter is used only for | |
| /// ADB_CTL_BULK_WRITE request. For ADB_CTL_BULK_READ requests transfer | |
| /// size is defined by the output buffer size. | |
| ULONG transfer_size; | |
| /// Initializes statically allocated structure | |
| __forceinline AdbBulkTransfer() { | |
| time_out = 0; | |
| transfer_size = 0; | |
| for_x64 = 0; | |
| } | |
| /// Provides access to protected write_buffer field | |
| void* GetWriteBuffer() { | |
| return write_buffer; | |
| } | |
| /// Provides access to protected write_buffer field | |
| const void* GetWriteBuffer() const { | |
| return write_buffer; | |
| } | |
| /// Sets write_buffer field. | |
| void SetWriteBuffer(void* buffer) { | |
| // For 32-bit we must zero out high 32 bit of the address, so 64-bit | |
| // driver will see valid address when accessing 64-bit write_buffer. | |
| for_x64 = 0; | |
| write_buffer = buffer; | |
| } | |
| protected: | |
| /// Pointer to the actual buffer for ADB_CTL_BULK_WRITE request. This field | |
| /// is not used in ADB_CTL_BULK_READ request. Note that in order to support | |
| /// compatibility between 32-bit and 64-bit versions of both, driver and | |
| /// application we must sizeof this field to the max pointer sizeof (which | |
| /// is 64 bit in our case). The idea is that if IOCTL was issued by a 64-bit | |
| /// process to a 64-bit driver, write_buffer will be valid 64-bit pointer to | |
| /// the write buffer. Same is true for 32-bit app talking to 32-bit driver. | |
| /// If, however, a 32-bit app is talking to 64-bit driver, then write_buffer | |
| /// initialized by 32-bit app will contain 32-bit address, which will be | |
| /// correctly picked up ("extended") by 64-bit driver. Since when setting | |
| /// this field by a 32-bit app requires some extra work (see SetWriteBuffer) | |
| /// we hide this field, making it accessible only throug the accessor | |
| /// methods (Get/SetWriteBuffer). | |
| union { | |
| void* write_buffer; | |
| __int64 for_x64; | |
| }; | |
| }; | |
| #endif // ANDROID_USB_API_ADB_API_LEGACY_H_ |