Ejemplo n.º 1
0
int Set_Charging_Commmand(int nCommand)
{
    int nRet = KAL_FALSE;
    mutex_lock(&charging_timer_api_lock);

    if (charger_command_status == CHARGER_COMMAND_STOP)
    {
        switch (nCommand)
        {
            case CHARGING_SET_USB_500_COMMAND :
            case CHARGING_SET_TA_MODE_COMMAND :
            case CHARGING_SET_USB_100_COMMAND :
            case CHARGING_SET_FACTORY_MODE_COMMAND :
            case CHARGING_DEACTIVE_COMMAND :
                charger_command = nCommand;
                charger_command_status = CHARGER_COMMAND_RUN;
                charger_command_execute_index = 0;
                nRet = KAL_TRUE;
                break;
            default :
                charger_command = CHARGING_UNKNOWN_COMMAND;
                charger_command_status = CHARGER_COMMAND_STOP;
                charger_command_execute_index = 0;
                nRet = KAL_FALSE;
                break;
        }
        if (nRet == KAL_TRUE)
        {
            if (charger_command_list[charger_command].cmd_interval[charger_command_execute_index].is_high)
            {
                mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
            }
            else
            {
                mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
            }
            config.u4CompareH = 0;
            config.u4CompareL = charger_command_list[charger_command].cmd_interval[charger_command_execute_index].delay_count;
            charger_command_execute_index++;

/*                                                                                                           */
            GPT_Config(config);
/*                                                                                                           */

            GPT_ClearCount(gpt_num);
            GPT_SetCompare(gpt_num, config.u4CompareL);
            GPT_Restart(gpt_num);
        }
    }

    mutex_unlock(&charging_timer_api_lock);

    return nRet;
}
Ejemplo n.º 2
0
void gpt_timer_irq_handler(UINT16 i)
{
    /*
        Do not added printf or log print in the function because it is interrupt service routine.
    */
    spin_lock_irqsave(&g_single_charger_lock, g_single_flags);

    // end command
    if (charger_command_list[charger_command].cmd_interval[charger_command_execute_index].delay_count == 0)
    {
        charger_command = CHARGING_UNKNOWN_COMMAND;
        charger_command_status = CHARGER_COMMAND_STOP;
        charger_command_execute_index = 0;
        spin_unlock_irqrestore(&g_single_charger_lock, g_single_flags);
        return;
    }

    if (charger_command_list[charger_command].cmd_interval[charger_command_execute_index].is_high)
    {
/*                                                                                 */
        mt_set_gpio_pull_select(CHG_EN_SET_N, GPIO_PULL_UP);
/*                                                                                 */
        mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    }
    else
    {
/*                                                                                 */
        mt_set_gpio_pull_select(CHG_EN_SET_N, GPIO_PULL_DOWN);
/*                                                                                 */
        mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    }
    config.u4CompareH = 0;
    config.u4CompareL = charger_command_list[charger_command].cmd_interval[charger_command_execute_index].delay_count;
    charger_command_execute_index++;

/*                                                                                                           */
    GPT_Config(config);
/*                                                                                                           */

    GPT_ClearCount(gpt_num);
    GPT_SetCompare(gpt_num, config.u4CompareL);
    GPT_Restart(gpt_num);

    spin_unlock_irqrestore(&g_single_charger_lock, g_single_flags);
}
Ejemplo n.º 3
0
bool sc_dpidle_can_enter(void)
{
#ifdef PROFILE_IDLE
    dpidle_tick_pre = GPT_GetCounter(GPT2);
#endif

#ifdef CONFIG_LOCAL_TIMERS
    dpidle_counter = localtimer_get_counter();
    if (dpidle_counter >= dpidle_time_critera) { // 13000 => 1ms
        GPT_SetCompare(WAKEUP_GPT, dpidle_counter);
        GPT_Start(WAKEUP_GPT);
        dpidle_state = 1;
        return true; 
    }

    if (dpidle_debug_mask & DEBUG_TRACING) {
        if (dpidle_counter > dpidle_block_interval) {
            dpidle_block_interval = dpidle_counter;
        }
        dpidle_sc_block_cnt++;
    }
#else /* !SMP */
    dpidle_counter = GPT_GetCounter(GPT1);
    dpidle_compare = GPT_GetCompare(GPT1);

    if (dpidle_compare >= dpidle_counter + dpidle_time_critera) { // 13000 => 1ms
        dpidle_state = 1;
        return true; 
    }

    if (dpidle_debug_mask & DEBUG_TRACING) {
        unsigned int delta = dpidle_compare - dpidle_counter;
        if (delta > dpidle_block_interval) {
            dpidle_block_interval = delta;
        }
        dpidle_sc_block_cnt++;
    }
#endif

    dpidle_state = 0;
    return false;
}