New routers supported
[tomato.git] / release / src / router / shared / id.c
blob7ad87ff1f2839e0a685164ff70c52bab1cd5ec97
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 E900 BCM53572 0x058e 42 0x1155 (64k/8MB flash)
35 E1000v2/E1500 BCM5357 0xf53b 42 0x1100 0x0710 E1500(64k/8MB flash)
36 E1000v2.1/E1200v1 BCM5357 0xf53a 42 0x1100 0x0710 E1200v1(64k/4MB flash)
37 E1550 BCM5358U 0xc550 42 0x1100 0x0710 (60k/16MB flash)
38 E2500 BCM5358U 0xf550 42 0x1101 0x0710 (60k/16MB)
39 E3200 BCM47186 0xf52a 42 0x1100 (60k/16MB)
40 WRT320N/E2000 BCM4717 0x04ef 42/66 0x1304/0x1305/0x1307 boardflags: 0x0040F10 / 0x00000602 (??)
41 WRT610Nv2/E3000 BCM4718 0x04cf 42/?? ?? boot_hw_model=WRT610N/E300
42 E4200 BCM4718 0xf52c 42 0x1101 boot_hw_model=E4200
44 WHR-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30182
45 WHR-HP-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30189
46 WZR-G300N BCM4704_BCM5325F_EWC 0x0472 ? 0x10 0x10 melco_id=31120
47 WZR-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115 melco_id=30061 (source: piggy)
48 WBR-G54 bcm94710ap 42 melco_id=ca020906
49 WHR2-A54G54 BCM4704_BCM5325F 0x042f 42 0x10 0x0210 melco_id=290441dd
50 WBR2-G54 BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29bb0332
51 WZR-G108 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30153 melco_id=31095 (source: BaoWeiQuan)
53 WHR-G125 BCM5354G 0x048E 00 0x11 0x750 melco_id=32093
55 SE505 BCM4712 0x0101 0x10 0x0388
57 WR850G v1 BCM4702 bcm94710dev 2 GemtekPmonVer=9
58 WR850G v2 (& v3?) BCM4712 0x0101 44 0x0188 CFEver=MotoWRv203
59 WR850G ? BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv207
60 WR850G v3 BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv301
62 WL-500G Deluxe BCM5365 bcm95365r 45 0x10 hardware_version=WL500gd-01-04-01-50 regulation_domain=0x30DE sdram_init=0x2008
63 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gp-01-02-00-00 regulation_domain=0X10US sdram_init=0x0009
64 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gH-01-00-00-00 regulation_domain=0X30DE sdram_init=0x000b
65 WL-500W BCM4704_BCM5325F_EWC 0x0472 45 0x23 0x0010 hardware_version=WL500gW-01-00-00-00 regulation_domain=0X10US sdram_init=0x0009
67 WL-500G Premium v2 HW_BCM5354G 0x48E 45 0x10 0x0750
68 WL-330GE HW_BCM5354G 0x048e 45 0x10 0x0650 hardware_version=WL330GE-02-06-00-05 //MIPSR1, 4MB flash w/o USB
69 WL-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
70 ZTE H618B HW_BCM5354G 0x048e 1105 0x35 0x0750
71 Ovislink WL1600GL HW_BCM5354G 0x048E 8 0x11
73 RT-N16 BCM4718 0x04cf 45 0x1218 0x0310 hardware_version=RT-N16-00-07-01-00 regulation_domain=0X10US sdram_init=0x419
74 RT-N15U BCM5357 0x052b 45 0x1204 0x80001710|0x1000
75 RT-N12 BCM4716 0x04cd 45 0x1201 0x????
76 RT-N12B1 BCM5357 0x054d 45 0x1101 0x710
77 RT-N10 BCM5356 0x04ec 45 0x1402 0x????
78 RT-N10U BCM5357 0x0550 45 0x1102 0x710
79 RT-N10P BCM53572 0x058e 45 0x1153 0x710
80 RT-N53 BCM5357 0x0550 45 0x1442 0x710
81 RT-N53A1 BCM5358U 0x0550 45 0x1446 0x710
82 RT-N66U BCM4706 0xf5b2 00 0x1100 0x0110
84 WNR3500L BCM4718 0x04cf 3500 0x1213|02 0x0710|0x1710
85 WNR3500Lv2 BCM47186 0x052b 3500(L) 02 0x710|0x1000
86 WNR2000v2 BCM4716B0 0xe4cd 1 0x1700
88 F7D4301 v1 BCM4718 0xd4cf 12345 0x1204
89 F7D3301/F7D3302/F7D4302 v1 BCM4718 0xa4cf 12345 0x1102
90 F5D8235-4 v3 BCM4718 0xa4cf 12345 0x1100
92 Dir-620C1 BCM5358U 0x0550 0015 0x1446 0x710 //530MHz/8MB/64MB
93 Rosewill L600N BCM5358U 0x0550 1015 0x1400 0x710 //500MHz/8MB/64MB/2.4-5GHz/USB
94 CW-5358U BCM5357 0x0550 1234 0x1100 0x710 //500MHz/8MB/32MB/2.4G/USB
95 FiberHome HG320 BCM5357 0x053d 0527 0x1202 0x610 //16MB/64MB/2.4G/USB
96 ChinaNet RG-200E BCM5357 0x053d 0504 0x1202 0x610 //16MB/64MB/2.4G/USB/FE
97 ZTE H218N BCM5357 0x053d 1234 0x1202 0x710 //16MB/64MB/2.4G/USB
99 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
101 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
102 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
104 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
106 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
108 source: piggy
109 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
110 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
111 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
112 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
113 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
114 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
115 ? WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
116 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
117 WR850G v1 BCM4702 bcm94710r4 100
119 *WRH54G BCM5354G 0x048E ? 0x10 ?
121 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
122 WLA2-G54L BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29129
124 TrueMobile 2300 bcm94710ap 44 "ModelId=WX-5565", Rev A00
127 * not supported/not tested
130 BFL_ENETADM 0x0080
131 BFL_ENETVLAN 0x0100
136 int check_hw_type(void)
138 const char *s;
139 unsigned long bf;
141 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
142 s = nvram_safe_get("boardtype");
143 switch (strtoul(s, NULL, 0)) {
144 case 0x467:
145 return HW_BCM5352E;
146 case 0x101:
147 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
148 case 0x708:
149 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
150 case 0x42f:
151 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
152 case 0x472:
153 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
154 case 0x478:
155 return HW_BCM4705L_BCM5325E_EWC;
156 case 0x48E:
157 return HW_BCM5354G;
158 case 0x456:
159 return HW_BCM5350;
160 case 0x4ec:
161 return HW_BCM5356;
162 case 0x489:
163 return HW_BCM4785;
164 #ifdef CONFIG_BCMWL5
165 case 0x04cd:
166 case 0xe4cd:
167 case 0x04fb:
168 return HW_BCM4716;
169 case 0x04ef:
170 return HW_BCM4717;
171 case 0x04cf:
172 case 0xa4cf:
173 case 0xd4cf:
174 case 0xf52c:
175 return HW_BCM4718;
176 case 0x05d8:
177 case 0xf5b2:
178 return HW_BCM4706;
179 case 0x052b:
180 if (nvram_match("boardrev", "0x1204")) return HW_BCM5357; //rt-n15u
181 if (nvram_match("boardrev", "02")) return HW_BCM47186; //WNR3500Lv2
182 case 0xf53a:
183 case 0xf53b:
184 case 0x0550: //RT-N10U and RT-N53 and CW-5358U
185 if (nvram_match("boardrev", "0x1400")) return HW_BCM5358U; //L600N
186 if (nvram_match("boardrev", "0x1446")) return HW_BCM5358U; //DIR-620C1
187 case 0x054d:
188 case 0x053d:
189 return HW_BCM5357;
190 case 0xf52a:
191 return HW_BCM47186;
192 case 0xf550:
193 case 0xc500:
194 case 0xc550:
195 return HW_BCM5358U;
196 case 0x058e:
197 if (nvram_match("boardrev", "0x1153")) return HW_BCM5357; //RG100E-CA
198 if (nvram_match("boardrev", "0x1155")) return HW_BCM53572; //E900
200 #endif
203 // WR850G may have "bcm94710dev " (extra space)
204 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
205 return HW_BCM4702;
208 if ((strcmp(s, "bcm95365r") == 0)) {
209 return HW_BCM5365;
212 return HW_UNKNOWN;
215 int get_model(void)
217 int hw;
218 char *c;
220 hw = check_hw_type();
222 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
223 case 0x29115:
224 case 0x30061:
225 return MODEL_WZRG54;
226 case 0x30182:
227 return MODEL_WHRG54S;
228 case 0x30189:
229 return MODEL_WHRHPG54;
230 case 0xCA020906:
231 return MODEL_WBRG54;
232 case 0x30026:
233 return MODEL_WZRHPG54;
234 case 0x30083:
235 return MODEL_WZRRSG54;
236 case 0x30103:
237 return MODEL_WZRRSG54HP;
238 case 0x28100:
239 return MODEL_WVRG54NF;
240 case 0x29130:
241 return MODEL_WHR3AG54;
242 case 0x290441DD:
243 return MODEL_WHR2A54G54;
244 case 0x32093:
245 return MODEL_WHRG125;
246 case 0x30153:
247 case 0x31095:
248 return MODEL_WZRG108;
249 case 0x31120:
250 return MODEL_WZRG300N;
251 case 0:
252 break;
253 default:
254 return MODEL_UNKNOWN;
257 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
258 case 0x29BB0332:
259 return MODEL_WBR2G54;
260 case 0x29129:
261 return MODEL_WLA2G54L;
262 case 0:
263 break;
264 default:
265 return MODEL_UNKNOWN;
268 if (nvram_match("boardtype", "bcm94710ap")) {
269 if (nvram_match("boardnum", "mn700")) return MODEL_MN700;
270 if (nvram_match("ModelId", "WX-5565")) return MODEL_TM2300;
273 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
276 if (hw == HW_BCM5354G) {
277 if (nvram_match("boardrev", "0x11")) {
278 return MODEL_WRH54G;
283 #ifdef CONFIG_BCMWL5
284 if (hw == HW_BCM4718) {
285 if (nvram_match("boot_hw_model", "WRT610N") ||
286 nvram_match("boot_hw_model", "E300"))
287 return MODEL_WRT610Nv2;
288 if (nvram_match("boot_hw_model", "E4200"))
289 return MODEL_E4200;
290 switch (strtoul(nvram_safe_get("boardtype"), NULL, 0)) {
291 case 0xd4cf:
292 if (nvram_match("boardrev", "0x1204")) return MODEL_F7D4301;
293 break;
294 case 0xa4cf:
295 if (nvram_match("boardrev", "0x1100")) return MODEL_F5D8235v3;
296 if (nvram_match("boardrev", "0x1102")) {
297 FILE *fp;
298 unsigned char s[18];
299 uint32 sig = TRX_MAGIC;
300 sprintf(s, MTD_DEV(%dro), 1);
301 if ((fp = fopen(s, "rb"))) {
302 fread(&sig, sizeof(sig), 1, fp);
303 fclose(fp);
305 #ifndef CONFIG_BCMWL6
306 switch (sig) {
307 case TRX_MAGIC_F7D3301:
308 return MODEL_F7D3301;
309 case TRX_MAGIC_F7D3302:
310 return MODEL_F7D3302;
311 default:
312 return MODEL_F7D4302;
314 #endif
316 break;
319 #endif
321 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
322 case 42:
323 switch (hw) {
324 case HW_BCM4704_BCM5325F:
325 return MODEL_WRTSL54GS;
326 case HW_BCM4704_BCM5325F_EWC:
327 if (nvram_match("boardrev", "0x10")) return MODEL_WRT300N;
328 if (nvram_match("boardrev", "0x11")) return MODEL_WRT160Nv1;
329 break;
330 case HW_BCM4785:
331 if (nvram_match("boardrev", "0x10")) return MODEL_WRT310Nv1;
332 break;
333 #ifdef CONFIG_BCMWL5
334 case HW_BCM4716:
335 return MODEL_WRT160Nv3;
336 case HW_BCM4717:
337 return MODEL_WRT320N;
338 case HW_BCM4718:
339 return MODEL_WRT610Nv2;
340 case HW_BCM47186:
341 if (nvram_match("boot_hw_model", "E3200")) return MODEL_E3200;
342 break;
343 case HW_BCM5357:
344 if (nvram_match("boot_hw_model", "M10") && nvram_match("boot_hw_ver", "2.0"))
345 return MODEL_E1000v2;
346 if (nvram_match("boot_hw_model", "E1000")) return MODEL_E1000v2;
347 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "1.0"))
348 return MODEL_E1500;
349 if (nvram_match("boot_hw_model", "E1500")) return MODEL_E1500;
350 break;
351 case HW_BCM53572:
352 if (nvram_match("boot_hw_model", "E800")) return MODEL_E900;
353 if (nvram_match("boot_hw_model", "E900")) return MODEL_E900;
354 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "2.0"))
355 return MODEL_E900;
356 break;
357 case HW_BCM5358U:
358 if (nvram_match("boot_hw_model", "E1550")) return MODEL_E1550;
359 if (nvram_match("boot_hw_model", "E2500")) return MODEL_E2500;
360 break;
361 #endif
363 return MODEL_WRT54G;
364 case 45:
365 switch (hw) {
366 case HW_BCM4704_BCM5325F:
367 return MODEL_WL500GP;
368 case HW_BCM4704_BCM5325F_EWC:
369 return MODEL_WL500W;
370 case HW_BCM5352E:
371 return MODEL_WL500GE;
372 case HW_BCM5354G:
373 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
374 if (strncmp(nvram_safe_get("hardware_version"), "WL330GE", 7) == 0) return MODEL_WL330GE;
375 return MODEL_WL500GPv2;
376 case HW_BCM5365:
377 return MODEL_WL500GD;
378 #ifdef CONFIG_BCMWL5
379 case HW_BCM5356:
380 if (nvram_match("boardrev", "0x1402")) return MODEL_RTN10;
381 break;
382 case HW_BCM5357:
383 if (nvram_match("boardrev", "0x1102")) return MODEL_RTN10U;
384 if (nvram_match("boardrev", "0x1153")) return MODEL_RTN10P;
385 if (nvram_match("boardrev", "0x1101")) return MODEL_RTN12B1;
386 if (nvram_match("boardrev", "0x1204")) return MODEL_RTN15U;
387 if (nvram_match("boardrev", "0x1442")) return MODEL_RTN53;
388 break;
389 case HW_BCM5358U:
390 if (nvram_match("boardrev", "0x1446")) return MODEL_RTN53A1;
391 break;
392 case HW_BCM4716:
393 if (nvram_match("boardrev", "0x1201")) return MODEL_RTN12;
394 break;
395 case HW_BCM4718:
396 if (nvram_match("boardrev", "0x1218")) return MODEL_RTN16;
397 break;
398 #endif
400 break;
401 #ifdef CONFIG_BCMWL5
402 case 66:
403 switch (hw) {
404 case HW_BCM4717:
405 return MODEL_WRT320N;
407 break;
408 case 1015:
409 switch (hw) {
410 case HW_BCM5358U:
411 if (nvram_match("boardrev", "0x1400")) return MODEL_L600N;
413 break;
414 case 0015:
415 switch (hw) {
416 case HW_BCM5358U:
417 if (nvram_match("boardrev", "0x1446")) return MODEL_DIR620C1;
419 break;
420 case 1234:
421 switch (hw) {
422 case HW_BCM5357:
423 if (nvram_match("boardrev", "0x1100")) return MODEL_CW5358U;
424 if (nvram_match("boardrev", "0x1202")) return MODEL_H218N;
426 break;
427 case 0527:
428 switch (hw) {
429 case HW_BCM5357:
430 //if (nvram_match("boardrev", "0x1202"))
431 return MODEL_HG320;
433 break;
434 case 0504: // This is the exact original CFE parameter. BWQ
435 switch (hw) {
436 case HW_BCM5357:
437 //if (nvram_match("boardrev", "0x1202"))
438 return MODEL_RG200E_CA;
440 break;
441 case 1:
442 switch (hw) {
443 case HW_BCM4716:
444 //if (nvram_match("boardrev", "0x1700"))
445 return MODEL_WNR2000v2;
446 break;
448 /* fall through */
449 case 0543:
450 switch (hw) {
451 case HW_BCM5357:
452 //if (nvram_match("boardrev", "0x1202"))
453 return MODEL_H218N;
455 break;
456 case 3500:
457 switch (hw) {
458 case HW_BCM4718:
459 //if (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02"))
460 return MODEL_WNR3500L;
461 break;
462 case HW_BCM47186:
463 return MODEL_WNR3500LV2;
464 break;
466 break;
467 #endif
468 case 0:
469 switch (hw) {
470 case HW_BCM5354G:
471 if (nvram_match("boardrev", "0x35")) return MODEL_DIR320;
472 break;
473 case HW_BCM4706:
474 if (nvram_match("boardrev", "0x1100")) return MODEL_RTN66U;
475 break;
477 break;
478 case 1105:
479 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x35")) return MODEL_H618B;
480 break;
481 case 8:
482 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x11")) return MODEL_WL1600GL;
483 break;
484 case 2:
485 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
486 break;
487 case 44:
488 c = nvram_safe_get("CFEver");
489 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
490 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
491 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
492 break;
493 case 100:
494 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
495 break;
496 case 56:
497 if (hw == HW_BCM5350) return MODEL_WTR54GS;
498 break;
499 case 60:
500 case 21:
501 if (hw == HW_BCM4706) return MODEL_W1800R;
504 return MODEL_UNKNOWN;
507 int supports(unsigned long attr)
509 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;