4 Copyright (C) 2006-2009 Jonathan Zarate
9 #include <sys/reboot.h>
17 static int get_btn(const char *name
, uint32_t *bit
, uint32_t *pushed
)
22 if (nvget_gpio(name
, &gpio
, &inv
)) {
24 *pushed
= inv
? 0 : *bit
;
30 int buttons_main(int argc
, char *argv
[])
38 uint32_t reset_pushed
;
41 int brau_count_stable
;
49 ses_mask
= ses_pushed
= 0;
56 switch (nvram_get_int("btn_override") ? MODEL_UNKNOWN
: get_model()) {
74 case MODEL_WHR2A54G54
:
77 reset_mask
= reset_pushed
= 1 << 4;
82 reset_mask
= reset_pushed
= 1 << 4;
85 reset_mask
= reset_pushed
= 1 << 7;
86 ses_mask
= ses_pushed
= 1 << 4;
92 case MODEL_WZRRSG54HP
:
94 reset_mask
= reset_pushed
= 1 << 4;
99 reset_mask
= reset_pushed
= 1 << 7;
111 reset_mask
= reset_pushed
= 1 << 0;
112 ses_mask
= ses_pushed
= 1 << 4;
115 reset_mask
= reset_pushed
= 1 << 6;
116 ses_mask
= ses_pushed
= 1 << 7;
121 ses_mask
= 1 << 6; // WLAN button on H618B
123 case MODEL_WL500GPv2
:
130 //? reset_mask = reset_pushed = 1 << 7;
133 reset_mask
= reset_pushed
= 1 << 7;
146 reset_mask
= 1 << 21;
153 brau_mask
= (1 << 4) | (1 << 5) | (1 << 6);
172 reset_mask
= 1 << 14;
175 case MODEL_WNR3500LV2
:
180 case MODEL_WNR2000v2
:
185 case MODEL_WNDR3700v3
:
194 case MODEL_F5D8235v3
:
205 reset_mask
= 1 << 10;
212 case MODEL_WRT160Nv3
:
221 case MODEL_WRT610Nv2
:
232 reset_mask
= 1 << 21;
234 //wlan button = 1 >> 10
237 reset_mask
= 1 << 21;
241 case MODEL_WRT160Nv1
:
246 case MODEL_WRT310Nv1
:
251 case MODEL_RG200E_CA
:
253 reset_mask
= 1 << 30;
257 reset_mask
= 1 << 30;
262 get_btn("btn_ses", &ses_mask
, &ses_pushed
);
263 if (!get_btn("btn_reset", &reset_mask
, &reset_pushed
)) {
264 // fprintf(stderr, "Not supported.\n");
269 mask
= reset_mask
| ses_mask
| brau_mask
;
272 cprintf("reset_mask=0x%X reset_pushed=0x%X\n", reset_mask
, reset_pushed
);
273 cprintf("ses_mask=0x%X\n", ses_mask
);
274 cprintf("brau_mask=0x%X\n", brau_mask
);
275 cprintf("ses_led=%d\n", ses_led
);
277 if (fork() != 0) return 0;
281 signal(SIGCHLD
, chld_reap
);
283 if ((gf
= gpio_open(mask
)) < 0) return 1;
286 brau_count_stable
= 0;
289 if (((gpio
= _gpio_read(gf
)) == ~0) || (last
== (gpio
&= mask
) && !brau_flag
) || (check_action() != ACT_IDLE
)) {
291 cprintf("gpio = %X\n", gpio
);
297 if ((gpio
& reset_mask
) == reset_pushed
) {
299 cprintf("reset down\n");
307 if (++count
== 3) led(LED_DIAG
, 1);
308 } while (((gpio
= _gpio_read(gf
)) != ~0) && ((gpio
& reset_mask
) == reset_pushed
));
311 cprintf("reset count = %d\n", count
);
314 eval("mtd-erase", "-d", "nvram");
315 //nvram_set("restore_defaults", "1");
322 set_action(ACT_REBOOT
);
329 if ((ses_mask
) && ((gpio
& ses_mask
) == ses_pushed
)) {
332 // syslog(LOG_DEBUG, "ses-pushed: gpio=x%X, pushed=x%X, mask=x%X, count=%d", gpio, ses_pushed, ses_mask, count);
334 led(ses_led
, LED_ON
);
336 led(ses_led
, LED_OFF
);
339 } while (((gpio
= _gpio_read(gf
)) != ~0) && ((gpio
& ses_mask
) == ses_pushed
));
342 if ((ses_led
== LED_DMZ
) && (nvram_get_int("dmz_enable") > 0)) led(LED_DMZ
, 1);
344 // syslog(LOG_DEBUG, "ses-released: gpio=x%X, pushed=x%X, mask=x%X, count=%d", gpio, ses_pushed, ses_mask, count);
345 syslog(LOG_INFO
, "SES pushed. Count was %d.", count
);
347 if ((count
!= 3) && (count
!= 7) && (count
!= 11)) {
358 cprintf("ses func=%d\n", n
);
360 sprintf(s
, "sesx_b%d", n
);
361 // syslog(LOG_DEBUG, "ses-func: count=%d %s='%s'", count, s, nvram_safe_get(s));
362 if ((p
= nvram_get(s
)) != NULL
) {
364 case '1': // toggle wl
365 nvram_set("rrules_radio", "-1");
366 eval("radio", "toggle");
371 case '3': // shutdown
374 case '4': // run a script
375 sprintf(s
, "%d", count
);
376 run_nvscript("sesx_script", s
, 2);
379 case '5': // !!TB: unmount all USB drives
380 add_remove_usbhost("-2", 0);
393 last
= (gpio
& brau_mask
);
394 if (brau_state
!= last
) {
395 brau_flag
= (brau_state
!= ~0); // set to 1 to run at startup
397 brau_count_stable
= 0;
399 else if (brau_flag
&& ++brau_count_stable
> 2) { // stable for 2+ seconds
401 switch (nvram_get_int("btn_override") ? MODEL_UNKNOWN
: get_model()) {
404 p
= (brau_state
& (1 << 4)) ? "ap" : (brau_state
& (1 << 5)) ? "repeater" : "router";
408 p
= brau_state
? "auto" : "bridge";
411 nvram_set("brau_state", p
);
413 cprintf("bridge/auto state = %s\n", p
);
415 run_nvscript("script_brau", p
, 2);