1b5eaa809da69865cbde156007ae5363f9209f932Paul McLean/* 2b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * Copyright (C) 2017 The Android Open Source Project 3b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * 4b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * Licensed under the Apache License, Version 2.0 (the "License"); 5b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * you may not use this file except in compliance with the License. 6b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * You may obtain a copy of the License at 7b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * 8b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * http://www.apache.org/licenses/LICENSE-2.0 9b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * 10b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * Unless required by applicable law or agreed to in writing, software 11b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * distributed under the License is distributed on an "AS IS" BASIS, 12b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * See the License for the specific language governing permissions and 14b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * limitations under the License. 15b5eaa809da69865cbde156007ae5363f9209f932Paul McLean */ 16b5eaa809da69865cbde156007ae5363f9209f932Paul McLeanpackage com.android.server.usb.descriptors; 17b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 18fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanimport com.android.server.usb.descriptors.report.ReportCanvas; 19fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanimport com.android.server.usb.descriptors.report.UsbStrings; 20fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 21b5eaa809da69865cbde156007ae5363f9209f932Paul McLean/** 22b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * @hide 23b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * A USB Device Descriptor. 24b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * see usb11.pdf section 9.6.1 25b5eaa809da69865cbde156007ae5363f9209f932Paul McLean */ 26fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanpublic final class UsbDeviceDescriptor extends UsbDescriptor { 27fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean private static final String TAG = "UsbDeviceDescriptor"; 28fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 29fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean public static final int USBSPEC_1_0 = 0x0100; 30fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean public static final int USBSPEC_1_1 = 0x0110; 31fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean public static final int USBSPEC_2_0 = 0x0200; 32b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 33b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private int mSpec; // 2:2 bcdUSB 2 BCD USB Specification Number - BCD 34b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mDevClass; // 4:1 class code 35b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mDevSubClass; // 5:1 subclass code 36b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mProtocol; // 6:1 protocol 37b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mPacketSize; // 7:1 Maximum Packet Size for Zero Endpoint. 38b5eaa809da69865cbde156007ae5363f9209f932Paul McLean // Valid Sizes are 8, 16, 32, 64 39b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private int mVendorID; // 8:2 vendor ID 40b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private int mProductID; // 10:2 product ID 41b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private int mDeviceRelease; // 12:2 Device Release number - BCD 42b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mMfgIndex; // 14:1 Index of Manufacturer String Descriptor 43b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mProductIndex; // 15:1 Index of Product String Descriptor 44b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mSerialNum; // 16:1 Index of Serial Number String Descriptor 45b5eaa809da69865cbde156007ae5363f9209f932Paul McLean private byte mNumConfigs; // 17:1 Number of Possible Configurations 46b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 47b5eaa809da69865cbde156007ae5363f9209f932Paul McLean UsbDeviceDescriptor(int length, byte type) { 48b5eaa809da69865cbde156007ae5363f9209f932Paul McLean super(length, type); 49fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean mHierarchyLevel = 1; 50b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 51b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 52b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public int getSpec() { 53b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mSpec; 54b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 55b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 56b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getDevClass() { 57b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mDevClass; 58b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 59b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 60b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getDevSubClass() { 61b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mDevSubClass; 62b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 63b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 64b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getProtocol() { 65b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mProtocol; 66b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 67b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 68b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getPacketSize() { 69b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mPacketSize; 70b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 71b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 72b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public int getVendorID() { 73b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mVendorID; 74b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 75b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 76b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public int getProductID() { 77b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mProductID; 78b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 79b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 80b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public int getDeviceRelease() { 81b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mDeviceRelease; 82b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 83b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 84b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getMfgIndex() { 85b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mMfgIndex; 86b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 87b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 88b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getProductIndex() { 89b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mProductIndex; 90b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 91b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 92b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getSerialNum() { 93b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mSerialNum; 94b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 95b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 96b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getNumConfigs() { 97b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mNumConfigs; 98b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 99b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 100b5eaa809da69865cbde156007ae5363f9209f932Paul McLean @Override 101b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public int parseRawDescriptors(ByteStream stream) { 102fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean mSpec = stream.unpackUsbShort(); 103b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mDevClass = stream.getByte(); 104b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mDevSubClass = stream.getByte(); 105b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mProtocol = stream.getByte(); 106b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mPacketSize = stream.getByte(); 107fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean mVendorID = stream.unpackUsbShort(); 108fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean mProductID = stream.unpackUsbShort(); 109fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean mDeviceRelease = stream.unpackUsbShort(); 110b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mMfgIndex = stream.getByte(); 111b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mProductIndex = stream.getByte(); 112b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mSerialNum = stream.getByte(); 113b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mNumConfigs = stream.getByte(); 114b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 115b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mLength; 116b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 117fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 118fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean @Override 119fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean public void report(ReportCanvas canvas) { 120fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean super.report(canvas); 121fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 122fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.openList(); 123fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 124fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean int spec = getSpec(); 125fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Spec: " + ReportCanvas.getBCDString(spec)); 126fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 127fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte devClass = getDevClass(); 128fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean String classStr = UsbStrings.getClassName(devClass); 129fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte devSubClass = getDevSubClass(); 130fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean String subClasStr = UsbStrings.getClassName(devSubClass); 131fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Class " + devClass + ": " + classStr + " Subclass" 132fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean + devSubClass + ": " + subClasStr); 13353215d1f7d79c6577b32c3b71db6db6435c95f09Paul McLean canvas.writeListItem("Vendor ID: " + ReportCanvas.getHexString(getVendorID()) 13453215d1f7d79c6577b32c3b71db6db6435c95f09Paul McLean + " Product ID: " + ReportCanvas.getHexString(getProductID()) 135fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean + " Product Release: " + ReportCanvas.getBCDString(getDeviceRelease())); 136fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 137fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte mfgIndex = getMfgIndex(); 138fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean String manufacturer = 139fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean UsbDescriptor.getUsbDescriptorString(canvas.getConnection(), mfgIndex); 140fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte productIndex = getProductIndex(); 141fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean String product = 142fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean UsbDescriptor.getUsbDescriptorString(canvas.getConnection(), productIndex); 143fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 144fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Manufacturer " + mfgIndex + ": " + manufacturer 145fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean + " Product " + productIndex + ": " + product); 146fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.closeList(); 147fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean } 148b5eaa809da69865cbde156007ae5363f9209f932Paul McLean} 149