Esempio n. 1
0
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;
}
Esempio n. 2
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;
	        }
	    }
	}
}