⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcc_handle_message.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	ind = (struct pwr_adc_ind_s*)request;

	ttw(ttr(TTrEventLow,"State=%d" NL, ind->data[State]));
	
	// Basic trace - not for CAL
	switch (pwr_ctrl->state)
	{
	case PRE :
		ttw(ttr(TTrEventLow,"Vbat=%d" NL, ADC_to_mV(ind->data[Vbat])));
		ttw(ttr(TTrEventLow,"Vchg=%d" NL, ADC_to_mV(ind->data[Vchg])));
		ttw(ttr(TTrEventLow,"Ichg=%d" NL, ind->data[Ichg]));
		break;
	case INI :
	case SUP :
	case CCI :
	case LCI :
	case CCV :
	case LCV :
		ttw(ttr(TTrEventLow,"Vbat=%d" NL, ADC_to_mV(ind->data[Vbat])));
		ttw(ttr(TTrEventLow,"Vbat_adc=%d" NL, ind->data[Vbat]));
#if (USE_Q402_CHG_CIRCUIT == 1)
		// Vchg Scaling factor for Q402 circuit
		pwr_cfg->data.Vchg = 5*ADC_to_mV(ind->data[Vchg])/4;
		ttw(ttr(TTrEventLow,"Vchg=%d" NL, pwr_cfg->data.Vchg));
#else
		pwr_cfg->data.Vchg = ADC_to_mV(ind->data[Vchg]);
		ttw(ttr(TTrEventLow,"Vchg=%d" NL, pwr_cfg->data.Vchg));
#endif
		ttw(ttr(TTrEventLow,"Ichg=%d" NL, ind->data[Ichg]));
		ttw(ttr(TTrEventLow,"Type=%d" NL, ind->data[Type]));
		ttw(ttr(TTrEventLow,"Tbat=%d" NL, ind->data[Tbat]));
		ttw(ttr(TTrEventLow,"T_rf=%d" NL, ind->data[T_rf]));
		ttw(ttr(TTrEventLow,"Vbt2=%d" NL, ADC_to_mV(ind->data[Vbt2])));
		break;
	}

	// Updates variables in 'service' mode - not for CAL, PRE & INI
	switch (pwr_ctrl->state)
	{
	case SUP :
	case CCI :
	case LCI :
	case CCV :
	case LCV :
		index = pwr_ctrl->index % CONSECUTIVE_CHG_UNPLUGS;
		ttw(ttr(TTrEventLow,"Using index: (%d)" NL, index));
		pwr_ctrl->index++;
		// Get current nucleus time
		timer  = rvf_get_tick_count();

		// T0 timer expired?
		pwr_ctrl->time_elapsed_T0  = pwr_timer_elapsed(pwr_ctrl->time_begin_T0, timer);
		ttw(ttr(TTrTimerLow,"T0: %d ms elapsed " NL, pwr_ctrl->time_elapsed_T0));

		// Compare T0 with configured sampling rate
		if (pwr_ctrl->time_elapsed_T0 > pwr_cfg->common.sampling)
		{
			ttw(ttr(TTrTimer, "T0 Reset: elapsed (%d)" NL, pwr_ctrl->time_elapsed_T0));
			pwr_ctrl->time_begin_T0 = timer;

		}

		pwr_cfg->data.Vbat = ind->data[Vbat]; 
		pwr_cfg->data.Vbat_avg = (ind->data[Vbat] + pwr_cfg->common.alfa1 * pwr_cfg->data.Vbat_avg)/(pwr_cfg->common.alfa1 + 1);
		//pwr_cfg->data.Vbat_avg_mV = ADC_to_mV(pwr_cfg->data.Vbat_avg);

		tmp_vbat_mV = (ADC_to_mV(ind->data[Vbat]) + pwr_cfg->data.Vbat_avg_mV * pwr_cfg->common.alfa1) / (pwr_cfg->common.alfa1 + 1);
		pwr_cfg->data.Vbat_avg_mV = (UINT16)tmp_vbat_mV;
		
		/* Robert.Chen added, 2004-05-29 */
		if(pwr_cfg->data.Vbat_avg_mV >= pwr_cfg->bat.chg_stop_thr && pwr_ctrl->state == CCV)
		{
			cv_overflow = 1;
		}
		/* add end */
		
		ttw(ttr(TTrEventLow,"Vbat_avg=%d" NL, pwr_cfg->data.Vbat_avg_mV));
		MI_dbgPrintf("zhq: PowerState=%d, Vbat=%d, Vbat_avg_mV=%d,Vbat=%d,Vbat_avg=%d", pwr_ctrl->state, ADC_to_mV(ind->data[Vbat]), pwr_cfg->data.Vbat_avg_mV,ind->data[Vbat],pwr_cfg->data.Vbat_avg);
		
		pwr_cfg->data.Tbat = ind->data[Tbat];
		pwr_cfg->data.Tbat_avg = (ind->data[Tbat] + pwr_cfg->common.alfa2 * pwr_cfg->data.Tbat_avg)/(pwr_cfg->common.alfa2 + 1);
		ttw(ttr(TTrEventLow,"Tbat_avg=%d" NL, pwr_cfg->data.Tbat_avg));
		temp = pwr_temp_lookup(pwr_cfg->data.Tbat_avg, 0x01);
		ttw(ttr(TTrEventLow,"temp=%d" NL, temp));

		pwr_cfg->data.T_rf_avg = ind->data[T_rf];
		pwr_cfg->data.T_rf_avg = (ind->data[T_rf] + pwr_cfg->common.alfa3 * pwr_cfg->data.T_rf_avg)/(pwr_cfg->common.alfa3 + 1);
		ttw(ttr(TTrEventLow,"T_rf_avg=%d" NL, pwr_cfg->data.T_rf_avg));

		pwr_cfg->data.Ichg = ind->data[Ichg];
		break;
	}

	// 'Main' switch
	ttw(ttr(TTrEventLow,"state=%d" NL, pwr_ctrl->state));
	switch (pwr_ctrl->state)
	{
	case CAL :
		MI_dbgPrintf("zhq: we entered CAL state.");

		// Read calibration files
		// Decide if SW precharge should be started (state PRE) or if a normal configuration scheme should be inititated (state INI)
		error = pwr_read_cal_files();		
		if (error >= 0)
		{
			MI_dbgPrintf("Vbat = %d", ADC_to_mV(ind->data[Vbat]));
			// Save measurements - also initial values for averaging
			pwr_cfg->data.Vbat_avg = pwr_cfg->data.Vbat = ind->data[Vbat];
			pwr_cfg->data.Vbat_avg_mV = ADC_to_mV(pwr_cfg->data.Vbat_avg);
			ttw(ttr(TTrEventLow,"Vbat=%d" NL, ADC_to_mV(ind->data[Vbat])));
			ttw(ttr(TTrEventLow,"Vchg=%d" NL, ADC_to_mV(ind->data[Vchg])));

			// Charger was already inserted?
			status = ind->data[State];

			if (status & CHGPRES)
			{
				// Charger plugged caused a wakeup
				pwr_ctrl->flag_chg_plugged = 1;
				pwr_ctrl->flag_chg_prev_plugged = 1;
				ttw(ttr(TTrInitLow,"Polled - charger plugged  (%d)" NL, status));
			}

			// Check Pre-charge - immediately change state to PRE
			if ((pwr_cfg->data.Vbat_avg_mV < VBAT_PRECHG_START) && (pwr_ctrl->flag_chg_plugged == 1))
			{
				ttw(ttr(TTrInitLow,"precharge (%d)" NL, ADC_to_mV(ind->data[Vbat])));
				// Charger interrupts (plug/unplug) are already masked off - in case it was a linear charger
				pwr_ctrl->state = PRE;

			#if (LCC_ALWAYS_MMI_INFO == 1)
			#if 0
				if(pwr_ctrl->flag_mmi_registered == 1)
				{
					pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG;
					mmi_send_msg(pwr_ctrl->mmi_ptr);
				}
			#endif	
			#endif
			}
			else
			{
				pwr_ctrl->state = INI;
			}
		}
	/* zhq, 2004/06/16, adding this for in INI and CAL state, no bat info is send to MMI, though mmi info timer
	has been started in pwr_register(). pay attention that in INI and CAL, we should use a temporary capacity array.*/
	#if (LCC_ALWAYS_MMI_INFO == 1)	
		pwr_check_timers();
	#endif
		break;
	case PRE :
		MI_dbgPrintf("zhq: we entered PRE state.");
		// Start fast charge immediately after 3.2V boot
		// Enter INI state - in order to read FFS configuration files - when Vbat reaches 3.6V
/* zhq, 2004/06/16, add below code for in PRE state, MMI should be
nofitied that charging has beging. */
		if (pwr_ctrl->flag_mmi_registered == 1)
		{
			if(eventsend == 0)
			{
				pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG_START_IND;
				mmi_send_msg(pwr_ctrl->mmi_ptr);
				eventsend++;

			}
			else if (eventsend == 9)
			{
				eventsend = 0;
			}
			else
			{
				eventsend++;
			}
			
		}
		
		// Hardcoding moving average to PRECHG_AVG_WINDOW_SIZE since we haven't read any configuration
		pwr_cfg->data.Vbat = ind->data[Vbat];
		pwr_cfg->data.Vbat_avg = (ind->data[Vbat] + PRECHG_AVG_WINDOW_SIZE  * pwr_cfg->data.Vbat_avg)/(PRECHG_AVG_WINDOW_SIZE + 1); 
		pwr_cfg->data.Vbat_avg_mV = ADC_to_mV(pwr_cfg->data.Vbat_avg);
		if (pwr_cfg->data.Vbat_avg_mV > VBAT_PRECHG_STOP)
		{
			ttw(ttr(TTrInitLow,"state PRE (%d > VBAT_PRECHG_STOP)" NL, pwr_cfg->data.Vbat_avg_mV));
			pwr_ctrl->state = INI;
			pwr_ctrl->flag_prechg_started = 0;
			stop_pre_charge();
		}
		else
		{
			ttw(ttr(TTrInitLow,"state PRE (%d < VBAT_PRECHG_STOP)" NL, pwr_cfg->data.Vbat_avg_mV));
			// Start fast charging NOW
			if (pwr_ctrl->flag_prechg_started == 0)
			{
				pwr_ctrl->flag_prechg_started = 1;
				start_pre_charge();
			}
		}

	#if (LCC_ALWAYS_MMI_INFO == 1)	/* Robert.Chen added, 2004-05-28, getting battery info at 'PRE' state */
		pwr_check_timers();
	#endif
		break;
	case INI :
		MI_dbgPrintf("zhq: we entered INI state.");
		// Charger was already inserted?
		status = ind->data[State];
		pwr_ctrl->chg_unplug_vec[index] = (status & CHGPRES);
		if (status & CHGPRES)
		{
			// Charger plugged caused a wakeup
			pwr_ctrl->flag_chg_plugged = 1;
			pwr_ctrl->flag_chg_prev_plugged = 1;
			ttw(ttr(TTrInitLow,"Polled - charger plugged  (%d)" NL, status));
		}

		if (pwr_ctrl->flag_ini_virgo == 0)
		{
			// Perform some very basic initialization

			/* Precharge (C/20) is switched OFF since it was finished in state PRE */
			ABB_Write_Register_on_page(PAGE0, BCICTL2, 0x0002);

			// Enable battery type identification
			// Switch on battery type identification (TYPEN)
			// NOTE: Battery type identification is ALWAYS done with 10uA (TYPEN)
			ttw(ttr(TTrInitLow,"Enable type ident (%d)" NL, 0x00));
		#if (LCC_BATID_DETECT_EN == 1)		/* Robert.Chen added,  */
			ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_30uA | TYPEN);
		#endif	
			pwr_ctrl->flag_ini_virgo = 1;

		}

		// Don't read battery files before we know which battery id to use
		// We will ignore the first BATTERY_TYPE_SLIP measurements of battery id
		if ((pwr_ctrl->count_bat_type == BATTERY_TYPE_SLIP))
		{

			error = pwr_task_init();

			// Change state
			pwr_ctrl->state = SUP;

			// Readout /pwr/common.cfg
			ttw(ttr(TTrInitLow,"common.cfg: pins: %d" NL, pwr_cfg->common.pins));
			ttw(ttr(TTrInitLow,"chg_dedic %d" NL, pwr_cfg->common.chg_dedic));
			ttw(ttr(TTrInitLow,"sampling %d" NL, pwr_cfg->common.sampling));
			ttw(ttr(TTrInitLow,"mod_cycle %d" NL, pwr_cfg->common.mod_cycle));
			ttw(ttr(TTrInitLow,"alfa1 %d" NL, pwr_cfg->common.alfa1));
			ttw(ttr(TTrInitLow,"alfa2 %d" NL, pwr_cfg->common.alfa2));
			ttw(ttr(TTrInitLow,"alfa3 %d" NL, pwr_cfg->common.alfa3));
			ttw(ttr(TTrInitLow,"rise_thr %d" NL, pwr_cfg->common.rise_thr));

			// Readout /pwr/bat/bat.cfg
			ttw(ttr(TTrInitLow,"bat.cfg: type: %d" NL, pwr_cfg->bat.type));
			ttw(ttr(TTrInitLow,"rf_temp: %d" NL, pwr_cfg->bat.rf_temp));
			ttw(ttr(TTrInitLow,"id_low: %d" NL, pwr_cfg->bat.id_low));
			ttw(ttr(TTrInitLow,"id_high: %d" NL, pwr_cfg->bat.id_high));
			ttw(ttr(TTrInitLow,"cbat: %d" NL, pwr_cfg->bat.cbat));
			ttw(ttr(TTrInitLow,"ratio: %d" NL, pwr_cfg->bat.ratio));
			ttw(ttr(TTrInitLow,"T1: %d" NL, pwr_cfg->bat.T1));
			ttw(ttr(TTrInitLow,"T2: %d" NL, pwr_cfg->bat.T2));
			ttw(ttr(TTrInitLow,"T3: %d" NL, pwr_cfg->bat.T3));
			ttw(ttr(TTrInitLow,"chg_start_thr: %d" NL, pwr_cfg->bat.chg_start_thr));
			ttw(ttr(TTrInitLow,"chg_stop_thr: %d" NL, pwr_cfg->bat.chg_stop_thr));
			ttw(ttr(TTrInitLow,"chg_ctrl_thr: %d" NL, pwr_cfg->bat.chg_ctrl_thr));
			ttw(ttr(TTrInitLow,"chg_again_thr: %d" NL, pwr_cfg->bat.chg_again_thr));

			// Readout /pwr/bat/temp<N>.cfg
			ttw(ttr(TTrInitLow,"sizeof(temp): %d" NL, sizeof(pwr_cfg->temp)));
			ttw(ttr(TTrInitLow,"sizeof(T_PWR_BAT_TEMP_CFG_BLOCK): %d" NL, sizeof(T_PWR_BAT_TEMP_CFG_BLOCK)));
			ttw(ttr(TTrInitLow,"temp.cfg: tbat_min: %d" NL, pwr_cfg->temp.tbat_min));
			ttw(ttr(TTrInitLow,"tbat_max: %d" NL, pwr_cfg->temp.tbat_max));
			ttw(ttr(TTrInitLow,"i_meas1: %d" NL, pwr_cfg->temp.i_meas1));
			for (i=0;i<=8;i++)
			{
				ttw(ttr(TTrInitLow,"v2t_1[]: %d" NL, pwr_cfg->temp.v2t_1[i]));
			}
			ttw(ttr(TTrInitLow,"i_meas2: %d" NL, pwr_cfg->temp.i_meas2));
			for (i=0;i<=8;i++)
			{
				ttw(ttr(TTrInitLow,"v2t_2[]: %d" NL, pwr_cfg->temp.v2t_2[i]));
			}
			for (i=0;i<=9;i++)
			{
				ttw(ttr(TTrInitLow,"cap[]: %d" NL, pwr_cfg->temp.cap[i]));
			}
			ttw(ttr(TTrInitLow,"a0: %d" NL, pwr_cfg->temp.a0));
			ttw(ttr(TTrInitLow,"a1: %d" NL, pwr_cfg->temp.a1));
			ttw(ttr(TTrInitLow,"a2: %d" NL, pwr_cfg->temp.a2));

			// Readout /mmi/pwr/bsie.cfg
			ttw(ttr(TTrInitLow,"mmi repetition: %d" NL, pwr_cfg->mmi.repetition));

			// Initialize battery temperature - must not be made in the virgo part since Tbat=0
			pwr_cfg->data.Tbat_avg = ind->data[Tbat];

			// Setup thermal sensor - don't re-enable TYPEN
/* zhq, 2004/06/16, add this macro to prevent using thermal resistor to detect
temperature for we do not have its support on hardware. */
#if (LCC_TEMP_DETECT_EN == 1)	
			if (pwr_cfg->temp.i_meas2 == 50)
			{
				ttw(ttr(TTrInitLow,"ABB set i_current: %d" NL, pwr_cfg->temp.i_meas2));
				ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_50uA);
			}
			else if (pwr_cfg->temp.i_meas2 == 30)
			{
				ttw(ttr(TTrInitLow,"ABB set i_current: %d" NL, pwr_cfg->temp.i_meas2));
				ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_30uA);
			}
			else
			{
				// Default 30uA
				ttw(ttr(TTrInitLow,"ABB set i_current default: %d" NL, pwr_cfg->temp.i_meas2));
				ABB_Write_Register_on_page(PAGE0, BCICTL1, THERMAL_SENSOR_30uA);
			}
