Tomato 1.24
[tomato.git] / release / src / router / shared / id.c
blobf73c9d71f25f60e4746befc1f5858f73a2e459ef
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 "shared.h"
18 HW_* boardtype boardnum boardrev boardflags others
19 --------------------- ------------ --------- --------- ----------- ---------------
20 WRT54G 1.x BCM4702 bcm94710dev 42
21 WRT54G 2.0 BCM4712 0x0101 42 0x10 0x0188
22 WRT54G 2.2, 3.x BCM5325E 0x0708 42 0x10 0x0118
23 WRT54G 4.0 BCM5352E 0x0467 42 0x10 0x2558
24 WRT54GL 1.0, 1.1 BCM5352E 0x0467 42 0x10 0x2558
25 WRT54GS 1.0 BCM4712 0x0101 42 0x10 0x0388
26 WRT54GS 1.1, 2.x BCM5325E 0x0708 42 0x10 0x0318
27 WRT54GS 3.0, 4.0 BCM5352E 0x0467 42 0x10 0x2758
28 WRT300N 1.0 BCM4704_BCM5325F_EWC 0x0472 42 0x10 0x10
29 WRTSL54GS BCM4704_BCM5325F 0x042f 42 0x10 0x0018
30 WTR54GS v1, v2 BCM5350 0x456 56 0x10 0xb18 (source: BaoWeiQuan)
32 WHR-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30182
33 WHR-HP-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30189
34 WZR-G300N BCM4704_BCM5325F_EWC 0x0472 ? 0x10 0x10 melco_id=31120
35 WZR-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115 melco_id=30061 (source: piggy)
36 WBR-G54 bcm94710ap 42 melco_id=ca020906
37 WHR2-A54G54 BCM4704_BCM5325F 0x042f 42 0x10 0x0210 melco_id=290441dd
38 WBR2-G54 BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29bb0332
39 WZR-G108 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30153 melco_id=31095 (source: BaoWeiQuan)
41 WHR-G125 BCM5354G 0x048E 00 0x11 0x750 melco_id=32093
43 SE505 BCM4712 0x0101 0x10 0x0388
45 WR850G v1 BCM4702 bcm94710dev 2 GemtekPmonVer=9
46 WR850G v2 (& v3?) BCM4712 0x0101 44 0x0188 CFEver=MotoWRv203
47 WR850G ? BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv207
48 WR850G v3 BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv301
50 *WL-500G Deluxe bcm95365r 45 0x10 hardware_version=WL500gd-01-04-01-50 regulation_domain=0x30DE sdram_init=0x2008
51 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gp-01-02-00-00 regulation_domain=0X10US sdram_init=0x0009
52 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gH-01-00-00-00 regulation_domain=0X30DE sdram_init=0x000b
54 WL-500G Premium v2 HW_BCM5354G 0x48E 45 0x10 0x0750
55 WL-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
58 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
60 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
61 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
63 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
65 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
67 source: piggy
68 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
69 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
70 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
71 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
72 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
73 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
74 ? WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
75 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
76 WR850G v1 BCM4702 bcm94710r4 100
78 *WRH54G BCM5354G 0x048E ? 0x10 ?
80 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
82 * not supported/not tested
85 BFL_ENETADM 0x0080
86 BFL_ENETVLAN 0x0100
91 int check_hw_type(void)
93 const char *s;
94 unsigned long bf;
96 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
97 s = nvram_safe_get("boardtype");
98 switch (strtoul(s, NULL, 0)) {
99 case 0x467:
100 return HW_BCM5352E;
101 case 0x101:
102 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
103 case 0x708:
104 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
105 case 0x42f:
106 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
107 case 0x472:
108 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
109 case 0x478:
110 return HW_BCM4705L_BCM5325E_EWC;
111 case 0x48E:
112 return HW_BCM5354G;
113 case 0x456:
114 return HW_BCM5350;
117 // WR850G may have "bcm94710dev " (extra space)
118 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
119 return HW_BCM4702;
122 return HW_UNKNOWN;
125 int get_model(void)
127 int hw;
128 char *c;
130 hw = check_hw_type();
132 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
133 case 0x29115:
134 case 0x30061:
135 return MODEL_WZRG54;
136 case 0x30182:
137 return MODEL_WHRG54S;
138 case 0x30189:
139 return MODEL_WHRHPG54;
140 case 0xCA020906:
141 return MODEL_WBRG54;
142 case 0x30026:
143 return MODEL_WZRHPG54;
144 case 0x30083:
145 return MODEL_WZRRSG54;
146 case 0x30103:
147 return MODEL_WZRRSG54HP;
148 case 0x28100:
149 return MODEL_WVRG54NF;
150 case 0x29130:
151 return MODEL_WHR3AG54;
152 case 0x290441DD:
153 return MODEL_WHR2A54G54;
154 case 0x32093:
155 return MODEL_WHRG125;
156 case 0x30153:
157 case 0x31095:
158 return MODEL_WZRG108;
159 #if TOMATO_N
160 case 0x31120:
161 return MODEL_WZRG300N;
162 #endif
163 case 0:
164 break;
165 default:
166 return MODEL_UNKNOWN;
169 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
170 case 0x29BB0332:
171 return MODEL_WBR2G54;
172 case 0:
173 break;
174 default:
175 return MODEL_UNKNOWN;
178 if (nvram_match("boardnum", "mn700")) {
179 return MODEL_MN700;
182 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
185 if (hw == HW_BCM5354G) {
186 if (nvram_match("boardrev", "0x11")) {
187 return MODEL_WRH54G;
192 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
193 case 42:
194 switch (hw) {
195 case HW_BCM4704_BCM5325F:
196 return MODEL_WRTSL54GS;
197 #if TOMATO_N
198 case HW_BCM4704_BCM5325F_EWC:
199 return MODEL_WRT300N;
200 #endif
202 return MODEL_WRT54G;
203 case 45:
204 switch (hw) {
205 case HW_BCM4704_BCM5325F:
206 return MODEL_WL500GP;
207 case HW_BCM5352E:
208 return MODEL_WL500GE;
209 case HW_BCM5354G:
210 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
211 return MODEL_WL500GPv2;
213 break;
214 case 2:
215 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
216 break;
217 case 44:
218 c = nvram_safe_get("CFEver");
219 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
220 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
221 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
222 break;
223 case 100:
224 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
225 break;
226 case 56:
227 if (hw == HW_BCM5350) return MODEL_WTR54GS;
228 break;
231 return MODEL_UNKNOWN;
234 int supports(unsigned long attr)
236 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;