Support Asus RT-N10U
[tomato.git] / release / src / router / shared / id.c
blobaf0e7d20c28ce2aa5faba3126560f8da6b3ce885
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-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
63 ZTE H618B HW_BCM5354G 0x048e 1105 0x35 0x0750
64 Ovislink WL1600GL HW_BCM5354G 0x048E 8 0x11
66 RT-N16 BCM4718 0x04cf 45 0x1218 0x0310 hardware_version=RT-N16-00-07-01-00 regulation_domain=0X10US sdram_init=0x419
67 RT-N12 BCM4716 0x04cd 45 0x1201 0x????
68 RT-N10 BCM5356 0x04ec 45 0x1402 0x????
69 RT-N10U BCM5357 0x0550 45 0x1102 0x710
70 RT-N66U BCM4706 0xf5b2 00 0x1100 0x0110
72 WNR3500L BCM4718 0x04cf 3500 0x1213|02 0x0710|0x1710
73 WNR2000v2 BCM4716B0 0xe4cd 1 0x1700
75 F7D4301 v1 BCM4718 0xd4cf 12345 0x1204
76 F7D3301/F7D3302/F7D4302 v1 BCM4718 0xa4cf 12345 0x1102
77 F5D8235-4 v3 BCM4718 0xa4cf 12345 0x1100
79 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
81 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
82 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
84 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
86 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
88 source: piggy
89 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
90 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
91 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
92 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
93 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
94 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
95 ? WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
96 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
97 WR850G v1 BCM4702 bcm94710r4 100
99 *WRH54G BCM5354G 0x048E ? 0x10 ?
101 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
102 WLA2-G54L BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29129
104 TrueMobile 2300 bcm94710ap 44 "ModelId=WX-5565", Rev A00
107 * not supported/not tested
110 BFL_ENETADM 0x0080
111 BFL_ENETVLAN 0x0100
116 int check_hw_type(void)
118 const char *s;
119 unsigned long bf;
121 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
122 s = nvram_safe_get("boardtype");
123 switch (strtoul(s, NULL, 0)) {
124 case 0x467:
125 return HW_BCM5352E;
126 case 0x101:
127 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
128 case 0x708:
129 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
130 case 0x42f:
131 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
132 case 0x472:
133 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
134 case 0x478:
135 return HW_BCM4705L_BCM5325E_EWC;
136 case 0x48E:
137 return HW_BCM5354G;
138 case 0x456:
139 return HW_BCM5350;
140 case 0x4ec:
141 return HW_BCM5356;
142 case 0x489:
143 return HW_BCM4785;
144 case 0x0550:
145 return HW_BCM5357;
147 #ifdef CONFIG_BCMWL5
148 case 0x04cd:
149 case 0xe4cd:
150 case 0x04fb:
151 return HW_BCM4716;
152 case 0x04ef:
153 return HW_BCM4717;
154 case 0x04cf:
155 case 0xa4cf:
156 case 0xd4cf:
157 case 0xf52c:
158 return HW_BCM4718;
159 case 0xf5b2:
160 return HW_BCM4706;
161 #endif
164 // WR850G may have "bcm94710dev " (extra space)
165 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
166 return HW_BCM4702;
169 if ((strcmp(s, "bcm95365r") == 0)) {
170 return HW_BCM5365;
173 return HW_UNKNOWN;
176 int get_model(void)
178 int hw;
179 char *c;
181 hw = check_hw_type();
183 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
184 case 0x29115:
185 case 0x30061:
186 return MODEL_WZRG54;
187 case 0x30182:
188 return MODEL_WHRG54S;
189 case 0x30189:
190 return MODEL_WHRHPG54;
191 case 0xCA020906:
192 return MODEL_WBRG54;
193 case 0x30026:
194 return MODEL_WZRHPG54;
195 case 0x30083:
196 return MODEL_WZRRSG54;
197 case 0x30103:
198 return MODEL_WZRRSG54HP;
199 case 0x28100:
200 return MODEL_WVRG54NF;
201 case 0x29130:
202 return MODEL_WHR3AG54;
203 case 0x290441DD:
204 return MODEL_WHR2A54G54;
205 case 0x32093:
206 return MODEL_WHRG125;
207 case 0x30153:
208 case 0x31095:
209 return MODEL_WZRG108;
210 case 0x31120:
211 return MODEL_WZRG300N;
212 case 0:
213 break;
214 default:
215 return MODEL_UNKNOWN;
218 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
219 case 0x29BB0332:
220 return MODEL_WBR2G54;
221 case 0x29129:
222 return MODEL_WLA2G54L;
223 case 0:
224 break;
225 default:
226 return MODEL_UNKNOWN;
229 if (nvram_match("boardtype", "bcm94710ap")) {
230 if (nvram_match("boardnum", "mn700")) return MODEL_MN700;
231 if (nvram_match("ModelId", "WX-5565")) return MODEL_TM2300;
234 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
237 if (hw == HW_BCM5354G) {
238 if (nvram_match("boardrev", "0x11")) {
239 return MODEL_WRH54G;
244 #ifdef CONFIG_BCMWL5
245 if (hw == HW_BCM4718) {
246 if (nvram_match("boot_hw_model", "WRT610N") ||
247 nvram_match("boot_hw_model", "E300"))
248 return MODEL_WRT610Nv2;
249 if (nvram_match("boot_hw_model", "E4200"))
250 return MODEL_E4200;
251 switch (strtoul(nvram_safe_get("boardtype"), NULL, 0)) {
252 case 0xd4cf:
253 if (nvram_match("boardrev", "0x1204")) return MODEL_F7D4301;
254 break;
255 case 0xa4cf:
256 if (nvram_match("boardrev", "0x1100")) return MODEL_F5D8235v3;
257 if (nvram_match("boardrev", "0x1102")) {
258 FILE *fp;
259 unsigned char s[18];
260 uint32 sig = TRX_MAGIC;
261 sprintf(s, MTD_DEV(%dro), 1);
262 if ((fp = fopen(s, "rb"))) {
263 fread(&sig, sizeof(sig), 1, fp);
264 fclose(fp);
266 switch (sig) {
267 case TRX_MAGIC_F7D3301:
268 return MODEL_F7D3301;
269 case TRX_MAGIC_F7D3302:
270 return MODEL_F7D3302;
271 default:
272 return MODEL_F7D4302;
275 break;
278 #endif
280 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
281 case 42:
282 switch (hw) {
283 case HW_BCM4704_BCM5325F:
284 return MODEL_WRTSL54GS;
285 case HW_BCM4704_BCM5325F_EWC:
286 if (nvram_match("boardrev", "0x10")) return MODEL_WRT300N;
287 if (nvram_match("boardrev", "0x11")) return MODEL_WRT160Nv1;
288 break;
289 case HW_BCM4785:
290 if (nvram_match("boardrev", "0x10")) return MODEL_WRT310Nv1;
291 break;
292 #ifdef CONFIG_BCMWL5
293 case HW_BCM4716:
294 return MODEL_WRT160Nv3;
295 case HW_BCM4717:
296 return MODEL_WRT320N;
297 case HW_BCM4718:
298 return MODEL_WRT610Nv2;
299 #endif
301 return MODEL_WRT54G;
302 case 45:
303 switch (hw) {
304 case HW_BCM4704_BCM5325F:
305 return MODEL_WL500GP;
306 case HW_BCM4704_BCM5325F_EWC:
307 return MODEL_WL500W;
308 case HW_BCM5352E:
309 return MODEL_WL500GE;
310 case HW_BCM5354G:
311 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
312 return MODEL_WL500GPv2;
313 case HW_BCM5365:
314 return MODEL_WL500GD;
315 #ifdef CONFIG_BCMWL5
316 case HW_BCM5356:
317 if (nvram_match("boardrev", "0x1402")) return MODEL_RTN10;
318 break;
319 case HW_BCM5357:
320 if (nvram_match("boardrev", "0x1102")) return MODEL_RTN10U;
321 break;
322 case HW_BCM4716:
323 if (nvram_match("boardrev", "0x1201")) return MODEL_RTN12;
324 break;
325 case HW_BCM4718:
326 if (nvram_match("boardrev", "0x1218")) return MODEL_RTN16;
327 break;
328 #endif
330 break;
331 #ifdef CONFIG_BCMWL5
332 case 66:
333 switch (hw) {
334 case HW_BCM4717:
335 return MODEL_WRT320N;
337 break;
338 case 1:
339 switch (hw) {
340 case HW_BCM4716:
341 //if (nvram_match("boardrev", "0x1700"))
342 return MODEL_WNR2000v2;
344 /* fall through */
345 case 3500:
346 switch (hw) {
347 case HW_BCM4718:
348 //if (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02"))
349 return MODEL_WNR3500L;
351 break;
352 #endif
353 case 0:
354 switch (hw) {
355 case HW_BCM5354G:
356 if (nvram_match("boardrev", "0x35")) return MODEL_DIR320;
357 break;
358 case HW_BCM4706:
359 if (nvram_match("boardrev", "0x1100")) return MODEL_RTN66U;
360 break;
362 break;
363 case 1105:
364 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x35")) return MODEL_H618B;
365 break;
366 case 8:
367 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x11")) return MODEL_WL1600GL;
368 break;
369 case 2:
370 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
371 break;
372 case 44:
373 c = nvram_safe_get("CFEver");
374 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
375 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
376 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
377 break;
378 case 100:
379 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
380 break;
381 case 56:
382 if (hw == HW_BCM5350) return MODEL_WTR54GS;
383 break;
386 return MODEL_UNKNOWN;
389 int supports(unsigned long attr)
391 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;