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