int check_uart_input(void) { int c = 0; if(uboot_spare_head.boot_data.work_mode != WORK_MODE_BOOT) { return 0; } if(tstc()) { c = getc(); printf("0x%x\n", c); } else { puts("no key input\n"); } if(c == '2') { return -1; } else if(c == '3') { sunxi_key_init(); do_key_test(NULL, 0, 1, NULL); } else if(c == 's') //shell mode { gd->force_shell = 1; gd->debug_mode = 1; } return 0; }
int check_update_key(void) { int ret; int fel_key_max; int power_plug_count = 0; int new_power_status = 0; int old_power_status = 0; int time_tick = 0 ; int fel_key_mode = 0; int user_mode_used = 0; gd->key_pressd_value = 0; if(uboot_spare_head.boot_data.work_mode != WORK_MODE_BOOT) { return 0; } old_power_status = axp_probe_power_source(); sunxi_key_init(); //detect user_mode exist script_parser_fetch("platform", "user_mode_used", &user_mode_used, 1); if(user_mode_used) { printf("user_mode found\n"); fel_key_mode = 2; } //detect fel_key exist else { ret = script_parser_fetch("fel_key", "fel_key_max", &fel_key_max, 1); if(ret) { printf("fel key old mode\n"); fel_key_mode = 1; } else { printf("fel key new mode\n"); } } printf("run key detect\n"); sunxi_key_read(); __msdelay(10); if(!fel_key_mode) { int key_value; int fel_key_max, fel_key_min; time_tick = 0; key_value = sunxi_key_read(); //读取按键信息 if(key_value < 0) //没有按键按下 { printf("no key found\n"); return 0; } gd->key_pressd_value = key_value; ret = script_parser_fetch("fel_key", "fel_key_max", &fel_key_max, 1); if(ret) { printf("fel key max not found\n"); return 0; } ret = script_parser_fetch("fel_key", "fel_key_min", &fel_key_min, 1); if(ret) { printf("fel key min not found\n"); return 0; } if((key_value <= fel_key_max) && (key_value >= fel_key_min)) { printf("fel key detected\n"); return 1; } printf("fel key value %d is not in the range from %d to %d\n", key_value, fel_key_min, fel_key_max); //old_usb_plug_status = usb_probe_vbus_type(); //add by guoyingyang while(sunxi_key_read() > 0) //press key and not loosen { time_tick++; new_power_status = axp_probe_power_source(); __msdelay(KEY_DELAY_EACH_TIME); if(new_power_status != old_power_status) { power_plug_count++; old_power_status = new_power_status; } if(power_plug_count == 3) { change_to_debug_mode(); break; } if(time_tick > KEY_MAX_COUNT_GO_ON) { printf("time out\n"); break; } } return 0; } else if(fel_key_mode == 1) { int count; int value_old, value_new, value_cnt; int new_key, new_key_flag; time_tick = 0; count = 0; value_cnt = 0; new_key = 0; new_key_flag = 0; ret = sunxi_key_read(); //读取按键信息 if(ret < 0) //没有按键按下 { printf("no key found\n"); return 0; } else { value_old = ret; } gd->key_pressd_value = ret; while(1) { time_tick ++; ret = axp_probe_key(); //获取power按键信息 new_power_status = axp_probe_power_source(); //detect vbus status printf("new_power_status = %d \n",new_power_status); if(ret > 0) //检测到POWER按键按下 { count ++; } if(new_power_status != old_power_status) { debug("=======flag change========\n"); power_plug_count ++; old_power_status = new_power_status; } __msdelay(KEY_DELAY_EACH_TIME); ret = sunxi_key_read(); //读取按键信息 if(ret < 0) //没有按键按下 { printf("key not pressed anymore\n"); if(count == 1) { if(new_key >= 2) { printf("1\n"); printf("force to debug mode\n"); return -1; } } return 0; } else { value_new = ret; if(value_old == value_new) { value_cnt ++; if(new_key_flag == 1) { new_key ++; new_key_flag ++; } else if(!new_key_flag) { new_key_flag ++; } } else { new_key_flag = 0; value_old = value_new; } } if(count == 3) { printf("you can unclench the key to update now\n"); return -1; } if((!count) && (power_plug_count == 3)) { change_to_debug_mode(); return 0; } if((!count) && (time_tick >= KEY_MAX_COUNT_GO_ON)) { printf("timeout, but no power key found\n"); return 0; } } } else { int user_key_value; user_key_value = sunxi_key_read(); //读取按键信息 if(user_key_value < 0) //没有按键按下 { printf("no user_key found\n"); } else { gd->key_pressd_value = user_key_value; } return 0; } }
int check_update_key(void) { int ret; int fel_key_max; int fel_key_mode = 0; gd->key_pressd_value = 0; if(uboot_spare_head.boot_data.work_mode != WORK_MODE_BOOT) { return 0; } sunxi_key_init(); ret = script_parser_fetch("fel_key", "fel_key_max", &fel_key_max, 1); if(ret) { printf("fel key old mode\n"); fel_key_mode = 1; } else { printf("fel key new mode\n"); } printf("run key detect\n"); sunxi_key_read(); __msdelay(10); if(!fel_key_mode) { int key_value; int fel_key_max, fel_key_min; key_value = sunxi_key_read(); //读取按键信息 if(key_value < 0) //没有按键按下 { printf("no key found\n"); return 0; } gd->key_pressd_value = key_value; ret = script_parser_fetch("fel_key", "fel_key_max", &fel_key_max, 1); if(ret) { printf("fel key max not found\n"); return 0; } ret = script_parser_fetch("fel_key", "fel_key_min", &fel_key_min, 1); if(ret) { printf("fel key min not found\n"); return 0; } if((key_value <= fel_key_max) && (key_value >= fel_key_min)) { printf("fel key detected\n"); return 1; } printf("fel key value %d is not in the range from %d to %d\n", key_value, fel_key_min, fel_key_max); return 0; } else { int count, time_tick; int value_old, value_new, value_cnt; int new_key, new_key_flag; time_tick = 0; count = 0; value_cnt = 0; new_key = 0; new_key_flag = 0; ret = sunxi_key_read(); //读取按键信息 if(ret < 0) //没有按键按下 { printf("no key found\n"); return 0; } else { value_old = ret; } gd->key_pressd_value = ret; while(1) { time_tick ++; ret = axp_probe_key(); //获取power按键信息 if(ret > 0) //检测到POWER按键按下 { count ++; } __msdelay(KEY_DELAY_EACH_TIME); ret = sunxi_key_read(); //读取按键信息 if(ret < 0) //没有按键按下 { printf("key not pressed anymore\n"); if(count == 1) { if(new_key >= 2) { printf("1\n"); printf("force to debug mode\n"); return -2; } } return 0; } else { value_new = ret; if(value_old == value_new) { value_cnt ++; if(new_key_flag == 1) { new_key ++; new_key_flag ++; } else if(!new_key_flag) { new_key_flag ++; } } else { new_key_flag = 0; value_old = value_new; } } if(count == 3) { printf("you can unclench the key to update now\n"); return -1; } if((!count) && (time_tick >= KEY_MAX_COUNT_GO_ON)) { printf("timeout, but no power key found\n"); return 0; } } } }