]>
Commit | Line | Data |
---|---|---|
796b06c2 KS |
1 | #!/usr/bin/perl |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | ||
cf7ebcea | 6 | sub usb_vendor { |
8db6dcfd KS |
7 | my $vendor; |
8 | ||
9 | open(IN, "<", "usb.ids"); | |
1d09582a | 10 | open(OUT, ">", "20-usb-vendor-model.hwdb"); |
8db6dcfd KS |
11 | print(OUT "# This file is part of systemd.\n" . |
12 | "#\n" . | |
378cf88f | 13 | "# Data imported from: http://www.linux-usb.org/usb.ids\n"); |
8db6dcfd KS |
14 | |
15 | while (my $line = <IN>) { | |
16 | $line =~ s/\s+$//; | |
c35ddc5b | 17 | $line =~ m/^([0-9a-f]{4})\s*(.+)$/; |
8db6dcfd KS |
18 | if (defined $1) { |
19 | $vendor = uc $1; | |
20 | my $text = $2; | |
21 | print(OUT "\n"); | |
22 | print(OUT "usb:v" . $vendor . "*\n"); | |
23 | print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n"); | |
24 | next; | |
25 | } | |
26 | ||
c35ddc5b | 27 | $line =~ m/^\t([0-9a-f]{4})\s*(.+)$/; |
8db6dcfd | 28 | if (defined $1) { |
1d09582a | 29 | my $model = uc $1; |
8db6dcfd KS |
30 | my $text = $2; |
31 | print(OUT "\n"); | |
1d09582a KS |
32 | print(OUT "usb:v" . $vendor . "p" . $model . "*\n"); |
33 | print(OUT " ID_MODEL_FROM_DATABASE=" . $text . "\n"); | |
8db6dcfd KS |
34 | } |
35 | } | |
36 | ||
f9cd2224 MM |
37 | close(IN); |
38 | close(OUT); | |
8db6dcfd KS |
39 | } |
40 | ||
41 | sub usb_classes { | |
42 | my $class; | |
43 | my $subclass; | |
44 | my $protocol; | |
45 | ||
46 | open(IN, "<", "usb.ids"); | |
47 | open(OUT, ">", "20-usb-classes.hwdb"); | |
48 | print(OUT "# This file is part of systemd.\n" . | |
49 | "#\n" . | |
378cf88f | 50 | "# Data imported from: http://www.linux-usb.org/usb.ids\n"); |
8db6dcfd KS |
51 | |
52 | while (my $line = <IN>) { | |
53 | $line =~ s/\s+$//; | |
54 | ||
c35ddc5b | 55 | $line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/; |
8db6dcfd KS |
56 | if (defined $1) { |
57 | $class = uc $1; | |
09d8f5d7 | 58 | if ($class =~ m/^00$/) { |
8db6dcfd KS |
59 | next; |
60 | } | |
09d8f5d7 | 61 | my $text = $2; |
8db6dcfd KS |
62 | print(OUT "\n"); |
63 | print(OUT "usb:v*p*d*dc" . $class . "*\n"); | |
64 | print(OUT " ID_USB_CLASS_FROM_DATABASE=" . $text . "\n"); | |
65 | next; | |
66 | } | |
67 | ||
68 | if (not defined $class) { | |
69 | next; | |
70 | } elsif ($line =~ m/^$/) { | |
71 | last; | |
72 | } | |
73 | ||
c35ddc5b | 74 | $line =~ m/^\t([0-9a-f]{2})\s*(.+)$/; |
8db6dcfd KS |
75 | if (defined $1) { |
76 | $subclass = uc $1; | |
09d8f5d7 KS |
77 | if ($subclass =~ m/^00$/) { |
78 | next; | |
79 | } | |
8db6dcfd KS |
80 | my $text = $2; |
81 | if ($text =~ m/^(\?|None|Unused)$/) { | |
82 | next; | |
83 | } | |
84 | print(OUT "\n"); | |
85 | print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "*\n"); | |
86 | print(OUT " ID_USB_SUBCLASS_FROM_DATABASE=" . $text . "\n"); | |
87 | next; | |
88 | } | |
89 | ||
c35ddc5b | 90 | $line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/; |
8db6dcfd KS |
91 | if (defined $1) { |
92 | $protocol = uc $1; | |
93 | my $text = $2; | |
94 | if ($text =~ m/^(\?|None|Unused)$/) { | |
95 | next; | |
96 | } | |
97 | print(OUT "\n"); | |
98 | print(OUT "usb:v*p*d*dc" . $class . "dsc" . $subclass . "dp" . $protocol . "*\n"); | |
99 | print(OUT " ID_USB_PROTOCOL_FROM_DATABASE=" . $text . "\n"); | |
100 | } | |
101 | } | |
102 | ||
f9cd2224 MM |
103 | close(IN); |
104 | close(OUT); | |
cf7ebcea KS |
105 | } |
106 | ||
107 | sub pci_vendor { | |
8db6dcfd KS |
108 | my $vendor; |
109 | my $device; | |
110 | ||
8db6dcfd | 111 | open(IN, "<", "pci.ids"); |
1d09582a | 112 | open(OUT, ">", "20-pci-vendor-model.hwdb"); |
8db6dcfd KS |
113 | print(OUT "# This file is part of systemd.\n" . |
114 | "#\n" . | |
378cf88f | 115 | "# Data imported from: http://pci-ids.ucw.cz/v2.2/pci.ids\n"); |
8db6dcfd KS |
116 | |
117 | while (my $line = <IN>) { | |
118 | $line =~ s/\s+$//; | |
c35ddc5b | 119 | $line =~ m/^([0-9a-f]{4})\s*(.+)$/; |
8db6dcfd KS |
120 | |
121 | if (defined $1) { | |
122 | $vendor = uc $1; | |
123 | my $text = $2; | |
124 | print(OUT "\n"); | |
125 | print(OUT "pci:v0000" . $vendor . "*\n"); | |
126 | print(OUT " ID_VENDOR_FROM_DATABASE=" . $text . "\n"); | |
127 | next; | |
128 | } | |
129 | ||
c35ddc5b | 130 | $line =~ m/^\t([0-9a-f]{4})\s*(.+)$/; |
8db6dcfd KS |
131 | if (defined $1) { |
132 | $device = uc $1; | |
133 | my $text = $2; | |
134 | print(OUT "\n"); | |
135 | print(OUT "pci:v0000" . $vendor . "d0000" . $device . "*\n"); | |
1d09582a | 136 | print(OUT " ID_MODEL_FROM_DATABASE=" . $text . "\n"); |
8db6dcfd KS |
137 | next; |
138 | } | |
139 | ||
140 | $line =~ m/^\t\t([0-9a-f]{4})\s*([0-9a-f]{4})\s*(.*)$/; | |
141 | if (defined $1) { | |
142 | my $sub_vendor = uc $1; | |
143 | my $sub_device = uc $2; | |
144 | my $text = $3; | |
145 | print(OUT "\n"); | |
146 | print(OUT "pci:v0000" . $vendor . "d0000" . $device . "sv0000" . $sub_vendor . "sd0000" . $sub_device . "*\n"); | |
1d09582a | 147 | print(OUT " ID_MODEL_FROM_DATABASE=" . $text . "\n"); |
8db6dcfd KS |
148 | } |
149 | } | |
150 | ||
f9cd2224 MM |
151 | close(IN); |
152 | close(OUT); | |
796b06c2 | 153 | } |
cf7ebcea KS |
154 | |
155 | sub pci_classes { | |
8db6dcfd KS |
156 | my $class; |
157 | my $subclass; | |
158 | my $interface; | |
159 | ||
160 | open(IN, "<", "pci.ids"); | |
161 | open(OUT, ">", "20-pci-classes.hwdb"); | |
162 | print(OUT "# This file is part of systemd.\n" . | |
163 | "#\n" . | |
378cf88f | 164 | "# Data imported from: http://pci-ids.ucw.cz/v2.2/pci.ids\n"); |
8db6dcfd KS |
165 | |
166 | while (my $line = <IN>) { | |
167 | $line =~ s/\s+$//; | |
168 | ||
c35ddc5b | 169 | $line =~ m/^C\ ([0-9a-f]{2})\s*(.+)$/; |
8db6dcfd KS |
170 | if (defined $1) { |
171 | $class = uc $1; | |
172 | my $text = $2; | |
173 | print(OUT "\n"); | |
174 | print(OUT "pci:v*d*sv*sd*bc" . $class . "*\n"); | |
175 | print(OUT " ID_PCI_CLASS_FROM_DATABASE=" . $text . "\n"); | |
176 | next; | |
177 | } | |
178 | ||
179 | if (not defined $class) { | |
180 | next; | |
181 | } elsif ($line =~ m/^$/) { | |
182 | last; | |
183 | } | |
184 | ||
c35ddc5b | 185 | $line =~ m/^\t([0-9a-f]{2})\s*(.+)$/; |
8db6dcfd KS |
186 | if (defined $1) { |
187 | $subclass = uc $1; | |
188 | my $text = $2; | |
189 | print(OUT "\n"); | |
190 | print(OUT "pci:v*d*sv*sd*bc" . $class . "sc" . $subclass . "*\n"); | |
191 | print(OUT " ID_PCI_SUBCLASS_FROM_DATABASE=" . $text . "\n"); | |
192 | next; | |
193 | } | |
194 | ||
c35ddc5b | 195 | $line =~ m/^\t\t([0-9a-f]{2})\s*(.+)$/; |
8db6dcfd KS |
196 | if (defined $1) { |
197 | $interface = uc $1; | |
198 | my $text = $2; | |
199 | print(OUT "\n"); | |
200 | print(OUT "pci:v*d*sv*sd*bc" . $class . "sc" . $subclass . "i" . $interface . "*\n"); | |
201 | print(OUT " ID_PCI_INTERFACE_FROM_DATABASE=" . $text . "\n"); | |
202 | } | |
203 | } | |
204 | ||
f9cd2224 MM |
205 | close(IN); |
206 | close(OUT); | |
796b06c2 | 207 | } |
cf7ebcea KS |
208 | |
209 | sub oui { | |
5fe25aff TG |
210 | my $iab_prefix; |
211 | my %iab_prefixes = (); | |
212 | ||
8db6dcfd KS |
213 | open(OUT, ">", "20-OUI.hwdb"); |
214 | print(OUT "# This file is part of systemd.\n" . | |
215 | "#\n" . | |
378cf88f KS |
216 | "# Data imported from:\n" . |
217 | "# http://standards.ieee.org/develop/regauth/oui/oui.txt\n" . | |
218 | "# http://standards.ieee.org/develop/regauth/iab/iab.txt\n"); | |
8db6dcfd | 219 | |
5fe25aff | 220 | open(IN, "<", "iab.txt"); |
8db6dcfd | 221 | while (my $line = <IN>) { |
f2f18613 | 222 | $line =~ s/^ +//; |
8db6dcfd | 223 | $line =~ s/\s+$//; |
5fe25aff TG |
224 | $line =~ m/^([0-9A-F]{2})-([0-9A-F]{2})-([0-9A-F]{2})\s*\(hex\)\s*.+$/; |
225 | if (defined $1) { | |
226 | $iab_prefix = $1 . $2 . $3; | |
227 | $iab_prefixes{ $iab_prefix } = 1; | |
228 | next; | |
229 | } | |
230 | ||
231 | $line =~ m/^([0-9A-F]{3})000-\g1FFF\s*\(base 16\)\s*(.+)$/; | |
8db6dcfd KS |
232 | if (defined $1) { |
233 | my $vendor = uc $1; | |
234 | my $text = $2; | |
5fe25aff | 235 | |
8db6dcfd | 236 | print(OUT "\n"); |
5fe25aff | 237 | print(OUT "OUI:" . $iab_prefix . $vendor . "*\n"); |
8db6dcfd KS |
238 | print(OUT " ID_OUI_FROM_DATABASE=" . $text . "\n"); |
239 | } | |
240 | } | |
f9cd2224 | 241 | close(IN); |
5fe25aff TG |
242 | |
243 | open(IN, "<", "oui.txt"); | |
244 | while (my $line = <IN>) { | |
f2f18613 | 245 | $line =~ s/^ +//; |
5fe25aff TG |
246 | $line =~ s/\s+$//; |
247 | $line =~ m/^([0-9A-F]{6})\s*\(base 16\)\s*(.+)$/; | |
248 | if (defined $1) { | |
249 | my $vendor = uc $1; | |
250 | my $text = $2; | |
8db6dcfd | 251 | |
5fe25aff TG |
252 | # skip the IAB prefixes |
253 | if (! exists $iab_prefixes{ $vendor }) { | |
254 | print(OUT "\n"); | |
255 | print(OUT "OUI:" . $vendor . "*\n"); | |
256 | print(OUT " ID_OUI_FROM_DATABASE=" . $text . "\n"); | |
257 | } | |
258 | } | |
259 | } | |
f9cd2224 MM |
260 | close(IN); |
261 | close(OUT); | |
448004c3 | 262 | } |
cf7ebcea KS |
263 | |
264 | usb_vendor(); | |
8db6dcfd KS |
265 | usb_classes(); |
266 | ||
cf7ebcea KS |
267 | pci_vendor(); |
268 | pci_classes(); | |
8db6dcfd | 269 | |
cf7ebcea | 270 | oui(); |