Extended MOTD with GUI
[tomato.git] / release / src / router / shared / id.c
blobbb3245c9501e82d8c0060216112d67d077939e3f
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
7 #include <string.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
12 #include <bcmnvram.h>
13 #include <bcmdevs.h>
14 #include <trxhdr.h>
15 #include "shared.h"
19 HW_* boardtype boardnum boardrev boardflags others
20 --------------------- ------------ --------- --------- ----------- ---------------
21 WRT54G 1.x BCM4702 bcm94710dev 42
22 WRT54G 2.0 BCM4712 0x0101 42 0x10 0x0188
23 WRT54G 2.2, 3.x BCM5325E 0x0708 42 0x10 0x0118
24 WRT54G 4.0 BCM5352E 0x0467 42 0x10 0x2558
25 WRT54GL 1.0, 1.1 BCM5352E 0x0467 42 0x10 0x2558
26 WRT54GS 1.0 BCM4712 0x0101 42 0x10 0x0388
27 WRT54GS 1.1, 2.x BCM5325E 0x0708 42 0x10 0x0318
28 WRT54GS 3.0, 4.0 BCM5352E 0x0467 42 0x10 0x2758
29 WRT300N 1.0 BCM4704_BCM5325F_EWC 0x0472 42 0x10 0x10
30 WRTSL54GS BCM4704_BCM5325F 0x042f 42 0x10 0x0018
31 WTR54GS v1, v2 BCM5350 0x456 56 0x10 0xb18 (source: BaoWeiQuan)
32 WRT160Nv1 BCM4704_BCM5325F_EWC 0x0472 42 0x11 0x0010 boot_hw_model=WRT160N boot_hw_ver=1.0
33 WRT160Nv3, M10 BCM4716 0x04cd 42 0x1700 boot_hw_model=WRT160N boot_hw_ver=3.0 (M10: boot_hw_model=M10 boot_hw_ver=1.0)
34 WRT320N/E2000 BCM4717 0x04ef 42/66 0x1304/0x1305/0x1307 boardflags: 0x0040F10 / 0x00000602 (??)
35 WRT610Nv2/E3000 BCM4718 0x04cf 42/?? ?? boot_hw_model=WRT610N/E300
36 E4200 BCM4718 0xf52c 42 0x1101 boot_hw_model=E4200
38 WHR-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30182
39 WHR-HP-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30189
40 WZR-G300N BCM4704_BCM5325F_EWC 0x0472 ? 0x10 0x10 melco_id=31120
41 WZR-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115 melco_id=30061 (source: piggy)
42 WBR-G54 bcm94710ap 42 melco_id=ca020906
43 WHR2-A54G54 BCM4704_BCM5325F 0x042f 42 0x10 0x0210 melco_id=290441dd
44 WBR2-G54 BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29bb0332
45 WZR-G108 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30153 melco_id=31095 (source: BaoWeiQuan)
47 WHR-G125 BCM5354G 0x048E 00 0x11 0x750 melco_id=32093
49 SE505 BCM4712 0x0101 0x10 0x0388
51 WR850G v1 BCM4702 bcm94710dev 2 GemtekPmonVer=9
52 WR850G v2 (& v3?) BCM4712 0x0101 44 0x0188 CFEver=MotoWRv203
53 WR850G ? BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv207
54 WR850G v3 BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv301
56 WL-500G Deluxe BCM5365 bcm95365r 45 0x10 hardware_version=WL500gd-01-04-01-50 regulation_domain=0x30DE sdram_init=0x2008
57 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gp-01-02-00-00 regulation_domain=0X10US sdram_init=0x0009
58 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gH-01-00-00-00 regulation_domain=0X30DE sdram_init=0x000b
59 WL-500W BCM4704_BCM5325F_EWC 0x0472 45 0x23 0x0010 hardware_version=WL500gW-01-00-00-00 regulation_domain=0X10US sdram_init=0x0009
61 WL-500G Premium v2 HW_BCM5354G 0x48E 45 0x10 0x0750
62 WL-330GE HW_BCM5354G 0x048e 45 0x10 0x0650 hardware_version=WL330GE-02-06-00-05 //MIPSR1, 4MB flash w/o USB
63 WL-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
64 ZTE H618B HW_BCM5354G 0x048e 1105 0x35 0x0750
65 Ovislink WL1600GL HW_BCM5354G 0x048E 8 0x11
67 RT-N16 BCM4718 0x04cf 45 0x1218 0x0310 hardware_version=RT-N16-00-07-01-00 regulation_domain=0X10US sdram_init=0x419
68 RT-N12 BCM4716 0x04cd 45 0x1201 0x????
69 RT-N10 BCM5356 0x04ec 45 0x1402 0x????
71 WNR3500L BCM4718 0x04cf 3500 0x1213|02 0x0710|0x1710
72 WNR2000v2 BCM4716B0 0xe4cd 1 0x1700
74 F7D4301 v1 BCM4718 0xd4cf 12345 0x1204
75 F7D3301/F7D3302/F7D4302 v1 BCM4718 0xa4cf 12345 0x1102
76 F5D8235-4 v3 BCM4718 0xa4cf 12345 0x1100
78 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
80 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
81 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
83 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
85 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
87 source: piggy
88 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
89 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
90 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
91 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
92 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
93 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
94 ? WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
95 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
96 WR850G v1 BCM4702 bcm94710r4 100
98 *WRH54G BCM5354G 0x048E ? 0x10 ?
100 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
101 WLA2-G54L BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29129
103 TrueMobile 2300 bcm94710ap 44 "ModelId=WX-5565", Rev A00
106 * not supported/not tested
109 BFL_ENETADM 0x0080
110 BFL_ENETVLAN 0x0100
115 int check_hw_type(void)
117 const char *s;
118 unsigned long bf;
120 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
121 s = nvram_safe_get("boardtype");
122 switch (strtoul(s, NULL, 0)) {
123 case 0x467:
124 return HW_BCM5352E;
125 case 0x101:
126 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
127 case 0x708:
128 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
129 case 0x42f:
130 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
131 case 0x472:
132 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
133 case 0x478:
134 return HW_BCM4705L_BCM5325E_EWC;
135 case 0x48E:
136 return HW_BCM5354G;
137 case 0x456:
138 return HW_BCM5350;
139 case 0x4ec:
140 return HW_BCM5356;
141 case 0x489:
142 return HW_BCM4785;
143 #ifdef CONFIG_BCMWL5
144 case 0x04cd:
145 case 0xe4cd:
146 case 0x04fb:
147 return HW_BCM4716;
148 case 0x04ef:
149 return HW_BCM4717;
150 case 0x04cf:
151 case 0xa4cf:
152 case 0xd4cf:
153 case 0xf52c:
154 return HW_BCM4718;
155 #endif
158 // WR850G may have "bcm94710dev " (extra space)
159 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
160 return HW_BCM4702;
163 if ((strcmp(s, "bcm95365r") == 0)) {
164 return HW_BCM5365;
167 return HW_UNKNOWN;
170 int get_model(void)
172 int hw;
173 char *c;
175 hw = check_hw_type();
177 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
178 case 0x29115:
179 case 0x30061:
180 return MODEL_WZRG54;
181 case 0x30182:
182 return MODEL_WHRG54S;
183 case 0x30189:
184 return MODEL_WHRHPG54;
185 case 0xCA020906:
186 return MODEL_WBRG54;
187 case 0x30026:
188 return MODEL_WZRHPG54;
189 case 0x30083:
190 return MODEL_WZRRSG54;
191 case 0x30103:
192 return MODEL_WZRRSG54HP;
193 case 0x28100:
194 return MODEL_WVRG54NF;
195 case 0x29130:
196 return MODEL_WHR3AG54;
197 case 0x290441DD:
198 return MODEL_WHR2A54G54;
199 case 0x32093:
200 return MODEL_WHRG125;
201 case 0x30153:
202 case 0x31095:
203 return MODEL_WZRG108;
204 case 0x31120:
205 return MODEL_WZRG300N;
206 case 0:
207 break;
208 default:
209 return MODEL_UNKNOWN;
212 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
213 case 0x29BB0332:
214 return MODEL_WBR2G54;
215 case 0x29129:
216 return MODEL_WLA2G54L;
217 case 0:
218 break;
219 default:
220 return MODEL_UNKNOWN;
223 if (nvram_match("boardtype", "bcm94710ap")) {
224 if (nvram_match("boardnum", "mn700")) return MODEL_MN700;
225 if (nvram_match("ModelId", "WX-5565")) return MODEL_TM2300;
228 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
231 if (hw == HW_BCM5354G) {
232 if (nvram_match("boardrev", "0x11")) {
233 return MODEL_WRH54G;
238 #ifdef CONFIG_BCMWL5
239 if (hw == HW_BCM4718) {
240 if (nvram_match("boot_hw_model", "WRT610N") ||
241 nvram_match("boot_hw_model", "E300"))
242 return MODEL_WRT610Nv2;
243 if (nvram_match("boot_hw_model", "E4200"))
244 return MODEL_E4200;
245 switch (strtoul(nvram_safe_get("boardtype"), NULL, 0)) {
246 case 0xd4cf:
247 if (nvram_match("boardrev", "0x1204")) return MODEL_F7D4301;
248 break;
249 case 0xa4cf:
250 if (nvram_match("boardrev", "0x1100")) return MODEL_F5D8235v3;
251 if (nvram_match("boardrev", "0x1102")) {
252 FILE *fp;
253 unsigned char s[18];
254 uint32 sig = TRX_MAGIC;
255 sprintf(s, MTD_DEV(%dro), 1);
256 if ((fp = fopen(s, "rb"))) {
257 fread(&sig, sizeof(sig), 1, fp);
258 fclose(fp);
260 switch (sig) {
261 case TRX_MAGIC_F7D3301:
262 return MODEL_F7D3301;
263 case TRX_MAGIC_F7D3302:
264 return MODEL_F7D3302;
265 default:
266 return MODEL_F7D4302;
269 break;
272 #endif
274 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
275 case 42:
276 switch (hw) {
277 case HW_BCM4704_BCM5325F:
278 return MODEL_WRTSL54GS;
279 case HW_BCM4704_BCM5325F_EWC:
280 if (nvram_match("boardrev", "0x10")) return MODEL_WRT300N;
281 if (nvram_match("boardrev", "0x11")) return MODEL_WRT160Nv1;
282 break;
283 case HW_BCM4785:
284 if (nvram_match("boardrev", "0x10")) return MODEL_WRT310Nv1;
285 break;
286 #ifdef CONFIG_BCMWL5
287 case HW_BCM4716:
288 return MODEL_WRT160Nv3;
289 case HW_BCM4717:
290 return MODEL_WRT320N;
291 case HW_BCM4718:
292 return MODEL_WRT610Nv2;
293 #endif
295 return MODEL_WRT54G;
296 case 45:
297 switch (hw) {
298 case HW_BCM4704_BCM5325F:
299 return MODEL_WL500GP;
300 case HW_BCM4704_BCM5325F_EWC:
301 return MODEL_WL500W;
302 case HW_BCM5352E:
303 return MODEL_WL500GE;
304 case HW_BCM5354G:
305 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
306 if (strncmp(nvram_safe_get("hardware_version"), "WL330GE", 7) == 0) return MODEL_WL330GE;
307 return MODEL_WL500GPv2;
308 case HW_BCM5365:
309 return MODEL_WL500GD;
310 #ifdef CONFIG_BCMWL5
311 case HW_BCM5356:
312 if (nvram_match("boardrev", "0x1402")) return MODEL_RTN10;
313 break;
314 case HW_BCM4716:
315 if (nvram_match("boardrev", "0x1201")) return MODEL_RTN12;
316 break;
317 case HW_BCM4718:
318 if (nvram_match("boardrev", "0x1218")) return MODEL_RTN16;
319 break;
320 #endif
322 break;
323 #ifdef CONFIG_BCMWL5
324 case 66:
325 switch (hw) {
326 case HW_BCM4717:
327 return MODEL_WRT320N;
329 break;
330 case 1:
331 switch (hw) {
332 case HW_BCM4716:
333 //if (nvram_match("boardrev", "0x1700"))
334 return MODEL_WNR2000v2;
336 /* fall through */
337 case 3500:
338 switch (hw) {
339 case HW_BCM4718:
340 //if (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02"))
341 return MODEL_WNR3500L;
343 break;
344 #endif
345 case 0:
346 switch (hw) {
347 case HW_BCM5354G:
348 if (nvram_match("boardrev", "0x35")) return MODEL_DIR320;
349 break;
351 break;
352 case 1105:
353 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x35")) return MODEL_H618B;
354 break;
355 case 8:
356 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x11")) return MODEL_WL1600GL;
357 break;
358 case 2:
359 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
360 break;
361 case 44:
362 c = nvram_safe_get("CFEver");
363 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
364 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
365 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
366 break;
367 case 100:
368 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
369 break;
370 case 56:
371 if (hw == HW_BCM5350) return MODEL_WTR54GS;
372 break;
375 return MODEL_UNKNOWN;
378 int supports(unsigned long attr)
380 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;