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 common super-class for all USB Interface Descritor subtypes. 24b5eaa809da69865cbde156007ae5363f9209f932Paul McLean * see usb11.pdf section 9.6.3 25b5eaa809da69865cbde156007ae5363f9209f932Paul McLean */ 26b5eaa809da69865cbde156007ae5363f9209f932Paul McLeanpublic class UsbInterfaceDescriptor extends UsbDescriptor { 27fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean private static final String TAG = "UsbInterfaceDescriptor"; 28b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 29b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mInterfaceNumber; // 2:1 Number of Interface 30b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mAlternateSetting; // 3:1 Value used to select alternative setting 31b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mNumEndpoints; // 4:1 Number of Endpoints used for this interface 32b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mUsbClass; // 5:1 Class Code 33b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mUsbSubclass; // 6:1 Subclass Code 34b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mProtocol; // 7:1 Protocol Code 35b5eaa809da69865cbde156007ae5363f9209f932Paul McLean protected byte mDescrIndex; // 8:1 Index of String Descriptor Describing this interface 36b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 37b5eaa809da69865cbde156007ae5363f9209f932Paul McLean UsbInterfaceDescriptor(int length, byte type) { 38b5eaa809da69865cbde156007ae5363f9209f932Paul McLean super(length, type); 39fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean mHierarchyLevel = 3; 40b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 41b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 42b5eaa809da69865cbde156007ae5363f9209f932Paul McLean @Override 43b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public int parseRawDescriptors(ByteStream stream) { 44b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mInterfaceNumber = stream.getByte(); 45b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mAlternateSetting = stream.getByte(); 46b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mNumEndpoints = stream.getByte(); 47b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mUsbClass = stream.getByte(); 48b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mUsbSubclass = stream.getByte(); 49b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mProtocol = stream.getByte(); 50b5eaa809da69865cbde156007ae5363f9209f932Paul McLean mDescrIndex = stream.getByte(); 51b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 52b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mLength; 53b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 54b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 55b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getInterfaceNumber() { 56b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mInterfaceNumber; 57b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 58b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 59b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getAlternateSetting() { 60b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mAlternateSetting; 61b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 62b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 63b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getNumEndpoints() { 64b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mNumEndpoints; 65b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 66b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 67b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getUsbClass() { 68b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mUsbClass; 69b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 70b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 71b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getUsbSubclass() { 72b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mUsbSubclass; 73b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 74b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 75b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getProtocol() { 76b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mProtocol; 77b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 78b5eaa809da69865cbde156007ae5363f9209f932Paul McLean 79b5eaa809da69865cbde156007ae5363f9209f932Paul McLean public byte getDescrIndex() { 80b5eaa809da69865cbde156007ae5363f9209f932Paul McLean return mDescrIndex; 81b5eaa809da69865cbde156007ae5363f9209f932Paul McLean } 82fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 83fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean @Override 84fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean public void report(ReportCanvas canvas) { 85fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean super.report(canvas); 86fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 87fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte usbClass = getUsbClass(); 88fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte usbSubclass = getUsbSubclass(); 89fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean byte protocol = getProtocol(); 90fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean String className = UsbStrings.getClassName(usbClass); 91fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean String subclassName = ""; 92fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean if (usbClass == UsbDescriptor.CLASSID_AUDIO) { 93fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean subclassName = UsbStrings.getAudioSubclassName(usbSubclass); 94fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean } 95fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean 96fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.openList(); 97fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Interface #" + getInterfaceNumber()); 98fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Class: " + ReportCanvas.getHexString(usbClass) + ": " + className); 99fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Subclass: " 100fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean + ReportCanvas.getHexString(usbSubclass) + ": " + subclassName); 101fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Protocol: " + protocol + ": " + ReportCanvas.getHexString(protocol)); 102fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.writeListItem("Endpoints: " + getNumEndpoints()); 103fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean canvas.closeList(); 104fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean } 105b5eaa809da69865cbde156007ae5363f9209f932Paul McLean} 106