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