Skip to content

Commit

Permalink
Add udev's hwdb support straight into hwids.
Browse files Browse the repository at this point in the history
Download the ACPI table (which is not autogenerated) as well as the
hwdb updater script from systemd's git, and add a Makefile rule to
re-generate the hwdb files.
  • Loading branch information
Flameeyes committed Dec 2, 2012
1 parent a8716d3 commit 3f1e4ef
Show file tree
Hide file tree
Showing 4 changed files with 6,846 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/udev/20-OUI.hwdb
/udev/20-pci-classes.hwdb
/udev/20-pci-vendor-product.hwdb
/udev/20-usb-classes.hwdb
/udev/20-usb-vendor-product.hwdb
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,15 @@ fetch:
$(Q)$(HTTPCAT) http://pci-ids.ucw.cz/v2.2/pci.ids.bz2 | bzcat > pci.ids
$(Q)$(HTTPCAT) http://www.linux-usb.org/usb.ids.bz2 | bzcat > usb.ids
$(Q)$(HTTPCAT) http://standards.ieee.org/develop/regauth/oui/oui.txt > oui.txt
$(Q)$(HTTPCAT) http://cgit.freedesktop.org/systemd/systemd/plain/hwdb/20-acpi-vendor.hwdb > udev/20-acpi-vendor.hwdb
$(Q)$(HTTPCAT) http://cgit.freedesktop.org/systemd/systemd/plain/hwdb/ids-update.pl > udev-hwdb-update.pl
$(Q)$(STATUS)

PV ?= $(shell ( awk '$$2 == "Date:" { print $$3; nextfile }' pci.ids usb.ids; git log --format=format:%ci -1 -- oui.txt | cut -d ' ' -f1; ) | sort | tail -n 1 | tr -d -)
PV ?= $(shell ( awk '$$2 == "Date:" { print $$3; nextfile }' pci.ids usb.ids; git log --format=format:%ci -1 -- oui.txt hwdb/20-acpi-vendor.hwdb udev-hwdb-update.pl | cut -d ' ' -f1; ) | sort | tail -n 1 | tr -d -)
P = hwids-$(PV)

tag:
git tag $(P)

udev-hwdb:
perl ./udev-hwdb-update.pl && mv *.hwdb udev/
239 changes: 239 additions & 0 deletions udev-hwdb-update.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
#!/usr/bin/perl

use strict;
use warnings;

sub usb_vendor {
my $vendor;

open(IN, "<", "usb.ids");
open(OUT, ">", "20-usb-vendor-product.hwdb");
print(OUT "# This file is part of systemd.\n" .
"#\n" .
"# Data imported and updated from: http://www.linux-usb.org/usb.ids\n");

while (my $line = <IN>) {
$line =~ s/\s+$//;
$line =~ m/^([0-9a-f]{4})\s*(.+)$/;
if (defined $1) {
$vendor = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "usb:v" . $vendor . "*\n");
print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n");
next;
}

$line =~ m/^\t([0-9a-f]{4})\s*(.+)$/;
if (defined $1) {
my $product = uc $1;
my $text = $2;
print(OUT "\n");
print(OUT "usb:v" . $vendor . "p" . $product . "*\n");
print(OUT " ID_PRODUCT_FROM_DATABASE=" . $text . "\n");
}
}

close(INP);
close(OUTP);
}

sub usb_classes {
my $class;
my $subclass;
my $protocol;

open(IN, "<", "usb.ids");
open(OUT, ">", "20-usb-classes.hwdb");
print(OUT "# This file is part of systemd.\n" .
"#\n" .
"# Data imported and updated from: http://www.linux-usb.org/usb.ids\n");

while (my $line = <IN>) {
$line =~ s/\s+$//;

$line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/;
if (defined $1) {
$class = uc $1;
if ($class =~ m/^00$/) {
next;
}
my $text = $2;
print(OUT "\n");
print(OUT "usb:v*p*d*dc" . $class . "*\n");
print(OUT " ID_USB_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;
if ($subclass =~ m/^00$/) {
next;
}
my $text = $2;
if ($text =~ m/^(\?|None|Unused)$/) {
next;
}
print(OUT "\n");
print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "*\n");
print(OUT " ID_USB_SUBCLASS_FROM_DATABASE=" . $text . "\n");
next;
}

$line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/;
if (defined $1) {
$protocol = uc $1;
my $text = $2;
if ($text =~ m/^(\?|None|Unused)$/) {
next;
}
print(OUT "\n");
print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "dp" . $protocol . "*\n");
print(OUT " ID_USB_PROTOCOL_FROM_DATABASE=" . $text . "\n");
}
}

close(INP);
close(OUTP);
}

sub pci_vendor {
my $vendor;
my $device;

open(IN, "<", "usb.ids");
open(IN, "<", "pci.ids");
open(OUT, ">", "20-pci-vendor-product.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/^([0-9a-f]{4})\s*(.+)$/;

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();
Loading

0 comments on commit 3f1e4ef

Please sign in to comment.