s32 adp_test_case02(void) { s32 ret = 0; unsigned int restTime; osl_sem_init(SEM_EMPTY,&sem); ret = DRV_TIMER_START(TIMER_ACPU_CPUVIEW_ID ,func,0,10000,0,TIMER_UNIT_NONE); if(ret!=0) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_START fail\n"); return ERROR; } ret = DRV_TIMER_GET_REST_TIME(TIMER_ACPU_CPUVIEW_ID,TIMER_UNIT_NONE,&restTime); if(ret!=0) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_GET_REST_TIME fail\n"); return ERROR; } bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"rest time = %d \n",restTime); osl_sem_down(&sem); ret = DRV_TIMER_STOP(TIMER_ACPU_CPUVIEW_ID); if(ret!=0) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_START fail\n"); return ERROR; } osl_sema_delete(&sem); return OK; }
/*************************************************************************** 函 数 名 : tcxo_timer_handle 功能描述 : TCXO 定时器到时处理函数 输入参数 : arg 启动定时器时传入的参数 输出参数 : 无 返 回 值 : RET_OK 成功 RET_ERR 失败 调用函数 : 被调函数 : 修改历史 : **************************************************************************/ static void tcxo_timer_handle(int arg) { unsigned long flags = 0; int i = 0; PWC_TCXO_ID_E tcxoId; PWC_TCXO_FUNCPTR pFuncPtr; PWC_COMM_MODEM_E enModemId = (PWC_COMM_MODEM_E)arg; local_irq_save(flags); /*根据modem id查找到使用的tcxo*/ tcxoId = g_stModemId2TcxoId[enModemId]; /*依次调用之前启动tcxo timer的回调函数*/ for(i = 0; i < PWC_COMM_MODE_BUTT; i++) { pFuncPtr = tcxo_soft_timer[tcxoId].g_stTcxoTimerStru[i].routine; if(pFuncPtr != NULL) { /*lint -e522*/ pFuncPtr(tcxo_soft_timer[tcxoId].g_stTcxoTimerStru[i].arg); tcxo_soft_timer[tcxoId].g_stTcxoTimerStru[i].routine = NULL; } } tcxo_soft_timer[tcxoId].timer_status = PWC_TCXO_TIMER_STOP; tcxo_soft_timer[tcxoId].tcxo_status = PWRCTRL_COMM_ON; if(0 != DRV_TIMER_STOP(TIMER_CCPU_DRX1_STABLE_ID)){ adp_dpm_printf("can't stop TCXO1 hardtimer!\n"); } tcxo_pm_om_log((unsigned int)TCXO_TIMER_HANDER, (unsigned int)arg); local_irq_restore(flags); return; }
VOS_VOID CpuView_StopTimer(VOS_VOID) { VOS_INT32 lValue; /* disenable CPU_VIEW timer,时钟频率为19.2MHz */ lValue = DRV_TIMER_STOP(CPU_VIEW_CLK_ID); if (0 > lValue) { CPU_VIEW_LOG_PRINT1("CpuView_StopTimer Stop Timer Fail:%d\r\n", lValue); } return; }
s32 k3_adp_test_case02(void) { s32 ret = 0; osl_sem_init(SEM_EMPTY,&sem); ret = DRV_TIMER_START(TIMER_ACPU_OSA_ID,func,0,1000,0,TIMER_UNIT_MS); if(ret!=0) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_START fail\n"); return ERROR; } osl_sem_down(&sem); ret = DRV_TIMER_STOP(TIMER_ACPU_OSA_ID); if(ret!=0) { bsp_trace(BSP_LOG_LEVEL_ERROR,BSP_MODU_HARDTIMER,"DRV_TIMER_START fail\n"); return ERROR; } osl_sema_delete(&sem); return OK; }
int enter_lowpm(struct cpuidle_device *dev, struct cpuidle_state *state) { int icanidle = 0; int idle_time; int cpu_id = 0; int cpu_idle_flag = IDLE_DISABLE; struct cpuidle_state *new_state = state; struct timeval before, after; int enter_state; struct timespec t; unsigned int timer_id = 0; unsigned int schedule_time = 0xffffffff; unsigned int expected_us; local_irq_disable(); cpu_id = get_cpu(); put_cpu(); if(get_enter_state(state, &enter_state) != 0) { local_irq_enable(); return 0; } /* Used to keep track of the total time in idle */ getnstimeofday(&before); #if 1 /*启动过程中不允许ACPU下电*/ /*if((CPU_IDLE_C1 <= enter_state)&&(CPU_IDLE_C3 >= enter_state)&&(before.tv_sec < IDLE_ACTIVE_DELAY_S))*/ if((CPU_IDLE_C1 <= enter_state)&&(CPU_IDLE_C3 >= enter_state)&&(0 == g_pwc_init_flag)) { PRINT_PWC_DBG(PWC_SWITCH_CPUIDLE,"before.tv_sec:0x%x\n",before.tv_sec); local_irq_enable(); return 0; } #endif if((RET_OK == pwrctrl_is_func_on(PWC_SWITCH_CPUIDLE))&&((CPU_IDLE_C0 < enter_state)&&(CPU_IDLE_C4 > enter_state))&&(0 == cpu_id)) { cpu_idle_flag = IDLE_ENABLE; } else { cpu_idle_flag = IDLE_DISABLE; } /*C3起定时器来唤醒 后续可优化*/ if((enter_state >= CPU_IDLE_C3)&&(IDLE_ENABLE == cpu_idle_flag)) { pwrctrl_sleep_mgr_get_next_schedule_time(0, &timer_id, &schedule_time); if(schedule_time > (0xFFFFFFFF / 1000)) { schedule_time = 0xFFFFFFFF; } else { schedule_time *= USEC_PER_MSEC; } /*C3停止所有TCXO定时器,待优化*/ /* determine the expected residency time, round up */ t = ktime_to_timespec(tick_nohz_get_sleep_length()); expected_us = t.tv_sec * USEC_PER_SEC + t.tv_nsec / NSEC_PER_USEC; if(schedule_time < expected_us) { PRINT_PWC_DBG(PWC_SWITCH_CPUIDLE,"enter_lowpm,system time:%d private time:%d\n",expected_us, schedule_time); expected_us = schedule_time; } expected_us -= state->exit_latency; DRV_TIMER_STOP(CPU_IDLE_TIMER); DRV_TIMER_START((unsigned int)CPU_IDLE_TIMER, cpu_idle_timer_isr, (int)0, (expected_us / MSEC_PER_SEC), TIMER_ONCE_COUNT, TIMER_UNIT_MS); } if(IDLE_ENABLE == cpu_idle_flag) { *gp_cpuidle_state = (enter_state << CPUIDLE_STATE_START_BIT) | (CPU_IDLE_STAT_VALID << CPUIDLE_STATE_MAGIC_START_BIT); /*pwrctrl_wdt_disable();*/ } if(0 == cpu_id) { PRINT_PWC_DBG(PWC_SWITCH_CPUIDLE,"system will enter cpuidle state(%d)\n",enter_state); } if(CPU_IDLE_C0 == enter_state) { cpu_do_idle(); } else if(IDLE_ENABLE == cpu_idle_flag) { pwrctrl_deep_sleep(); } if(enter_state >= SPECIAL_HANDLE_STATE) { /*清除timer中断*/ /*C3恢复之前停止所有TCXO定时器,待优化*/ } if(IDLE_ENABLE == cpu_idle_flag) { *gp_cpuidle_state = (CPU_IDLE_C4 << CPUIDLE_STATE_START_BIT) | (CPU_IDLE_STAT_VALID << CPUIDLE_STATE_MAGIC_START_BIT); /*pwrctrl_wdt_enable();*/ } getnstimeofday(&after); idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + (after.tv_usec - before.tv_usec); local_irq_enable(); return idle_time; }