Merge "Add dump of USB descriptors to the dumpsys for UsbHostManager service." into oc-mr1-dev
am: e7b8f6d24a
Change-Id: I4b510bccbb6b71a92f1fa6938195466ecd3956dc
This commit is contained in:
@@ -22,8 +22,10 @@ import android.content.Context;
|
|||||||
import android.hardware.usb.UsbConfiguration;
|
import android.hardware.usb.UsbConfiguration;
|
||||||
import android.hardware.usb.UsbConstants;
|
import android.hardware.usb.UsbConstants;
|
||||||
import android.hardware.usb.UsbDevice;
|
import android.hardware.usb.UsbDevice;
|
||||||
|
import android.hardware.usb.UsbDeviceConnection;
|
||||||
import android.hardware.usb.UsbEndpoint;
|
import android.hardware.usb.UsbEndpoint;
|
||||||
import android.hardware.usb.UsbInterface;
|
import android.hardware.usb.UsbInterface;
|
||||||
|
import android.hardware.usb.UsbManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@@ -32,8 +34,11 @@ import android.util.Slog;
|
|||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.util.IndentingPrintWriter;
|
import com.android.internal.util.IndentingPrintWriter;
|
||||||
import com.android.server.usb.descriptors.UsbDescriptorParser;
|
import com.android.server.usb.descriptors.UsbDescriptorParser;
|
||||||
|
import com.android.server.usb.descriptors.report.TextReportCanvas;
|
||||||
|
import com.android.server.usb.descriptors.tree.UsbDescriptorsTree;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -43,6 +48,8 @@ public class UsbHostManager {
|
|||||||
private static final String TAG = UsbHostManager.class.getSimpleName();
|
private static final String TAG = UsbHostManager.class.getSimpleName();
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
// contains all connected USB devices
|
// contains all connected USB devices
|
||||||
private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
|
private final HashMap<String, UsbDevice> mDevices = new HashMap<>();
|
||||||
|
|
||||||
@@ -69,6 +76,8 @@ public class UsbHostManager {
|
|||||||
|
|
||||||
public UsbHostManager(Context context, UsbAlsaManager alsaManager,
|
public UsbHostManager(Context context, UsbAlsaManager alsaManager,
|
||||||
UsbSettingsManager settingsManager) {
|
UsbSettingsManager settingsManager) {
|
||||||
|
mContext = context;
|
||||||
|
|
||||||
mHostBlacklist = context.getResources().getStringArray(
|
mHostBlacklist = context.getResources().getStringArray(
|
||||||
com.android.internal.R.array.config_usbHostBlacklist);
|
com.android.internal.R.array.config_usbHostBlacklist);
|
||||||
mUsbAlsaManager = alsaManager;
|
mUsbAlsaManager = alsaManager;
|
||||||
@@ -339,6 +348,33 @@ public class UsbHostManager {
|
|||||||
if (mUsbDeviceConnectionHandler != null) {
|
if (mUsbDeviceConnectionHandler != null) {
|
||||||
pw.println("Default USB Host Connection handler: " + mUsbDeviceConnectionHandler);
|
pw.println("Default USB Host Connection handler: " + mUsbDeviceConnectionHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Collection<UsbDevice> devices = mDevices.values();
|
||||||
|
if (devices.size() != 0) {
|
||||||
|
pw.println("USB Peripheral Descriptors");
|
||||||
|
for (UsbDevice device : devices) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
UsbDescriptorParser parser = new UsbDescriptorParser();
|
||||||
|
if (parser.parseDevice(device.getDeviceName())) {
|
||||||
|
UsbDescriptorsTree descriptorTree = new UsbDescriptorsTree();
|
||||||
|
descriptorTree.parse(parser);
|
||||||
|
|
||||||
|
UsbManager usbManager =
|
||||||
|
(UsbManager) mContext.getSystemService(Context.USB_SERVICE);
|
||||||
|
UsbDeviceConnection connection = usbManager.openDevice(device);
|
||||||
|
|
||||||
|
descriptorTree.report(new TextReportCanvas(connection, stringBuilder));
|
||||||
|
connection.close();
|
||||||
|
|
||||||
|
stringBuilder.append("isHeadset[in: " + parser.isInputHeadset()
|
||||||
|
+ " , out: " + parser.isOutputHeadset() + "]");
|
||||||
|
} else {
|
||||||
|
stringBuilder.append("Error Parsing USB Descriptors");
|
||||||
|
}
|
||||||
|
pw.println(stringBuilder.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,6 @@ public class UsbASFormat extends UsbACInterface {
|
|||||||
public void report(ReportCanvas canvas) {
|
public void report(ReportCanvas canvas) {
|
||||||
super.report(canvas);
|
super.report(canvas);
|
||||||
|
|
||||||
canvas.write(UsbStrings.getFormatName(getFormatType()));
|
canvas.writeParagraph(UsbStrings.getFormatName(getFormatType()), /*emphasis*/false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,8 +130,8 @@ public final class UsbDeviceDescriptor extends UsbDescriptor {
|
|||||||
String subClasStr = UsbStrings.getClassName(devSubClass);
|
String subClasStr = UsbStrings.getClassName(devSubClass);
|
||||||
canvas.writeListItem("Class " + devClass + ": " + classStr + " Subclass"
|
canvas.writeListItem("Class " + devClass + ": " + classStr + " Subclass"
|
||||||
+ devSubClass + ": " + subClasStr);
|
+ devSubClass + ": " + subClasStr);
|
||||||
canvas.writeListItem("Vendor ID: " + getVendorID()
|
canvas.writeListItem("Vendor ID: " + ReportCanvas.getHexString(getVendorID())
|
||||||
+ " Product ID: " + getProductID()
|
+ " Product ID: " + ReportCanvas.getHexString(getProductID())
|
||||||
+ " Product Release: " + ReportCanvas.getBCDString(getDeviceRelease()));
|
+ " Product Release: " + ReportCanvas.getBCDString(getDeviceRelease()));
|
||||||
|
|
||||||
byte mfgIndex = getMfgIndex();
|
byte mfgIndex = getMfgIndex();
|
||||||
|
|||||||
@@ -40,6 +40,12 @@ public final class TextReportCanvas extends ReportCanvas {
|
|||||||
mStringBuilder = stringBuilder;
|
mStringBuilder = stringBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeListIndent() {
|
||||||
|
for (int space = 0; space < mListIndent; space++) {
|
||||||
|
mStringBuilder.append(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(String text) {
|
public void write(String text) {
|
||||||
mStringBuilder.append(text);
|
mStringBuilder.append(text);
|
||||||
@@ -47,7 +53,8 @@ public final class TextReportCanvas extends ReportCanvas {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openHeader(int level) {
|
public void openHeader(int level) {
|
||||||
mStringBuilder.append("[" + level + " - ");
|
writeListIndent();
|
||||||
|
mStringBuilder.append("[");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -56,7 +63,8 @@ public final class TextReportCanvas extends ReportCanvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openParagraph(boolean inRed) {
|
public void openParagraph(boolean emphasis) {
|
||||||
|
writeListIndent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -75,24 +83,14 @@ public final class TextReportCanvas extends ReportCanvas {
|
|||||||
closeParagraph();
|
closeParagraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeListIndent() {
|
|
||||||
for (int space = 0; space < mListIndent; space++) {
|
|
||||||
mStringBuilder.append(" ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openList() {
|
public void openList() {
|
||||||
mListIndent += LIST_INDENT_AMNT;
|
mListIndent += LIST_INDENT_AMNT;
|
||||||
writeListIndent();
|
|
||||||
mStringBuilder.append("---->\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void closeList() {
|
public void closeList() {
|
||||||
writeListIndent();
|
|
||||||
mListIndent -= LIST_INDENT_AMNT;
|
mListIndent -= LIST_INDENT_AMNT;
|
||||||
mStringBuilder.append("<----\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ public final class UsbStrings {
|
|||||||
private static HashMap<Integer, String> sTerminalNames;
|
private static HashMap<Integer, String> sTerminalNames;
|
||||||
private static HashMap<Integer, String> sFormatNames;
|
private static HashMap<Integer, String> sFormatNames;
|
||||||
|
|
||||||
|
static {
|
||||||
|
allocUsbStrings();
|
||||||
|
}
|
||||||
|
|
||||||
private static void initDescriptorNames() {
|
private static void initDescriptorNames() {
|
||||||
sDescriptorNames = new HashMap<Byte, String>();
|
sDescriptorNames = new HashMap<Byte, String>();
|
||||||
sDescriptorNames.put(UsbDescriptor.DESCRIPTORTYPE_DEVICE, "Device");
|
sDescriptorNames.put(UsbDescriptor.DESCRIPTORTYPE_DEVICE, "Device");
|
||||||
@@ -246,7 +250,7 @@ public final class UsbStrings {
|
|||||||
/**
|
/**
|
||||||
* Initializes string tables.
|
* Initializes string tables.
|
||||||
*/
|
*/
|
||||||
public static void allocUsbStrings() {
|
private static void allocUsbStrings() {
|
||||||
initDescriptorNames();
|
initDescriptorNames();
|
||||||
initACControlInterfaceNames();
|
initACControlInterfaceNames();
|
||||||
initACStreamingInterfaceNames();
|
initACStreamingInterfaceNames();
|
||||||
@@ -257,19 +261,6 @@ public final class UsbStrings {
|
|||||||
initFormatNames();
|
initFormatNames();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Deinitializes string tables.
|
|
||||||
*/
|
|
||||||
public static void releaseUsbStrings() {
|
|
||||||
sDescriptorNames = null;
|
|
||||||
sACControlInterfaceNames = null;
|
|
||||||
sACStreamingInterfaceNames = null;
|
|
||||||
sClassNames = null;
|
|
||||||
sAudioSubclassNames = null;
|
|
||||||
sAudioEncodingNames = null;
|
|
||||||
sTerminalNames = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the name for the specified descriptor ID.
|
* Retrieves the name for the specified descriptor ID.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ public final class UsbDescriptorsACInterfaceNode extends UsbDescriptorsTreeNode
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void report(ReportCanvas canvas) {
|
public void report(ReportCanvas canvas) {
|
||||||
canvas.openListItem();
|
canvas.writeListItem("AC Interface type: 0x"
|
||||||
canvas.writeParagraph("AC Interface type:0x"
|
+ Integer.toHexString(mACInterface.getSubtype()));
|
||||||
+ Integer.toHexString(mACInterface.getSubtype()), false);
|
canvas.openList();
|
||||||
mACInterface.report(canvas);
|
mACInterface.report(canvas);
|
||||||
canvas.closeListItem();
|
canvas.closeList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user