NvBool Pcf50626SetVoltage( NvOdmPmuDeviceHandle hDevice, NvU32 vddRail, NvU32 MilliVolts, NvU32* pSettleMicroSeconds) { NvU8 data = 0; NV_ASSERT(hDevice); NV_ASSERT(vddRail < PCF50626PmuSupply_Num); if (pcf50626SupplyInfoTable[vddRail].cap.OdmProtected == NV_TRUE) { NVODMPMU_PRINTF(("[NVODM PMU] Pcf50626SetVoltage Warning: The voltage is protected and can not be set: %d.\n", vddRail)); return NV_TRUE; } if ((MilliVolts == ODM_VOLTAGE_OFF) || ((MilliVolts <= pcf50626SupplyInfoTable[vddRail].cap.MaxMilliVolts) && (MilliVolts >= pcf50626SupplyInfoTable[vddRail].cap.MinMilliVolts))) { if (! Pcf50626WriteVoltageReg(hDevice, vddRail, MilliVolts, pSettleMicroSeconds)) return NV_FALSE; } else { NVODMPMU_PRINTF(("[NVODM OPMU] Pcf50626SetVoltage Error: The required voltage is not supported..\n")); return NV_FALSE; } if (vddRail == PCF50626PmuSupply_DCUD) { // VBUs rail is enabled bydefault, so no need to enable set voltage. // "Millivolts" field is used as Enable or disable VBUS GPIO if (MilliVolts == ODM_VOLTAGE_OFF) { data = 0x7; // all bits to low fixed 0 } else { data = 0x0; // default reset value high impedence state } if (!Pcf50626I2cWrite8(hDevice,PCF50626_GPIO5C1_ADDR, data)) return NV_FALSE; } return NV_TRUE; }
NvBool Pcf50626RtcAlarmIntEnable( NvOdmPmuDeviceHandle hDevice, NvBool Enable) { NvBool Status = NV_FALSE; NvU8 Mask; if ((Status = Pcf50626I2cRead8(hDevice, PCF50626_INT1M_ADDR, &Mask)) == NV_TRUE) { (Mask = Enable? (Mask & ~0x8):(Mask|0x8)); Status = Pcf50626I2cWrite8 (hDevice, PCF50626_INT1M_ADDR, Mask); } return Status; }
static NvBool Pcf50626AdcIn1Read(NvOdmPmuDeviceHandle hDevice, NvU32 *volt) { NvU32 timeout = 0; NvU8 dataS1 = 0; NvU8 dataS3 = 0; NV_ASSERT(hDevice); NV_ASSERT(volt); // Turn off GPIO7 if(! Pcf50626I2cWrite8(hDevice, PCF50626_GPIO7C1_ADDR, 0x0)) return NV_FALSE; //ADCC3 - Division sel if(! Pcf50626I2cWrite8(hDevice, PCF50626_ADCC3_ADDR, PCF50626_ADCC3_RESET)) return NV_FALSE; //ADCC1 - Resolustion, Mux Sel, Avg sel if(! Pcf50626I2cWrite8(hDevice, PCF50626_ADCC1_ADDR, 0x0C)) return NV_FALSE; // Start Converstion if(! Pcf50626I2cWrite8(hDevice, PCF50626_ADCC1_ADDR, 0x0D)) return NV_FALSE; // Wait for conversion NvOdmOsWaitUS(ADC_CONVERSION_DELAY_USEC); // make sure the conversion is completed, or timeout. while (timeout < ADC_CONVERSION_TIMEOUT_USEC) { if(! Pcf50626I2cRead8(hDevice, PCF50626_ADCS3_ADDR, &dataS3)) return NV_FALSE; if (dataS3 & 0x80) break; NvOdmOsWaitUS(ADC_CONVERSION_DELAY_USEC); timeout += ADC_CONVERSION_DELAY_USEC; } if (timeout >= ADC_CONVERSION_TIMEOUT_USEC) { NVODMPMU_PRINTF(("ADC conversion timeout.\n")); return NV_FALSE; } // read the conversion result if (!Pcf50626I2cRead8(hDevice, PCF50626_ADCS1_ADDR, &dataS1)) return NV_FALSE; // Get result *volt = (((NvU32)((dataS1 << 2) | (dataS3 & 0x03))) * ADC_CONVERSION_VOLTAGE_RANGE * ADC_CONVERSION_DIVIDOR) >> ADC_CONVERSION_PRECISION; return NV_TRUE; }