예제 #1
0
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;

}
예제 #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;
	        }
	    }
	}
}
예제 #4
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;
}