- Updated pci, usb, vendor ids and hwdb files
[oweals/hwdata.git] / ids-update.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Date::Format;
6
7 sub usb_vendor {
8         my $vendor;
9         my $source_date;
10
11         open(IN, "<", "usb.ids");
12         open(OUT, ">", "20-usb-vendor-model.hwdb");
13         print(OUT "# This file is part of systemd.\n" .
14                   "#\n" .
15                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
16                   "#\n" .
17                   "# Data imported from: http://www.linux-usb.org/usb.ids\n");
18
19         while (my $line = <IN>) {
20                 $line =~ s/\s+$//;
21                 if (not defined $source_date) {
22                     $line =~ m/^#\s*Date:\s*(.+)$/;
23                     if (defined $1) {
24                             $source_date = $1;
25                             print(OUT "#\n# Source date: $1\n");
26                             next;
27                     }
28                 }
29
30                 $line =~ m/^([0-9a-f]{4})\s*(.+)$/;
31                 if (defined $1) {
32                         $vendor = uc $1;
33                         my $text = $2;
34                         print(OUT "\n");
35                         print(OUT "usb:v" . $vendor . "*\n");
36                         print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n");
37                         next;
38                 }
39
40                 $line =~ m/^\t([0-9a-f]{4})\s*(.+)$/;
41                 if (defined $1) {
42                         my $model = uc $1;
43                         my $text = $2;
44                         print(OUT "\n");
45                         print(OUT "usb:v" . $vendor . "p" . $model . "*\n");
46                         print(OUT " ID_MODEL_FROM_DATABASE=" . $text . "\n");
47                 }
48         }
49
50         close(IN);
51         close(OUT);
52 }
53
54 sub usb_classes {
55         my $class;
56         my $subclass;
57         my $protocol;
58         my $source_date;
59
60         open(IN, "<", "usb.ids");
61         open(OUT, ">", "20-usb-classes.hwdb");
62         print(OUT "# This file is part of systemd.\n" .
63                   "#\n" .
64                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
65                   "#\n" .
66                   "# Data imported from: http://www.linux-usb.org/usb.ids\n");
67
68         while (my $line = <IN>) {
69                 $line =~ s/\s+$//;
70
71                 if (not defined $source_date) {
72                     $line =~ m/^#\s*Date:\s*(.+)$/;
73                     if (defined $1) {
74                             $source_date = $1;
75                             print(OUT "#\n# Source date: $1\n");
76                             next;
77                     }
78                 }
79
80                 $line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/;
81                 if (defined $1) {
82                         $class = uc $1;
83                         if ($class =~ m/^00$/) {
84                                 next;
85                         }
86                         my $text = $2;
87                         print(OUT "\n");
88                         print(OUT "usb:v*p*d*dc" . $class . "*\n");
89                         print(OUT " ID_USB_CLASS_FROM_DATABASE=" . $text . "\n");
90                         next;
91                 }
92
93                 if (not defined $class) {
94                         next;
95                 } elsif ($line =~ m/^$/) {
96                         last;
97                 }
98
99                 $line =~ m/^\t([0-9a-f]{2})\s*(.+)$/;
100                 if (defined $1) {
101                         $subclass = uc $1;
102                         if ($subclass =~ m/^00$/) {
103                                 next;
104                         }
105                         my $text = $2;
106                         if ($text =~ m/^(\?|None|Unused)$/) {
107                                 next;
108                         }
109                         print(OUT "\n");
110                         print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "*\n");
111                         print(OUT " ID_USB_SUBCLASS_FROM_DATABASE=" . $text . "\n");
112                         next;
113                 }
114
115                 $line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/;
116                 if (defined $1) {
117                         $protocol = uc $1;
118                         my $text = $2;
119                         if ($text =~ m/^(\?|None|Unused)$/) {
120                                 next;
121                         }
122                         print(OUT "\n");
123                         print(OUT "usb:v*p*d*dc" .  $class . "dsc" . $subclass . "dp" . $protocol . "*\n");
124                         print(OUT " ID_USB_PROTOCOL_FROM_DATABASE=" . $text . "\n");
125                 }
126         }
127
128         close(IN);
129         close(OUT);
130 }
131
132 sub pci_vendor {
133         my $vendor;
134         my $device;
135         my $device_text;
136         my $source_date;
137
138         open(IN, "<", "pci.ids");
139         open(OUT, ">", "20-pci-vendor-model.hwdb");
140         print(OUT "# This file is part of systemd.\n" .
141                   "#\n" .
142                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
143                   "#\n" .
144                   "# Data imported from: http://pci-ids.ucw.cz/v2.2/pci.ids\n");
145
146         while (my $line = <IN>) {
147                 $line =~ s/\s+$//;
148
149                 if (not defined $source_date) {
150                     $line =~ m/^#\s*Date:\s*(.+)$/;
151                     if (defined $1) {
152                             $source_date = $1;
153                             print(OUT "#\n# Source date: $1\n");
154                             next;
155                     }
156                 }
157
158                 $line =~ m/^([0-9a-f]{4})\s*(.+)$/;
159                 if (defined $1) {
160                         $vendor = uc $1;
161                         my $text = $2;
162                         print(OUT "\n");
163                         print(OUT "pci:v0000" . $vendor . "*\n");
164                         print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n");
165                         next;
166                 }
167
168                 $line =~ m/^\t([0-9a-f]{4})\s*(.+)$/;
169                 if (defined $1) {
170                         $device = uc $1;
171                         $device_text = $2;
172                         print(OUT "\n");
173                         print(OUT "pci:v0000" . $vendor . "d0000" . $device . "*\n");
174                         print(OUT " ID_MODEL_FROM_DATABASE=" . $device_text . "\n");
175                         next;
176                 }
177
178                 $line =~ m/^\t\t([0-9a-f]{4})\s*([0-9a-f]{4})\s*(.*)$/;
179                 if (defined $1) {
180                         my $sub_vendor = uc $1;
181                         my $sub_device = uc $2;
182                         my $sub_text = $3;
183                         $sub_text =~ s/^\Q$device_text\E\s*//;
184                         $sub_text =~ s/(.+)/\ ($1)/;
185                         print(OUT "\n");
186                         print(OUT "pci:v0000" . $vendor . "d0000" . $device . "sv0000" . $sub_vendor . "sd0000" . $sub_device . "*\n");
187                         print(OUT " ID_MODEL_FROM_DATABASE=" . $device_text . $sub_text . "\n");
188                 }
189         }
190
191         close(IN);
192         close(OUT);
193 }
194
195 sub pci_classes {
196         my $class;
197         my $subclass;
198         my $interface;
199         my $source_date;
200
201         open(IN, "<", "pci.ids");
202         open(OUT, ">", "20-pci-classes.hwdb");
203         print(OUT "# This file is part of systemd.\n" .
204                   "#\n" .
205                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
206                   "#\n" .
207                   "# Data imported from: http://pci-ids.ucw.cz/v2.2/pci.ids\n");
208
209         while (my $line = <IN>) {
210                 $line =~ s/\s+$//;
211
212                 if (not defined $source_date) {
213                     $line =~ m/^#\s*Date:\s*(.+)$/;
214                     if (defined $1) {
215                             $source_date = $1;
216                             print(OUT "#\n# Source date: $1\n");
217                             next;
218                     }
219                 }
220
221                 $line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/;
222                 if (defined $1) {
223                         $class = uc $1;
224                         my $text = $2;
225                         print(OUT "\n");
226                         print(OUT "pci:v*d*sv*sd*bc" . $class . "*\n");
227                         print(OUT " ID_PCI_CLASS_FROM_DATABASE=" . $text . "\n");
228                         next;
229                 }
230
231                 if (not defined $class) {
232                         next;
233                 } elsif ($line =~ m/^$/) {
234                         last;
235                 }
236
237                 $line =~ m/^\t([0-9a-f]{2})\s*(.+)$/;
238                 if (defined $1) {
239                         $subclass = uc $1;
240                         my $text = $2;
241                         print(OUT "\n");
242                         print(OUT "pci:v*d*sv*sd*bc" . $class . "sc" . $subclass . "*\n");
243                         print(OUT " ID_PCI_SUBCLASS_FROM_DATABASE=" . $text . "\n");
244                         next;
245                 }
246
247                 $line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/;
248                 if (defined $1) {
249                         $interface = uc $1;
250                         my $text = $2;
251                         print(OUT "\n");
252                         print(OUT "pci:v*d*sv*sd*bc" .  $class . "sc" . $subclass . "i" . $interface . "*\n");
253                         print(OUT " ID_PCI_INTERFACE_FROM_DATABASE=" . $text . "\n");
254                 }
255         }
256
257         close(IN);
258         close(OUT);
259 }
260
261 sub sdio_vendor {
262         my $vendor;
263         my $device;
264
265         open(IN, "<", "sdio.ids");
266         open(OUT, ">", "20-sdio-vendor-model.hwdb");
267         print(OUT "# This file is part of systemd.\n" .
268                   "#\n" .
269                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
270                   "#\n" .
271                   "# Data imported from: hwdb/sdio.ids\n");
272
273         while (my $line = <IN>) {
274                 $line =~ s/\s+$//;
275
276                 $line =~ m/^([0-9a-f]{4})\s*(.+)$/;
277                 if (defined $1) {
278                         $vendor = uc $1;
279                         my $text = $2;
280                         print(OUT "\n");
281                         print(OUT "sdio:c*v" . $vendor . "*\n");
282                         print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n");
283                         next;
284                 }
285
286                 $line =~ m/^\t([0-9a-f]{4})\s*(.+)$/;
287                 if (defined $1) {
288                         $device = uc $1;
289                         my $text = $2;
290                         print(OUT "\n");
291                         print(OUT "sdio:c*v" . $vendor . "d" . $device . "*\n");
292                         print(OUT " ID_MODEL_FROM_DATABASE=" . $text . "\n");
293                         next;
294                 }
295         }
296
297         close(IN);
298         close(OUT);
299 }
300
301 sub sdio_classes {
302         my $class;
303         my $subclass;
304         my $interface;
305
306         open(IN, "<", "sdio.ids");
307         open(OUT, ">", "20-sdio-classes.hwdb");
308         print(OUT "# This file is part of systemd.\n" .
309                   "#\n" .
310                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
311                   "#\n" .
312                   "# Data imported from: hwdb/sdio.ids\n");
313
314         while (my $line = <IN>) {
315                 $line =~ s/\s+$//;
316
317                 $line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/;
318                 if (defined $1) {
319                         $class = uc $1;
320                         my $text = $2;
321                         print(OUT "\n");
322                         print(OUT "sdio:c" . $class . "v*d*\n");
323                         print(OUT " ID_SDIO_CLASS_FROM_DATABASE=" . $text . "\n");
324                         next;
325                 }
326         }
327
328         close(IN);
329         close(OUT);
330 }
331
332 sub oui {
333         my $iab_prefix;
334         my %iab_prefixes = ();
335         my $source_date;
336
337         open(OUT, ">", "20-OUI.hwdb");
338         print(OUT "# This file is part of systemd.\n" .
339                   "#\n" .
340                   "# Generated:     " . time2str("%Y-%m-%d\n", time) .
341                   "#\n" .
342                   "# Data imported from:\n" .
343                   "#   http://standards.ieee.org/develop/regauth/oui/oui.txt\n" .
344                   "#   http://standards.ieee.org/develop/regauth/iab/iab.txt\n");
345
346         open(IN, "<", "iab.txt");
347         while (my $line = <IN>) {
348                 $line =~ s/^ +//;
349
350                 if (not defined $source_date) {
351                     $line =~ m/^\s*Generated:\s+(.+)$/;
352                     if (defined $1) {
353                             $source_date = $1;
354                             print(OUT "#\n# Source date: $1\n");
355                             next;
356                     }
357                 }
358
359                 $line =~ s/\s+$//;
360                 $line =~ m/^([0-9A-F]{2})-([0-9A-F]{2})-([0-9A-F]{2})\s*\(hex\)\s*.+$/;
361                 if (defined $1) {
362                         $iab_prefix = $1 . $2 . $3;
363                         $iab_prefixes{ $iab_prefix } = 1;
364                         next;
365                 }
366
367                 $line =~ m/^([0-9A-F]{3})000-\g1FFF\s*\(base 16\)\s*(.+)$/;
368                 if (defined $1) {
369                         my $vendor = uc $1;
370                         my $text = $2;
371
372                         print(OUT "\n");
373                         print(OUT "OUI:" . $iab_prefix . $vendor . "*\n");
374                         print(OUT " ID_OUI_FROM_DATABASE=" . $text . "\n");
375                 }
376         }
377         close(IN);
378
379         open(IN, "<", "oui.txt");
380         while (my $line = <IN>) {
381                 $line =~ s/^ +//;
382                 $line =~ s/\s+$//;
383                 $line =~ m/^([0-9A-F]{6})\s*\(base 16\)\s*(.+)$/;
384                 if (defined $1) {
385                         my $vendor = uc $1;
386                         my $text = $2;
387
388                         # skip the IAB prefixes
389                         if (! exists $iab_prefixes{ $vendor }) {
390                                 print(OUT "\n");
391                                 print(OUT "OUI:" . $vendor . "*\n");
392                                 print(OUT " ID_OUI_FROM_DATABASE=" . $text . "\n");
393                         }
394                 }
395         }
396         close(IN);
397         close(OUT);
398 }
399
400 usb_vendor();
401 usb_classes();
402
403 pci_vendor();
404 pci_classes();
405
406 sdio_vendor();
407 sdio_classes();
408
409 oui();