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

Last change on this file since 31691 was 31691, checked in by brainslayer, 7 days ago

erc wireless toggle

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//      sesgpio = 0x017;
1099      wifi24gpio = 0x117;
1100      val |= get_gpio(23) << 23;
1101#endif
1102#elif defined(HAVE_HORNET)
1103        sesgpio = 0x00b;
1104        val |= get_gpio(11) << 11;      //aoss pushbutton
1105#elif defined(HAVE_RB2011)
1106//      sesgpio = 0x110;
1107//      val |= get_gpio(16) << 16;      //aoss pushbutton
1108#elif defined(HAVE_WDR4300)
1109//      sesgpio = 0x110;
1110//      val |= get_gpio(16) << 16;      //aoss pushbutton
1111#elif defined(HAVE_WNDR3700V4)
1112        wifi24gpio = 0x10f;
1113        sesgpio = 0x10c;
1114        val |= get_gpio(15) << 15;      //aoss pushbutton
1115        val |= get_gpio(12) << 12;      //aoss pushbutton
1116#elif defined(HAVE_WR1043V2)
1117        sesgpio = 0x111;
1118        val |= get_gpio(17) << 17;      //aoss pushbutton
1119#elif defined(HAVE_WZR450HP2)
1120        sesgpio = 0x115;
1121        val |= get_gpio(21) << 21;      //aoss pushbutton
1122#elif defined(HAVE_XD3200)
1123        sesgpio = 0x101;
1124        val |= get_gpio(1) << 1;        //aoss pushbutton
1125#elif defined(HAVE_WR650AC)
1126#elif defined(HAVE_E355AC)
1127#elif defined(HAVE_WR615N)
1128#elif defined(HAVE_AP120C)
1129#elif defined(HAVE_E380AC)
1130#elif defined(HAVE_E325N)
1131#elif defined(HAVE_DIR869)
1132        sesgpio = 0x102;
1133        val |= get_gpio(2) << 2;        //aoss pushbutton
1134#elif defined(HAVE_DIR859)
1135        sesgpio = 0x101;
1136        val |= get_gpio(1) << 1;        //aoss pushbutton
1137#elif defined(HAVE_MMS344)
1138
1139#elif defined(HAVE_DIR825C1)
1140        sesgpio = 0x110;
1141        val |= get_gpio(16) << 16;      //aoss pushbutton
1142#elif defined(HAVE_WASP)
1143        sesgpio = 0x00b;
1144        val |= get_gpio(11) << 11;      //aoss pushbutton
1145#elif defined(HAVE_WNR2200)
1146        sesgpio = 0x101;        //not yet supported
1147        val |= get_gpio(37) << 1;       //aoss pushbutton
1148#elif defined(HAVE_WNR2000)
1149        sesgpio = 0x00b;
1150        val |= get_gpio(11) << 11;      //aoss pushbutton
1151#elif defined(HAVE_WDR2543)
1152        sesgpio = 0x10c;
1153        val |= get_gpio(12) << 12;      //aoss pushbutton
1154#elif defined(HAVE_WHRHPGN)
1155        sesgpio = 0x10c;
1156        val |= get_gpio(12) << 12;      //aoss pushbutton
1157#elif defined(HAVE_RT10N)
1158        sesgpio = 0x100;
1159        val |= get_gpio(0);     //aoss pushbutton
1160#elif defined(HAVE_RT15N)
1161        sesgpio = 0x100;
1162        val |= get_gpio(0);     //aoss pushbutton
1163#elif defined(HAVE_F5D8235)
1164        sesgpio = 0x100;
1165        val |= get_gpio(0);     //aoss pushbutton
1166#elif defined(HAVE_WR5422)
1167        sesgpio = 0x100;
1168        val |= get_gpio(0);     //aoss pushbutton
1169#elif defined(HAVE_DIR600)
1170        sesgpio = 0x100;
1171        val |= get_gpio(0);     //aoss pushbutton
1172#elif defined(HAVE_WR941V6)
1173        sesgpio = 0x102;
1174        val |= get_gpio(2) << 2;        //aoss pushbutton
1175#elif defined(HAVE_WR841V9)
1176        sesgpio = 0x111;
1177        val |= get_gpio(17) << 17;      //aoss pushbutton
1178#elif defined(HAVE_DIR615I)
1179        sesgpio = 0x110;
1180        val |= get_gpio(16) << 16;      //aoss pushbutton
1181#elif defined(HAVE_DIR615E)
1182        sesgpio = 0x10c;
1183        val |= get_gpio(12) << 12;      //aoss pushbutton
1184#elif defined(HAVE_WR1043)
1185        sesgpio = 0x107;
1186        val |= get_gpio(7) << 7;        //aoss pushbutton
1187#elif defined(HAVE_WR941)
1188        sesgpio = 0x107;
1189        val |= get_gpio(7) << 7;        //aoss pushbutton
1190#elif defined(HAVE_MR3020)
1191        sesgpio = 0xfff;
1192#elif defined(HAVE_WR741V4)
1193        sesgpio = 0x01a;
1194        val |= get_gpio(26) << 26;      //aoss pushbutton
1195#elif defined(HAVE_WR741)
1196        sesgpio = 0x10c;
1197        val |= get_gpio(12) << 12;      //aoss pushbutton
1198#elif defined(HAVE_WRT400)
1199        sesgpio = 0x103;
1200        val |= get_gpio(3) << 3;        //aoss pushbutton
1201#elif defined(HAVE_WNDR3700)
1202        wifi24gpio = 0x10b;
1203        sesgpio = 0x103;
1204        val |= get_gpio(3) << 3;        //aoss pushbutton
1205        val |= get_gpio(11) << 11;      //aoss pushbutton
1206#elif defined(HAVE_DIR825)
1207        sesgpio = 0x108;
1208        val |= get_gpio(8) << 8;        //aoss pushbutton
1209#elif defined(HAVE_TG2521)
1210        sesgpio = 0x10c;
1211        val |= get_gpio(12) << 12;      //aoss pushbutton
1212#elif defined(HAVE_OPENRISC)
1213        sesgpio = 0x005;
1214        val |= get_gpio(5) << 5;        //aoss pushbutton
1215#elif defined(HAVE_IPQ806X)
1216        switch (brand) {
1217        case ROUTER_LINKSYS_EA8500:
1218                sesgpio = 0x105;
1219                wifi24gpio = 0x106;
1220                val |= get_gpio(65) << 5;
1221                val |= get_gpio(67) << 6;
1222                break;
1223        case ROUTER_ASROCK_G10:
1224                wifi5gpio = 0x105;
1225                wifi24gpio = 0x106;
1226                val |= get_gpio(65) << 5;
1227                val |= get_gpio(64) << 6;
1228                break;
1229        case ROUTER_NETGEAR_R7500:
1230        case ROUTER_NETGEAR_R7500V2:
1231        case ROUTER_NETGEAR_R7800:
1232                wifi24gpio = 0x106;
1233                val |= get_gpio(6) << 6;
1234                break;
1235        case ROUTER_NETGEAR_R9000:
1236                sesgpio = 0x105;
1237                wifi24gpio = 0x106;
1238                val |= get_gpio(32) << 5;
1239                val |= get_gpio(5) << 6;
1240                break;
1241        }
1242#endif
1243
1244#ifdef HAVE_WRT160NL
1245        sesgpio = 0x107;
1246        val |= get_gpio(7) << 7;        //wps/ses pushbutton
1247#endif
1248#ifdef HAVE_TEW632BRP
1249        sesgpio = 0x10c;
1250        val |= get_gpio(12) << 12;      //wps/ses pushbutton
1251#endif
1252#ifdef HAVE_UNFY
1253        sesgpio = 0xfff;
1254#endif
1255#else
1256        if (brand > 0xffff) {
1257                if ((brand & 0x000ff) != 0x000ff)
1258                        gpio = 1 << (brand & 0x000ff);  // calculate gpio value.
1259
1260                if ((brand & 0x00100) == 0)     // check reset button polarity: 0
1261                        // normal, 1 inversed
1262                        state = (val & gpio);
1263                else
1264                        state = !(val & gpio);
1265        } else {
1266
1267                if ((brand & 0x000f) != 0x000f)
1268                        gpio = 1 << (brand & 0x000f);   // calculate gpio value.
1269
1270                if ((brand & 0x0010) == 0)      // check reset button polarity: 0
1271                        // normal, 1 inversed
1272                        state = (val & gpio);
1273                else
1274                        state = !(val & gpio);
1275        }
1276        /*
1277         * 1 byte router's SES (AOSS) button gpio number and polarity; Eko
1278         * 25.nov.06
1279         *
1280         * R R R P N N N N = 0xXX ----- - ------- | | gpio num | | | |--- SES -
1281         * AOSS button polarity (0: normal, 1 inversed) | |-------- reserved for
1282         * future use
1283         *
1284         * 0xff = button disabled / not available
1285         */
1286        int pushses;
1287        int pushwifi24;
1288        int pushwifi5;
1289        int sesgpio;
1290        int wifi24gpio = 0xfff;
1291        int wifi5gpio = 0xfff;
1292
1293        switch (brand) {
1294        case ROUTER_BUFFALO_WHRG54S:
1295        case ROUTER_BUFFALO_WZRRSG54:
1296        case ROUTER_BUFFALO_WLI_TX4_G54HP:
1297                sesgpio = 0x100;        // gpio 0, inversed
1298                break;
1299        case ROUTER_BUFFALO_WLA2G54C:
1300                sesgpio = 0x102;        // gpio 2, inversed
1301                break;
1302        case ROUTER_BUFFALO_WBR2G54S:
1303                sesgpio = 0x004;        // gpio 4, normal
1304                break;
1305        case ROUTER_BUFFALO_WZR600DHP2:
1306        case ROUTER_BUFFALO_WZR900DHP:
1307                sesgpio = 0x109;        // gpio 9, inversed
1308                break;
1309        case ROUTER_BUFFALO_WZR1750:
1310                sesgpio = 0x10c;        // gpio 12, inversed
1311                break;
1312        case ROUTER_BUFFALO_WXR1900DHP:
1313                sesgpio = 0x110;        // gpio 16, inversed
1314                break;
1315        case ROUTER_D1800H:
1316                sesgpio = 0x10a;        // gpio 10, inversed
1317                break;
1318#ifndef HAVE_BUFFALO
1319        case ROUTER_BOARD_WCRGN:
1320        case ROUTER_BOARD_DIR600B:
1321        case ROUTER_BOARD_RT3352:
1322#ifndef HAVE_RUT500
1323        case ROUTER_BOARD_NEPTUNE:
1324#endif
1325        case ROUTER_BOARD_DIR615D:
1326        case ROUTER_BOARD_WHRG300N:
1327        case ROUTER_ASUS_RTN10PLUS:
1328        case ROUTER_TPLINK_ARCHERC9:
1329        case ROUTER_ASUS_RTN12:
1330        case ROUTER_NETGEAR_WNR2000V2:
1331                sesgpio = 0x100;
1332                break;
1333        case ROUTER_TPLINK_ARCHERC3150:
1334                sesgpio = 0x103;
1335                break;
1336        case ROUTER_DIR860LB1:
1337                sesgpio = 0x112;
1338                break;
1339        case ROUTER_BOARD_E1700:
1340        case ROUTER_DIR810L:
1341        case ROUTER_WHR300HP2:
1342        case ROUTER_ASUS_RTN10:
1343        case ROUTER_LINKSYS_WTR54GS:
1344        case ROUTER_NETGEAR_WNDR4000:
1345                sesgpio = 0x102;
1346                break;
1347        case ROUTER_ASUS_WL500G_PRE:
1348        case ROUTER_ASUS_WL700GE:
1349                sesgpio = 0x004;        // gpio 4, normal
1350                break;
1351        case ROUTER_ASUS_RTN10PLUSD1:
1352                sesgpio = 0x114;        // gpio 20, inversed
1353                break;
1354        case ROUTER_LINKSYS_EA6900:
1355        case ROUTER_LINKSYS_EA6700:
1356        case ROUTER_LINKSYS_EA6350:
1357        case ROUTER_LINKSYS_EA6500V2:
1358        case ROUTER_TRENDNET_TEW812:
1359        case ROUTER_DLINK_DIR890:
1360        case ROUTER_DLINK_DIR880:
1361        case ROUTER_DLINK_DIR895:
1362        case ROUTER_TRENDNET_TEW828:
1363        case ROUTER_DLINK_DIR885:
1364        case ROUTER_DLINK_DIR868:
1365        case ROUTER_DLINK_DIR868C:
1366        case ROUTER_DLINK_DIR330:
1367                sesgpio = 0x107;        // gpio 7, inversed
1368                break;
1369        case ROUTER_ASUS_AC67U:
1370                wifi24gpio = 0x10f;
1371                sesgpio = 0x107;        // gpio 7, inversed
1372                break;
1373        case ROUTER_ASUS_AC87U:
1374                sesgpio = 0x102;        // gpio 2, inversed
1375                wifi24gpio = 0x10f;
1376                break;
1377        case ROUTER_ASUS_AC88U:
1378        case ROUTER_ASUS_AC3100:
1379                sesgpio = 0x114;        // gpio 20, inversed
1380                wifi24gpio = 0x112;     // gpio 18, inversed
1381                break;
1382        case ROUTER_ASUS_AC1200:
1383                sesgpio = 0x109;        // gpio 9, inversed
1384                break;
1385        case ROUTER_ASUS_AC5300:
1386                wifi24gpio = 0x114;     // gpio 20, inversed
1387                sesgpio = 0x112;        // gpio 18, inversed
1388                break;
1389        case ROUTER_ASUS_AC3200:
1390                sesgpio = 0x107;        // gpio 2, inversed
1391                wifi24gpio = 0x104;
1392                break;
1393        case ROUTER_ASUS_AC56U:
1394                wifi24gpio = 0x107;     // gpio 7, inversed
1395                sesgpio = 0x10f;        // gpio 7, inversed
1396                break;
1397        case ROUTER_ASUS_RTN18U:
1398                sesgpio = 0x10b;        // gpio 11, inversed
1399                break;
1400        case ROUTER_ASUS_WL550GE:
1401                sesgpio = 0x00f;        // gpio 15, normal
1402                break;
1403        case ROUTER_DLINK_DIR860:
1404        case ROUTER_WRT310N:
1405        case ROUTER_WRT350N:
1406        case ROUTER_WRT610N:
1407        case ROUTER_ASUS_RTN16:
1408        case ROUTER_BELKIN_F7D3301:
1409        case ROUTER_BELKIN_F7D3302:
1410        case ROUTER_BELKIN_F7D4301:
1411        case ROUTER_BELKIN_F7D4302:
1412        case ROUTER_BELKIN_F5D8235V3:
1413        case ROUTER_LINKSYS_E3200:
1414                sesgpio = 0x108;        // gpio 8, inversed
1415                break;
1416        case ROUTER_ASUS_WL500W:
1417                sesgpio = 0x007;        // gpio 7, normal
1418                break;
1419        case ROUTER_ASUS_WL520GUGC:
1420        case ROUTER_ASUS_WL500G_PRE_V2:
1421                sesgpio = 0x103;        // gpio 3, inversed
1422                break;
1423        case ROUTER_WAP54G_V3:
1424                sesgpio = 0x10e;        // gpio 14, inversed
1425                break;
1426        case ROUTER_NETGEAR_WNDR3300:
1427                sesgpio = 0x101;        // gpio 1, inversed
1428                break;
1429        case ROUTER_WRT54G_V81:
1430        case ROUTER_DLINK_DIR320:
1431        case ROUTER_WRT600N:
1432        case ROUTER_NETGEAR_WNDR3400:
1433        case ROUTER_NETGEAR_WNR3500L:
1434                sesgpio = 0x106;        // gpio 6, inversed
1435                break;
1436        case ROUTER_NETGEAR_WNR3500LV2:
1437                sesgpio = 0x106;        // gpio 6, inversed
1438                wifi24gpio = 0x108;
1439                break;
1440        case ROUTER_WRT320N:
1441        case ROUTER_WRT160NV3:
1442        case ROUTER_NETGEAR_WNDR4500:
1443        case ROUTER_NETGEAR_WNDR4500V2:
1444        case ROUTER_NETGEAR_R6300:
1445        case ROUTER_NETGEAR_AC1450:
1446        case ROUTER_NETGEAR_R6250:
1447        case ROUTER_NETGEAR_R6300V2:
1448        case ROUTER_NETGEAR_R7000:
1449                wifi24gpio = 0x105;
1450                //fall through
1451        case ROUTER_WRT54G:
1452        case ROUTER_WRT54G_V8:
1453        case ROUTER_WRTSL54GS:
1454        case ROUTER_WRT150N:
1455        case ROUTER_WRT160N:
1456        case ROUTER_WRT300N:
1457        case ROUTER_WRT300NV11:
1458        case ROUTER_WRT610NV2:
1459        case ROUTER_ASKEY_RT220XD:      // not soldered
1460        case ROUTER_DYNEX_DX_NRUTER:
1461        case ROUTER_LINKSYS_E4200:
1462        case ROUTER_ASUS_RTN66:
1463        case ROUTER_ASUS_AC66U:
1464                sesgpio = 0x104;
1465                break;
1466        case ROUTER_NETGEAR_R6400:
1467                sesgpio = 0x103;
1468                wifi24gpio = 0x104;
1469                break;
1470        case ROUTER_NETGEAR_R8000:
1471                sesgpio = 0x105;
1472                wifi24gpio = 0x104;
1473                break;
1474        case ROUTER_NETGEAR_R8500:
1475                sesgpio = 0x104;
1476                wifi24gpio = 0x113;
1477                break;
1478        case ROUTER_LINKSYS_EA6500:
1479        case ROUTER_NETGEAR_EX6200:
1480                wifi24gpio = 0x104;
1481                break;
1482        case ROUTER_WRT310NV2:
1483                sesgpio = 0x105;        // gpio 5, inversed
1484                break;
1485        case ROUTER_LINKSYS_E800:
1486        case ROUTER_LINKSYS_E900:
1487        case ROUTER_LINKSYS_E1000V2:
1488        case ROUTER_LINKSYS_E1500:
1489        case ROUTER_LINKSYS_E1550:
1490        case ROUTER_LINKSYS_E2500:
1491                sesgpio = 0x109;        // gpio 9, inversed
1492                break;
1493
1494#endif
1495        default:
1496                sesgpio = 0xfff;        // gpio unknown, disabled
1497                wifi5gpio = 0xfff;      // gpio unknown, disabled
1498                wifi24gpio = 0xfff;     // gpio unknown, disabled
1499        }
1500#endif
1501
1502        pushses = 1 << (sesgpio & 0x0ff);       // calculate push value from ses gpio
1503        pushwifi24 = 1 << (wifi24gpio & 0x0ff); // calculate push value from ses gpio
1504        pushwifi5 = 1 << (wifi5gpio & 0x0ff);   // calculate push value from ses gpio
1505        //
1506        //
1507        //
1508        // pin no.
1509
1510        /*
1511         * The value is zero during button-pushed.
1512         */
1513        if (state && nvram_matchi("resetbutton_enable", 1)) {
1514                DEBUG("resetbutton: mode=%d, count=%d\n", mode, _count);
1515
1516                if (mode == 0) {
1517                        /*
1518                         * We detect button pushed first time
1519                         */
1520                        resetbtn_alarmtimer(0, URGENT_INTERVAL);
1521                        mode = 1;
1522                }
1523                if (++_count > RESET_WAIT_COUNT) {
1524                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1525                                fprintf(stderr, "resetbutton: nothing to do...\n");
1526                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1527                                return;
1528                        }
1529                        handle_reset();
1530                }
1531        } else if ((sesgpio != 0xfff) && (((sesgpio & 0x100) == 0 && (val & pushses)) || ((sesgpio & 0x100) == 0x100 && !(val & pushses)))) {
1532                if (!ses_pushed && (++_count > SES_WAIT)) {
1533                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1534                                fprintf(stderr, "resetbutton: nothing to do...\n");
1535                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1536                                return;
1537                        }
1538                        _count = 0;
1539                        ses_pushed = 1;
1540                        handle_ses();
1541                }
1542        } else if ((wifi24gpio != 0xfff && wifi5gpio == 0xfff) && (((wifi24gpio & 0x100) == 0 && (val & pushwifi24)) || ((wifi24gpio & 0x100) == 0x100 && !(val & pushwifi24)))) {
1543                if (!wifi24_pushed && (++_count > SES_WAIT)) {
1544                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1545                                fprintf(stderr, "resetbutton: nothing to do...\n");
1546                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1547                                return;
1548                        }
1549                        _count = 0;
1550                        wifi24_pushed = 1;
1551                        handle_wifi();
1552                }
1553
1554        } else if ((wifi24gpio != 0xfff && wifi5gpio != 0xfff) && (((wifi24gpio & 0x100) == 0 && (val & pushwifi24)) || ((wifi24gpio & 0x100) == 0x100 && !(val & pushwifi24)))) {
1555                if (!wifi24_pushed && (++_count > SES_WAIT)) {
1556                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1557                                fprintf(stderr, "resetbutton: nothing to do...\n");
1558                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1559                                return;
1560                        }
1561                        _count = 0;
1562                        wifi24_pushed = 1;
1563                        handle_wifi24();
1564                }
1565        } else if ((wifi24gpio != 0xfff && wifi5gpio != 0xfff) && (((wifi5gpio & 0x100) == 0 && (val & pushwifi5)) || ((wifi5gpio & 0x100) == 0x100 && !(val & pushwifi5)))) {
1566                if (!wifi5_pushed && (++_count > SES_WAIT)) {
1567                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1568                                fprintf(stderr, "resetbutton: nothing to do...\n");
1569                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1570                                return;
1571                        }
1572                        _count = 0;
1573                        wifi5_pushed = 1;
1574                        handle_wifi5();
1575                }
1576
1577        } else {
1578                _count = 0;     // reset counter to avoid factory default
1579                wifi24_pushed = 0;
1580                wifi5_pushed = 0;
1581                ses_pushed = 0;
1582                /*
1583                 * Although it's unpushed now, it had ever been pushed
1584                 */
1585                if (mode == 1) {
1586//                      fprintf(stderr, "[RESETBUTTON] released %d\n", count);
1587                        resetbtn_alarmtimer(NORMAL_INTERVAL, 0);
1588                        mode = 0;
1589#ifdef HAVE_UNFY
1590                        if (_count > UPGRADE_WAIT_COUNT) {
1591
1592                                char *upgrade_script = "firmware_upgrade.sh";
1593                                char call[32];
1594                                fprintf(stderr, "[RESETBUTTON] check:%d count:%d\n", pidof(upgrade_script), _count);
1595                                if (pidof(upgrade_script) < 0) {
1596                                        sprintf(call, "/%s/%s", nvram_safe_get("fw_upgrade_dir"), upgrade_script);
1597                                        if (f_exists(call)) {
1598                                                fprintf(stderr, "[RESETBUTTON] trigger update script: %s\n", call);
1599                                                system(call);
1600                                        } else {
1601                                                fprintf(stderr, "[RESETBUTTON] upgrade script not found\n");
1602                                                led_control(LED_DIAG, LED_OFF);
1603                                        }
1604                                }
1605                        }
1606#else
1607                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1608                                fprintf(stderr, "resetbutton: nothing to do...\n");
1609                                resetbtn_alarmtimer(0, 0);      /* Stop the timer alarm */
1610                                return;
1611                        }
1612#endif
1613                }
1614        }
1615}
1616
1617static int resetbutton_main(int argc, char *argv[])
1618{
1619        brand = getRouterBrand();
1620#ifndef HAVE_MI424WR
1621#if !defined(HAVE_NOP8670) && !defined(HAVE_TONZE)
1622        if (brand <= 0xffff && (brand & 0x000f) == 0x000f)
1623#endif
1624        {
1625                puts("sorry, your unit does not support resetbutton feature\n");
1626                return 0;
1627        }
1628#endif
1629#ifndef HAVE_NOP8670
1630#ifdef HAVE_MAGICBOX
1631        init_gpio();
1632#endif
1633        /*
1634         * Run it under background
1635         */
1636        switch (fork()) {
1637        case -1:
1638                DEBUG("can't fork\n");
1639                exit(0);
1640                break;
1641        case 0:
1642                /*
1643                 * child process
1644                 */
1645                DEBUG("fork ok\n");
1646                (void)setsid();
1647                break;
1648        default:
1649                /*
1650                 * parent process should just die
1651                 */
1652                _exit(0);
1653        }
1654
1655        /*
1656         * set the signal handler
1657         */
1658        signal(SIGALRM, resetbtn_period_check);
1659
1660        /*
1661         * set timer
1662         */
1663        resetbtn_alarmtimer(NORMAL_INTERVAL, 0);
1664
1665        /*
1666         * Most of time it goes to sleep
1667         */
1668        while (1)
1669                pause();
1670
1671        return 0;
1672#endif
1673}
1674
1675#undef DEBUG
Note: See TracBrowser for help on using the repository browser.