diff options
author | Federico Mena Quintero <federico@gnome.org> | 2015-05-19 18:35:02 -0500 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2016-06-10 23:27:58 +0200 |
commit | 3411164af3b765d1fc9f7bfa95be24e4e7acea2a (patch) | |
tree | dd894cd4cd99a7d084aa9db1054266fd2db06d44 /hwdb/acpi-update.py | |
parent | e373507d2570fe474a09fd6e3836ead32dca912f (diff) |
hwdb: update UEFI/ACPI/PNP/EISA/EDID database from UEFI web site
Let's hook up the ACPI database we maintain from the upstream UEFI sources.
This adds a tool to convert the database provided upstream to our native
format, similar to how this is handled for the PCI and USB databases.
Note that the upstream web site claims to offer an XLS download, but the actual
data made available is an HTML file in reality, just one with the ".xls"
suffix...
The data provided from the UEFI folks is not very high quality nor complete,
hence apply a patch after the conversion step that fixes up a few things and
adds in more entries from various sources. For example, the EDID ids maintained
by GNOME and other sources have been added too, as they all appear to use the
same ID namespace.
This also adds explicit support for 4 character ACPI ids, in addition to the
normal 3 character PNP ids.
Also fixes:
https://bugs.freedesktop.org/show_bug.cgi?id=90524
Diffstat (limited to 'hwdb/acpi-update.py')
-rwxr-xr-x | hwdb/acpi-update.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/hwdb/acpi-update.py b/hwdb/acpi-update.py new file mode 100755 index 0000000000..2dc8c7c064 --- /dev/null +++ b/hwdb/acpi-update.py @@ -0,0 +1,79 @@ +#!/usr/bin/python3 + +from html.parser import HTMLParser +from enum import Enum + +class State(Enum): + NOWHERE = 0 + COMPANY = 1 + AFTER_COMPANY = 2 + PNPID = 3 + AFTER_PNPID = 4 + DATE = 5 + +class PNPTableParser(HTMLParser): + + def __init__(self): + HTMLParser.__init__(self) + self.state = State.NOWHERE + self.data = "" + self.pnpid = None + self.company = None + self.table = [] + + def handle_starttag(self, tag, attrs): + + if tag == "td": + if self.state == State.NOWHERE: + self.state = State.COMPANY + elif self.state == State.AFTER_COMPANY: + self.state = State.PNPID + elif self.state == State.AFTER_PNPID: + self.state = State.DATE + else: + raise Error("Unexpected field") + + self.data = "" + + def handle_endtag(self, tag): + + if tag == "td": + if self.state == State.COMPANY: + self.company = ' '.join(self.data.strip().split()) + self.state = State.AFTER_COMPANY + elif self.state == State.PNPID: + self.pnpid = self.data.strip() + self.state = State.AFTER_PNPID + self.table.append((self.pnpid, self.company)) + elif self.state == State.DATE: + self.state = State.NOWHERE + else: + raise Error("Unexpected field") + + def handle_data(self, data): + self.data += data + +def read_table(a): + + parser = PNPTableParser() + + for line in a: + parser.feed(line) + + parser.close() + parser.table.sort() + + for pnpid, company in parser.table: + print("\nacpi:{0}*:\n ID_VENDOR_FROM_DATABASE={1}".format(pnpid, company)) + +a = open("acpi_id_registry.html") +b = open("pnp_id_registry.html") + +print('# This file is part of systemd.\n' + '#\n' + '# Data imported from:\n' + '# http://www.uefi.org/uefi-pnp-export\n' + '# http://www.uefi.org/uefi-acpi-export') + +read_table(a) +read_table(b) |