/** * @brief CheckAdcStatusFail * * Check ADC status is fail or not * * @para pUg31xx address of SystemDataType * @return _UPI_TRUE_ if fail */ _upi_bool_ CheckAdcStatusFail(SystemDataType *data) { API_I2C_Read(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_COUNTER_LOW, REG_COUNTER_HIGH - REG_COUNTER_LOW + 1, (unsigned char *)&data->adcCheckData.regCounter); API_I2C_Read(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_AVE_VBAT1_LOW, REG_AVE_VBAT1_HIGH - REG_AVE_VBAT1_LOW + 1, (unsigned char *)&data->adcCheckData.regVbat1Ave); /// [AT-PM] : Compare counter register ; 01/27/2013 if(data->adcCheckData.regCounter == data->adcCheckData.lastCounter) { data->adcCheckData.failCounterCurrent = data->adcCheckData.failCounterCurrent + 1; UG31_LOGI("[%s]: Counter fixed (%d) ... %d\n", __func__, data->adcCheckData.regCounter, data->adcCheckData.failCounterCurrent); } else { data->adcCheckData.failCounterCurrent = 0; } data->adcCheckData.lastCounter = data->adcCheckData.regCounter; /// [AT-PM] : Compre VBat1 register ; 01/27/2013 if(data->adcCheckData.regVbat1Ave == data->adcCheckData.lastVBat1Ave) { data->adcCheckData.failCounterVoltage = data->adcCheckData.failCounterVoltage + 1; UG31_LOGI("[%s]: VBat1 fixed (%d) ... %d\n", __func__, data->adcCheckData.regVbat1Ave, data->adcCheckData.failCounterVoltage); } else { data->adcCheckData.failCounterVoltage = 0; } data->adcCheckData.lastVBat1Ave = data->adcCheckData.regVbat1Ave; /// [AT-PM] : Check ADC fail criteria ; 01/27/2013 if(data->adcCheckData.failCounterCurrent > ADC_FAIL_CRITERIA) { data->adcCheckData.failCounterCurrent = 0; return (_UPI_TRUE_); } if(data->adcCheckData.failCounterVoltage > ADC_FAIL_CRITERIA) { data->adcCheckData.failCounterVoltage = 0; return (_UPI_TRUE_); } return (_UPI_FALSE_); }
/** * @brief DecimateRst * * Decimate reset filter of ADC * * @return _UPI_NULL_ */ void DecimateRst(void) { _sys_u8_ tmp8; tmp8 = 0x00; API_I2C_Read(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_ALARM_EN, 1, &tmp8); tmp8 = tmp8 & (~ALARM_EN_DECIMATE_RST); API_I2C_Write(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_ALARM_EN, 1, &tmp8); tmp8 = tmp8 | ALARM_EN_DECIMATE_RST; API_I2C_Write(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_ALARM_EN, 1, &tmp8); UG31_LOGI("[%s]: DECIMATE_RST\n", __func__); }
/** * @brief UpiRestoreData * * Restore data from system to IC routine * * @para data address of BackupDataType * @return BACKUP_BOOL_TRUE if success */ _backup_bool_ UpiRestoreData(BackupDataType *data) { _backup_bool_ rtn; _backup_u32_ driverVer; SystemDataType *orgSysData; _backup_s32_ tmp32; /// [AT-PM] : Create buffer ; 02/21/2013 #ifndef UG31XX_SHELL_ALGORITHM orgSysData = &CheckBackupFile_orgSysData; #else ///< else of UG31XX_SHELL_ALGORITHM orgSysData = (SystemDataType *)upi_malloc(sizeof(SystemDataType)); #endif ///< end of UG31XX_SHELL_ALGORITHM upi_memcpy(orgSysData, ptrSysData, sizeof(SystemDataType)); /// [AT-PM] : Get data from file ; 02/21/2013 #if defined (uG31xx_OS_WINDOWS) rtn = read_backup_file(data->backupFileName, data->backupBuffer, data->backupBufferSize); #else ///< else of defined (uG31xx_OS_WINDOWS) rtn = read_backup_file(ptrBackupFileName, data->backupBuffer, data->backupBufferSize); #endif ///< end of defined (uG31xx_OS_WINDOWS) if(rtn == _UPI_FALSE_) { UG31_LOGE("[%s]: Read data from backup file fail.\n", __func__); #ifdef UG31XX_SHELL_ALGORITHM upi_free(orgSysData); #endif ///< end of UG31XX_SHELL_ALGORITHM return (BACKUP_BOOL_FALSE); } driverVer = ConvertData(data); UG31_LOGI("[%s]: Driver version = %d\n", __func__, (int)driverVer); /// [AT-PM] : Keep following information ; 01/22/2014 ptrSysData->timeTagFromIC = orgSysData->timeTagFromIC; ptrSysData->tableUpdateIdxFromIC = orgSysData->tableUpdateIdxFromIC; /// [AT-PM] : Check abnormal condition ; 01/22/2014 if((data->backupVolt1 != 0) && (data->backupVolt2 != 0)) { tmp32 = (_backup_s32_)data->backupVolt1; tmp32 = tmp32 - data->backupVolt2; if((tmp32 < RESTORE_ABNORMAL_VOLT_RANGE_UPBND) && (tmp32 > RESTORE_ABNORMAL_VOLT_RANGE_LWBND)) { ptrSysData->rmFromIC = orgSysData->rmFromIC; ptrSysData->fccFromIC = orgSysData->fccFromIC; ptrSysData->rsocFromIC = orgSysData->rsocFromIC; } } #ifdef UG31XX_SHELL_ALGORITHM upi_free(orgSysData); #endif ///< end of UG31XX_SHELL_ALGORITHM return (BACKUP_BOOL_TRUE); }
/** * @brief UpiBackupVoltage * * Backup voltage points for abnormal battery checking * * @para data address of BackupDataType * @return NULL */ void UpiBackupVoltage(BackupDataType *data) { _backup_s32_ tmp32; /// [AT-PM] : Cumulate delta Q ; 01/22/2014 tmp32 = (_backup_s32_)data->measData->stepCap; tmp32 = tmp32*data->measData->curr; if(tmp32 < 0) { tmp32 = 0; } else { tmp32 = (_backup_s32_)data->measData->stepCap; } tmp32 = tmp32 + data->backupDeltaQ; data->backupDeltaQ = (_backup_u16_)tmp32; /// [AT-PM] : Update voltage point 1 ; 01/22/2014 data->backupVolt1 = (_backup_u16_)data->measData->bat1Voltage; UG31_LOGN("[%s]: Update backup voltage point 1 = %d (%d)\n", __func__, data->backupVolt1, data->backupDeltaQ); /// [AT-PM] : Check delta Q ; 01/22/2014 tmp32 = data->sysData->ggbParameter->ILMD; tmp32 = tmp32*BACKUP_VOLTAGE_DELTA_Q_THRESHOLD/CONST_PERCENTAGE; if(data->backupDeltaQ < 0) { tmp32 = tmp32*(-1); if(data->backupDeltaQ > tmp32) { UG31_LOGN("[%s]: data->backupDeltaQ not reach threshold %d\n", __func__, tmp32); return; } } else { if(data->backupDeltaQ < tmp32) { UG31_LOGN("[%s]: data->backupDeltaQ not reach threshold %d\n", __func__, tmp32); return; } } /// [AT-PM] : Update voltage point 2 ; 01/22/2014 data->backupVolt2 = data->backupVolt1; data->backupDeltaQ = 0; UG31_LOGI("[%s]: Update backup voltage point 2 = %d (%d)\n", __func__, data->backupVolt1, data->backupDeltaQ); }
/** * @brief ConvertData * * Convert data from buffer * * @para data address of BackupDataType structure * @return driver version */ _backup_u32_ ConvertData(BackupDataType *data) { _backup_u8_ *ptr; _backup_u32_ driverVer; ptr = data->backupBuffer; upi_memcpy((_backup_u8_ *)data->capData->encriptTable, ptr, (_upi_u32_)data->capData->tableSize); ptr = ptr + data->capData->tableSize; upi_memcpy((_backup_u8_ *)&data->sysData->rmFromIC, ptr, sizeof(data->sysData->rmFromIC)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->rmFromIC)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->fccFromIC, ptr, sizeof(data->sysData->fccFromIC)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->fccFromIC)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->timeTagFromIC, ptr, sizeof(data->sysData->timeTagFromIC)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->timeTagFromIC)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->tableUpdateIdxFromIC, ptr, sizeof(data->sysData->tableUpdateIdxFromIC)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->tableUpdateIdxFromIC)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->deltaCapFromIC, ptr, sizeof(data->sysData->deltaCapFromIC)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->deltaCapFromIC)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->adc1ConvTime, ptr, sizeof(data->sysData->adc1ConvTime)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->adc1ConvTime)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->rsocFromIC, ptr, sizeof(data->sysData->rsocFromIC)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->rsocFromIC)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->cycleCount, ptr, sizeof(data->sysData->cycleCount)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->cycleCount)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->ccOffset, ptr, sizeof(data->sysData->ccOffset)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->ccOffset)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->predictRsoc, ptr, sizeof(data->sysData->predictRsoc)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->predictRsoc)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->sysData->standbyDsgRatio, ptr, sizeof(data->sysData->standbyDsgRatio)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->sysData->standbyDsgRatio)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->backupVolt1, ptr, sizeof(data->backupVolt1)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->backupVolt1)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->backupVolt2, ptr, sizeof(data->backupVolt2)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->backupVolt2)/sizeof(_backup_u8_); upi_memcpy((_backup_u8_ *)&data->capData->preDsgCharge, ptr, sizeof(data->capData->preDsgCharge)/sizeof(_backup_u8_)); ptr = ptr + sizeof(data->capData->preDsgCharge)/sizeof(_backup_u8_); upi_memcpy(&data->backupCustomerSelfDef[0], ptr, CELL_PARAMETER_STRING_LENGTH); ptr = ptr + CELL_PARAMETER_STRING_LENGTH; upi_memcpy(&data->backupProjectSelfDef[0], ptr, CELL_PARAMETER_STRING_LENGTH); ptr = ptr + CELL_PARAMETER_STRING_LENGTH; upi_memcpy((_backup_u8_ *)&driverVer, ptr, sizeof(driverVer)/sizeof(_backup_u8_)); UG31_LOGI("[%s]: Read driver version = %d (%d)\n", __func__, (int)driverVer, UG31XX_DRIVER_VERSION); return (driverVer); }