From 0e76cf0b69324e071618d5a7105d1084d2a27550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 31 Mar 2011 21:58:06 +0000 Subject: [PATCH] added some hub ports information to listusb git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41157 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/usb/Hub.cpp | 6 ++-- .../kernel/bus_managers/usb/usb_private.h | 1 + .../kernel/bus_managers/usb/usbspec_private.h | 7 ++-- src/bin/Jamfile | 3 ++ src/bin/listusb.cpp | 36 +++++++++++++++++++ 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/usb/Hub.cpp b/src/add-ons/kernel/bus_managers/usb/Hub.cpp index e0d719ace5..04b4ce61ef 100644 --- a/src/add-ons/kernel/bus_managers/usb/Hub.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Hub.cpp @@ -128,10 +128,10 @@ Hub::UpdatePortStatus(uint8 index) // get the current port status size_t actualLength = 0; status_t result = DefaultPipe()->SendRequest(USB_REQTYPE_CLASS | USB_REQTYPE_OTHER_IN, - USB_REQUEST_GET_STATUS, 0, index + 1, 4, (void *)&fPortStatus[index], - 4, &actualLength); + USB_REQUEST_GET_STATUS, 0, index + 1, sizeof(usb_port_status), + (void *)&fPortStatus[index], sizeof(usb_port_status), &actualLength); - if (result < B_OK || actualLength < 4) { + if (result < B_OK || actualLength < sizeof(usb_port_status)) { TRACE_ERROR("error updating port status\n"); return B_ERROR; } diff --git a/src/add-ons/kernel/bus_managers/usb/usb_private.h b/src/add-ons/kernel/bus_managers/usb/usb_private.h index 4bf437437a..5b745d1f86 100644 --- a/src/add-ons/kernel/bus_managers/usb/usb_private.h +++ b/src/add-ons/kernel/bus_managers/usb/usb_private.h @@ -12,6 +12,7 @@ #include "BeOSCompatibility.h" #include "usbspec_private.h" #include +#include #define TRACE_OUTPUT(x, y, z...) \ diff --git a/src/add-ons/kernel/bus_managers/usb/usbspec_private.h b/src/add-ons/kernel/bus_managers/usb/usbspec_private.h index aadcccd0c9..4b46b48a54 100644 --- a/src/add-ons/kernel/bus_managers/usb/usbspec_private.h +++ b/src/add-ons/kernel/bus_managers/usb/usbspec_private.h @@ -6,14 +6,13 @@ * Michael Lotz * Niels S. Reedijk */ - #ifndef _USBSPEC_PRIVATE_H #define _USBSPEC_PRIVATE_H + #include -#include #include -#include + #define USB_MAX_AREAS 8 #define USB_MAX_FRAGMENT_SIZE B_PAGE_SIZE * 96 @@ -96,6 +95,8 @@ struct usb_port_status #define PORT_STATUS_POWER 0x0100 #define PORT_STATUS_LOW_SPEED 0x0200 #define PORT_STATUS_HIGH_SPEED 0x0400 +#define PORT_STATUS_TEST 0x0800 +#define PORT_STATUS_INDICATOR 0x1000 //The feature requests with ports diff --git a/src/bin/Jamfile b/src/bin/Jamfile index 3295e1995b..e41b9b5e57 100644 --- a/src/bin/Jamfile +++ b/src/bin/Jamfile @@ -195,6 +195,9 @@ StdBinCommands setusbconfig.cpp : be libdevice.so : $(haiku-utils_rsrc) ; +ObjectHdrs [ FGristFiles listusb$(SUFOBJ) ] + : [ FDirName $(SUBDIR) $(DOTDOT) add-ons kernel bus_managers usb ] ; + # standard commands that need libbluetooth.so, due the Bluetooth Kit StdBinCommands bt_dev_info.cpp diff --git a/src/bin/listusb.cpp b/src/bin/listusb.cpp index 1508b45e45..f884b87690 100644 --- a/src/bin/listusb.cpp +++ b/src/bin/listusb.cpp @@ -13,6 +13,8 @@ #include #include +#include "usbspec_private.h" + const char* ClassName(int classNumber) { @@ -168,6 +170,40 @@ DumpInfo(BUSBDevice &device, bool verbose) printf(" [Configuration %lu]\n", i); DumpConfiguration(device.ConfigurationAt(i)); } + + if (device.Class() != 0x09) + return; + + usb_hub_descriptor hubDescriptor; + size_t size = device.GetDescriptor(USB_DESCRIPTOR_HUB, 0, 0, + (void *)&hubDescriptor, sizeof(usb_hub_descriptor)); + if (size == sizeof(usb_hub_descriptor)) { + printf(" Hub ports count......... %d\n", hubDescriptor.num_ports); + printf(" Hub Controller Current.. %dmA\n", hubDescriptor.max_power); + + for (int index = 1; index <= hubDescriptor.num_ports; index++) { + usb_port_status portStatus; + size_t actualLength = device.ControlTransfer(USB_REQTYPE_CLASS + | USB_REQTYPE_OTHER_IN, USB_REQUEST_GET_STATUS, 0, + index, sizeof(portStatus), (void *)&portStatus); + if (actualLength != sizeof(portStatus)) + continue; + printf(" Port %d status....... %04x.%04x%s%s%s%s%s%s%s%s%s\n", + index, portStatus.status, portStatus.change, + portStatus.status & PORT_STATUS_CONNECTION ? " Connect": "", + portStatus.status & PORT_STATUS_ENABLE ? " Enable": "", + portStatus.status & PORT_STATUS_SUSPEND ? " Suspend": "", + portStatus.status & PORT_STATUS_OVER_CURRENT ? " Overcurrent": "", + portStatus.status & PORT_STATUS_RESET ? " Reset": "", + portStatus.status & PORT_STATUS_POWER ? " Power": "", + portStatus.status & PORT_STATUS_CONNECTION ? + (portStatus.status & PORT_STATUS_LOW_SPEED ? " Lowspeed" + : (portStatus.status & PORT_STATUS_HIGH_SPEED ? " Highspeed" + : " Fullspeed")) : "", + portStatus.status & PORT_STATUS_TEST ? " Test": "", + portStatus.status & PORT_STATUS_INDICATOR ? " Indicator": ""); + } + } }