source: src/router/rc/resetbutton.c @ 31534

Last change on this file since 31534 was 31534, checked in by brainslayer, 4 months ago

avoid naming conflicts

File size: 37.6 KB
Line 
1
2#include <stdio.h>
3#include <signal.h>
4#include <sys/time.h>
5#include <unistd.h>
6#include <stdlib.h>
7#include <sys/types.h>
8#include <string.h>
9#include <bcmnvram.h>
10#include <shutils.h>
11#include <utils.h>
12#include <rc.h>
13#include <stdarg.h>
14#include <dirent.h>
15#include <syslog.h>
16
17#define SES_LED_CHECK_TIMES     "9999"  /* How many times to check? */
18#define SES_LED_CHECK_INTERVAL  "1"     /* Wait interval seconds */
19#define RESET_WAIT              3       /* seconds */
20#define RESET_WAIT_COUNT        RESET_WAIT * 10 /* 10 times a second */
21#ifdef HAVE_ERC
22#define SES_WAIT                5       /* seconds */
23#else
24#define SES_WAIT                3       /* seconds */
25#endif
26#define SES_WAIT_COUNT  SES_WAIT        /* 10 times a second */
27#ifdef HAVE_UNFY
28#define UPGRADE_WAIT            1       /* seconds */
29#define UPGRADE_WAIT_COUNT      UPGRADE_WAIT * 10 - 5
30#endif
31
32#define NORMAL_INTERVAL         1       /* second */
33#define URGENT_INTERVAL         100 * 1000      /* microsecond */
34
35#ifndef HAVE_GATEWORX           /* 1/10 second */
36#define GPIO_FILE               "/dev/gpio/in"
37#endif
38#if 0
39#define DEBUG printf
40#else
41#define DEBUG(format, args...)
42#endif
43
44#ifdef HAVE_MAGICBOX
45#include <sys/mman.h>
46
47#define GPIO0_OR   0x0700       /* rw, output */
48#define GPIO0_TCR  0x0704       /* rw, three-state control */
49#define GPIO0_ODR  0x0718       /* rw, open drain */
50#define GPIO0_IR   0x071c       /* ro, input */
51#define GPIO0_BASE 0xef600000   /* page */
52
53#define GPIO_LED    0x20000000  /* GPIO1 */
54#define GPIO_BUTTON 0x40000000  /* GPIO2 */
55
56#define REG(buf, offset) ((unsigned int *)((void *)buf + offset))
57
58static unsigned int *page;
59static int fd;
60
61static void init_gpio()
62{
63        void *start = 0;
64
65        fd = open("/dev/mem", O_RDWR);
66        if (fd < 0) {
67                // dd_syslog(LOG_ERR, "Can't open /dev/mem: %s", strerror(errno));
68                exit(1);
69        }
70
71        page = mmap(start, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t) GPIO0_BASE);
72        if (page == MAP_FAILED) {
73                // dd_syslog(LOG_ERR, "Can't mmap GPIO memory space: %s",
74                // strerror(errno));
75                exit(1);
76        }
77
78        /*
79         * disable
80         */
81        *REG(page, GPIO0_TCR) &= ~(GPIO_LED | GPIO_BUTTON);
82        /*
83         * enable led
84         */
85        *REG(page, GPIO0_TCR) |= GPIO_LED | GPIO_BUTTON;
86        /*
87         * enable/disable(?) button
88         */
89        *REG(page, GPIO0_TCR) &= ~GPIO_BUTTON;
90
91        *REG(page, GPIO0_IR) & GPIO_BUTTON;
92        *REG(page, GPIO0_IR) & GPIO_BUTTON;
93
94}
95
96static int getbuttonstate()
97{
98        return (*REG(page, GPIO0_IR) & GPIO_BUTTON) == 0;
99
100}
101#endif
102
103#if defined(HAVE_FONERA) || defined(HAVE_WHRAG108) || defined(HAVE_LS2) || defined(HAVE_CA8) || defined(HAVE_TW6600)  || defined(HAVE_LS5) || defined(HAVE_WP54G) || defined(HAVE_NP28G) || defined(HAVE_SOLO51) || defined(HAVE_OPENRISC)
104static int getbuttonstate()
105{
106#if defined(HAVE_EAP3660) || defined(HAVE_EOC2610) || defined(HAVE_EOC1650) || defined(HAVE_ECB3500)
107        return !get_gpio(5);
108#elif defined(HAVE_WRT54G2)
109        return !get_gpio(7);
110#elif defined(HAVE_RTG32)
111        return get_gpio(6);
112#elif defined(HAVE_EOC5610)
113        return !get_gpio(6);
114#elif HAVE_WP54G
115        return get_gpio(4);
116#elif HAVE_NP28G
117        return get_gpio(4);
118#elif HAVE_WPE53G
119        return get_gpio(6);
120#elif HAVE_NP25G
121        return get_gpio(4);
122#elif HAVE_OPENRISC
123        return get_gpio(0);
124#else
125        return get_gpio(6);
126#endif
127}
128#elif defined(HAVE_VENTANA)
129static int getbuttonstate()
130{
131        return !get_gpio(496);
132}
133#elif defined(HAVE_E200)
134static int getbuttonstate()
135{
136        return !get_gpio(0);
137}
138#elif defined(HAVE_EROUTER)
139static int getbuttonstate()
140{
141        return !get_gpio(11);
142}
143#elif defined(HAVE_UNIWIP)
144static int getbuttonstate()
145{
146        return !get_gpio(232);
147}
148#elif defined(HAVE_WDR4900)
149static int getbuttonstate()
150{
151        return get_gpio(3);
152}
153#elif defined(HAVE_MVEBU)
154static int getbuttonstate()
155{
156        int ret;
157        if (getRouterBrand() == ROUTER_WRT_1900AC)
158                ret = get_gpio(33);
159        else
160                ret = get_gpio(29);
161        return !ret;
162}
163#elif defined(HAVE_R9000)
164static int getbuttonstate()
165{
166        int ret = !get_gpio(31);
167        return ret;
168}
169#elif defined(HAVE_IPQ806X)
170static int getbuttonstate()
171{
172        int ret = 0;
173        switch (getRouterBrand()) {
174        case ROUTER_LINKSYS_EA8500:
175                ret = get_gpio(68);
176                break;
177        case ROUTER_ASROCK_G10:
178                ret = get_gpio(16);
179                break;
180        default:
181                ret = get_gpio(54);
182        }
183        return !ret;
184}
185#elif defined(HAVE_DAP3410)
186static int getbuttonstate()
187{
188        return !get_gpio(17);
189}
190#elif defined(HAVE_UBNTM)
191static int getbuttonstate()
192{
193        int brand = getRouterBrand();
194        if (brand == ROUTER_UBNT_UAPAC)
195                return !get_gpio(2);
196        return !get_gpio(12);
197}
198#elif defined(HAVE_RB2011)
199static int getbuttonstate()
200{
201        return 0;
202}
203#elif defined(HAVE_WDR4300)
204static int getbuttonstate()
205{
206        return !get_gpio(16);
207}
208#elif defined(HAVE_WNDR3700V4)
209static int getbuttonstate()
210{
211        return !get_gpio(21);
212}
213#elif defined(HAVE_DIR862)
214static int getbuttonstate()
215{
216        return !get_gpio(17);
217
218}
219#elif defined(HAVE_MMS344)
220static int getbuttonstate()
221{
222        return 0;
223        int ret = get_gpio(12);
224
225        if (ret == 0)
226                return 1;
227        return 0;
228}
229#elif defined(HAVE_WR1043V2)
230static int getbuttonstate()
231{
232        return !get_gpio(16);
233}
234#elif defined(HAVE_WZR450HP2)
235static int getbuttonstate()
236{
237        return !get_gpio(17);
238}
239#elif defined(HAVE_WR615N)
240static int getbuttonstate()
241{
242        return !get_gpio(17);
243}
244#elif defined(HAVE_E325N)
245static int getbuttonstate()
246{
247        return !get_gpio(20);
248}
249#elif defined(HAVE_E355AC)
250static int getbuttonstate()
251{
252        return !get_gpio(17);
253}
254#elif defined(HAVE_AP120C)
255static int getbuttonstate()
256{
257        return !get_gpio(16);
258}
259#elif defined(HAVE_WR650AC)
260static int getbuttonstate()
261{
262        return !get_gpio(19);
263}
264#elif defined(HAVE_XD3200)
265static int getbuttonstate()
266{
267        return !get_gpio(2);
268}
269#elif defined(HAVE_E380AC)
270static int getbuttonstate()
271{
272        return !get_gpio(19);
273}
274#elif defined(HAVE_DIR869)
275static int getbuttonstate()
276{
277        return !get_gpio(1);
278}
279#elif defined(HAVE_DIR859)
280static int getbuttonstate()
281{
282        return !get_gpio(2);
283}
284#elif defined(HAVE_JWAP606)
285static int getbuttonstate()
286{
287        return !get_gpio(15);
288}
289#elif defined(HAVE_DIR825C1)
290static int getbuttonstate()
291{
292        return !get_gpio(17);
293}
294#elif defined(HAVE_WASP)
295static int getbuttonstate()
296{
297        return !get_gpio(12);
298}
299#elif defined(HAVE_CARAMBOLA)
300#ifdef HAVE_ERC
301static int getbuttonstate()
302{
303        return get_gpio(12);
304
305}
306#else
307static int getbuttonstate()
308{
309        return !get_gpio(11);
310}
311#endif
312#elif defined(HAVE_HORNET)
313static int getbuttonstate()
314{
315        return !get_gpio(12);
316}
317#elif defined(HAVE_WNR2200)
318static int getbuttonstate()
319{
320        return !get_gpio(38);
321}
322#elif defined(HAVE_WNR2000)
323static int getbuttonstate()
324{
325        return !get_gpio(40);
326}
327#elif defined(HAVE_WDR2543)
328static int getbuttonstate()
329{
330        return !get_gpio(11);
331}
332#elif defined(HAVE_WHRHPGN)
333static int getbuttonstate()
334{
335        return !get_gpio(11);
336
337}
338#elif defined(HAVE_DAP3320)
339static int getbuttonstate()
340{
341        return !get_gpio(12);
342}
343#elif defined(HAVE_DAP2330)
344static int getbuttonstate()
345{
346        return !get_gpio(17);
347}
348#elif defined(HAVE_DAP2230)
349static int getbuttonstate()
350{
351        return !get_gpio(17);
352}
353#elif defined(HAVE_WR941V6)
354static int getbuttonstate()
355{
356        return !get_gpio(1);
357}
358#elif defined(HAVE_WR841V9)
359static int getbuttonstate()
360{
361        return !get_gpio(12);
362}
363#elif defined(HAVE_DIR615I)
364static int getbuttonstate()
365{
366        return !get_gpio(17);
367}
368#elif defined(HAVE_DIR615E)
369static int getbuttonstate()
370{
371        return !get_gpio(8);
372}
373#elif defined(HAVE_WNDR3700)
374static int getbuttonstate()
375{
376        return !get_gpio(8);
377}
378#elif defined(HAVE_DIR825)
379static int getbuttonstate()
380{
381        return !get_gpio(3);
382
383}
384#elif defined(HAVE_WRT400)
385static int getbuttonstate()
386{
387        return !get_gpio(8);
388}
389#elif defined(HAVE_WRT160NL)
390static int getbuttonstate()
391{
392        return !get_gpio(21);
393}
394#elif defined(HAVE_TG2521)
395static int getbuttonstate()
396{
397        return !get_gpio(21);
398
399}
400#elif defined(HAVE_TG1523)
401static int getbuttonstate()
402{
403        return !get_gpio(0);
404
405}
406#elif defined(HAVE_WR941)
407static int getbuttonstate()
408{
409        return !get_gpio(3);
410
411}
412#elif defined(HAVE_WR741V4)
413static int getbuttonstate()
414{
415        return get_gpio(11);
416}
417#elif defined(HAVE_WR741)
418static int getbuttonstate()
419{
420        return !get_gpio(11);
421}
422#elif defined(HAVE_WR1043)
423static int getbuttonstate()
424{
425        return !get_gpio(3);
426
427}
428#elif defined(HAVE_WZRG300NH2)
429static int getbuttonstate()
430{
431        return !get_gpio(1);    // nxp multiplexer connected
432}
433#elif defined(HAVE_WZRG450)
434static int getbuttonstate()
435{
436        return !get_gpio(6);    // nxp multiplexer connected
437}
438#elif defined(HAVE_DIR632)
439static int getbuttonstate()
440{
441        return !get_gpio(8);    // nxp multiplexer connected
442
443}
444#elif defined(HAVE_WZRG300NH)
445static int getbuttonstate()
446{
447        return !get_gpio(24);   // nxp multiplexer connected
448}
449#elif defined(HAVE_WZRHPAG300NH)
450static int getbuttonstate()
451{
452        return !get_gpio(11);
453}
454#elif defined(HAVE_TEW632BRP)
455static int getbuttonstate()
456{
457        return !get_gpio(21);
458}
459#elif defined(HAVE_JA76PF)
460static int getbuttonstate()
461{
462        return !get_gpio(11);
463}
464#elif defined(HAVE_ALFAAP94)
465static int getbuttonstate()
466{
467        return !get_gpio(11);
468}
469#elif defined(HAVE_JWAP003)
470static int getbuttonstate()
471{
472        return !get_gpio(11);
473}
474#elif defined(HAVE_ALFANX)
475static int getbuttonstate()
476{
477        return !get_gpio(11);
478}
479#elif defined(HAVE_LSX)
480static int getbuttonstate()
481{
482        return !get_gpio(8);
483}
484#elif defined(HAVE_WMBR_G300NH)
485static int getbuttonstate()
486{
487        return !get_gpio(37);
488}
489#elif defined(HAVE_VF803)
490static int getbuttonstate()
491{
492        return !get_gpio(28);
493}
494#elif defined(HAVE_SX763)
495static int getbuttonstate()
496{
497        return get_gpio(14);
498}
499#endif
500#if defined(HAVE_GATEWORX) || defined (HAVE_STORM)
501
502#include <linux/mii.h>
503#include <linux/sockios.h>
504#include <net/if.h>
505#include <arpa/inet.h>
506#include <sys/socket.h>
507#include <linux/sockios.h>
508#include <linux/mii.h>
509#define u8 unsigned char
510#define u32 unsigned int
511
512#define GPIO_GET_BIT    0x0000001
513#define GPIO_SET_BIT    0x0000005
514#define GPIO_GET_CONFIG 0x0000003
515#define GPIO_SET_CONFIG 0x0000004
516
517#define IXP4XX_GPIO_OUT                 0x1
518#define IXP4XX_GPIO_IN                  0x2
519
520struct gpio_bit {
521        unsigned char bit;
522        unsigned char state;
523};
524
525char *filename = "/dev/gpio";
526
527static int read_bit(int bit)
528{
529
530        int file;
531        struct gpio_bit _bit;
532
533        /*
534         * open device
535         */
536        if ((file = open(filename, O_RDONLY)) == -1) {
537                /*
538                 * ERROR HANDLING; you can check errno to see what went wrong
539                 */
540                return 1;
541        }
542
543        /*
544         * Config pin as input
545         */
546        _bit.bit = bit;
547        _bit.state = IXP4XX_GPIO_IN;
548        if (ioctl(file, GPIO_SET_CONFIG, (unsigned long)&_bit) < 0) {
549                /*
550                 * ERROR HANDLING; you can check errno to see what went wrong
551                 */
552                close(file);
553                return 1;
554        }
555
556        /*
557         * Read data
558         */
559        _bit.bit = bit;
560        if (ioctl(file, GPIO_GET_BIT, (unsigned long)&_bit) < 0) {
561                /*
562                 * ERROR HANDLING; you can check errno to see what went wrong
563                 */
564                close(file);
565                return 1;
566        }
567
568        close(file);
569        return _bit.state;
570}
571
572static int isCompex(void)
573{
574        static int compex = -1;
575
576        if (compex != -1)
577                return compex;
578        char filename2[64];
579
580        sprintf(filename2, "/dev/mtdblock/%d", getMTD("RedBoot"));
581        FILE *file = fopen(filename2, "r");
582
583        if (file) {
584                fseek(file, 0x1f800, SEEK_SET);
585                unsigned int signature;
586
587                fread(&signature, 4, 1, file);
588                if (signature == 0x20021103) {
589                        compex = 1;
590                } else {
591                        compex = 0;
592                }
593                fclose(file);
594        }
595        return compex;
596}
597
598static int isGW2369(void)
599{
600
601        int brand = getRouterBrand();
602        if (brand == ROUTER_BOARD_GATEWORX_GW2369)
603                return 1;
604        return 0;
605}
606
607static int isGW2350(void)
608{
609        if (nvram_match("DD_BOARD", "Gateworks Cambria GW2350")
610            || nvram_match("DD_BOARD2", "Gateworks Cambria GW2350"))
611                return 1;
612        return 0;
613}
614
615static int getbuttonstate()
616{
617        FILE *in;
618        int ret;
619
620#ifdef HAVE_STORM
621        ret = read_bit(60);
622#elif HAVE_WG302V1
623        ret = read_bit(13);
624#elif HAVE_WG302
625        ret = read_bit(3);
626#elif HAVE_MI424WR
627        ret = read_bit(10);
628#elif HAVE_USR8200
629        ret = read_bit(12);
630#elif HAVE_CAMBRIA
631        if (isGW2350())
632                ret = read_bit(4);
633        else
634                ret = read_bit(20);
635#else
636        if (isCompex())
637                ret = read_bit(0);
638        if (isGW2369())
639                ret = read_bit(3);
640        else
641                ret = read_bit(4);
642#endif
643#ifdef HAVE_TONZE
644        return ret == 0 ? 0 : 1;
645#else
646        return ret == 0 ? 1 : 0;
647#endif
648}
649#endif
650
651static int mode = 0;            /* mode 1 : pushed */
652static int ses_mode = 0;        /* mode 1 : pushed */
653static int wifi_mode = 0;       /* mode 1 : pushed */
654static int _count = 0;
655
656static int ses_pushed = 0;
657static int wifi24_pushed = 0;
658static int wifi5_pushed = 0;
659#ifdef HAVE_RADIOOFF
660static int initses = 1;
661#endif
662
663static int brand;
664
665static void resetbtn_alarmtimer(unsigned long sec, unsigned long usec)
666{
667        struct itimerval itv;
668
669        itv.it_value.tv_sec = sec;
670        itv.it_value.tv_usec = usec;
671
672        itv.it_interval = itv.it_value;
673        setitimer(ITIMER_REAL, &itv, NULL);
674}
675
676/*static int endswith(char *str, char *cmp)
677{
678        int cmp_len, str_len, i;
679
680        cmp_len = strlen(cmp);
681        str_len = strlen(str);
682        if (cmp_len > str_len)
683                return (0);
684        for (i = 0; i < cmp_len; i++) {
685                if (str[(str_len - 1) - i] != cmp[(cmp_len - 1) - i])
686                        return (0);
687        }
688        return (1);
689}*/
690
691static void runStartup(char *folder, char *extension)
692{
693        struct dirent *entry;
694        DIR *directory;
695
696        directory = opendir(folder);
697        if (directory == NULL) {
698                return;
699        }
700        // list all files in this directory
701        while ((entry = readdir(directory)) != NULL) {
702                if (endswith(entry->d_name, extension)) {
703                        sysprintf("%s/%s&\n", folder, entry->d_name);
704                }
705        }
706        closedir(directory);
707}
708
709/*
710 * void system_reboot(void) { DEBUG("resetbutton: reboot\n"); alarmtimer(0,
711 * 0); eval("reboot"); }
712 */
713
714static void service_restart(void)
715{
716        DEBUG("resetbutton: restart\n");
717        /*
718         * Stop the timer alarm
719         */
720        resetbtn_alarmtimer(0, 0);
721        /*
722         * Reset the Diagnostic LED
723         */
724        diag_led(DIAG, START_LED);      /* call from service.c */
725        /*
726         * Restart all of services
727         */
728        eval("rc", "restart");
729}
730
731static void handle_reset(void)
732{
733
734        if ((brand & 0x000f) != 0x000f) {
735                fprintf(stderr, "resetbutton: factory default.\n");
736                dd_syslog(LOG_DEBUG, "Reset button: restoring factory defaults now!\n");
737#if !defined(HAVE_XSCALE) && !defined(HAVE_MAGICBOX) && !defined(HAVE_FONERA) && !defined(HAVE_WHRAG108) && !defined(HAVE_GATEWORX) && !defined(HAVE_LS2) && !defined(HAVE_CA8) && !defined(HAVE_TW6600) && !defined(HAVE_LS5) && !defined(HAVE_LSX) && !defined(HAVE_SOLO51)
738                led_control(LED_DIAG, LED_ON);
739#elif defined(HAVE_WHRHPGN)  || defined(HAVE_WZRG300NH) || defined(HAVE_WZRHPAG300NH) || defined(HAVE_WZRG450)
740                led_control(LED_DIAG, LED_ON);
741#endif
742                ACTION("ACT_HW_RESTORE");
743                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
744#ifdef HAVE_X86
745                eval("mount", "/usr/local", "-o", "remount,rw");
746                eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
747                // database
748                unlink("/tmp/nvram/.lock");     // delete
749                // nvram
750                // database
751                eval("rm", "-f", "/usr/local/nvram/*"); // delete
752                // nvram
753                // database
754                eval("mount", "/usr/local", "-o", "remount,ro");
755#elif HAVE_RB500
756                eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
757                // database
758                unlink("/tmp/nvram/.lock");     // delete
759                // nvram
760                // database
761                eval("rm", "-f", "/etc/nvram/*");       // delete nvram
762                // database
763#elif defined(HAVE_RB600) && !defined(HAVE_WDR4900)
764                eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
765                // database
766                unlink("/tmp/nvram/.lock");     // delete
767                // nvram
768                // database
769                eval("rm", "-f", "/etc/nvram/*");       // delete nvram
770                // database
771#elif HAVE_MAGICBOX
772                eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
773                // database
774                unlink("/tmp/nvram/.lock");     // delete
775                // nvram
776                // database
777                eval("erase", "nvram");
778#else
779#ifdef HAVE_BUFFALO_SA
780                int region_sa = 0;
781                if (nvram_default_match("region", "SA", ""))
782                        region_sa = 1;
783#endif
784                nvram_seti("sv_restore_defaults", 1);
785                nvram_commit();
786                eval("killall", "ledtool");     // stop blinking on
787                // nvram_commit
788#if !defined(HAVE_XSCALE) && !defined(HAVE_MAGICBOX) && !defined(HAVE_FONERA) && !defined(HAVE_WHRAG108) && !defined(HAVE_GATEWORX) && !defined(HAVE_LS2) && !defined(HAVE_CA8) && !defined(HAVE_TW6600) && !defined(HAVE_LS5) && !defined(HAVE_LSX) && !defined(HAVE_SOLO51)
789                led_control(LED_DIAG, LED_ON);  // turn diag led on,
790                // so we know reset
791                // was pressed and
792                // we're restoring
793                // defaults.
794#elif defined(HAVE_WHRHPGN) || defined(HAVE_WZRG300NH) || defined(HAVE_WZRHPAG300NH) || defined(HAVE_WZRG450)
795                led_control(LED_DIAG, LED_ON);
796#endif
797#ifdef HAVE_BUFFALO_SA
798                nvram_seti("sv_restore_defaults", 1);
799                if (region_sa)
800                        nvram_set("region", "SA");
801                nvram_commit();
802#endif
803
804                // nvram_set ("sv_restore_defaults", "1");
805                // nvram_commit ();
806
807                kill(1, SIGTERM);
808#endif
809        }
810
811}
812
813static void handle_wifi(void)
814{
815
816        led_control(LED_WLAN, LED_FLASH);       // when pressed, blink white
817        _count = 0;
818        switch (wifi_mode) {
819        case 1:
820                dd_syslog(LOG_DEBUG, "Wifi button: turning radio(s) on\n");
821                sysprintf("startstop radio_on");
822                wifi_mode = 0;
823                break;
824        case 0:
825                // (AOSS) led
826                dd_syslog(LOG_DEBUG, "Wifi button: turning radio(s) off\n");
827                sysprintf("startstop radio_off");
828                wifi_mode = 1;
829                break;
830        }
831
832}
833
834static void handle_wifi24(void)
835{
836
837        led_control(LED_WLAN, LED_FLASH);       // when pressed, blink white
838        _count = 0;
839        switch (wifi_mode) {
840        case 1:
841                dd_syslog(LOG_DEBUG, "Wifi button: turning radio(s) on\n");
842                sysprintf("startstop radio_on_0");
843                wifi_mode = 0;
844                break;
845        case 0:
846                // (AOSS) led
847                dd_syslog(LOG_DEBUG, "Wifi button: turning radio(s) off\n");
848                sysprintf("startstop radio_off_0");
849                wifi_mode = 1;
850                break;
851        }
852
853}
854
855static void handle_wifi5(void)
856{
857
858        led_control(LED_WLAN, LED_FLASH);       // when pressed, blink white
859        _count = 0;
860        switch (wifi_mode) {
861        case 1:
862                dd_syslog(LOG_DEBUG, "Wifi button: turning radio(s) on\n");
863                sysprintf("startstop radio_on_1");
864                wifi_mode = 0;
865                break;
866        case 0:
867                // (AOSS) led
868                dd_syslog(LOG_DEBUG, "Wifi button: turning radio(s) off\n");
869                sysprintf("startstop radio_off_1");
870                wifi_mode = 1;
871                break;
872        }
873
874}
875
876static void handle_ses(void)
877{
878
879        runStartup("/etc/config", ".sesbutton");
880        runStartup("/jffs/etc/config", ".sesbutton");   // if available
881        runStartup("/mmc/etc/config", ".sesbutton");    // if available
882        runStartup("/tmp/etc/config", ".sesbutton");    // if available
883        _count = 0;
884        if (nvram_matchi("usb_ses_umount", 1)) {
885                led_control(LED_DIAG, LED_FLASH);
886                runStartup("/etc/config", ".umount");
887                sleep(5);
888                led_control(LED_DIAG, LED_FLASH);
889                sleep(1);
890                led_control(LED_DIAG, LED_FLASH);
891        }
892
893        if (nvram_matchi("radiooff_button", 1)) {
894                led_control(LED_SES, LED_FLASH);        // when pressed, blink white
895                switch (ses_mode) {
896
897                case 1:
898                        // SES (AOSS) led
899#ifdef HAVE_RADIOOFF
900#ifndef HAVE_BUFFALO
901                        dd_syslog(LOG_DEBUG, "SES / AOSS / EZ-setup button: turning radio(s) on\n");
902#else
903                        dd_syslog(LOG_DEBUG, "AOSS button: turning radio(s) on\n");
904#endif
905#ifndef HAVE_ERC
906                        sysprintf("startstop radio_on");
907#endif
908#endif
909#ifdef HAVE_ERC
910#ifdef HAVE_HORNET
911                        dd_syslog(LOG_DEBUG, "XXXXXXXX: TURN LED ON\n");
912                        set_gpio(1, 1);
913#endif
914#endif
915
916                        ses_mode = 0;
917                        break;
918                case 0:
919
920                        // (AOSS) led
921#ifdef HAVE_RADIOOFF
922#ifndef HAVE_BUFFALO
923                        dd_syslog(LOG_DEBUG, "SES / AOSS / EZ-setup button: turning radio(s) off\n");
924#else
925                        dd_syslog(LOG_DEBUG, "AOSS button: turning radio(s) off\n");
926#endif
927#ifndef HAVE_ERC
928                        sysprintf("startstop radio_off");
929#endif
930#endif
931#ifdef HAVE_ERC
932#ifdef HAVE_HORNET
933                        dd_syslog(LOG_DEBUG, "XXXXXXXX: TURN LED OFF\n");
934                        set_gpio(1, 0);
935#endif
936#endif
937                        ses_mode = 1;
938                        break;
939                }
940
941        }
942#if defined(HAVE_AOSS) || defined(HAVE_WPS)
943        else if (nvram_matchi("radiooff_button", 2)) {
944                sysprintf("startstop aoss");
945        }
946#endif
947
948}
949
950static void resetbtn_period_check(int sig)
951{
952        FILE *fp;
953        unsigned int val = 0;
954
955#ifdef HAVE_RADIOOFF
956        if (initses == 1 && nvram_matchi("radiooff_boot_off", 1)
957            && nvram_matchi("radiooff_button", 1)) {
958                ses_mode = 1;
959                initses = 0;
960        }
961#endif
962
963        // time_t t;
964
965        // time(&t);
966        // DEBUG("resetbutton: now time=%d\n", t);
967
968#if defined(HAVE_IPQ806X) || defined(HAVE_MVEBU) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_WHRAG108) || defined(HAVE_GATEWORX) || defined(HAVE_STORM) || defined(HAVE_LS2) || defined(HAVE_CA8) || defined(HAVE_TW6600)  || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_WP54G) || defined(HAVE_NP28G) || defined(HAVE_SOLO51) || defined(HAVE_OPENRISC) || defined(HAVE_DANUBE) || defined(HAVE_WDR4900) || defined(HAVE_VENTANA) || defined(HAVE_AC622) || defined(HAVE_AC722) || defined(HAVE_EROUTER)
969        val = getbuttonstate();
970#ifdef HAVE_WRK54G
971        val = !val;
972#endif
973#ifndef HAVE_ALPHA
974#ifdef HAVE_USR5453
975        val = !val;
976#endif
977#endif
978
979#else
980        switch (brand) {
981        case ROUTER_BOARD_WCRGN:
982        case ROUTER_BOARD_WHRG300N:
983        case ROUTER_BOARD_DIR600B:
984        case ROUTER_ASUS_RTN10PLUS:
985        case ROUTER_BOARD_DIR615D:
986        case ROUTER_BOARD_RT3352:
987                val = (get_gpio(10) << 10) | (get_gpio(0) << 0);
988                break;
989        case ROUTER_BOARD_HAMEA15:
990        case ROUTER_BOARD_EAP9550:
991        case ROUTER_BOARD_ESR9752:
992                val = get_gpio(0);
993                break;
994        case ROUTER_BOARD_ECB9750:
995                val = get_gpio(11) << 11;
996                break;
997        case ROUTER_BOARD_NEPTUNE:
998#ifdef HAVE_RUT500
999                val = (get_gpio(10) << 10);
1000#else
1001                val = (get_gpio(10) << 10) | (get_gpio(0) << 0);
1002#endif
1003                break;
1004        case ROUTER_BOARD_F5D8235:
1005        case ROUTER_BOARD_BR6574N:
1006        case ROUTER_BOARD_ACXNR22:
1007        case ROUTER_BOARD_TECHNAXX3G:
1008        case ROUTER_BOARD_ESR6650:
1009        case ROUTER_BOARD_W502U:
1010        case ROUTER_BOARD_WR5422:
1011                val = get_gpio(10) << 10;
1012                break;
1013        case ROUTER_BOARD_RT15N:
1014                val = get_gpio(12) << 12;
1015                break;
1016        case ROUTER_BOARD_AR670W:
1017        case ROUTER_BOARD_AR690W:
1018                val = get_gpio(9) << 9;
1019                break;
1020        case ROUTER_WHR300HP2:
1021                val = (get_gpio(52) << 1) | (get_gpio(53) << 2);
1022                break;
1023        case ROUTER_BOARD_E1700:
1024        case ROUTER_DIR810L:
1025                val = (get_gpio(1) << 1) | (get_gpio(2) << 2);
1026                break;
1027        case ROUTER_DIR860LB1:
1028                val = (get_gpio(7) << 7) | (get_gpio(18) << 18);
1029                break;
1030        case ROUTER_BOARD_GW2380:
1031        case ROUTER_BOARD_GW2388:
1032                val = get_gpio(240);
1033                break;
1034        default:
1035                if ((fp = fopen(GPIO_FILE, "r"))) {
1036#ifdef HAVE_XSCALE
1037                        fscanf(fp, "%d", &val);
1038#else
1039                        if (brand == ROUTER_NETGEAR_WGR614L)    //gpio 7 power led shared with reset button
1040                        {
1041                                set_gpio(7, 1); //disable power led
1042                                val = get_gpio(7) << 7; //read and shift value
1043                                set_gpio(7, 0); //enable power led
1044                        } else {
1045                                fread(&val, 4, 1, fp);
1046                        }
1047
1048#endif
1049                        fclose(fp);
1050                } else
1051                        perror(GPIO_FILE);
1052                break;
1053        }
1054#endif
1055        DEBUG("resetbutton: GPIO = 0x%x\n", val);
1056
1057        int gpio = 0;
1058
1059        int state = 0;
1060
1061#if defined(HAVE_IPQ806X) || defined(HAVE_MVEBU) || (HAVE_XSCALE) || defined(HAVE_MAGICBOX) || defined(HAVE_FONERA) || defined(HAVE_WHRAG108) || defined(HAVE_GATEWORX) || defined(HAVE_STORM) || defined(HAVE_LS2) || defined(HAVE_CA8) || defined(HAVE_TW6600)  || defined(HAVE_LS5) || defined(HAVE_LSX) || defined(HAVE_WP54G) || defined(HAVE_NP28G) || defined(HAVE_SOLO51) || defined(HAVE_OPENRISC) || defined(HAVE_DANUBE) || defined(HAVE_UNIWIP) || defined(HAVE_EROUTER) || defined(HAVE_VENTANA)
1062        state = val;
1063        int sesgpio = 0xfff;
1064        int wifi24gpio = 0xfff;
1065        int wifi5gpio = 0xfff;
1066        int pushses;
1067        int pushwifi24;
1068        int pushwifi5;
1069#ifdef HAVE_WZRG300NH
1070        sesgpio = 0x117;
1071        val |= get_gpio(23) << 23;      //aoss pushbutton
1072#elif defined(HAVE_WZR600DHP)
1073        sesgpio = 0x105;
1074        val |= get_gpio(5) << 5;
1075#elif defined(HAVE_WZRG300NH2)
1076        sesgpio = 0x10c;
1077        val |= get_gpio(12) << 12;      //aoss pushbutton
1078#elif defined(HAVE_WMBR_G300NH)
1079        sesgpio = 0x100;
1080        val |= get_gpio(0);     //aoss pushbutton
1081#elif defined(HAVE_WZRG450)
1082        sesgpio = 0x108;
1083        val |= get_gpio(8) << 8;        //aoss pushbutton
1084#elif defined(HAVE_MVEBU)
1085        sesgpio = 0x101;
1086        if (getRouterBrand() == ROUTER_WRT_1900AC)
1087                val |= get_gpio(32) << 1;       //aoss pushbutton
1088        else
1089                val |= get_gpio(24) << 1;       //aoss pushbutton
1090#elif defined(HAVE_DIR632)
1091        sesgpio = 0x10c;
1092        val |= get_gpio(12) << 12;      //aoss pushbutton
1093#elif defined(HAVE_WZRHPAG300NH)
1094        sesgpio = 0x105;
1095        val |= get_gpio(5) << 5;        //aoss pushbutton
1096#elif defined(HAVE_CARAMBOLA)
1097#if defined(HAVE_ERC)
1098//      wifi24gpio = 0x117;
1099//      val |= get_gpio(23) << 23;
1100#endif
1101#elif defined(HAVE_HORNET)
1102        sesgpio = 0x00b;
1103        val |= get_gpio(11) << 11;      //aoss pushbutton
1104#elif defined(HAVE_RB2011)
1105//      sesgpio = 0x110;
1106//      val |= get_gpio(16) << 16;      //aoss pushbutton
1107#elif defined(HAVE_WDR4300)
1108//      sesgpio = 0x110;
1109//      val |= get_gpio(16) << 16;      //aoss pushbutton
1110#elif defined(HAVE_WNDR3700V4)
1111        wifi24gpio = 0x10f;
1112        sesgpio = 0x10c;
1113        val |= get_gpio(15) << 15;      //aoss pushbutton
1114        val |= get_gpio(12) << 12;      //aoss pushbutton
1115#elif defined(HAVE_WR1043V2)
1116        sesgpio = 0x111;
1117        val |= get_gpio(17) << 17;      //aoss pushbutton
1118#elif defined(HAVE_WZR450HP2)
1119        sesgpio = 0x115;
1120        val |= get_gpio(21) << 21;      //aoss pushbutton
1121#elif defined(HAVE_XD3200)
1122        sesgpio = 0x101;
1123        val |= get_gpio(1) << 1;        //aoss pushbutton
1124#elif defined(HAVE_WR650AC)
1125#elif defined(HAVE_E355AC)
1126#elif defined(HAVE_WR615N)
1127#elif defined(HAVE_AP120C)
1128#elif defined(HAVE_E380AC)
1129#elif defined(HAVE_E325N)
1130#elif defined(HAVE_DIR869)
1131        sesgpio = 0x102;
1132        val |= get_gpio(2) << 2;        //aoss pushbutton
1133#elif defined(HAVE_DIR859)
1134        sesgpio = 0x101;
1135        val |= get_gpio(1) << 1;        //aoss pushbutton
1136#elif defined(HAVE_MMS344)
1137
1138#elif defined(HAVE_DIR825C1)
1139        sesgpio = 0x110;
1140        val |= get_gpio(16) << 16;      //aoss pushbutton
1141#elif defined(HAVE_WASP)
1142        sesgpio = 0x00b;
1143        val |= get_gpio(11) << 11;      //aoss pushbutton
1144#elif defined(HAVE_WNR2200)
1145        sesgpio = 0x101;        //not yet supported
1146        val |= get_gpio(37) << 1;       //aoss pushbutton
1147#elif defined(HAVE_WNR2000)
1148        sesgpio = 0x00b;
1149        val |= get_gpio(11) << 11;      //aoss pushbutton
1150#elif defined(HAVE_WDR2543)
1151        sesgpio = 0x10c;
1152        val |= get_gpio(12) << 12;      //aoss pushbutton
1153#elif defined(HAVE_WHRHPGN)
1154        sesgpio = 0x10c;
1155        val |= get_gpio(12) << 12;      //aoss pushbutton
1156#elif defined(HAVE_RT10N)
1157        sesgpio = 0x100;
1158        val |= get_gpio(0);     //aoss pushbutton
1159#elif defined(HAVE_RT15N)
1160        sesgpio = 0x100;
1161        val |= get_gpio(0);     //aoss pushbutton
1162#elif defined(HAVE_F5D8235)
1163        sesgpio = 0x100;
1164        val |= get_gpio(0);     //aoss pushbutton
1165#elif defined(HAVE_WR5422)
1166        sesgpio = 0x100;
1167        val |= get_gpio(0);     //aoss pushbutton
1168#elif defined(HAVE_DIR600)
1169        sesgpio = 0x100;
1170        val |= get_gpio(0);     //aoss pushbutton
1171#elif defined(HAVE_WR941V6)
1172        sesgpio = 0x102;
1173        val |= get_gpio(2) << 2;        //aoss pushbutton
1174#elif defined(HAVE_WR841V9)
1175        sesgpio = 0x111;
1176        val |= get_gpio(17) << 17;      //aoss pushbutton
1177#elif defined(HAVE_DIR615I)
1178        sesgpio = 0x110;
1179        val |= get_gpio(16) << 16;      //aoss pushbutton
1180#elif defined(HAVE_DIR615E)
1181        sesgpio = 0x10c;
1182        val |= get_gpio(12) << 12;      //aoss pushbutton
1183#elif defined(HAVE_WR1043)
1184        sesgpio = 0x107;
1185        val |= get_gpio(7) << 7;        //aoss pushbutton
1186#elif defined(HAVE_WR941)
1187        sesgpio = 0x107;
1188        val |= get_gpio(7) << 7;        //aoss pushbutton
1189#elif defined(HAVE_MR3020)
1190        sesgpio = 0xfff;
1191#elif defined(HAVE_WR741V4)
1192        sesgpio = 0x01a;
1193        val |= get_gpio(26) << 26;      //aoss pushbutton
1194#elif defined(HAVE_WR741)
1195        sesgpio = 0x10c;
1196        val |= get_gpio(12) << 12;      //aoss pushbutton
1197#elif defined(HAVE_WRT400)
1198        sesgpio = 0x103;
1199        val |= get_gpio(3) << 3;        //aoss pushbutton
1200#elif defined(HAVE_WNDR3700)
1201        wifi24gpio = 0x10b;
1202        sesgpio = 0x103;
1203        val |= get_gpio(3) << 3;        //aoss pushbutton
1204        val |= get_gpio(11) << 11;      //aoss pushbutton
1205#elif defined(HAVE_DIR825)
1206        sesgpio = 0x108;
1207        val |= get_gpio(8) << 8;        //aoss pushbutton
1208#elif defined(HAVE_TG2521)
1209        sesgpio = 0x10c;
1210        val |= get_gpio(12) << 12;      //aoss pushbutton
1211#elif defined(HAVE_OPENRISC)
1212        sesgpio = 0x005;
1213        val |= get_gpio(5) << 5;        //aoss pushbutton
1214#elif defined(HAVE_IPQ806X)
1215        switch (brand) {
1216        case ROUTER_LINKSYS_EA8500:
1217                sesgpio = 0x105;
1218                wifi24gpio = 0x106;
1219                val |= get_gpio(65) << 5;
1220                val |= get_gpio(67) << 6;
1221                break;
1222        case ROUTER_ASROCK_G10:
1223                wifi5gpio = 0x105;
1224                wifi24gpio = 0x106;
1225                val |= get_gpio(65) << 5;
1226                val |= get_gpio(64) << 6;
1227                break;
1228        case ROUTER_NETGEAR_R7500:
1229        case ROUTER_NETGEAR_R7500V2:
1230        case ROUTER_NETGEAR_R7800:
1231                wifi24gpio = 0x106;
1232                val |= get_gpio(6) << 6;
1233                break;
1234        case ROUTER_NETGEAR_R9000:
1235                sesgpio = 0x105;
1236                wifi24gpio = 0x106;
1237                val |= get_gpio(32) << 5;
1238                val |= get_gpio(5) << 6;
1239                break;
1240        }
1241#endif
1242
1243#ifdef HAVE_WRT160NL
1244        sesgpio = 0x107;
1245        val |= get_gpio(7) << 7;        //wps/ses pushbutton
1246#endif
1247#ifdef HAVE_TEW632BRP
1248        sesgpio = 0x10c;
1249        val |= get_gpio(12) << 12;      //wps/ses pushbutton
1250#endif
1251#ifdef HAVE_UNFY
1252        sesgpio = 0xfff;
1253#endif
1254#else
1255        if (brand > 0xffff) {
1256                if ((brand & 0x000ff) != 0x000ff)
1257                        gpio = 1 << (brand & 0x000ff);  // calculate gpio value.
1258
1259                if ((brand & 0x00100) == 0)     // check reset button polarity: 0
1260                        // normal, 1 inversed
1261                        state = (val & gpio);
1262                else
1263                        state = !(val & gpio);
1264        } else {
1265
1266                if ((brand & 0x000f) != 0x000f)
1267                        gpio = 1 << (brand & 0x000f);   // calculate gpio value.
1268
1269                if ((brand & 0x0010) == 0)      // check reset button polarity: 0
1270                        // normal, 1 inversed
1271                        state = (val & gpio);
1272                else
1273                        state = !(val & gpio);
1274        }
1275        /*
1276         * 1 byte router's SES (AOSS) button gpio number and polarity; Eko
1277         * 25.nov.06
1278         *
1279         * R R R P N N N N = 0xXX ----- - ------- | | gpio num | | | |--- SES -
1280         * AOSS button polarity (0: normal, 1 inversed) | |-------- reserved for
1281         * future use
1282         *
1283         * 0xff = button disabled / not available
1284         */
1285        int pushses;
1286        int pushwifi24;
1287        int pushwifi5;
1288        int sesgpio;
1289        int wifi24gpio = 0xfff;
1290        int wifi5gpio = 0xfff;
1291
1292        switch (brand) {
1293        case ROUTER_BUFFALO_WHRG54S:
1294        case ROUTER_BUFFALO_WZRRSG54:
1295        case ROUTER_BUFFALO_WLI_TX4_G54HP:
1296                sesgpio = 0x100;        // gpio 0, inversed
1297                break;
1298        case ROUTER_BUFFALO_WLA2G54C:
1299                sesgpio = 0x102;        // gpio 2, inversed
1300                break;
1301        case ROUTER_BUFFALO_WBR2G54S:
1302                sesgpio = 0x004;        // gpio 4, normal
1303                break;
1304        case ROUTER_BUFFALO_WZR600DHP2:
1305        case ROUTER_BUFFALO_WZR900DHP:
1306                sesgpio = 0x109;        // gpio 9, inversed
1307                break;
1308        case ROUTER_BUFFALO_WZR1750:
1309                sesgpio = 0x10c;        // gpio 12, inversed
1310                break;
1311        case ROUTER_BUFFALO_WXR1900DHP:
1312                sesgpio = 0x110;        // gpio 16, inversed
1313                break;
1314        case ROUTER_D1800H:
1315                sesgpio = 0x10a;        // gpio 10, inversed
1316                break;
1317#ifndef HAVE_BUFFALO
1318        case ROUTER_BOARD_WCRGN:
1319        case ROUTER_BOARD_DIR600B:
1320        case ROUTER_BOARD_RT3352:
1321#ifndef HAVE_RUT500
1322        case ROUTER_BOARD_NEPTUNE:
1323#endif
1324        case ROUTER_BOARD_DIR615D:
1325        case ROUTER_BOARD_WHRG300N:
1326        case ROUTER_ASUS_RTN10PLUS:
1327        case ROUTER_TPLINK_ARCHERC9:
1328        case ROUTER_ASUS_RTN12:
1329        case ROUTER_NETGEAR_WNR2000V2:
1330                sesgpio = 0x100;
1331                break;
1332        case ROUTER_TPLINK_ARCHERC3150:
1333                sesgpio = 0x103;
1334                break;
1335        case ROUTER_DIR860LB1:
1336                sesgpio = 0x112;
1337                break;
1338        case ROUTER_BOARD_E1700:
1339        case ROUTER_DIR810L:
1340        case ROUTER_WHR300HP2:
1341        case ROUTER_ASUS_RTN10:
1342        case ROUTER_LINKSYS_WTR54GS:
1343        case ROUTER_NETGEAR_WNDR4000:
1344                sesgpio = 0x102;
1345                break;
1346        case ROUTER_ASUS_WL500G_PRE:
1347        case ROUTER_ASUS_WL700GE:
1348                sesgpio = 0x004;        // gpio 4, normal
1349                break;
1350        case ROUTER_ASUS_RTN10PLUSD1:
1351                sesgpio = 0x114;        // gpio 20, inversed
1352                break;
1353        case ROUTER_LINKSYS_EA6900:
1354        case ROUTER_LINKSYS_EA6700:
1355        case ROUTER_LINKSYS_EA6350:
1356        case ROUTER_LINKSYS_EA6500V2:
1357        case ROUTER_TRENDNET_TEW812:
1358        case ROUTER_DLINK_DIR890:
1359        case ROUTER_DLINK_DIR880:
1360        case ROUTER_DLINK_DIR895:
1361        case ROUTER_TRENDNET_TEW828:
1362        case ROUTER_DLINK_DIR885:
1363        case ROUTER_DLINK_DIR868:
1364        case ROUTER_DLINK_DIR868C:
1365        case ROUTER_DLINK_DIR330:
1366                sesgpio = 0x107;        // gpio 7, inversed
1367                break;
1368        case ROUTER_ASUS_AC67U:
1369                wifi24gpio = 0x10f;
1370                sesgpio = 0x107;        // gpio 7, inversed
1371                break;
1372        case ROUTER_ASUS_AC87U:
1373                sesgpio = 0x102;        // gpio 2, inversed
1374                wifi24gpio = 0x10f;
1375                break;
1376        case ROUTER_ASUS_AC88U:
1377        case ROUTER_ASUS_AC3100:
1378                sesgpio = 0x114;        // gpio 20, inversed
1379                wifi24gpio = 0x112;     // gpio 18, inversed
1380                break;
1381        case ROUTER_ASUS_AC1200:
1382                sesgpio = 0x109;        // gpio 9, inversed
1383                break;
1384        case ROUTER_ASUS_AC5300:
1385                wifi24gpio = 0x114;     // gpio 20, inversed
1386                sesgpio = 0x112;        // gpio 18, inversed
1387                break;
1388        case ROUTER_ASUS_AC3200:
1389                sesgpio = 0x107;        // gpio 2, inversed
1390                wifi24gpio = 0x104;
1391                break;
1392        case ROUTER_ASUS_AC56U:
1393                wifi24gpio = 0x107;     // gpio 7, inversed
1394                sesgpio = 0x10f;        // gpio 7, inversed
1395                break;
1396        case ROUTER_ASUS_RTN18U:
1397                sesgpio = 0x10b;        // gpio 11, inversed
1398                break;
1399        case ROUTER_ASUS_WL550GE:
1400                sesgpio = 0x00f;        // gpio 15, normal
1401                break;
1402        case ROUTER_DLINK_DIR860:
1403        case ROUTER_WRT310N:
1404        case ROUTER_WRT350N:
1405        case ROUTER_WRT610N:
1406        case ROUTER_ASUS_RTN16:
1407        case ROUTER_BELKIN_F7D3301:
1408        case ROUTER_BELKIN_F7D3302:
1409        case ROUTER_BELKIN_F7D4301:
1410        case ROUTER_BELKIN_F7D4302:
1411        case ROUTER_BELKIN_F5D8235V3:
1412        case ROUTER_LINKSYS_E3200:
1413                sesgpio = 0x108;        // gpio 8, inversed
1414                break;
1415        case ROUTER_ASUS_WL500W:
1416                sesgpio = 0x007;        // gpio 7, normal
1417                break;
1418        case ROUTER_ASUS_WL520GUGC:
1419        case ROUTER_ASUS_WL500G_PRE_V2:
1420                sesgpio = 0x103;        // gpio 3, inversed
1421                break;
1422        case ROUTER_WAP54G_V3:
1423                sesgpio = 0x10e;        // gpio 14, inversed
1424                break;
1425        case ROUTER_NETGEAR_WNDR3300:
1426                sesgpio = 0x101;        // gpio 1, inversed
1427                break;
1428        case ROUTER_WRT54G_V81:
1429        case ROUTER_DLINK_DIR320:
1430        case ROUTER_WRT600N:
1431        case ROUTER_NETGEAR_WNDR3400:
1432        case ROUTER_NETGEAR_WNR3500L:
1433                sesgpio = 0x106;        // gpio 6, inversed
1434                break;
1435        case ROUTER_NETGEAR_WNR3500LV2:
1436                sesgpio = 0x106;        // gpio 6, inversed
1437                wifi24gpio = 0x108;
1438                break;
1439        case ROUTER_WRT320N:
1440        case ROUTER_WRT160NV3:
1441        case ROUTER_NETGEAR_WNDR4500:
1442        case ROUTER_NETGEAR_WNDR4500V2:
1443        case ROUTER_NETGEAR_R6300:
1444        case ROUTER_NETGEAR_AC1450:
1445        case ROUTER_NETGEAR_R6250:
1446        case ROUTER_NETGEAR_R6300V2:
1447        case ROUTER_NETGEAR_R7000:
1448                wifi24gpio = 0x105;
1449                //fall through
1450        case ROUTER_WRT54G:
1451        case ROUTER_WRT54G_V8:
1452        case ROUTER_WRTSL54GS:
1453        case ROUTER_WRT150N:
1454        case ROUTER_WRT160N:
1455        case ROUTER_WRT300N:
1456        case ROUTER_WRT300NV11:
1457        case ROUTER_WRT610NV2:
1458        case ROUTER_ASKEY_RT220XD:      // not soldered
1459        case ROUTER_DYNEX_DX_NRUTER:
1460        case ROUTER_LINKSYS_E4200:
1461        case ROUTER_ASUS_RTN66:
1462        case ROUTER_ASUS_AC66U:
1463                sesgpio = 0x104;
1464                break;
1465        case ROUTER_NETGEAR_R6400:
1466                sesgpio = 0x103;
1467                wifi24gpio = 0x104;
1468                break;
1469        case ROUTER_NETGEAR_R8000:
1470                sesgpio = 0x105;
1471                wifi24gpio = 0x104;
1472                break;
1473        case ROUTER_NETGEAR_R8500:
1474                sesgpio = 0x104;
1475                wifi24gpio = 0x113;
1476                break;
1477        case ROUTER_LINKSYS_EA6500:
1478        case ROUTER_NETGEAR_EX6200:
1479                wifi24gpio = 0x104;
1480                break;
1481        case ROUTER_WRT310NV2:
1482                sesgpio = 0x105;        // gpio 5, inversed
1483                break;
1484        case ROUTER_LINKSYS_E800:
1485        case ROUTER_LINKSYS_E900:
1486        case ROUTER_LINKSYS_E1000V2:
1487        case ROUTER_LINKSYS_E1500:
1488        case ROUTER_LINKSYS_E1550:
1489        case ROUTER_LINKSYS_E2500:
1490                sesgpio = 0x109;        // gpio 9, inversed
1491                break;
1492
1493#endif
1494        default:
1495                sesgpio = 0xfff;        // gpio unknown, disabled
1496                wifi5gpio = 0xfff;      // gpio unknown, disabled
1497                wifi24gpio = 0xfff;     // gpio unknown, disabled
1498        }
1499#endif
1500
1501        pushses = 1 << (sesgpio & 0x0ff);       // calculate push value from ses gpio
1502        pushwifi24 = 1 << (wifi24gpio & 0x0ff); // calculate push value from ses gpio
1503        pushwifi5 = 1 << (wifi5gpio & 0x0ff);   // calculate push value from ses gpio
1504        //
1505        //
1506        //
1507        // pin no.
1508
1509        /*
1510         * The value is zero during button-pushed.
1511         */
1512        if (state && nvram_matchi("resetbutton_enable", 1)) {
1513                DEBUG("resetbutton: mode=%d, count=%d\n", mode, _count);
1514
1515                if (mode == 0) {
1516                        /*
1517                         * We detect button pushed first time
1518                         */
1519                        resetbtn_alarmtimer(0, URGENT_INTERVAL);
1520                        mode = 1;
1521                }
1522                if (++_count > RESET_WAIT_COUNT) {
1523                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1524                                fprintf(stderr, "resetbutton: nothing to do...\n");
1525                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1526                                return;
1527                        }
1528                        handle_reset();
1529                }
1530        } else if ((sesgpio != 0xfff) && (((sesgpio & 0x100) == 0 && (val & pushses)) || ((sesgpio & 0x100) == 0x100 && !(val & pushses)))) {
1531                if (!ses_pushed && (++_count > SES_WAIT)) {
1532                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1533                                fprintf(stderr, "resetbutton: nothing to do...\n");
1534                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1535                                return;
1536                        }
1537                        _count = 0;
1538                        ses_pushed = 1;
1539                        handle_ses();
1540                }
1541        } else if ((wifi24gpio != 0xfff && wifi5gpio == 0xfff) && (((wifi24gpio & 0x100) == 0 && (val & pushwifi24)) || ((wifi24gpio & 0x100) == 0x100 && !(val & pushwifi24)))) {
1542                if (!wifi24_pushed && (++_count > SES_WAIT)) {
1543                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1544                                fprintf(stderr, "resetbutton: nothing to do...\n");
1545                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1546                                return;
1547                        }
1548                        _count = 0;
1549                        wifi24_pushed = 1;
1550                        handle_wifi();
1551                }
1552
1553        } else if ((wifi24gpio != 0xfff && wifi5gpio != 0xfff) && (((wifi24gpio & 0x100) == 0 && (val & pushwifi24)) || ((wifi24gpio & 0x100) == 0x100 && !(val & pushwifi24)))) {
1554                if (!wifi24_pushed && (++_count > SES_WAIT)) {
1555                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1556                                fprintf(stderr, "resetbutton: nothing to do...\n");
1557                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1558                                return;
1559                        }
1560                        _count = 0;
1561                        wifi24_pushed = 1;
1562                        handle_wifi24();
1563                }
1564        } else if ((wifi24gpio != 0xfff && wifi5gpio != 0xfff) && (((wifi5gpio & 0x100) == 0 && (val & pushwifi5)) || ((wifi5gpio & 0x100) == 0x100 && !(val & pushwifi5)))) {
1565                if (!wifi5_pushed && (++_count > SES_WAIT)) {
1566                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1567                                fprintf(stderr, "resetbutton: nothing to do...\n");
1568                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1569                                return;
1570                        }
1571                        _count = 0;
1572                        wifi5_pushed = 1;
1573                        handle_wifi5();
1574                }
1575
1576        } else {
1577                _count = 0;     // reset counter to avoid factory default
1578                wifi24_pushed = 0;
1579                wifi5_pushed = 0;
1580                ses_pushed = 0;
1581                /*
1582                 * Although it's unpushed now, it had ever been pushed
1583                 */
1584                if (mode == 1) {
1585//                      fprintf(stderr, "[RESETBUTTON] released %d\n", count);
1586                        resetbtn_alarmtimer(NORMAL_INTERVAL, 0);
1587                        mode = 0;
1588#ifdef HAVE_UNFY
1589                        if (_count > UPGRADE_WAIT_COUNT) {
1590
1591                                char *upgrade_script = "firmware_upgrade.sh";
1592                                char call[32];
1593                                fprintf(stderr, "[RESETBUTTON] check:%d count:%d\n", pidof(upgrade_script), _count);
1594                                if (pidof(upgrade_script) < 0) {
1595                                        sprintf(call, "/%s/%s", nvram_safe_get("fw_upgrade_dir"), upgrade_script);
1596                                        if (f_exists(call)) {
1597                                                fprintf(stderr, "[RESETBUTTON] trigger update script: %s\n", call);
1598                                                system(call);
1599                                        } else {
1600                                                fprintf(stderr, "[RESETBUTTON] upgrade script not found\n");
1601                                                led_control(LED_DIAG, LED_OFF);
1602                                        }
1603                                }
1604                        }
1605#else
1606                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1607                                fprintf(stderr, "resetbutton: nothing to do...\n");
1608                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1609                                return;
1610                        }
1611#endif
1612                }
1613        }
1614}
1615
1616static int resetbutton_main(int argc, char *argv[])
1617{
1618        brand = getRouterBrand();
1619#ifndef HAVE_MI424WR
1620#if !defined(HAVE_NOP8670) && !defined(HAVE_TONZE)
1621        if (brand <= 0xffff && (brand & 0x000f) == 0x000f)
1622#endif
1623        {
1624                puts("sorry, your unit does not support resetbutton feature\n");
1625                return 0;
1626        }
1627#endif
1628#ifndef HAVE_NOP8670
1629#ifdef HAVE_MAGICBOX
1630        init_gpio();
1631#endif
1632        /*
1633         * Run it under background
1634         */
1635        switch (fork()) {
1636        case -1:
1637                DEBUG("can't fork\n");
1638                exit(0);
1639                break;
1640        case 0:
1641                /*
1642                 * child process
1643                 */
1644                DEBUG("fork ok\n");
1645                (void)setsid();
1646                break;
1647        default:
1648                /*
1649                 * parent process should just die
1650                 */
1651                _exit(0);
1652        }
1653
1654        /*
1655         * set the signal handler
1656         */
1657        signal(SIGALRM, resetbtn_period_check);
1658
1659        /*
1660         * set timer
1661         */
1662        resetbtn_alarmtimer(NORMAL_INTERVAL, 0);
1663
1664        /*
1665         * Most of time it goes to sleep
1666         */
1667        while (1)
1668                pause();
1669
1670        return 0;
1671#endif
1672}
1673
1674#undef DEBUG
Note: See TracBrowser for help on using the repository browser.