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

Last change on this file since 18946 was 18946, checked in by eko, 14 months ago

Linksys E1550 support

File size: 24.9 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
22#define NORMAL_INTERVAL         1       /* second */
23#define URGENT_INTERVAL         100 * 1000      /* microsecond */
24
25#ifndef HAVE_GATEWORX           /* 1/10 second */
26#define GPIO_FILE               "/dev/gpio/in"
27#endif
28#if 0
29#define DEBUG printf
30#else
31#define DEBUG(format, args...)
32#endif
33
34#ifdef HAVE_MAGICBOX
35#include <sys/mman.h>
36
37#define GPIO0_OR   0x0700       /* rw, output */
38#define GPIO0_TCR  0x0704       /* rw, three-state control */
39#define GPIO0_ODR  0x0718       /* rw, open drain */
40#define GPIO0_IR   0x071c       /* ro, input */
41#define GPIO0_BASE 0xef600000   /* page */
42
43#define GPIO_LED    0x20000000  /* GPIO1 */
44#define GPIO_BUTTON 0x40000000  /* GPIO2 */
45
46#define REG(buf, offset) ((unsigned int *)((void *)buf + offset))
47
48static unsigned int *page;
49static int fd;
50
51void init_gpio()
52{
53        void *start = 0;
54
55        fd = open("/dev/mem", O_RDWR);
56        if (fd < 0) {
57                // dd_syslog(LOG_ERR, "Can't open /dev/mem: %s", strerror(errno));
58                exit(1);
59        }
60
61        page = mmap(start, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
62                    (off_t) GPIO0_BASE);
63        if (page == MAP_FAILED) {
64                // dd_syslog(LOG_ERR, "Can't mmap GPIO memory space: %s",
65                // strerror(errno));
66                exit(1);
67        }
68
69        /*
70         * disable
71         */
72        *REG(page, GPIO0_TCR) &= ~(GPIO_LED | GPIO_BUTTON);
73        /*
74         * enable led
75         */
76        *REG(page, GPIO0_TCR) |= GPIO_LED | GPIO_BUTTON;
77        /*
78         * enable/disable(?) button
79         */
80        *REG(page, GPIO0_TCR) &= ~GPIO_BUTTON;
81
82        *REG(page, GPIO0_IR) & GPIO_BUTTON;
83        *REG(page, GPIO0_IR) & GPIO_BUTTON;
84
85}
86
87int getbuttonstate()
88{
89        return (*REG(page, GPIO0_IR) & GPIO_BUTTON) == 0;
90
91}
92#endif
93
94#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)
95int getbuttonstate()
96{
97#if defined(HAVE_EAP3660) || defined(HAVE_EOC2610) || defined(HAVE_EOC1650) || defined(HAVE_ECB3500)
98        int ret = get_gpio(5);
99        return 1 - ret;
100#elif defined(HAVE_WRT54G2)
101        int ret = get_gpio(7);
102        return 1 - ret;
103#elif defined(HAVE_RTG32)
104        int ret = get_gpio(6);
105        return ret;
106#elif defined(HAVE_EOC5610)
107        int ret = get_gpio(6);
108        return 1 - ret;
109#elif HAVE_WP54G
110        int ret = get_gpio(4);
111        return ret;
112#elif HAVE_NP28G
113        int ret = get_gpio(4);
114        return ret;
115#elif HAVE_WPE53G
116        int ret = get_gpio(6);
117        return ret;
118#elif HAVE_NP25G
119        int ret = get_gpio(4);
120        return ret;
121#elif HAVE_OPENRISC
122        int ret = get_gpio(0);
123        return ret;
124#else
125        int ret = get_gpio(6);
126        return ret;
127#endif
128}
129#elif defined(HAVE_UBNTM)
130int getbuttonstate()
131{
132        int ret = get_gpio(12);
133
134        if (ret == 0)
135                return 1;
136        return 0;
137}
138#elif defined(HAVE_DIR825C1)
139int getbuttonstate()
140{
141        int ret = get_gpio(17);
142
143        if (ret == 0)
144                return 1;
145        return 0;
146}
147#elif defined(HAVE_WASP)
148int getbuttonstate()
149{
150        int ret = get_gpio(12);
151
152        if (ret == 0)
153                return 1;
154        return 0;
155}
156#elif defined(HAVE_HORNET)
157int getbuttonstate()
158{
159        int ret = get_gpio(12);
160
161        if (ret == 0)
162                return 1;
163        return 0;
164}
165#elif defined(HAVE_WNR2200)
166int getbuttonstate()
167{
168        int ret = get_gpio(38);
169
170        if (ret == 0)
171                return 1;
172        return 0;
173}
174#elif defined(HAVE_WNR2000)
175int getbuttonstate()
176{
177        int ret = get_gpio(40);
178
179        if (ret == 0)
180                return 1;
181        return 0;
182}
183#elif defined(HAVE_WHRHPGN)
184int getbuttonstate()
185{
186        int ret = get_gpio(11);
187
188        if (ret == 0)
189                return 1;
190        return 0;
191}
192#elif defined(HAVE_DIR615E)
193int getbuttonstate()
194{
195        int ret = get_gpio(8);
196        if (ret == 0)
197                return 1;
198        return 0;
199}
200#elif defined(HAVE_WNDR3700)
201int getbuttonstate()
202{
203        int ret = get_gpio(8);
204
205        if (ret == 0)
206                return 1;
207        return 0;
208}
209#elif defined(HAVE_DIR825)
210int getbuttonstate()
211{
212        int ret = get_gpio(3);
213
214        if (ret == 0)
215                return 1;
216        return 0;
217}
218#elif defined(HAVE_WRT400)
219int getbuttonstate()
220{
221        int ret = get_gpio(8);
222
223        if (ret == 0)
224                return 1;
225        return 0;
226}
227#elif defined(HAVE_WRT160NL)
228int getbuttonstate()
229{
230        int ret = get_gpio(21);
231
232        if (ret == 0)
233                return 1;
234        return 0;
235}
236#elif defined(HAVE_TG2521)
237int getbuttonstate()
238{
239        int ret = get_gpio(21);
240
241        if (ret == 0)
242                return 1;
243        return 0;
244}
245#elif defined(HAVE_TG1523)
246int getbuttonstate()
247{
248        int ret = get_gpio(0);
249
250        if (ret == 0)
251                return 1;
252        return 0;
253}
254#elif defined(HAVE_WR941)
255int getbuttonstate()
256{
257        int ret = get_gpio(3);
258
259        if (ret == 0)
260                return 1;
261        return 0;
262}
263#elif defined(HAVE_WR741V4)
264int getbuttonstate()
265{
266        int ret = get_gpio(11);
267
268        return ret;
269}
270#elif defined(HAVE_WR741)
271int getbuttonstate()
272{
273        int ret = get_gpio(11);
274
275        if (ret == 0)
276                return 1;
277        return 0;
278}
279#elif defined(HAVE_WR1043)
280int getbuttonstate()
281{
282        int ret = get_gpio(3);
283
284        if (ret == 0)
285                return 1;
286        return 0;
287}
288#elif defined(HAVE_WZRG300NH2)
289int getbuttonstate()
290{
291        int ret = get_gpio(1);  // nxp multiplexer connected
292
293        if (ret == 0)
294                return 1;
295        return 0;
296}
297#elif defined(HAVE_WZRG450)
298int getbuttonstate()
299{
300        int ret = get_gpio(6);  // nxp multiplexer connected
301
302        if (ret == 0)
303                return 1;
304        return 0;
305}
306#elif defined(HAVE_DIR632)
307int getbuttonstate()
308{
309        int ret = get_gpio(8);  // nxp multiplexer connected
310
311        if (ret == 0)
312                return 1;
313        return 0;
314}
315#elif defined(HAVE_WZRG300NH)
316int getbuttonstate()
317{
318        int ret = get_gpio(24); // nxp multiplexer connected
319
320        if (ret == 0)
321                return 1;
322        return 0;
323}
324#elif defined(HAVE_WZRHPAG300NH)
325int getbuttonstate()
326{
327        int ret = get_gpio(11);
328
329        if (ret == 0)
330                return 1;
331        return 0;
332}
333#elif defined(HAVE_TEW632BRP)
334int getbuttonstate()
335{
336        int ret = get_gpio(21);
337
338        if (ret == 0)
339                return 1;
340        return 0;
341}
342#elif defined(HAVE_JA76PF)
343int getbuttonstate()
344{
345        int ret = get_gpio(11);
346
347        if (ret == 0)
348                return 1;
349        return 0;
350}
351#elif defined(HAVE_ALFAAP94)
352int getbuttonstate()
353{
354        int ret = get_gpio(11);
355
356        if (ret == 0)
357                return 1;
358        return 0;
359}
360#elif defined(HAVE_JWAP003)
361int getbuttonstate()
362{
363        int ret = get_gpio(11);
364
365        if (ret == 0)
366                return 1;
367        return 0;
368}
369#elif defined(HAVE_LSX)
370int getbuttonstate()
371{
372        int ret = get_gpio(8);
373
374        if (ret == 0)
375                return 1;
376        return 0;
377}
378#elif defined(HAVE_WMBR_G300NH)
379int getbuttonstate()
380{
381        int ret = get_gpio(37);
382
383        if (ret == 0)
384                return 1;
385        return 0;
386}
387#elif defined(HAVE_VF803)
388int getbuttonstate()
389{
390        int ret = get_gpio(28);
391
392        if (ret == 0)
393                return 1;
394        return 0;
395}
396#elif defined(HAVE_SX763)
397int getbuttonstate()
398{
399        int ret = get_gpio(14);
400
401        return 0;
402}
403#endif
404#if defined(HAVE_GATEWORX) || defined (HAVE_STORM)
405
406#include <linux/mii.h>
407#include <linux/sockios.h>
408#include <net/if.h>
409#include <arpa/inet.h>
410#include <sys/socket.h>
411#include <linux/sockios.h>
412#include <linux/mii.h>
413#define u8 unsigned char
414#define u32 unsigned long
415
416#define GPIO_GET_BIT    0x0000001
417#define GPIO_SET_BIT    0x0000005
418#define GPIO_GET_CONFIG 0x0000003
419#define GPIO_SET_CONFIG 0x0000004
420
421#define IXP4XX_GPIO_OUT                 0x1
422#define IXP4XX_GPIO_IN                  0x2
423
424struct gpio_bit {
425        unsigned char bit;
426        unsigned char state;
427};
428
429char *filename = "/dev/gpio";
430
431int read_bit(int bit)
432{
433        int file;
434        struct gpio_bit _bit;
435
436        /*
437         * open device
438         */
439        if ((file = open(filename, O_RDONLY)) == -1) {
440                /*
441                 * ERROR HANDLING; you can check errno to see what went wrong
442                 */
443                return 1;
444        }
445
446        /*
447         * Config pin as input
448         */
449        _bit.bit = bit;
450        _bit.state = IXP4XX_GPIO_IN;
451        if (ioctl(file, GPIO_SET_CONFIG, (unsigned long)&_bit) < 0) {
452                /*
453                 * ERROR HANDLING; you can check errno to see what went wrong
454                 */
455                return 1;
456        }
457
458        /*
459         * Read data
460         */
461        _bit.bit = bit;
462        if (ioctl(file, GPIO_GET_BIT, (unsigned long)&_bit) < 0) {
463                /*
464                 * ERROR HANDLING; you can check errno to see what went wrong
465                 */
466                return 1;
467        }
468
469        close(file);
470        return _bit.state;
471}
472
473int isCompex(void)
474{
475        static int compex = -1;
476
477        if (compex != -1)
478                return compex;
479        char filename2[64];
480
481        sprintf(filename2, "/dev/mtdblock/%d", getMTD("RedBoot"));
482        FILE *file = fopen(filename2, "r");
483
484        if (file) {
485                fseek(file, 0x1f800, SEEK_SET);
486                unsigned int signature;
487
488                fread(&signature, 4, 1, file);
489                if (signature == 0x20021103) {
490                        compex = 1;
491                } else {
492                        compex = 0;
493                }
494                fclose(file);
495        }
496        return compex;
497}
498
499int isGW2369(void)
500{
501
502        int brand = getRouterBrand();
503        if (brand == ROUTER_BOARD_GATEWORX_GW2369)
504                return 1;
505        return 0;
506}
507
508int isGW2350(void)
509{
510        if (nvram_match("DD_BOARD", "Gateworks Cambria GW2350")
511            || nvram_match("DD_BOARD2", "Gateworks Cambria GW2350"))
512                return 1;
513        return 0;
514}
515
516int getbuttonstate()
517{
518        FILE *in;
519        int ret;
520
521#ifdef HAVE_STORM
522        ret = read_bit(60);
523#elif HAVE_WG302V1
524        ret = read_bit(13);
525#elif HAVE_WG302
526        ret = read_bit(3);
527#elif HAVE_MI424WR
528        ret = read_bit(10);
529#elif HAVE_USR8200
530        ret = read_bit(12);
531#elif HAVE_CAMBRIA
532        if (isGW2350())
533                ret = read_bit(4);
534        else
535                ret = read_bit(20);
536#else
537        if (isCompex())
538                ret = read_bit(0);
539        if (isGW2369())
540                ret = read_bit(3);
541        else
542                ret = read_bit(4);
543#endif
544#ifdef HAVE_TONZE
545        return ret == 0 ? 0 : 1;
546#else
547        return ret == 0 ? 1 : 0;
548#endif
549}
550#endif
551
552static int mode = 0;            /* mode 1 : pushed */
553static int ses_mode = 0;        /* mode 1 : pushed */
554static int count = 0;
555
556#ifdef HAVE_RADIOOFF
557static int initses = 1;
558#endif
559
560static int brand;
561
562static void alarmtimer(unsigned long sec, unsigned long usec)
563{
564        struct itimerval itv;
565
566        itv.it_value.tv_sec = sec;
567        itv.it_value.tv_usec = usec;
568
569        itv.it_interval = itv.it_value;
570        setitimer(ITIMER_REAL, &itv, NULL);
571}
572
573int endswith(char *str, char *cmp)
574{
575        int cmp_len, str_len, i;
576
577        cmp_len = strlen(cmp);
578        str_len = strlen(str);
579        if (cmp_len > str_len)
580                return (0);
581        for (i = 0; i < cmp_len; i++) {
582                if (str[(str_len - 1) - i] != cmp[(cmp_len - 1) - i])
583                        return (0);
584        }
585        return (1);
586}
587
588void runStartup(char *folder, char *extension)
589{
590        struct dirent *entry;
591        DIR *directory;
592
593        directory = opendir(folder);
594        if (directory == NULL) {
595                return;
596        }
597        // list all files in this directory
598        while ((entry = readdir(directory)) != NULL) {
599                if (endswith(entry->d_name, extension)) {
600                        sysprintf("%s/%s&\n", folder, entry->d_name);
601                }
602        }
603        closedir(directory);
604}
605
606/*
607 * void system_reboot(void) { DEBUG("resetbutton: reboot\n"); alarmtimer(0,
608 * 0); eval("reboot"); }
609 */
610
611void service_restart(void)
612{
613        DEBUG("resetbutton: restart\n");
614        /*
615         * Stop the timer alarm
616         */
617        alarmtimer(0, 0);
618        /*
619         * Reset the Diagnostic LED
620         */
621        diag_led(DIAG, START_LED);      /* call from service.c */
622        /*
623         * Restart all of services
624         */
625        eval("rc", "restart");
626}
627
628void period_check(int sig)
629{
630        FILE *fp;
631        unsigned int val = 0;
632
633#ifdef HAVE_RADIOOFF
634        if (initses == 1 && nvram_match("radiooff_boot_off", "1")
635            && nvram_match("radiooff_button", "1")) {
636                ses_mode = 1;
637                initses = 0;
638        }
639#endif
640
641        // time_t t;
642
643        // time(&t);
644        // DEBUG("resetbutton: now time=%d\n", t);
645
646#if 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)
647        val = getbuttonstate();
648#ifdef HAVE_WRK54G
649        if (val)
650                val = 0;
651        else
652                val = 1;
653#endif
654#ifndef HAVE_ALPHA
655#ifdef HAVE_USR5453
656        if (val)
657                val = 0;
658        else
659                val = 1;
660#endif
661#endif
662
663#else
664        if (brand == ROUTER_BOARD_WCRGN) {
665                val = get_gpio(10) << 10;
666        } else if (brand == ROUTER_BOARD_WHRG300N) {
667                val = get_gpio(10) << 10;
668        } else if (brand == ROUTER_BOARD_ECB9750) {
669                val = get_gpio(11) << 11;
670        } else if (brand == ROUTER_BOARD_NEPTUNE) {
671                val = get_gpio(10) << 10;
672        } else if (brand == ROUTER_BOARD_RT3352) {
673                val = get_gpio(10) << 10;
674        } else if (brand == ROUTER_BOARD_WR5422) {
675                val = get_gpio(10) << 10;
676        } else if (brand == ROUTER_BOARD_DIR600B) {
677                val = get_gpio(10) << 10;
678        } else if (brand == ROUTER_BOARD_F5D8235) {
679                val = get_gpio(10) << 10;
680        } else if (brand == ROUTER_ASUS_RTN10PLUS) {
681                val = get_gpio(10) << 10;
682        } else if (brand == ROUTER_BOARD_RT15N) {
683                val = get_gpio(12) << 12;
684        } else if (brand == ROUTER_BOARD_DIR615D) {
685                val = get_gpio(10) << 10;
686        } else if (brand == ROUTER_BOARD_ESR6650) {
687                val = get_gpio(10) << 10;
688        } else if (brand == ROUTER_BOARD_EAP9550) {
689                val = get_gpio(0);
690        } else if (brand == ROUTER_BOARD_ESR9752) {
691                val = get_gpio(0);
692        } else if (brand == ROUTER_BOARD_AR670W) {
693                val = get_gpio(9) << 9;
694        } else if (brand == ROUTER_BOARD_AR690W) {
695                val = get_gpio(9) << 9;
696        } else if (brand == ROUTER_BOARD_BR6574N) {
697                val = get_gpio(10) << 10;
698        } else if (brand == ROUTER_BOARD_ACXNR22) {
699                val = get_gpio(10) << 10;
700        } else if (brand == ROUTER_BOARD_TECHNAXX3G) {
701                val = get_gpio(10) << 10;
702        } else if (brand == ROUTER_BOARD_W502U) {
703                val = get_gpio(10) << 10;
704        } else {
705
706                if ((fp = fopen(GPIO_FILE, "r"))) {
707#ifdef HAVE_XSCALE
708                        fscanf(fp, "%d", &val);
709#else
710                        if (brand == ROUTER_NETGEAR_WGR614L)    //gpio 7 power led shared with reset button
711                        {
712                                set_gpio(7, 1); //disable power led
713                                val = get_gpio(7) << 7; //read and shift value
714                                set_gpio(7, 0); //enable power led
715                        } else {
716                                fread(&val, 4, 1, fp);
717                        }
718
719#endif
720                        fclose(fp);
721                } else
722                        perror(GPIO_FILE);
723        }
724#endif
725        DEBUG("resetbutton: GPIO = 0x%x\n", val);
726
727        int gpio = 0;
728
729        int state = 0;
730
731#if defined(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)
732        state = val;
733        int sesgpio = 0xfff;
734        int push;
735#ifdef HAVE_WZRG300NH
736        sesgpio = 0x117;
737        val |= get_gpio(23) << 23;      //aoss pushbutton
738#elif defined(HAVE_NEPTUNE)
739        sesgpio = 0x100;
740        val |= get_gpio(0);     //aoss pushbutton
741#elif defined(HAVE_WCRGN)
742        sesgpio = 0x100;
743        val |= get_gpio(0);     //aoss pushbutton
744#elif defined(HAVE_RT3352)
745        sesgpio = 0x100;
746        val |= get_gpio(0);     //aoss pushbutton
747#elif defined(HAVE_WZRG300NH2)
748        sesgpio = 0x10c;
749        val |= get_gpio(12) << 12;      //aoss pushbutton
750#elif defined(HAVE_WMBR_G300NH)
751        sesgpio = 0x100;
752        val |= get_gpio(0);     //aoss pushbutton
753#elif defined(HAVE_WZRG450)
754        sesgpio = 0x108;
755        val |= get_gpio(8) << 8;        //aoss pushbutton
756#elif defined(HAVE_DIR632)
757        sesgpio = 0x10c;
758        val |= get_gpio(12) << 12;      //aoss pushbutton
759#elif defined(HAVE_WZRHPAG300NH)
760        sesgpio = 0x105;
761        val |= get_gpio(5) << 5;        //aoss pushbutton
762#elif defined(HAVE_HORNET)
763        sesgpio = 0x00b;
764        val |= get_gpio(11) << 11;      //aoss pushbutton
765#elif defined(HAVE_DIR825C1)
766        sesgpio = 0x110;
767        val |= get_gpio(16) << 16;      //aoss pushbutton
768#elif defined(HAVE_WASP)
769        sesgpio = 0x00b;
770        val |= get_gpio(11) << 11;      //aoss pushbutton
771#elif defined(HAVE_WNR2200)
772//      sesgpio = 0x00b; //not yet supported
773//      val |= get_gpio(37) << 37;      //aoss pushbutton
774#elif defined(HAVE_WNR2000)
775        sesgpio = 0x00b;
776        val |= get_gpio(11) << 11;      //aoss pushbutton
777#elif defined(HAVE_WHRHPGN)
778        sesgpio = 0x10c;
779        val |= get_gpio(12) << 12;      //aoss pushbutton
780#elif defined(HAVE_RT10N)
781        sesgpio = 0x100;
782        val |= get_gpio(0);     //aoss pushbutton
783#elif defined(HAVE_RT15N)
784        sesgpio = 0x100;
785        val |= get_gpio(0);     //aoss pushbutton
786#elif defined(HAVE_F5D8235)
787        sesgpio = 0x100;
788        val |= get_gpio(0);     //aoss pushbutton
789#elif defined(HAVE_WR5422)
790        sesgpio = 0x100;
791        val |= get_gpio(0);     //aoss pushbutton
792#elif defined(HAVE_DIR600)
793        sesgpio = 0x100;
794        val |= get_gpio(0);     //aoss pushbutton
795#elif defined(HAVE_DIR615E)
796        sesgpio = 0x10c;
797        val |= get_gpio(12) << 12;      //aoss pushbutton
798#elif defined(HAVE_WR1043)
799        sesgpio = 0x107;
800        val |= get_gpio(7) << 7;        //aoss pushbutton
801#elif defined(HAVE_WR941)
802        sesgpio = 0x107;
803        val |= get_gpio(7) << 7;        //aoss pushbutton
804#elif defined(HAVE_WR741V4)
805        sesgpio = 0x01a;
806        val |= get_gpio(26) << 26;      //aoss pushbutton
807#elif defined(HAVE_WR741)
808        sesgpio = 0x10c;
809        val |= get_gpio(12) << 12;      //aoss pushbutton
810#elif defined(HAVE_WRT400)
811        sesgpio = 0x103;
812        val |= get_gpio(3) << 3;        //aoss pushbutton
813#elif defined(HAVE_WNDR3700)
814        sesgpio = 0x103;
815        val |= get_gpio(3) << 3;        //aoss pushbutton
816#elif defined(HAVE_DIR825)
817        sesgpio = 0x108;
818        val |= get_gpio(8) << 8;        //aoss pushbutton
819#elif defined(HAVE_TG2521)
820        sesgpio = 0x10c;
821        val |= get_gpio(12) << 12;      //aoss pushbutton
822#elif defined(HAVE_OPENRISC)
823        sesgpio = 0x005;
824        val |= get_gpio(5) << 5;        //aoss pushbutton
825#endif
826#ifdef HAVE_WRT160NL
827        sesgpio = 0x107;
828        val |= get_gpio(7) << 7;        //wps/ses pushbutton
829#endif
830#ifdef HAVE_TEW632BRP
831        sesgpio = 0x10c;
832        val |= get_gpio(12) << 12;      //wps/ses pushbutton
833#endif
834#else
835        if (brand > 0xffff) {
836                if ((brand & 0x000ff) != 0x000ff)
837                        gpio = 1 << (brand & 0x000ff);  // calculate gpio value.
838
839                if ((brand & 0x00100) == 0)     // check reset button polarity: 0
840                        // normal, 1 inversed
841                        state = (val & gpio);
842                else
843                        state = !(val & gpio);
844        } else {
845
846                if ((brand & 0x000f) != 0x000f)
847                        gpio = 1 << (brand & 0x000f);   // calculate gpio value.
848
849                if ((brand & 0x0010) == 0)      // check reset button polarity: 0
850                        // normal, 1 inversed
851                        state = (val & gpio);
852                else
853                        state = !(val & gpio);
854        }
855        /*
856         * 1 byte router's SES (AOSS) button gpio number and polarity; Eko
857         * 25.nov.06
858         *
859         * R R R P N N N N = 0xXX ----- - ------- | | gpio num | | | |--- SES -
860         * AOSS button polarity (0: normal, 1 inversed) | |-------- reserved for
861         * future use
862         *
863         * 0xff = button disabled / not available
864         */
865        int push;
866        int sesgpio;
867
868        switch (brand) {
869        case ROUTER_BUFFALO_WHRG54S:
870        case ROUTER_BUFFALO_WZRRSG54:
871        case ROUTER_BUFFALO_WLI_TX4_G54HP:
872        case ROUTER_ASUS_RTN12:
873        case ROUTER_NETGEAR_WNR2000V2:
874                sesgpio = 0x100;        // gpio 0, inversed
875                break;
876        case ROUTER_BUFFALO_WLA2G54C:
877        case ROUTER_ASUS_RTN10:
878                sesgpio = 0x102;        // gpio 2, inversed
879                break;
880        case ROUTER_BUFFALO_WBR2G54S:
881        case ROUTER_ASUS_WL700GE:
882                sesgpio = 0x004;        // gpio 4, normal
883                break;
884#ifndef HAVE_BUFFALO
885        case ROUTER_LINKSYS_WTR54GS:
886        case ROUTER_NETGEAR_WNDR4000:
887                sesgpio = 0x102;        // gpio 2, inversed
888                break;
889        case ROUTER_WRT54G:
890        case ROUTER_WRT54G_V8:
891        case ROUTER_WRTSL54GS:
892        case ROUTER_WRT150N:
893        case ROUTER_WRT160N:
894        case ROUTER_WRT300N:
895        case ROUTER_WRT300NV11:
896        case ROUTER_WRT610NV2:
897        case ROUTER_ASKEY_RT220XD:      // not soldered
898        case ROUTER_DYNEX_DX_NRUTER:
899        case ROUTER_LINKSYS_E4200:
900        case ROUTER_ASUS_RTN66:
901                sesgpio = 0x104;        // gpio 4, inversed
902                break;
903        case ROUTER_ASUS_WL500G_PRE:
904                sesgpio = 0x004;        // gpio 4, normal
905                break;
906        case ROUTER_ASUS_WL550GE:
907                sesgpio = 0x00f;        // gpio 15, normal
908                break;
909        case ROUTER_WRT310N:
910        case ROUTER_WRT350N:
911        case ROUTER_WRT610N:
912        case ROUTER_ASUS_RTN16:
913        case ROUTER_BELKIN_F7D3301:
914        case ROUTER_BELKIN_F7D3302:
915        case ROUTER_BELKIN_F7D4301:
916        case ROUTER_BELKIN_F7D4302:
917        case ROUTER_BELKIN_F5D8235V3:
918        case ROUTER_LINKSYS_E3200:
919                sesgpio = 0x108;        // gpio 8, inversed
920                break;
921        case ROUTER_ASUS_WL500W:
922                sesgpio = 0x007;        // gpio 7, normal
923                break;
924        case ROUTER_DLINK_DIR330:
925                sesgpio = 0x107;        // gpio 7, inversed
926                break;
927        case ROUTER_ASUS_WL520GUGC:
928        case ROUTER_ASUS_WL500G_PRE_V2:
929                sesgpio = 0x103;        // gpio 3, inversed
930                break;
931        case ROUTER_WAP54G_V3:
932                sesgpio = 0x10e;        // gpio 14, inversed
933                break;
934        case ROUTER_NETGEAR_WNDR3300:
935                sesgpio = 0x101;        // gpio 1, inversed
936                break;
937        case ROUTER_WRT54G_V81:
938        case ROUTER_DLINK_DIR320:
939        case ROUTER_WRT600N:
940        case ROUTER_NETGEAR_WNDR3400:
941        case ROUTER_NETGEAR_WNR3500L:
942                sesgpio = 0x106;        // gpio 6, inversed
943                break;
944        case ROUTER_WRT320N:
945        case ROUTER_WRT160NV3:
946        case ROUTER_WRT310NV2:
947                sesgpio = 0x105;        // gpio 5, inversed
948                break;
949        case ROUTER_LINKSYS_E900:
950        case ROUTER_LINKSYS_E1000V2:
951        case ROUTER_LINKSYS_E1500:
952        case ROUTER_LINKSYS_E1550:
953        case ROUTER_LINKSYS_E2500:
954                sesgpio = 0x109;        // gpio 9, inversed
955                break; 
956
957#endif
958        default:
959                sesgpio = 0xfff;        // gpio unknown, disabled
960        }
961#endif
962
963        push = 1 << (sesgpio & 0x0ff);  // calculate push value from ses gpio
964        //
965        //
966        //
967        // pin no.
968
969        /*
970         * The value is zero during button-pushed.
971         */
972        if (state && nvram_match("resetbutton_enable", "1")) {
973                DEBUG("resetbutton: mode=%d, count=%d\n", mode, count);
974
975                if (mode == 0) {
976                        /*
977                         * We detect button pushed first time
978                         */
979                        alarmtimer(0, URGENT_INTERVAL);
980                        mode = 1;
981                }
982                {               /* Whenever it is pushed steady */
983                        if (++count > RESET_WAIT_COUNT) {
984                                if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
985                                        fprintf(stderr,
986                                                "resetbutton: nothing to do...\n");
987                                        alarmtimer(0, 0);       /* Stop the timer alarm */
988                                        return;
989                                }
990                                if ((brand & 0x000f) != 0x000f) {
991                                        printf
992                                            ("resetbutton: factory default.\n");
993                                        dd_syslog(LOG_DEBUG,
994                                                  "Reset button: restoring factory defaults now!\n");
995#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)
996                                        led_control(LED_DIAG, LED_ON);
997#elif defined(HAVE_WHRHPGN)  || defined(HAVE_WZRG300NH) || defined(HAVE_WZRHPAG300NH) || defined(HAVE_WZRG450)
998                                        led_control(LED_DIAG, LED_ON);
999#endif
1000                                        ACTION("ACT_HW_RESTORE");
1001                                        alarmtimer(0, 0);       /* Stop the timer alarm */
1002#ifdef HAVE_X86
1003                                        eval("mount", "/usr/local", "-o",
1004                                             "remount,rw");
1005                                        eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
1006                                        // database
1007                                        eval("rm", "-f", "/tmp/nvram/.lock");   // delete
1008                                        // nvram
1009                                        // database
1010                                        eval("rm", "-f", "/usr/local/nvram/*"); // delete
1011                                        // nvram
1012                                        // database
1013                                        eval("mount", "/usr/local", "-o",
1014                                             "remount,ro");
1015#elif HAVE_RB500
1016                                        eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
1017                                        // database
1018                                        eval("rm", "-f", "/tmp/nvram/.lock");   // delete
1019                                        // nvram
1020                                        // database
1021                                        eval("rm", "-f", "/etc/nvram/*");       // delete nvram
1022                                        // database
1023#elif HAVE_MAGICBOX
1024                                        eval("rm", "-f", "/tmp/nvram/*");       // delete nvram
1025                                        // database
1026                                        eval("rm", "-f", "/tmp/nvram/.lock");   // delete
1027                                        // nvram
1028                                        // database
1029                                        eval("erase", "nvram");
1030#else
1031                                        nvram_set("sv_restore_defaults", "1");
1032                                        nvram_commit();
1033                                        eval("killall", "ledtool");     // stop blinking on
1034                                        // nvram_commit
1035#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)
1036                                        led_control(LED_DIAG, LED_ON);  // turn diag led on,
1037                                        // so we know reset
1038                                        // was pressed and
1039                                        // we're restoring
1040                                        // defaults.
1041#elif defined(HAVE_WHRHPGN) || defined(HAVE_WZRG300NH) || defined(HAVE_WZRHPAG300NH) || defined(HAVE_WZRG450)
1042                                        led_control(LED_DIAG, LED_ON);
1043#endif
1044
1045                                        eval("erase", "nvram");
1046#endif
1047
1048                                        // nvram_set ("sv_restore_defaults", "1");
1049                                        // nvram_commit ();
1050
1051                                        kill(1, SIGTERM);
1052                                }
1053                        }
1054                }
1055        } else if ((sesgpio != 0xfff)
1056                   && (((sesgpio & 0x100) == 0 && (val & push))
1057                       || ((sesgpio & 0x100) == 0x100 && !(val & push)))) {
1058                runStartup("/etc/config", ".sesbutton");
1059                runStartup("/jffs/etc/config", ".sesbutton");   // if available
1060                runStartup("/mmc/etc/config", ".sesbutton");    // if available
1061                runStartup("/tmp/etc/config", ".sesbutton");    // if available
1062                if (nvram_match("radiooff_button", "1")) {
1063                        led_control(LED_SES, LED_FLASH);        // when pressed, blink white
1064                        if (ses_mode == 1) {
1065                                // SES (AOSS) led
1066#ifdef HAVE_RADIOOFF
1067#ifndef HAVE_BUFFALO
1068                                dd_syslog(LOG_DEBUG,
1069                                          "SES / AOSS / EZ-setup button: turning radio(s) on\n");
1070#else
1071                                dd_syslog(LOG_DEBUG,
1072                                          "AOSS button: turning radio(s) on\n");
1073#endif
1074#ifndef HAVE_ERC
1075                                sysprintf("startservice radio_on");
1076#endif
1077#endif
1078
1079                                ses_mode = 0;
1080
1081                        } else if (ses_mode == 0) {
1082                                // (AOSS) led
1083#ifdef HAVE_RADIOOFF
1084#ifndef HAVE_BUFFALO
1085                                dd_syslog(LOG_DEBUG,
1086                                          "SES / AOSS / EZ-setup button: turning radio(s) off\n");
1087#else
1088                                dd_syslog(LOG_DEBUG,
1089                                          "AOSS button: turning radio(s) off\n");
1090#endif
1091#ifndef HAVE_ERC
1092                                sysprintf("startservice radio_off");
1093#endif
1094#endif
1095
1096                                ses_mode = 1;
1097                        }
1098                }
1099#ifdef HAVE_AOSS
1100                else if (nvram_match("radiooff_button", "2")) {
1101                        sysprintf("startservice aoss");
1102                }
1103#else
1104#endif
1105
1106        } else {
1107
1108                /*
1109                 * Although it's unpushed now, it had ever been pushed
1110                 */
1111                if (mode == 1) {
1112                        if (check_action() != ACT_IDLE) {       // Don't execute during upgrading
1113                                fprintf(stderr,
1114                                        "resetbutton: nothing to do...\n");
1115                                alarmtimer(0, 0);       /* Stop the timer alarm */
1116                                return;
1117                        }
1118                        service_restart();
1119                }
1120        }
1121}
1122
1123int main(int argc, char *argv[])
1124{
1125        brand = getRouterBrand();
1126#ifndef HAVE_MI424WR
1127#if !defined(HAVE_NOP8670) && !defined(HAVE_TONZE)
1128        if ((brand & 0x000f) == 0x000f)
1129#endif
1130        {
1131                puts("sorry, your unit does not support resetbutton feature\n");
1132                return 0;
1133        }
1134#endif
1135#ifndef HAVE_NOP8670
1136#ifdef HAVE_MAGICBOX
1137        init_gpio();
1138#endif
1139        /*
1140         * Run it under background
1141         */
1142        switch (fork()) {
1143        case -1:
1144                DEBUG("can't fork\n");
1145                exit(0);
1146                break;
1147        case 0:
1148                /*
1149                 * child process
1150                 */
1151                DEBUG("fork ok\n");
1152                (void)setsid();
1153                break;
1154        default:
1155                /*
1156                 * parent process should just die
1157                 */
1158                _exit(0);
1159        }
1160
1161        /*
1162         * set the signal handler
1163         */
1164        signal(SIGALRM, period_check);
1165
1166        /*
1167         * set timer
1168         */
1169        alarmtimer(NORMAL_INTERVAL, 0);
1170
1171        /*
1172         * Most of time it goes to sleep
1173         */
1174        while (1)
1175                pause();
1176
1177        return 0;
1178#endif
1179}
Note: See TracBrowser for help on using the repository browser.