#endif


		}
		else
		{
			// Compare battery id with values found in FFS
			// First value(s) are NOT to be trusted
			pwr_ctrl->count_bat_type++;
			pwr_cfg->data.bat_id = ind->data[Type];

		}
	/* zhq, 2004/06/16, adding this for in INI and CAL state, no bat info is send to MMI, though mmi info timer
	has been started in pwr_register(). pay attention that in INI and CAL, we should use a temporary capacity array.*/
	#if (LCC_ALWAYS_MMI_INFO == 1)	
		pwr_check_timers();
	#endif
		break;
	case SUP :
		MI_dbgPrintf("zhq: we entered SUP state.");
		// Charger inserted?? Poll!!
		// Reason: 100Hz interrupts will occur if an unregulated charger is inserted & charger interrupts are enabled
		//         This will cause an immediate crash!
		status = ind->data[State];
		pwr_ctrl->chg_unplug_vec[index] = (status & CHGPRES);
		if (status & CHGPRES)
		{
			// Charger is plugged - continue
			ttw(ttr(TTrEventLow,"Polled - chg plugged (%d)" NL, status));
			pwr_ctrl->flag_chg_plugged = 1;
			pwr_ctrl->capacity = pwr_capacity(pwr_cfg->data.Vbat_avg_mV);
		}
		else
		{
			pwr_ctrl->flag_chg_plugged = 0;
		}

		if (pwr_ctrl->flag_mmi_registered == 1)
		{
			// If the charger is plugged and no charging is initiated this message will be repeated until charging has started
			// Charger plugged
			if ((pwr_ctrl->flag_chg_plugged == 1) &&  (pwr_ctrl->flag_chg_prev_plugged == 0))
			{
				pwr_ctrl->flag_chg_prev_plugged = 1;
				pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG_PLUG_IND;
				mmi_send_msg(pwr_ctrl->mmi_ptr);
			}
			// Charger unplugged
			if ((pwr_ctrl->flag_chg_plugged == 0) && (pwr_ctrl->flag_chg_prev_plugged == 1))
			{
				pwr_ctrl->flag_chg_prev_plugged = 0;
				pwr_ctrl->mmi_ptr->header.msg_id = MMI_CHG_UNPLUG_IND;
				mmi_send_msg(pwr_ctrl->mmi_ptr);
			}

			if (pwr_ctrl->flag_bat_unknown == 1)
			{
				// Battery unknown - inform the MMI
				pwr_ctrl->mmi_ptr->header.msg_id = MMI_BAT_UNKNOWN_IND;
				mmi_send_msg(pwr_ctrl->mmi_ptr);
				// Send only once
				pwr_ctrl->flag_bat_unknown = 0;
			}

		}

		pwr_check_timers();

		// If charger is plugged AND charger configuration is not read AND capacity is below configured limit - charger id Vchg(Load=0) must be measured
		if ((pwr_ctrl->flag_chg_plugged == 1) && 
			(pwr_ctrl->flag_chg_cfg_read == 0) && 
			(pwr_ctrl->capacity < pwr_cfg->bat.chg_again_thr)
		   )
		{

			// Measurement loop - Take the 2nd Vchg(0) measurements
			if (pwr_ctrl->count_chg_type == CHARGER_TYPE_SLIP)
			{
				if (pwr_cfg->data.Vchg > CHARGER_TYPE_OUT_OF_BOUND_LOW)
				{
					pwr_cfg->data.chg_id = pwr_cfg->data.Vchg;
				}
				else
				{
					// Out of bound!!
					ttr(TTrWarning, "Charger id out of bound! %d" NL, pwr_cfg->data.Vchg);
					pwr_cfg->data.chg_id = CHARGER_TYPE_TYPICAL;
				}
				ttw(ttr(TTrEventLow,"Using chg id=%d" NL, pwr_cfg->data.chg_id));
				error = pwr_read_chg_files();
				pwr_ctrl->flag_chg_cfg_read = 1;

				// Initialize the circular buffer with charger plugs
				for (i=0;i<= CONSECUTIVE_CHG_UNPLUGS-1 ;i++)
					pwr_ctrl->chg_unplug_vec[i] = CHGPRES;

				if (pwr_chg_start(pwr_temp_lookup(pwr_cfg->data.Tbat_avg, 0x01)) == TRUE)
				{
					if (pwr_cfg->chg.type == CI)
					{
						pwr_ctrl->state = CCI;
						// Enable charger plug/unplug interrupts for a CI charger						
						ABB_Write_Register_on_page(PAGE0, ITMASK, ALL_IT_UMSK);
					}
					else
					{
						if (pwr_cfg->chg.type == UNREGULATED)
							pwr_ctrl->state = LCI;
						else
						{
							ttr(TTrWarning, "Unknown charger type! %d" NL, pwr_cfg->chg.type);
							pwr_ctrl->state = LCI;
						}
					}
				#if (USE_Q401_CHG_CIRCUIT == 1)
					start_q401_charge();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -