3 #include <asm/mipsregs.h>
4 #include <asm/addrspace.h>
7 #include "ar7240_soc.h"
9 #if !defined(COMPRESSED_UBOOT)
10 extern void hornet_ddr_init(void);
13 extern int ar7240_ddr_find_size(void);
14 extern void hornet_ddr_tap_init(void);
16 #define SETBITVAL(val, pos, bit) do {ulong bitval = (bit) ? 0x1 : 0x0; (val) = ((val) & ~(0x1 << (pos))) | ( (bitval) << (pos));} while(0)
18 void led_toggle(void){
21 gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
23 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
24 gpio ^= 1 << GPIO_WPS_LED_BIT;
25 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined(CONFIG_FOR_TPLINK_WR710N_V1)
26 gpio ^= 1 << GPIO_SYS_LED_BIT;
27 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
28 gpio ^= 1 << GPIO_INTERNET_LED_BIT;
29 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
30 gpio ^= 1 << GPIO_SYS_LED_BIT;
31 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
32 gpio ^= 1 << GPIO_SYS_LED_BIT;
33 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
34 gpio ^= 1 << GPIO_SYS_LED_BIT;
35 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
36 gpio ^= 1 << GPIO_SYS_LED_BIT;
37 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
38 gpio ^= 1 << GPIO_WLAN_LED_BIT;
39 #elif defined(CONFIG_FOR_DRAGINO_V2) || defined(CONFIG_FOR_MESH_POTATO_V2)
40 gpio ^= 1 << GPIO_WLAN_LED_BIT;
41 #elif defined(CONFIG_FOR_GL_INET)
42 gpio ^= 1 << GPIO_WLAN_LED_BIT;
44 #error "Custom GPIO in leg_toggle() not defined!"
47 ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
50 void all_led_on(void){
53 gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
55 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
56 SETBITVAL(gpio, GPIO_WPS_LED_BIT, GPIO_WPS_LED_ON);
57 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
58 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
59 SETBITVAL(gpio, GPIO_ETH_LED_BIT, GPIO_ETH_LED_ON);
60 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined (CONFIG_FOR_TPLINK_WR710N_V1)
61 SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
62 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
63 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
64 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
65 SETBITVAL(gpio, GPIO_ETH_LED_BIT, GPIO_ETH_LED_ON);
66 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
67 SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
68 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
69 SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
70 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
71 SETBITVAL(gpio, GPIO_LAN1_LED_BIT, GPIO_LAN1_LED_ON);
72 SETBITVAL(gpio, GPIO_LAN2_LED_BIT, GPIO_LAN2_LED_ON);
73 SETBITVAL(gpio, GPIO_LAN3_LED_BIT, GPIO_LAN3_LED_ON);
74 SETBITVAL(gpio, GPIO_LAN4_LED_BIT, GPIO_LAN4_LED_ON);
75 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
76 SETBITVAL(gpio, GPIO_QSS_LED_BIT, GPIO_QSS_LED_ON);
78 #ifdef CONFIG_FOR_TPLINK_MR3220_V2
79 SETBITVAL(gpio, GPIO_USB_LED_BIT, GPIO_USB_LED_ON);
81 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
82 SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
83 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
84 SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON);
85 SETBITVAL(gpio, GPIO_WAN_LED_BIT, GPIO_WAN_LED_ON);
86 SETBITVAL(gpio, GPIO_LAN1_LED_BIT, GPIO_LAN1_LED_ON);
87 SETBITVAL(gpio, GPIO_LAN2_LED_BIT, GPIO_LAN2_LED_ON);
88 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
89 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
90 #elif defined(CONFIG_FOR_DRAGINO_V2) || defined(CONFIG_FOR_MESH_POTATO_V2)
91 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
92 SETBITVAL(gpio, GPIO_WAN_LED_BIT, GPIO_WAN_LED_ON);
93 SETBITVAL(gpio, GPIO_LAN_LED_BIT, GPIO_LAN_LED_ON);
94 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, GPIO_INTERNET_LED_ON);
95 #elif defined(CONFIG_FOR_GL_INET)
96 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, GPIO_WLAN_LED_ON);
97 SETBITVAL(gpio, GPIO_LAN_LED_BIT, GPIO_LAN_LED_ON);
99 #error "Custom GPIO in all_led_on() not defined!"
102 ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
105 void all_led_off(void){
108 gpio = ar7240_reg_rd(AR7240_GPIO_OUT);
110 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
111 SETBITVAL(gpio, GPIO_WPS_LED_BIT, !GPIO_WPS_LED_ON);
112 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
113 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
114 SETBITVAL(gpio, GPIO_ETH_LED_BIT, !GPIO_ETH_LED_ON);
115 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined (CONFIG_FOR_TPLINK_WR710N_V1)
116 SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
117 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
118 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
119 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
120 SETBITVAL(gpio, GPIO_ETH_LED_BIT, !GPIO_ETH_LED_ON);
121 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
122 SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
123 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4) || defined(CONFIG_FOR_TPLINK_MR3220_V2)
124 SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
125 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
126 SETBITVAL(gpio, GPIO_LAN1_LED_BIT, !GPIO_LAN1_LED_ON);
127 SETBITVAL(gpio, GPIO_LAN2_LED_BIT, !GPIO_LAN2_LED_ON);
128 SETBITVAL(gpio, GPIO_LAN3_LED_BIT, !GPIO_LAN3_LED_ON);
129 SETBITVAL(gpio, GPIO_LAN4_LED_BIT, !GPIO_LAN4_LED_ON);
130 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
131 SETBITVAL(gpio, GPIO_QSS_LED_BIT, !GPIO_QSS_LED_ON);
133 #ifdef CONFIG_FOR_TPLINK_MR3220_V2
134 SETBITVAL(gpio, GPIO_USB_LED_BIT, !GPIO_USB_LED_ON);
136 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
137 SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
138 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
139 SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON);
140 SETBITVAL(gpio, GPIO_WAN_LED_BIT, !GPIO_WAN_LED_ON);
141 SETBITVAL(gpio, GPIO_LAN1_LED_BIT, !GPIO_LAN1_LED_ON);
142 SETBITVAL(gpio, GPIO_LAN2_LED_BIT, !GPIO_LAN2_LED_ON);
143 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
144 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
145 #elif defined(CONFIG_FOR_DRAGINO_V2) || defined(CONFIG_FOR_MESH_POTATO_V2)
146 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
147 SETBITVAL(gpio, GPIO_WAN_LED_BIT, !GPIO_WAN_LED_ON);
148 SETBITVAL(gpio, GPIO_LAN_LED_BIT, !GPIO_LAN_LED_ON);
149 SETBITVAL(gpio, GPIO_INTERNET_LED_BIT, !GPIO_INTERNET_LED_ON);
150 #elif defined(CONFIG_FOR_GL_INET)
151 SETBITVAL(gpio, GPIO_WLAN_LED_BIT, !GPIO_WLAN_LED_ON);
152 SETBITVAL(gpio, GPIO_LAN_LED_BIT, !GPIO_LAN_LED_ON);
154 #error "Custom GPIO in all_led_off() not defined!"
157 ar7240_reg_wr(AR7240_GPIO_OUT, gpio);
161 #ifndef GPIO_RST_BUTTON_BIT
162 #error "GPIO_RST_BUTTON_BIT not defined!"
164 int reset_button_status(void){
167 gpio = ar7240_reg_rd(AR7240_GPIO_IN);
169 if(gpio & (1 << GPIO_RST_BUTTON_BIT)){
170 #if defined(GPIO_RST_BUTTON_IS_ACTIVE_LOW)
176 #if defined(GPIO_RST_BUTTON_IS_ACTIVE_LOW)
184 void gpio_config(void){
185 #if defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
187 * clk_obs1(gpio13/bit8), clk_obs2(gpio14/bit9), clk_obs3(gpio15/bit10),
188 * clk_obs4(gpio16/bit11), clk_obs5(gpio17/bit12)
189 * clk_obs0(gpio1/bit19), 6(gpio11/bit20)
191 ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & ~((0x1f<<8)|(0x3<<19))));
194 /* Enable eth Switch LEDs */
195 ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | (0x1f<<3)));
198 //Turn on status leds:
200 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) |(1<<0)));
202 //set WLAN LED output to low (reverse polarity LED)
203 //ar7240_reg_wr(AR7240_GPIO_CLEAR, (1<<0));
205 /* Clear AR7240_GPIO_FUNC BIT2 to ensure that software can control LED5(GPIO16) and LED6(GPIO17) */
206 ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & ~(0x1<<2)));
209 * clk_obs1(gpio13/bit8), clk_obs2(gpio14/bit9), clk_obs3(gpio15/bit10),
210 * clk_obs4(gpio16/bit11), clk_obs5(gpio17/bit12)
211 * clk_obs0(gpio1/bit19), 6(gpio11/bit20)
214 ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xEF84E0FB));
216 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
217 /* Disable EJTAG functionality to enable GPIO functionality */
218 ar7240_reg_wr(AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) | 0x8001));
221 /* Set HORNET_BOOTSTRAP_STATUS BIT18 to ensure that software can control GPIO26 and GPIO27 */
222 ar7240_reg_wr(HORNET_BOOTSTRAP_STATUS, (ar7240_reg_rd(HORNET_BOOTSTRAP_STATUS) | (0x1<<18)));
225 #if defined(CONFIG_FOR_TPLINK_MR3020_V1)
227 /* LED's GPIOs on MR3020:
236 /* set OE, added by zcf, 20110509 */
237 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC020001));
239 /* Disable clock obs, added by zcf, 20110509 */
240 //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
241 #elif defined(CONFIG_FOR_TPLINK_WR703N_V1) || defined(CONFIG_FOR_TPLINK_WR720N_V3) || defined(CONFIG_FOR_TPLINK_WR710N_V1)
243 /* LED's GPIOs on WR703N/WR720Nv3/WR710N:
249 /* set OE, added by zcf, 20110714 */
250 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x8000000));
251 #elif defined(CONFIG_FOR_TPLINK_MR3040_V1V2)
253 /* LED's GPIOs on MR3040:
261 /* set OE, added by zcf, 20110509 */
262 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC020000));
264 /* Disable clock obs, added by zcf, 20110509 */
265 //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
266 #elif defined(CONFIG_FOR_TPLINK_MR10U_V1) || defined(CONFIG_FOR_TPLINK_MR13U_V1)
268 /* LED's GPIOs on MR10U/MR13U:
274 /* set OE, added by zcf, 20110714 */
275 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x8000000));
276 #elif defined(CONFIG_FOR_TPLINK_WR740N_V4)
278 /* LED's GPIOs on WR740Nv4:
291 /* set OE, added by zcf, 20110509 */
292 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x803E003));
294 /* Disable clock obs, added by zcf, 20110509 */
295 //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
296 #elif defined(CONFIG_FOR_TPLINK_MR3220_V2)
298 /* LED's GPIOs on MR3220v2:
312 /* set OE, added by zcf, 20110509 */
313 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC03E003));
315 /* Disable clock obs, added by zcf, 20110509 */
316 //ar7240_reg_wr (AR7240_GPIO_FUNC, (ar7240_reg_rd(AR7240_GPIO_FUNC) & 0xffe7e07f));
317 #elif defined(CONFIG_FOR_8DEVICES_CARAMBOLA2)
318 // TODO: check GPIO config for C2
319 #elif defined(CONFIG_FOR_DRAGINO_V2) || defined(CONFIG_FOR_MESH_POTATO_V2)
321 /* LED's GPIOs on MR3220v2:
331 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x10022001));
333 #elif defined(CONFIG_FOR_DLINK_DIR505_A1)
335 /* LED's GPIOs on DIR-505:
343 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xC000000));
345 // turn off RED LED, we don't need it
346 ar7240_reg_wr(AR7240_GPIO_OUT, (ar7240_reg_rd(AR7240_GPIO_OUT) | (0x1 << 26)));
347 #elif defined(CONFIG_FOR_GS_OOLITE_V1_DEV)
349 /* LED's GPIOs on GS-Oolite v1 with development board:
354 * 27 => SYS LED (green on dev board, red on module)
356 * I/O on development board:
357 * 0 => RED LED (active low)
358 * 1 => RED LED (active low)
363 * 14 => RED LED (active low)
364 * 16 => RED LED (active low)
365 * 18 => RED LED (active low)
366 * 19 => RED LED (active low)
367 * 20 => RED LED (active low)
368 * 21 => RED LED (active low)
369 * 22 => RED LED (active low)
372 * 26 => RED LED (active low)
377 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0xDFFE103));
379 // turn on power on USB and turn off RED LEDs
380 ar7240_reg_wr(AR7240_GPIO_SET, 0x47D4103);
381 #elif defined(CONFIG_FOR_GL_INET)
383 /* LED's GPIOs on GL.iNet:
391 ar7240_reg_wr(AR7240_GPIO_OE, (ar7240_reg_rd(AR7240_GPIO_OE) | 0x2001));
394 #error "Custom GPIO config in gpio_config() not defined!"
398 int ar7240_mem_config(void){
399 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
400 #ifndef COMPRESSED_UBOOT
404 /* Default tap values for starting the tap_init*/
405 ar7240_reg_wr(AR7240_DDR_TAP_CONTROL0, CFG_DDR_TAP0_VAL);
406 ar7240_reg_wr(AR7240_DDR_TAP_CONTROL1, CFG_DDR_TAP1_VAL);
412 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
413 hornet_ddr_tap_init();
416 // return memory size
417 return(ar7240_ddr_find_size());
421 return((long int)ar7240_mem_config());
424 #ifndef COMPRESSED_UBOOT
425 int checkboard(void){
426 printf(BOARD_CUSTOM_STRING"\n\n");
432 * Returns a string with memory type preceded by a space sign
434 const char* print_mem_type(void){
436 * WR720N v3 (CH version) has wrong bootstrap configuration,
437 * so the memory type cannot be recognized automatically
439 #if defined(CONFIG_FOR_TPLINK_WR720N_V3)
440 return " DDR 16-bit";
442 unsigned int reg_val;
444 reg_val = (ar7240_reg_rd(HORNET_BOOTSTRAP_STATUS) & HORNET_BOOTSTRAP_MEM_TYPE_MASK) >> HORNET_BOOTSTRAP_MEM_TYPE_SHIFT;
452 return " DDR 16-bit";
456 return " DDR2 16-bit";
463 #endif /* defined(CONFIG_FOR_TPLINK_WR720N_V3) */