int do_key_test(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct sunxi_lradc *sunxi_key_base = (struct sunxi_lradc *)SUNXI_KEYADC_BASE; u32 power_key = 0; puts(" press a key:\n"); sunxi_key_base->ints = 0x1f1f; while(!ctrlc()) { sunxi_key_read(); power_key = axp_probe_key(); if(power_key > 0) { break; } } 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; } } } }
/* ************************************************************************************************************ * * function * * name : * * parmeters : * * return : * * note : * * ************************************************************************************************************ */ int do_burn_from_boot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct timer_list timer_t; int ret; if(gd->vbus_status == SUNXI_VBUS_NOT_EXIST) { printf("out of usb burn from boot without usb\n"); return 0; } tick_printf("usb burn from boot\n"); if(sunxi_usb_dev_register(4) < 0) { printf("usb burn fail: not support burn private data\n"); return -1; } sunxi_usb_burn_from_boot_overtime = 0; if(sunxi_usb_init(0)) { printf("%s usb init fail\n", __func__); sunxi_usb_exit(); return 0; } timer_t.data = (unsigned long)&timer_t; timer_t.expires = 800; timer_t.function = probe_usb_overtime; init_timer(&timer_t); tick_printf("usb prepare ok\n"); add_timer(&timer_t); while(1) { if(sunxi_usb_burn_from_boot_init) //当usb sof中断触发,跳出循环 { printf("usb sof ok\n"); del_timer(&timer_t); break; } if(sunxi_usb_burn_from_boot_overtime) //当定时时间到,还没有中断,跳出循环 { tick_printf("overtime\n"); del_timer(&timer_t); sunxi_usb_exit(); tick_printf("%s usb : no usb exist\n", __func__); return 0; } } sunxi_usb_burn_from_boot_overtime = 0; tick_printf("usb probe ok\n"); //开始等待加载驱动,这里不需要延时 sunxi_usb_burn_from_boot_overtime = 0; tick_printf("usb setup ok\n"); timer_t.expires = 3000; add_timer(&timer_t); while(1) { ret = sunxi_usb_extern_loop(); //执行usb主循环 if(ret) //当执行结果非0,表示到了最后一个步骤,需要往后执行 { break; } if(sunxi_usb_burn_from_boot_handshake) //当握手成功,停止检查定时器 { del_timer(&timer_t); } if(sunxi_usb_burn_from_boot_overtime) //当定时时间到,还没有握手成功,跳出循环 { del_timer(&timer_t); sunxi_usb_exit(); tick_printf("%s usb : have no handshake\n", __func__); return 0; } if(ctrlc()) { del_timer(&timer_t); ret = SUNXI_UPDATE_NEXT_ACTION_NORMAL; break; } if(sunxi_key_read()>0) { del_timer(&timer_t); ret = SUNXI_UPDATE_NEXT_ACTION_NORMAL; break; } } tick_printf("exit usb burn from boot\n"); sunxi_usb_exit(); sunxi_update_subsequent_processing(ret); return 0; }