listusb: display USB vendor and devices names based on usb.ids
* download usb.ids, processed like pci.ids to generate a header. * best would be to load and parse the file at runtime with shared code.
This commit is contained in:
@@ -1,23 +1,25 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2008, Haiku, Inc. All Rights Reserved.
|
* Copyright 2008-2012, Haiku, Inc. All Rights Reserved.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Jérôme Duval
|
* Jérôme Duval
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "usbdevs.h"
|
#include "usbhdr.h"
|
||||||
#include "usbdevs_data.h"
|
|
||||||
|
|
||||||
void
|
void
|
||||||
usb_get_vendor_info(uint16 vendorID, const char **vendorName)
|
usb_get_vendor_info(uint16 vendorID, const char **vendorName)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; usb_knowndevs[i].vendor != 0; i++) {
|
for (i = 0; i < (int)USB_VENTABLE_LEN; i++) {
|
||||||
if (usb_knowndevs[i].vendor == vendorID) {
|
if (UsbVenTable[i].VenId == vendorID) {
|
||||||
*vendorName = usb_knowndevs[i].vendorname;
|
*vendorName = UsbVenTable[i].VenName && UsbVenTable[i].VenName[0]
|
||||||
|
? UsbVenTable[i].VenName : NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -26,18 +28,16 @@ usb_get_vendor_info(uint16 vendorID, const char **vendorName)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
usb_get_vendor_device_info(uint16 vendorID, uint16 deviceID, const char **vendorName, const char **deviceName)
|
usb_get_device_info(uint16 vendorID, uint16 deviceID, const char **deviceName)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; usb_knowndevs[i].vendor != 0; i++) {
|
// search for the device
|
||||||
if (usb_knowndevs[i].vendor == vendorID
|
for (i = 0; i < (int)USB_DEVTABLE_LEN; i++) {
|
||||||
&& usb_knowndevs[i].product == deviceID
|
if (UsbDevTable[i].VenId == vendorID && UsbDevTable[i].DevId == deviceID ) {
|
||||||
&& usb_knowndevs[i].flags != USB_KNOWNDEV_NOPROD) {
|
*deviceName = UsbDevTable[i].ChipDesc && UsbDevTable[i].ChipDesc[0]
|
||||||
*deviceName = usb_knowndevs[i].productname;
|
? UsbDevTable[i].ChipDesc : NULL;
|
||||||
*vendorName = usb_knowndevs[i].vendorname;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*vendorName = NULL;
|
|
||||||
*deviceName = NULL;
|
*deviceName = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,28 +19,30 @@ rule ISAPnPHeaderGen
|
|||||||
|
|
||||||
actions ISAPnPHeaderGen1
|
actions ISAPnPHeaderGen1
|
||||||
{
|
{
|
||||||
grep '^PNP[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] ' $(2[1]) | gawk -f $(2[2]) > $(1) ;
|
grep '^PNP[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] ' $(2[1]) \
|
||||||
|
| gawk -f $(2[2]) > $(1) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
ISAPnPHeaderGen [ FGristFiles isapnpids.h ] : isapnp_devids.txt : devlist2h.awk ;
|
ISAPnPHeaderGen [ FGristFiles isapnpids.h ] : isapnp_devids.txt : devlist2h.awk ;
|
||||||
|
|
||||||
rule USBHeaderGen
|
rule USBDevsHeaderGen
|
||||||
{
|
{
|
||||||
SEARCH on $(2) = $(SEARCH_SOURCE) ;
|
SEARCH on $(2) = $(SEARCH_SOURCE) ;
|
||||||
SEARCH on $(3) = $(SEARCH_SOURCE) ;
|
SEARCH on $(3) = $(SEARCH_SOURCE) ;
|
||||||
|
|
||||||
Depends $(1) : $(2) $(3) ;
|
Depends $(1) : $(2) $(3) ;
|
||||||
MakeLocateArch $(<) ;
|
MakeLocateArch $(<) ;
|
||||||
USBHeaderGen1 $(1) : $(2) $(3) ;
|
USBDevsHeaderGen1 $(1) : $(2) $(3) ;
|
||||||
LocalClean clean : $(<) ;
|
LocalClean clean : $(<) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
actions USBHeaderGen1
|
actions USBDevsHeaderGen1
|
||||||
{
|
{
|
||||||
gawk -v HEADERFILE=$(1[1]) -v DATAFILE=$(1[2]) -f $(2[2]) $(2[1])
|
gawk -v HEADERFILE=$(1[1]) -v DATAFILE=$(1[2]) -f $(2[2]) $(2[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
USBHeaderGen [ FGristFiles usbdevs.h usbdevs_data.h ] : usbdevs : usb_devlist2h.awk ;
|
USBDevsHeaderGen [ FGristFiles usbdevs.h usbdevs_data.h ] : usbdevs
|
||||||
|
: usb_devlist2h.awk ;
|
||||||
|
|
||||||
rule PCIHeaderGen
|
rule PCIHeaderGen
|
||||||
{
|
{
|
||||||
@@ -63,6 +65,27 @@ local pciidsFile = [ DownloadFile pci.ids
|
|||||||
|
|
||||||
PCIHeaderGen [ FGristFiles pcihdr.h ] : $(pciidsFile) : pci-header.awk ;
|
PCIHeaderGen [ FGristFiles pcihdr.h ] : $(pciidsFile) : pci-header.awk ;
|
||||||
|
|
||||||
|
rule USBHeaderGen
|
||||||
|
{
|
||||||
|
SEARCH on $(2) = $(SEARCH_SOURCE) ;
|
||||||
|
SEARCH on $(3) = $(SEARCH_SOURCE) ;
|
||||||
|
|
||||||
|
Depends $(1) : $(2) $(3) ;
|
||||||
|
MakeLocateArch $(<) ;
|
||||||
|
USBHeaderGen1 $(1) : $(2) $(3) ;
|
||||||
|
LocalClean clean : $(<) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
actions USBHeaderGen1
|
||||||
|
{
|
||||||
|
gawk -v HEADERFILE=$(1) -f $(2[2]) $(2[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
local usbidsFile = [ DownloadFile usb.ids
|
||||||
|
: http://www.linux-usb.org/usb.ids ] ;
|
||||||
|
|
||||||
|
USBHeaderGen [ FGristFiles usbhdr.h ] : $(usbidsFile) : usb-header.awk ;
|
||||||
|
|
||||||
Application Devices :
|
Application Devices :
|
||||||
DevicesApplication.cpp
|
DevicesApplication.cpp
|
||||||
DevicesView.cpp
|
DevicesView.cpp
|
||||||
@@ -91,7 +114,5 @@ DoCatalogs Devices :
|
|||||||
Device.cpp
|
Device.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
Includes [ FGristFiles DevicesInfo.cpp ] : [ FGristFiles isapnpids.h usbdevs.h
|
Includes [ FGristFiles DevicePCI.cpp ] : [ FGristFiles pcihdr.h ] ;
|
||||||
usbdevs_data.h ] ;
|
|
||||||
Includes [ FGristFiles ConfigurationWindow.cpp ] : [ FGristFiles pcihdr.h ] ;
|
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ BEGIN {
|
|||||||
/^\t[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / {
|
/^\t[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / {
|
||||||
|
|
||||||
device = substr($0, 8)
|
device = substr($0, 8)
|
||||||
|
gsub( /\\/, "\\\\", device )
|
||||||
gsub( /\"/, "\\\"", device )
|
gsub( /\"/, "\\\"", device )
|
||||||
|
|
||||||
# store device ID for possible devices afterwards
|
# store device ID for possible devices afterwards
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# USB Header script
|
||||||
|
#
|
||||||
|
# Copyright 2006-2012, Haiku.
|
||||||
|
# Distributed under the terms of the MIT License.
|
||||||
|
#
|
||||||
|
# Authors:
|
||||||
|
# John Drinkwater, [email protected]
|
||||||
|
#
|
||||||
|
# Use with http://www.linux-usb.org/usb.ids
|
||||||
|
# run as: awk -v HEADERFILE=usbhdr.h -f usb-header.awk usb.ids
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
# field separator, defining because user could have overridden
|
||||||
|
FS = " "
|
||||||
|
|
||||||
|
# Pass this in from outside with -v HEADERFILE=filenametouse
|
||||||
|
# we require usbhdr.h for our system
|
||||||
|
ofile = HEADERFILE
|
||||||
|
|
||||||
|
# possibly use this in the future
|
||||||
|
cleanvalues = "[^A-Za-z0-9{}\"'&@?!*.,:;+<> \\t\\/_\\[\\]=#()-]"
|
||||||
|
# ToDo: currently IDs aren't checked, we dumbly assume the source is clean
|
||||||
|
|
||||||
|
# descriptive output header
|
||||||
|
print "#if 0" > ofile
|
||||||
|
print "#\tUSBHDR.H: USB Vendors, Devices\n#" > ofile
|
||||||
|
print "#\tGenerated by usb-header.awk, source data from the following URI:\n#\thttp://www.linux-usb.org/usb.ids\n#" > ofile
|
||||||
|
print "#\tHeader created on " strftime( "%A, %d %b %Y %H:%M:%S %Z", systime() ) > ofile
|
||||||
|
print "#endif" > ofile
|
||||||
|
|
||||||
|
# and we start with vendors..
|
||||||
|
print "\ntypedef struct _USB_VENTABLE\n{\n\tunsigned short\tVenId ;\n\tconst char *\tVenName ;\n} USB_VENTABLE, *PUSB_VENTABLE ;\n" > ofile
|
||||||
|
print "USB_VENTABLE\tUsbVenTable [] =\n{" > ofile
|
||||||
|
}
|
||||||
|
|
||||||
|
# matches vendor - starts with an id as first thing on the line
|
||||||
|
# because this occurs first in the header file, we output it without worry
|
||||||
|
/^[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / {
|
||||||
|
|
||||||
|
if ( vendorcount++ > 0 ) {
|
||||||
|
formatting = ",\n"
|
||||||
|
} else {
|
||||||
|
formatting = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# store vendor ID for possible devices afterwards
|
||||||
|
vendorid = $1
|
||||||
|
vendor = substr($0, 7)
|
||||||
|
gsub( /\"/, "\\\"", vendor )
|
||||||
|
|
||||||
|
printf formatting "\t{ 0x" vendorid ", \"" vendor "\" }" > ofile
|
||||||
|
}
|
||||||
|
|
||||||
|
# matches device
|
||||||
|
/^\t[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]] / {
|
||||||
|
|
||||||
|
device = substr($0, 8)
|
||||||
|
gsub( /\\/, "\\\\", device )
|
||||||
|
gsub( /\"/, "\\\"", device )
|
||||||
|
|
||||||
|
# store device ID for possible devices afterwards
|
||||||
|
deviceid = $1
|
||||||
|
devicecount++
|
||||||
|
devices[devicecount, 1] = vendorid
|
||||||
|
devices[devicecount, 2] = $1
|
||||||
|
devices[devicecount, 3] = device
|
||||||
|
}
|
||||||
|
|
||||||
|
# We've processed the file, now output.
|
||||||
|
END {
|
||||||
|
|
||||||
|
print "\n};\n\n// Use this value for loop control during searching:\n#define\tUSB_VENTABLE_LEN\t(sizeof(UsbVenTable)/sizeof(USB_VENTABLE))\n" > ofile
|
||||||
|
|
||||||
|
if ( devicecount > 0 ) {
|
||||||
|
|
||||||
|
print "typedef struct _USB_DEVTABLE\n{\n\tunsigned short VenId ;\n\tunsigned short DevId ;\n\tconst char *\tChipDesc ;\n} USB_DEVTABLE, *PUSB_DEVTABLE ;\n" > ofile
|
||||||
|
print "USB_DEVTABLE\tUsbDevTable [] =\n{" > ofile
|
||||||
|
for (i = 1; i <= devicecount; i++) {
|
||||||
|
|
||||||
|
if (i != 1) {
|
||||||
|
formatting = ",\n"
|
||||||
|
} else {
|
||||||
|
formatting = ""
|
||||||
|
}
|
||||||
|
printf formatting "\t{ 0x" devices[i, 1] ", 0x" devices[i, 2] ", \"" devices[i, 3] "\" }" > ofile
|
||||||
|
}
|
||||||
|
print "\n} ;\n\n// Use this value for loop control during searching:\n#define USB_DEVTABLE_LEN (sizeof(UsbDevTable)/sizeof(USB_DEVTABLE))\n" > ofile
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
close(ofile)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+3
-1
@@ -198,7 +198,9 @@ StdBinCommands
|
|||||||
: be libdevice.so : $(haiku-utils_rsrc) ;
|
: be libdevice.so : $(haiku-utils_rsrc) ;
|
||||||
|
|
||||||
ObjectHdrs [ FGristFiles listusb$(SUFOBJ) ]
|
ObjectHdrs [ FGristFiles listusb$(SUFOBJ) ]
|
||||||
: [ FDirName $(SUBDIR) $(DOTDOT) add-ons kernel bus_managers usb ] ;
|
: [ FDirName $(SUBDIR) $(DOTDOT) add-ons kernel bus_managers usb ]
|
||||||
|
[ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR) apps devices ] ;
|
||||||
|
Includes [ FGristFiles listusb.cpp ] : <src!apps!devices>usbhdr.h ;
|
||||||
|
|
||||||
# standard commands that need libbluetooth.so, due the Bluetooth Kit
|
# standard commands that need libbluetooth.so, due the Bluetooth Kit
|
||||||
StdBinCommands
|
StdBinCommands
|
||||||
|
|||||||
+12
-3
@@ -14,6 +14,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "usbspec_private.h"
|
#include "usbspec_private.h"
|
||||||
|
#include "usb-utils.h"
|
||||||
|
|
||||||
|
|
||||||
const char*
|
const char*
|
||||||
@@ -152,6 +153,10 @@ DumpInfo(BUSBDevice &device, bool verbose)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *vendorName = NULL, *deviceName = NULL;
|
||||||
|
usb_get_vendor_info(device.VendorID(), &vendorName);
|
||||||
|
usb_get_device_info(device.VendorID(), device.ProductID(), &deviceName);
|
||||||
|
|
||||||
printf("[Device /dev/bus/usb%s]\n", device.Location());
|
printf("[Device /dev/bus/usb%s]\n", device.Location());
|
||||||
printf(" Class .................. 0x%02x (%s)\n", device.Class(),
|
printf(" Class .................. 0x%02x (%s)\n", device.Class(),
|
||||||
ClassName(device.Class()));
|
ClassName(device.Class()));
|
||||||
@@ -159,9 +164,13 @@ DumpInfo(BUSBDevice &device, bool verbose)
|
|||||||
printf(" Protocol ............... 0x%02x\n", device.Protocol());
|
printf(" Protocol ............... 0x%02x\n", device.Protocol());
|
||||||
printf(" Max Endpoint 0 Packet .. %d\n", device.MaxEndpoint0PacketSize());
|
printf(" Max Endpoint 0 Packet .. %d\n", device.MaxEndpoint0PacketSize());
|
||||||
printf(" USB Version ............ 0x%04x\n", device.USBVersion());
|
printf(" USB Version ............ 0x%04x\n", device.USBVersion());
|
||||||
printf(" Vendor ID .............. 0x%04x\n", device.VendorID());
|
printf(" Vendor ID .............. 0x%04x", device.VendorID());
|
||||||
printf(" Product ID ............. 0x%04x\n", device.ProductID());
|
if (vendorName != NULL)
|
||||||
printf(" Product Version ........ 0x%04x\n", device.Version());
|
printf(" (%s)", vendorName);
|
||||||
|
printf("\n Product ID ............. 0x%04x", device.ProductID());
|
||||||
|
if (deviceName != NULL)
|
||||||
|
printf(" (%s)", deviceName);
|
||||||
|
printf("\n Product Version ........ 0x%04x\n", device.Version());
|
||||||
printf(" Manufacturer String .... \"%s\"\n", device.ManufacturerString());
|
printf(" Manufacturer String .... \"%s\"\n", device.ManufacturerString());
|
||||||
printf(" Product String ......... \"%s\"\n", device.ProductString());
|
printf(" Product String ......... \"%s\"\n", device.ProductString());
|
||||||
printf(" Serial Number .......... \"%s\"\n", device.SerialNumberString());
|
printf(" Serial Number .......... \"%s\"\n", device.SerialNumberString());
|
||||||
|
|||||||
Reference in New Issue
Block a user