예제 #1
0
/*
************************************************************************************************************
*
*                                             function
*
*    函数名称:
*
*    参数列表:
*
*    返回值  : 0:正常启动
*			   -1:关机
*
*    说明    :如果是量产完成,直接关机
*
*
************************************************************************************************************
*/
__s32 check_power_status(void)
{
    __s32 status;
    __s32 power_start;

#ifdef CONFIG_AW_HOMELET_PRODUCT
    return 0;
#endif

    status = wBoot_power_get_level();
    if(status == BATTERY_RATIO_TOO_LOW_WITHOUT_DCIN)						//低电状态下,无外部电源,直接关机
    {
        __inf("battery low power with no dc or ac, should set power off\n");
        ShowPictureEx("c:\\os_show\\low_pwr.bmp", 0);
        wBoot_timer_delay(3000);

        return -1;
    }
    power_start = 0;
    // 0: 不允许插火牛直接开机,必须通过判断:满足以下条件可以直接开机:长按power按键,前次是系统状态,如果电池电量过低,则不允许开机
    // 1: 任意状态下,允许插火牛直接开机,同时要求电池电量足够高
    // 2: 不允许插火牛直接开机,必须通过判断:满足以下条件可以直接开机:长按power按键,前次是系统状态,不要求电池电量
    // 3: 任意状态下,允许插火牛直接开机,不要求电池电量
    if(wBoot_script_parser_fetch("target", "power_start", &power_start, 1))
    {
        power_start=0;
    }
    __debug("status=%d\n",status);
    switch(status)
    {
    case BATTERY_RATIO_ENOUGH:
        __inf("battery enough\n");
        break;
    case BATTERY_RATIO_TOO_LOW_WITH_DCIN:
        __inf("battery too low with dc\n");
        break;
    case BATTERY_RATIO_TOO_LOW_WITHOUT_DCIN:
        __inf("battery too low without dc\n");
        break;
    default:
        break;
    }
    __inf("power_start=%x\n", power_start);
    if(status == BATTERY_RATIO_TOO_LOW_WITH_DCIN)					//低电,同时带外部电源状态下
    {
        if(!(power_start & 0x02))	//需要判断当前电池电量,要求power_start的第1bit的值为0
        {   //此种情况下,直接关机
            __inf("battery low power with dc or ac, should charge longer\n");
            ShowPictureEx("c:\\os_show\\bempty.bmp", 0);
            wBoot_timer_delay(3000);

            return -1;
        }
        else
        {
            if(power_start == 3)	//不需要判断当前电池电量,如果为3,则进入系统,如果为0,则进行后续判断
            {
                return 0;
            }
        }
    }
    else							//电池电量足够情况下
    {
        if(power_start & 0x01)		//如果第0bit的值为1,则进入系统
        {
            return 0;
        }
    }								//其它情况下,进入后续判断

    status = -1;
    status = wBoot_power_check_startup();
#ifdef FORCE_BOOT_STANDBY
    status = 0;
#endif
    if(status)
    {
        return 0;
    }
    {

        __u32 dcin, bat_exist;
        __s32 bat_cal, this_bat_cal;
        __u32 bat_show_hd = NULL;
        int   i, j;
        int   bat_full_status = 0;
        //当前可以确定是火牛开机,但是是否开机还不确定,需要确认电池是否存在
        WaitForDeInitFinish();//等 LCD init结束,release hard timer.
        power_int_reg();
        usb_detect_enter();
        bat_show_hd = ShowBatteryCharge_init(0);

        //wBoot_timer_delay(1500);
        dcin = 0;
        bat_exist = 0;
        wBoot_power_get_dcin_battery_exist(&dcin, &bat_exist);
        if(!bat_exist)
        {
            __inf("no battery exist\n");
            ShowBatteryCharge_exit(bat_show_hd);
            power_int_rel();
            usb_detect_exit();

            return 0;
        }
        wlibc_int_disable();
        this_bat_cal = wBoot_power_get_cal();
        wlibc_int_enable();
        __inf("base bat_cal = %d\n", this_bat_cal);
        if(this_bat_cal > 95)
        {
            this_bat_cal = 100;
        }
        if(this_bat_cal == 100)
        {
            ShowBatteryCharge_exit(bat_show_hd);
            bat_show_hd = NULL;
            show_battery_full(&bat_full_status);
            for(i =0; i<12; i++)
            {
                if(power_ops_int_status & 0x02)	//短按
                {
                    power_ops_int_status &= ~0x02;
                    j = 0;
                    __inf("short key\n");
                }
                else if(power_ops_int_status & 0x01)	//长按
                {
                    wlibc_int_disable();
                    power_int_rel();
                    usb_detect_exit();
                    power_ops_int_status &= ~0x01;
                    wlibc_int_enable();
                    power_int_reg();
                    __inf("long key\n");

                    return 0;
                }
                wBoot_timer_delay(250);
            }
        }
        else
        {
            int one_delay;

            one_delay = 1000/(10 - (this_bat_cal/10));
            for(j=0; j<3; j++)
            {
                for(i=this_bat_cal; i<110; i+=10)
                {
                    ShowBatteryCharge_rate(bat_show_hd, i);
                    wBoot_timer_delay(one_delay);
                    if(power_ops_int_status & 0x02)	//短按
                    {
                        power_ops_int_status &= ~0x02;
                        j = 0;
                        __inf("short key\n");
                    }
                    else if(power_ops_int_status & 0x01)	//长按
                    {
                        ShowBatteryCharge_exit(bat_show_hd);
                        wlibc_int_disable();
                        power_int_rel();
                        usb_detect_exit();
                        power_ops_int_status &= ~0x01;
                        wlibc_int_enable();
                        power_int_reg();
                        __inf("long key\n");

                        return 0;
                    }
                }
            }
            ShowBatteryCharge_rate(bat_show_hd, this_bat_cal);
            wBoot_timer_delay(1000);
        }
        wBoot_power_get_key();
        __inf("extenal power low go high startup\n");
        /******************************************************************
        *
        *	standby 返回值说明
        *
        *	   -1: 进入standby失败
        *		1: 普通按键唤醒
        *		2: 电源按键短按唤醒
        *		3: 电源按键长按唤醒
        *		4: 外部电源移除唤醒
        *		5: 电池充电完成
        *		6: 在唤醒状态下外部电源被移除
        *		7: 在唤醒状态下充电完成
        *
        ******************************************************************/
        do
        {

            if(power_ops_int_status & 0x04)
            {
                status = 8;
                power_ops_int_status &= ~0x04;
            }
            else
            {
                wlibc_int_disable();
                power_int_rel();
                usb_detect_exit();
                wlibc_int_enable();
                De_CloseLayer(board_res.layer_hd);
                wBoot_EnableInt(GIC_SRC_NMI);
                __inf("enter standby\n");
                status = wBoot_standby();
                __inf("exit standby by %d\n", status);
                wBoot_DisableInt(GIC_SRC_NMI);

                wlibc_int_disable();
                bat_cal = wBoot_power_get_cal();
                wlibc_int_enable();
                __inf("current bat_cal = %d\n", bat_cal);
                if(bat_cal > this_bat_cal)
                {
                    this_bat_cal = bat_cal;
                    if(this_bat_cal > 95)
                    {
                        this_bat_cal = 100;
                    }
                }
            }
            switch(status)
            {
            case 2:		//短按power按键导致唤醒
            {
                power_int_reg();
                De_OpenLayer(board_res.layer_hd);
                if(this_bat_cal == 100)
                {
                    if(bat_show_hd)
                    {
                        ShowBatteryCharge_exit(bat_show_hd);
                        bat_show_hd = NULL;
                    }
                    show_battery_full(&bat_full_status);
                    for(i =0; i<12; i++)
                    {
                        if(power_ops_int_status & 0x02)	//短按
                        {
                            power_ops_int_status &= ~0x02;
                            i = 0;
                            __msg("short key\n");
                        }
                        else if(power_ops_int_status & 0x01)	//长按
                        {
                            ShowBatteryCharge_exit(bat_show_hd);
                            wlibc_int_disable();
                            power_int_rel();
                            usb_detect_exit();
                            power_ops_int_status &= ~0x01;
                            wlibc_int_enable();
                            power_int_reg();
                            __inf("long key\n");

                            return 0;
                        }
                        wBoot_timer_delay(250);
                    }
                }
                else
                {
                    int one_delay;

                    one_delay = 1000/(10 - (this_bat_cal/10));
                    for(j=0; j<3; j++)
                    {
                        for(i=this_bat_cal; i<110; i+=10)
                        {
                            ShowBatteryCharge_rate(bat_show_hd, i);
                            wBoot_timer_delay(one_delay);
                            if(power_ops_int_status & 0x02)	//短按
                            {
                                power_ops_int_status &= ~0x02;
                                j = 0;
                                __msg("short key\n");
                            }
                            else if(power_ops_int_status & 0x01)	//长按
                            {
                                ShowBatteryCharge_exit(bat_show_hd);
                                wlibc_int_disable();
                                power_int_rel();
                                usb_detect_exit();
                                power_ops_int_status &= ~0x01;
                                wlibc_int_enable();
                                power_int_reg();
                                __inf("long key\n");

                                return 0;
                            }
                        }
                    }
                    ShowBatteryCharge_rate(bat_show_hd, this_bat_cal);
                    wBoot_timer_delay(1000);
                }
            }
            break;

            case 3:		//长按电源按键之后,关闭电池图标,进入系统
            {
                ShowBatteryCharge_exit(bat_show_hd);
                power_int_reg();

                return 0;
            }

            case 4:		//当移除外部电源时候,重新显示当前电池图标后,3秒后关机
            case 5:		//当电池充电完成的时候,需要关机
                De_OpenLayer(board_res.layer_hd);
                ShowBatteryCharge_rate(bat_show_hd, this_bat_cal);
            case 6:
            case 7:
            {
                power_int_reg();
                if((status != 4) && (status != 5))
                {
                    De_OpenLayer(board_res.layer_hd);
                    ShowBatteryCharge_rate(bat_show_hd, this_bat_cal);
                }
                wBoot_timer_delay(500);
                if(bat_show_hd)
                {
                    ShowBatteryCharge_degrade(bat_show_hd, 10);
                    ShowBatteryCharge_exit(bat_show_hd);
                }
                else
                {
                    shut_battery_full();
                }

                return -1;
            }
            case 8:		//standby过程中检测到vbus接入
            {
                usb_detect_enter();
                wBoot_timer_delay(600);
                usb_detect_exit();
            }
            break;
            case 9:		//standby过程中检测到vbus移除,同时存在普通dc
            {
                power_set_usbpc();
            }
            break;

            default:
                break;
            }
        }
        while(1);
    }
}
예제 #2
0
int check_power_status(void)
{
    int var4;
    int var5;
    struct ShowBatteryChangeHandle *var6;
    int var7;
    int var8;
    int var9;
    int vasl;
    int sp0;
    int sp4;
    int sp8;
    int sp12;

    sp12 = svc_3e();
    if(sp12 == 1) {
        wlibc_uprintf(
                "battery low power with no dc or ac, should set power off\n");
        ShowPictureEx("c:\\os_show\\low_pwr.bmp", 0);
        svc_delay(3000);
        return -1;
    }
    if(sp12 == 3) {
        wlibc_uprintf(
                "battery low power with dc or ac, should charge longer\n");
        ShowPictureEx("c:\\os_show\\bempty.bmp", 0);
        svc_delay(3000);
        return -1;

    }
    sp12 = -1;
    svc_b0("target", "power_start", &sp12, 1);
    if(sp12 == 1) {
        return 0;
    }
    sp12 = svc_3b();
    wlibc_uprintf("startup status = %d\n", sp12);
    if( sp12 != 0)
        return 0;
    var6 = 0;
    sp0 = 0;
    power_int_reg();
    usb_detect_enter();
    var6 = ShowBatteryCharge_init();

    svc_delay(1500);
    sp8 = 0;
    sp4 = 0;
    svc_38(&sp8, &sp4);
    if(sp4 == 0) {
        wlibc_uprintf("no battery exist\n");
        ShowBatteryCharge_exit(var6);
        power_int_rel();
        usb_detect_exit();
        return 0;

    }
    wlibc_int_disable();
    var5 = svc_batt_chargerate();
    wlibc_int_enable();
    wlibc_uprintf("base bat_cal = %d\n", var5);
    if(var5 > 95)
        var5 = 100;
    if(var5 == 100) {
        ShowBatteryCharge_exit(var6);
        var6 = 0;
        fnL428008D0(&sp0);
        var7 = 0;
        while(var7 < 12) {
            if( *L4280A3A8 & 2 ) {
                *L4280A3A8 &= ~2;
                var8 = 0;
                wlibc_uprintf("short key\n");
            } else if( *L4280A3A8 & 1 ) {
                wlibc_int_disable();
                power_int_rel();
                usb_detect_exit();
                *L4280A3A8 &= ~1;
                wlibc_int_enable();
                power_int_reg();
                wlibc_uprintf("long key\n");
                return 0;
            }
            svc_delay(250);
            var7 = var7 + 1;
        }
    } else { 
        vasl = 10 - var5 / 10;
        var9 = 1000 / vasl;
        var8 = 0;
        while(var8 < 3) {
            var7 = var5;
            while(var7 < 110) {
                ShowBatteryCharge_rate(var6, var7);
                svc_delay(var9);
                if( *L4280A3A8 & 2 ) {
                    *L4280A3A8 &= ~2;
                    var8 = 0;
                    wlibc_uprintf("short key\n");
                } else if( *L4280A3A8 & 1 ) {
                    ShowBatteryCharge_exit(var6);
                    wlibc_int_disable();
                    power_int_rel();
                    usb_detect_exit();
                    *L4280A3A8 &= ~1;
                    wlibc_int_enable();
                    power_int_reg();
                    wlibc_uprintf("long key\n");
                    return 0;
                }
                var7 = var7 + 10;
            }
            var8 = var8 + 1;
        }
        ShowBatteryCharge_rate(var6, var5);
        svc_delay(1000);
    }
    svc_3a();
    wlibc_uprintf("extenal power low go high startup\n");
    while(1) {
        wlibc_uprintf("enter standby\n");
        if( *L4280A3A8 & 4 ) {
            sp12 = 8;
            *L4280A3A8 &= ~4;
        } else { 
            wlibc_int_disable();
            power_int_rel();
            usb_detect_exit();
            wlibc_int_enable();
            //De_CloseLayer(gDeParam0);
            sp12 = svc_05();
            wlibc_uprintf("exit standby by %d\n", sp12);
            wlibc_int_disable();
            var4 = svc_batt_chargerate();
            wlibc_int_enable();
            wlibc_uprintf("current bat_cal = %d\n", var4);
            if(var4 > var5) {
                var5 = var4;
                var4 = var5;
                if(var5 > 95) {
                    var5 = 100;
                }
            }
        }
        switch( sp12 - 2 ) {
        case 0:
            power_int_reg();
            //De_OpenLayer(gDeParam0);

            if(var5 == 100) {
                if(var6 != 0) {
                    ShowBatteryCharge_exit(var6);
                    var6 = 0;
                }
                fnL428008D0(&sp0);
                var7 = 0;
                while(var7 < 12) {
                    if( *L4280A3A8 & 2 ) {
                        *L4280A3A8 &= ~2;
                        var7 = 0;
                        wlibc_uprintf("MSG:L%d(%s):", 321,
                                "Board/fel_detect/fel_detect.c");
                        wlibc_ntprintf("short key\n");
                    } else { 
                        if( *L4280A3A8 & 1 ) {
                            ShowBatteryCharge_exit(var6);
                            wlibc_int_disable();
                            power_int_rel();
                            usb_detect_exit();
                            *L4280A3A8 &= ~1;
                            wlibc_int_enable();
                            power_int_reg();
                            wlibc_uprintf("long key\n");
                            return 0;
                        }
                    }
                    svc_delay(250);
                    var7 = var7 + 1;
                }
            } else { 
                vasl = 10 - var5 / 10;
                var9 = 1000 / vasl;
                var8 = 0;
                while(var8 < 3) {
                    var7 = var5;
                    while(var7 < 110) {
                        ShowBatteryCharge_rate(var6, var7);
                        svc_delay(var9);
                        if( *L4280A3A8 & 2 ) {
                            *L4280A3A8 &= ~2;
                            var8 = 0;
                            wlibc_uprintf("MSG:L%d(%s):", 354,
                                    "Board/fel_detect/fel_detect.c");
                            wlibc_ntprintf("short key\n");
                        } else if( *L4280A3A8 & 1 ) {
                            ShowBatteryCharge_exit(var6);
                            wlibc_int_disable();
                            power_int_rel();
                            usb_detect_exit();
                            *L4280A3A8 &= ~1;
                            wlibc_int_enable();
                            power_int_reg();
                            wlibc_uprintf("long key\n");
                            return 0;
                        }
                        var7 = var7 + 10;
                    }
                    var8 = var8 + 1;
                }
                ShowBatteryCharge_rate(var6, var5);
                svc_delay(1000);
            }
            break;
        case 1:
            ShowBatteryCharge_exit(var6);
            power_int_reg();
            return 0;
        case 2:
        case 3:
            //De_OpenLayer(gDeParam0);
            ShowBatteryCharge_rate(var6, var5);
        case 4:
        case 5:
            power_int_reg();
            if(sp12 != 4) {
                if(sp12 != 5) {
                    //De_OpenLayer(gDeParam0);
                    ShowBatteryCharge_rate(var6, var5);
                }
            }
            svc_delay(500);
            if(var6 != 0) {
                ShowBatteryCharge_degrade(var6);
                ShowBatteryCharge_exit(var6);
            } else { 
                fnL42800848();
            }
            return -1;
        case 6:
            usb_detect_enter();
            svc_delay(600);
            usb_detect_exit();
            break;
        case 7:
            power_set_usbpc();
            break;
        default:
            break;
        }
    }
}