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

Last change on this file since 17560 was 17560, checked in by eko, 22 months ago

wndr3400 radio on/off button gpio

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