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; }
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); }
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; }