diff --git a/board/inteno/common/board.c b/board/inteno/common/board.c index bb63bab8a55f701c754d246950f79989300d6ad8..f8001aca5ca412503914712aa5b894e78b3d1d67 100644 --- a/board/inteno/common/board.c +++ b/board/inteno/common/board.c @@ -278,7 +278,7 @@ int board_late_init(void) #define RT2880_PRGIO_ADDR (RALINK_SYSCTL_BASE + 0x600) // Programmable I/O #define RT2880_REG_PIODIR (RT2880_PRGIO_ADDR + 0x00) #define RT2880_REG_PIODATA (RT2880_PRGIO_ADDR + 0x20) - +extern int first_press_check; static int do_rescue(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int opt; @@ -297,6 +297,7 @@ static int do_rescue(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1; } } + if (do_button){ //set GPIO18 as input, this is the factory default button RALINK_REG(RT2880_REG_PIODIR)&= ~(1<<18); //input mode @@ -309,11 +310,18 @@ static int do_rescue(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) set_led(LED_WPS, LED_STATE_ON); run_command("net_init",0); printf("Entering rescue mode\n"); + first_press_check = 1; run_command("httpd",0); return 0; } +int reset_button_is_pressed(void) +{ + RALINK_REG(RT2880_REG_PIODIR)&= ~(1<<18); //input mode + return (RALINK_REG(RT2880_REG_PIODATA) & 1<<18)?0:1; +} + U_BOOT_CMD( rescue, 2, 0, do_rescue, diff --git a/board/inteno/common/lwip_start.c b/board/inteno/common/lwip_start.c index 67da87a8089ed17c6237eabc4061caf8824b0402..ed99d103fce54747f593151e44f8bb6f587f4de8 100644 --- a/board/inteno/common/lwip_start.c +++ b/board/inteno/common/lwip_start.c @@ -18,8 +18,11 @@ #include "lwip_start.h" +#include "led.h" + u32_t sys_now(void); static void lwip_periodic_handle( void ); +extern int reset_button_is_pressed(); /* from net.h but its hard to include that one. here */ void net_init(void); @@ -31,6 +34,7 @@ void eth_halt(void); int eth_send(void *packet, int length); #define ETHERNET_MTU 1500 +#define GPIO_RESET_BUTTON 41 extern u8 net_ethaddr[6]; extern int lwip_redirect; @@ -42,11 +46,128 @@ struct netif netif; static int loop_active; static int delay_start; +enum reset_btn_status +{ + reset_btn_release, + reset_btn_hold, + reset_btn_handle +}; + +static int reset_btn_state = reset_btn_release; +static int reset_count = 0; +static int current_lit = 1; // switching sucessful change led +static int rec_pkt_cnt = 0; +static int null_pkt_cnt = 0; +int first_press_check = 0; // =0 null, =1 rec +#define REC_PACKET_INC() (rec_pkt_cnt++) +#define NULL_PACKET_INC() (null_pkt_cnt++) + + + u32_t sys_now(void) { //printf("%s not implemented\n",__func__); return 0; } +static void check_reset_button(int sleep_time) +{ + int btn = 0; + btn = reset_button_is_pressed(); + if(first_press_check) + { + if(!btn)//first enter button has released + { + first_press_check = 0; + } + return; + } + + if(reset_btn_state != reset_btn_release && sleep_time) + mdelay(sleep_time); + + if(reset_btn_state == reset_btn_release) + { + if(btn)//button is pressed + { + if(++reset_count > 5)//confirm btn pressed + { + reset_btn_state = reset_btn_hold; + reset_count = 0; + } + } + else + { + reset_count = 0; + } + } + else if(reset_btn_state == reset_btn_hold) + { + if(btn) + { + if(++reset_count > 5)//confirm btn pressed + { + reset_btn_state = reset_btn_handle; + reset_count = 0; + } + } + else + { + reset_btn_state = reset_btn_release; + reset_count = 0; + } + } + else if(reset_btn_state == reset_btn_handle) + { + if(!btn) + { + if(++reset_count > 5)//stay in button handle state for 5 times + { + int next_vol = 0; + unsigned long cur_vol = 0; + char *s; + char *fs_name[]={"rootfs_0","rootfs_1"}; + char *root_name="root_vol"; + //get current ubi_fs + s = getenv(root_name); + //switch ubi_fs + //next_vol = (strcmp(s,fs_name[0]))?0:1; + cur_vol = simple_strtoul(s + strlen("rootfs_"), NULL, 10); + next_vol = !cur_vol; + setenv(root_name,fs_name[next_vol]); + printf("bootfs set to %s volume\n",fs_name[next_vol]); + reset_btn_state = reset_btn_release; + reset_count = 0; + + if(current_lit) + set_led(LED_WPS, LED_STATE_OFF); + else + set_led(LED_WPS, LED_STATE_ON); + current_lit = !current_lit; + loop_active = 0; + } + + } + else + { + reset_count = 0; + } + } +} + +static void do_btn_handle(int tick_time) +{ + int need_check = 0; + if(null_pkt_cnt > tick_time) + { + check_reset_button(100); + null_pkt_cnt = 0; + } + else if(rec_pkt_cnt > tick_time) + { + check_reset_button(10); + rec_pkt_cnt = 0; + } +} /* called from net_process_received_packet() in net/net.c when a new packet is received. @@ -189,9 +310,12 @@ void lwip_break( int delay) } } +//set_led +//add a new feature to check pressbutton err_t lwip_loop( int timeout) { + int is_rec = 0; loop_active = 1; timeout_active = 0; delay_start = 0; @@ -209,8 +333,15 @@ err_t lwip_loop( int timeout) /* if something has been received process it */ if(eth_rx() > 0) { - lwip_periodic_handle(); - } + lwip_periodic_handle(); + //LOCK_BTN(); + REC_PACKET_INC(); + } + else + { + NULL_PACKET_INC(); + } + /* exit on ctrl-c */ if(ctrlc()){ printf("\nlwip stop. due to ctrlc\n\n"); @@ -218,7 +349,10 @@ err_t lwip_loop( int timeout) loop_active = 0; return ERR_IF; } - + + /*do reset button check*/ + //if(LOCK_VALID()) + do_btn_handle(100); /* do we have a delayed shutdown ? */ if(loop_active < 0){ if ((-1*loop_active) < get_timer(delay_start)){