ids-update.pl revision c35ddc5b69ef1911de39933329eda0b569cae4b9
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz#!/usr/bin/perl
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantzuse strict;
5f5d1b4cc970b7f06ff8ef6526128e9a27303d88nduse warnings;
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdndsub usb_vendor {
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding my $vendor;
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding open(IN, "<", "usb.ids");
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding open(OUT, ">", "20-usb-vendor-product.hwdb");
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding print(OUT "# This file is part of systemd.\n" .
db479b48bd4d75423ed4a45e15b75089d1a8ad72fielding "#\n" .
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd "# Data imported and updated from: http://www.linux-usb.org/usb.ids\n");
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd while (my $line = <IN>) {
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd $line =~ s/\s+$//;
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd $line =~ m/^([0-9a-f]{4})\s*(.+)$/;
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd if (defined $1) {
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd $vendor = uc $1;
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd my $text = $2;
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd print(OUT "\n");
d5d794fc2f4cc9ca6d6da17cfa2cdcd8d244bacdnd print(OUT "usb:v" . $vendor . "*\n");
7db9f691a00ead175b03335457ca296a33ddf31bnd print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz next;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $line =~ m/^\t([0-9a-f]{4})\s*(.+)$/;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if (defined $1) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz my $product = uc $1;
169280c7e65362d4ed444ec262c3f22a6a280166nd my $text = $2;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "usb:v" . $vendor . "p" . $product . "*\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT " ID_PRODUCT_FROM_DATABASE=" . $text . "\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz close(INP);
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz close(OUTP);
9cd3b05d7b70f07a742bbaf548fa4fa2bdbe5ce6noodl}
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantzsub usb_classes {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz my $class;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz my $subclass;
43d99bfb458baee0a702c56a4ef4200e75c4dbb8yoshiki my $protocol;
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz open(IN, "<", "usb.ids");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz open(OUT, ">", "20-usb-classes.hwdb");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "# This file is part of systemd.\n" .
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz "#\n" .
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz "# Data imported and updated from: http://www.linux-usb.org/usb.ids\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz while (my $line = <IN>) {
43d99bfb458baee0a702c56a4ef4200e75c4dbb8yoshiki $line =~ s/\s+$//;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if (defined $1) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $class = uc $1;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if ($class =~ m/^00$/) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz next;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd my $text = $2;
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd print(OUT "\n");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd print(OUT "usb:v*p*d*dc" . $class . "*\n");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd print(OUT " ID_USB_CLASS_FROM_DATABASE=" . $text . "\n");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd next;
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd }
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd if (not defined $class) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz next;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz } elsif ($line =~ m/^$/) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz last;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $line =~ m/^\t([0-9a-f]{2})\s*(.+)$/;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if (defined $1) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $subclass = uc $1;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if ($subclass =~ m/^00$/) {
6f10385908fbdfd4849e4bc50e690ee54c62f2cdhumbedooh next;
6f10385908fbdfd4849e4bc50e690ee54c62f2cdhumbedooh }
6f10385908fbdfd4849e4bc50e690ee54c62f2cdhumbedooh my $text = $2;
6f10385908fbdfd4849e4bc50e690ee54c62f2cdhumbedooh if ($text =~ m/^(\?|None|Unused)$/) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz next;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "*\n");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd print(OUT " ID_USB_SUBCLASS_FROM_DATABASE=" . $text . "\n");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd next;
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd $line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if (defined $1) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $protocol = uc $1;
ab006d00972fa9529a7a41b8869056e9b08c75aayoshiki my $text = $2;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz if ($text =~ m/^(\?|None|Unused)$/) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz next;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "dp" . $protocol . "*\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz print(OUT " ID_USB_PROTOCOL_FROM_DATABASE=" . $text . "\n");
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz }
d423a2cc6aa6f80d8783f1211a86c4140dc86ca0yoshiki
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz close(INP);
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz close(OUTP);
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd}
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantzsub pci_vendor {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz my $vendor;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz my $device;
d423a2cc6aa6f80d8783f1211a86c4140dc86ca0yoshiki
d423a2cc6aa6f80d8783f1211a86c4140dc86ca0yoshiki open(IN, "<", "usb.ids");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd open(IN, "<", "pci.ids");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd open(OUT, ">", "20-pci-vendor-product.hwdb");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd print(OUT "# This file is part of systemd.\n" .
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz "#\n" .
d423a2cc6aa6f80d8783f1211a86c4140dc86ca0yoshiki "# Data imported and updated from: http://pci-ids.ucw.cz/v2.2/pci.ids\n");
35ffb30f57f777dbf3f17c5a5ddf706559942c16nd
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz while (my $line = <IN>) {
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $line =~ s/\s+$//;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz $line =~ m/^([0-9a-f]{4})\s*(.+)$/;
f43ed9051a7f4db461d67ed4f7ece175b3dbca7cjerenkrantz
if (defined $1) {
$vendor = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "pci:v0000" . $vendor . "*\n");
print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n");
next;
}
$line =~ m/^\t([0-9a-f]{4})\s*(.+)$/;
if (defined $1) {
$device = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "pci:v0000" . $vendor . "d0000" . $device . "*\n");
print(OUT " ID_PRODUCT_FROM_DATABASE=" . $text . "\n");
next;
}
$line =~ m/^\t\t([0-9a-f]{4})\s*([0-9a-f]{4})\s*(.*)$/;
if (defined $1) {
my $sub_vendor = uc $1;
my $sub_device = uc $2;
my $text = $3;
print(OUT "\n");
print(OUT "pci:v0000" . $vendor . "d0000" . $device . "sv0000" . $sub_vendor . "sd0000" . $sub_device . "*\n");
print(OUT " ID_PRODUCT_FROM_DATABASE=" . $text . "\n");
}
}
close(INP);
close(OUTP);
}
sub pci_classes {
my $class;
my $subclass;
my $interface;
open(IN, "<", "pci.ids");
open(OUT, ">", "20-pci-classes.hwdb");
print(OUT "# This file is part of systemd.\n" .
"#\n" .
"# Data imported and updated from: http://pci-ids.ucw.cz/v2.2/pci.ids\n");
while (my $line = <IN>) {
$line =~ s/\s+$//;
$line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/;
if (defined $1) {
$class = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "pci:v*d*sv*sd*bc" . $class . "*\n");
print(OUT " ID_PCI_CLASS_FROM_DATABASE=" . $text . "\n");
next;
}
if (not defined $class) {
next;
} elsif ($line =~ m/^$/) {
last;
}
$line =~ m/^\t([0-9a-f]{2})\s*(.+)$/;
if (defined $1) {
$subclass = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "pci:v*d*sv*sd*bc" . $class . "sc" . $subclass . "*\n");
print(OUT " ID_PCI_SUBCLASS_FROM_DATABASE=" . $text . "\n");
next;
}
$line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/;
if (defined $1) {
$interface = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "pci:v*d*sv*sd*bc" . $class . "sc" . $subclass . "i" . $interface . "*\n");
print(OUT " ID_PCI_INTERFACE_FROM_DATABASE=" . $text . "\n");
}
}
close(INP);
close(OUTP);
}
sub oui {
open(IN, "<", "oui.txt");
open(OUT, ">", "20-OUI.hwdb");
print(OUT "# This file is part of systemd.\n" .
"#\n" .
"# Data imported and updated from: http://standards.ieee.org/develop/regauth/oui/oui.txt\n");
while (my $line = <IN>) {
$line =~ s/\s+$//;
$line =~ m/^([0-9A-F]{6})\s*\(base 16\)\s*(.+)$/;
if (defined $1) {
my $vendor = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "OUI:" . $vendor . "\n");
print(OUT " ID_OUI_FROM_DATABASE=" . $text . "\n");
}
}
close(INP);
close(OUTP);
}
usb_vendor();
usb_classes();
pci_vendor();
pci_classes();
oui();