NvBool Max8907bI2cRead8(
   NvOdmPmuDeviceHandle hDevice,
   NvU8 Addr,
   NvU8 *Data)
{
    NvU32 i;
    NvU8 ReadBuffer = 0;
    NvOdmI2cStatus  status = NvOdmI2cStatus_Success;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;
    NvOdmI2cTransactionInfo TransactionInfo[2];

    for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++)
    {
        NvU32 TransactionCount = 0;
        // Write the PMU offset
        ReadBuffer = Addr & 0xFF;

        TransactionInfo[TransactionCount].Address = hPmu->DeviceAddr;
        TransactionInfo[TransactionCount].Buf = &ReadBuffer;
        TransactionInfo[TransactionCount].Flags =
            NVODM_I2C_IS_WRITE | NVODM_I2C_USE_REPEATED_START;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        TransactionInfo[TransactionCount].Address = (hPmu->DeviceAddr | 0x1);
        TransactionInfo[TransactionCount].Buf = &ReadBuffer;
        TransactionInfo[TransactionCount].Flags = 0;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        // Read data from PMU at the specified offset
        status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0],
            TransactionCount, MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE);

        if (status == NvOdmI2cStatus_Success)
        {
            *Data = ReadBuffer;
            return NV_TRUE;
        }
    }

    // Transaction Error
    switch (status)
    {
        case NvOdmI2cStatus_Timeout:
            NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: Timeout\n"));
            break;
        case NvOdmI2cStatus_SlaveNotFound:
        default:
            NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: SlaveNotFound\n"));
            break;
    }
    return NV_FALSE;
}
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 Max8907bRtcI2cWriteTime(
   NvOdmPmuDeviceHandle hDevice,
   NvU8 Addr,
   NvU32 Data)
{
    NvU32 i;
    NvU8 WriteBuffer[5];
    NvOdmI2cStatus  status = NvOdmI2cStatus_Success;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;
    NvOdmI2cTransactionInfo TransactionInfo;

    NVODMPMU_PRINTF(("\n RTC I2C write: Addr=0x%x, Data=0x%x ", Addr, Data));
    for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++)
    {
        WriteBuffer[0] = (NvU8)(Addr & 0xFF);
        WriteBuffer[1] = (NvU8)((Data >> 24) & 0xFF);
        WriteBuffer[2] = (NvU8)((Data >> 16) & 0xFF);
        WriteBuffer[3] = (NvU8)((Data >>  8) & 0xFF);
        WriteBuffer[4] = (NvU8)(Data & 0xFF);

        TransactionInfo.Address = MAX8907B_RTC_SLAVE_ADDR;
        TransactionInfo.Buf = &WriteBuffer[0];
        TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
        TransactionInfo.NumBytes = 5;

        status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1,
            MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE);

        if (status == NvOdmI2cStatus_Success)
            return NV_TRUE;
    }

    // Transaction Error
    switch (status)
    {
        case NvOdmI2cStatus_Timeout:
            NVODMPMU_PRINTF(("Max8907bRtcI2cWrite32 Failed: Timeout\n"));
            break;
        case NvOdmI2cStatus_SlaveNotFound:
        default:
            NVODMPMU_PRINTF(("Max8907bRtcI2cWrite32 Failed: SlaveNotFound\n"));
            break;
    }
    return NV_FALSE;
}
NvBool Pcf50626I2cRead32(
   NvOdmPmuDeviceHandle hDevice,
   NvU8 Addr,
   NvU32 *Data)
{
    NvU8 ReadBuffer[5];
    NvOdmI2cStatus  status = NvOdmI2cStatus_Success;    
    Pcf50626PrivData *hPmu = (Pcf50626PrivData*)hDevice->pPrivate;
    NvOdmI2cTransactionInfo TransactionInfo[2];


    ReadBuffer[0] = Addr & 0xFF;

    TransactionInfo[0].Address = hPmu->DeviceAddr;
    TransactionInfo[0].Buf = &ReadBuffer[0];
    TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo[0].NumBytes = 1;

    TransactionInfo[1].Address = (hPmu->DeviceAddr | 0x1);
    TransactionInfo[1].Buf = &ReadBuffer[0];
    TransactionInfo[1].Flags = 0;
    TransactionInfo[1].NumBytes = 4;

    status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], 2,
                                        PCF506226_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status != NvOdmI2cStatus_Success)
    {
        switch (status)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("NvOdmPmuI2cRead32 Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("NvOdmPmuI2cRead32 Failed: SlaveNotFound\n"));
                break;             
        }
        return NV_FALSE;
    }

    *Data = (ReadBuffer[0] << 24) | (ReadBuffer[1] << 16) | 
            (ReadBuffer[2] << 8) | ReadBuffer[3];

    return NV_TRUE;
}
NvBool Tps6586xI2cRead32(
    NvOdmPmuDeviceHandle hPmu,
    NvU32 Addr,
    NvU32 *Data)
{
    NvU8 ReadBuffer[5];
    NvOdmI2cStatus status = NvOdmI2cStatus_Success;
    NvOdmI2cTransactionInfo TransactionInfo[2];

    // Write the PMU offset
    ReadBuffer[0] = Addr & 0xFF;

    TransactionInfo[0].Address = ((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->DeviceAddr;
    TransactionInfo[0].Buf = &ReadBuffer[0];
    TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo[0].NumBytes = 1;

    TransactionInfo[1].Address = (((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->DeviceAddr | 0x1);
    TransactionInfo[1].Buf = &ReadBuffer[0];
    TransactionInfo[1].Flags = 0;
    TransactionInfo[1].NumBytes = 4;

    // Read data from PMU at the specified offset
    status = NvOdmI2cTransaction(((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->hOdmI2C, &TransactionInfo[0], 2,
                                 TPS6586x_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status != NvOdmI2cStatus_Success)
    {
        switch (status)
        {
        case NvOdmI2cStatus_Timeout:
            NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: Timeout\n"));
            break;
        case NvOdmI2cStatus_SlaveNotFound:
        default:
            NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: SlaveNotFound\n"));
            break;
        }
        return NV_FALSE;
    }

    *Data = (ReadBuffer[0] << 24) | (ReadBuffer[1] << 16) |
            (ReadBuffer[2] <<  8) |  ReadBuffer[3];
    return NV_TRUE;
}
NvBool Pcf50626I2cRead8(
    NvOdmPmuDeviceHandle hDevice,
    NvU8 Addr,
    NvU8 *Data)
{
    NvU8 ReadBuffer = 0;
    NvOdmI2cStatus  status = NvOdmI2cStatus_Success;    
    Pcf50626PrivData *hPmu = (Pcf50626PrivData*)hDevice->pPrivate;
    NvOdmI2cTransactionInfo TransactionInfo[2];

    // Write the PMU offset
    ReadBuffer = Addr & 0xFF;

    TransactionInfo[0].Address = hPmu->DeviceAddr;
    TransactionInfo[0].Buf = &ReadBuffer;
    TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo[0].NumBytes = 1;    
    TransactionInfo[1].Address = (hPmu->DeviceAddr | 0x1);
    TransactionInfo[1].Buf = &ReadBuffer;
    TransactionInfo[1].Flags = 0;
    TransactionInfo[1].NumBytes = 1;

    // Read data from PMU at the specified offset
    status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], 2, 
                                    PCF506226_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status != NvOdmI2cStatus_Success)
    {
        switch (status)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("NvOdmPmuI2cRead8 Failed: SlaveNotFound\n"));
                break;             
        }
        return NV_FALSE;
    }  

    *Data = ReadBuffer;
    return NV_TRUE;
}
示例#7
0
/* --- Read/Write40 for reading/writing RTC */

#if 0	/* PMU does not support i2c multibyte write */
NvBool Tps6586xI2cWrite40(
    NvOdmPmuDeviceHandle hPmu,
    NvU32 Addr,
    NvU8 *Data)
{
    NvU8 WriteBuffer[6];
    NvOdmI2cStatus status = NvOdmI2cStatus_Success;
    NvOdmI2cTransactionInfo TransactionInfo = {0};

    WriteBuffer[0] = (NvU8)(Addr & 0xFF);
    WriteBuffer[1] = Data[0];
    WriteBuffer[2] = Data[1];
    WriteBuffer[3] = Data[2];
    WriteBuffer[4] = Data[3];
    WriteBuffer[5] = Data[4];

    TransactionInfo.Address = ((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->DeviceAddr;
    TransactionInfo.Buf = &WriteBuffer[0];
    TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo.NumBytes = 6;

    status = NvOdmI2cTransaction(((NvOdmPmuDeviceTPS *)(hPmu->pPrivate))->hOdmI2C, &TransactionInfo, 1,
                        TPS6586x_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status == NvOdmI2cStatus_Success)
    {
        return NV_TRUE;
    }
    else
    {
        switch (status)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("NvOdmPmuI2cWrite40 Failed: Timeout\n"));
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("NvOdmPmuI2cWrite40 Failed: SlaveNotFound\n"));
                break;
        }
        return NV_FALSE;
    }
}
NvBool MIC2826I2cRead8(
    NvOdmPmuDeviceHandle hDevice,
    NvU8 Addr,
    NvU8 *Data)
{
    NvU8 ReadBuffer = 0;
    NvOdmI2cStatus status = NvOdmI2cStatus_Success;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;    
    NvOdmI2cTransactionInfo TransactionInfo[2];

    ReadBuffer = Addr & 0xFF;

    TransactionInfo[0].Address = MIC2826_SLAVE_ADDR;
    TransactionInfo[0].Buf = &ReadBuffer;
    TransactionInfo[0].Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo[0].NumBytes = 1;    
    TransactionInfo[1].Address = (MIC2826_SLAVE_ADDR | 0x1);
    TransactionInfo[1].Buf = &ReadBuffer;
    TransactionInfo[1].Flags = 0;
    TransactionInfo[1].NumBytes = 1;

    status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0], 2, 
                                    MIC2826_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status != NvOdmI2cStatus_Success)
    {
        switch (status)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("NvOdmPmuOWI2cRead8 Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("NvOdmPmuOWI2cRead8 Failed: SlaveNotFound\n"));
                break;             
        }
        return NV_FALSE;
    }  

    *Data = ReadBuffer;
    return NV_TRUE;
}
NvBool Max8907bI2cWrite8(
   NvOdmPmuDeviceHandle hDevice,
   NvU8 Addr,
   NvU8 Data)
{
    NvU32 i;
    NvU8 WriteBuffer[2];
    NvOdmI2cTransactionInfo TransactionInfo;
    NvOdmI2cStatus status = NvOdmI2cStatus_Success;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;

    for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++)
    {
        WriteBuffer[0] = Addr & 0xFF;   // PMU offset
        WriteBuffer[1] = Data & 0xFF;   // written data

        TransactionInfo.Address = hPmu->DeviceAddr;
        TransactionInfo.Buf = &WriteBuffer[0];
        TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
        TransactionInfo.NumBytes = 2;

        status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1,
            MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE);

        if (status == NvOdmI2cStatus_Success)
            return NV_TRUE;
    }

    // Transaction Error
    switch (status)
    {
        case NvOdmI2cStatus_Timeout:
            NVODMPMU_PRINTF(("NvOdmPmuI2cWrite8 Failed: Timeout\n"));
            break;
        case NvOdmI2cStatus_SlaveNotFound:
        default:
            NVODMPMU_PRINTF(("NvOdmPmuI2cWrite8 Failed: SlaveNotFound\n"));
            break;
    }
    return NV_FALSE;
}
NvBool Pcf50626I2cWrite32(
    NvOdmPmuDeviceHandle hDevice,
    NvU8 Addr,
    NvU32 Data)
{
    NvU8 WriteBuffer[5];
    NvOdmI2cStatus  status = NvOdmI2cStatus_Success;    
    Pcf50626PrivData *hPmu = (Pcf50626PrivData*)hDevice->pPrivate;
    NvOdmI2cTransactionInfo TransactionInfo;

    WriteBuffer[0] = (NvU8)(Addr & 0xFF);  
    WriteBuffer[1] = (NvU8)((Data >> 24) & 0xFF);
    WriteBuffer[2] = (NvU8)((Data >> 16) & 0xFF);
    WriteBuffer[3] = (NvU8)((Data >>  8) & 0xFF);
    WriteBuffer[4] = (NvU8)(Data & 0xFF);

    TransactionInfo.Address = hPmu->DeviceAddr;
    TransactionInfo.Buf = &WriteBuffer[0];
    TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo.NumBytes = 5;

    status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1,
                                        PCF506226_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status != NvOdmI2cStatus_Success)
    {
        switch (status)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("NvOdmPmuI2cWrite32 Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("NvOdmPmuI2cWrite32 Failed: SlaveNotFound\n"));
                break;             
        }
        return NV_FALSE;
    }

    return NV_TRUE;
}
NvBool MIC2826I2cWrite8(
    NvOdmPmuDeviceHandle hDevice,
    NvU8 Addr,
    NvU8 Data)
{  
    NvU8 WriteBuffer[2];
    NvOdmI2cStatus status = NvOdmI2cStatus_Success;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;    
    NvOdmI2cTransactionInfo TransactionInfo;

    WriteBuffer[0] = Addr & 0xFF;   
    WriteBuffer[1] = Data & 0xFF;   // written data

    TransactionInfo.Address = MIC2826_SLAVE_ADDR;
    TransactionInfo.Buf = &WriteBuffer[0];
    TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo.NumBytes = 2;

    status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1, 
                        MIC2826_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
    if (status == NvOdmI2cStatus_Success)
    {
        return NV_TRUE;
    }
    else
    {
        switch (status)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("NvOdmPmuOWI2cWrite8 Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("NvOdmPmuOWI2cWrite8 Failed: SlaveNotFound\n"));
                break;             
        }
        return NV_FALSE;
    }    
}
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;
}
示例#13
0
NvBool
Tca6416ConfigPortPin(
    NvOdmPmuDeviceHandle hDevice,
    NvU32 PortNo,
    NvU32 PinNo,
    GpioPinMode Mode)
{
    NvU8 WriteBuffer[2];
    NvOdmI2cStatus Error;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;

    NvOdmI2cTransactionInfo TransactionInfo;
    static NvU8  ConfigPort1Val = 0xFF; //  set to default value
    static NvU8  ConfigPort2Val = 0xFF; //  set to default value

    if (PortNo == TCA6416_PORT_0)
    {
        WriteBuffer[0] =  TCA6416_CONFIG_PORT_0 & 0xFF;

        if (Mode == GpioPinMode_Output)
        {
            WriteBuffer[1] = ((ConfigPort1Val & (0xFF & (~(1 << PinNo)))) | (0x0 << PinNo));
        } else if (Mode == GpioPinMode_InputData)
        {
            WriteBuffer[1] = ((ConfigPort1Val & (0xFF & (~(1 << PinNo)))) | (0x1 << PinNo));
        }
        ConfigPort1Val = WriteBuffer[1];
    }else if (PortNo == TCA6416_PORT_1)
    {
        WriteBuffer[0] = TCA6416_CONFIG_PORT_1 & 0xFF;

        if (Mode == GpioPinMode_Output)
        {
            WriteBuffer[1] = (ConfigPort2Val & (0xFF & (~(1 << PinNo))));
        } else if (Mode == GpioPinMode_InputData)
        {
            WriteBuffer[1] = ((ConfigPort2Val & (0xFF & (~(1 << PinNo)))) | (0x1 << PinNo));
        }
        ConfigPort2Val = WriteBuffer[1];
    }

    TransactionInfo.Address = TCA6416_SLAVE_ADDR;
    TransactionInfo.Buf = WriteBuffer;
    TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo.NumBytes = 2;

    // write the pmu Offset (from where data gpio need to be set)
    Error = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1,
                            TCA6416_I2C_SPEED_KHZ, NV_WAIT_INFINITE);

    if (Error == NvOdmI2cStatus_Success)
    {
        return NV_TRUE;
    }
    else
    {
        switch (Error)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("Tca6416ConfigPortPin Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("Tca6416ConfigPortPin Failed: SlaveNotFound\n"));
                break;
        }
        return NV_FALSE;
    }
}
示例#14
0
NvBool
Tca6416WritePortPin(
    NvOdmPmuDeviceHandle hDevice,
    NvU32 PortNo,
    NvU32 PinNo,
    GpioPinState data)
{
    NvOdmI2cTransactionInfo TransactionInfo;
    NvOdmI2cStatus Error;
    NvU8 WriteBuffer[2];
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;

    static NvU8  OutPut1Val = 0xFF; //  set to default value
    static NvU8  OutPut2Val = 0xFF; //  set to default value


    /* set the command byte */
    if (PortNo == TCA6416_PORT_0)
    {
        WriteBuffer[0] = TCA6416_OUTPUT_PORT_0 & 0xFF;
        // Set the data 
        WriteBuffer[1] =  ((OutPut1Val & (0xFF & (~(1 << PinNo)))) | (data << PinNo));

        OutPut1Val = WriteBuffer[1];

    } else if (PortNo == TCA6416_PORT_1)
    {
        WriteBuffer[0] = TCA6416_OUTPUT_PORT_1 & 0xFF;
        // Set the data
        WriteBuffer[1] =  ((OutPut2Val & (0xFF & (~(1 << PinNo)))) | (data << PinNo));

        OutPut2Val = WriteBuffer[1];
    }

    TransactionInfo.Address = TCA6416_SLAVE_ADDR;
    TransactionInfo.Buf = WriteBuffer;
    TransactionInfo.Flags = NVODM_I2C_IS_WRITE;
    TransactionInfo.NumBytes = 2;

    Error = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo, 1,
                    TCA6416_I2C_SPEED_KHZ, NV_WAIT_INFINITE);

    if (Error == NvOdmI2cStatus_Success)
    {
        return NV_TRUE;
    }
    else
    {
        switch (Error)
        {
            case NvOdmI2cStatus_Timeout:
                NVODMPMU_PRINTF(("Tca6416I2cWrite8 Failed: Timeout\n")); 
                break;
             case NvOdmI2cStatus_SlaveNotFound:
             default:
                NVODMPMU_PRINTF(("Tca6416I2cWrite8 Failed: SlaveNotFound\n"));
                break;
        }
        return NV_FALSE;
    }
}
示例#15
0
NvBool Max8907bRtcI2cReadTime(
   NvOdmPmuDeviceHandle hDevice,
   NvU8 Addr,
   NvU32 *Data)
{
    NvU32 i;
    NvU8 ReadBuffer[4];
    NvOdmI2cStatus  status = NvOdmI2cStatus_Success;
    Max8907bPrivData *hPmu = (Max8907bPrivData*)hDevice->pPrivate;
    NvOdmI2cTransactionInfo TransactionInfo[MAX_TRANSACTION_COUNT];

    NVODMPMU_PRINTF(("\n RTC I2C read: Addr=0x%x ", Addr));
    for (i = 0; i < MAX8907B_I2C_RETRY_CNT; i++)
    {
        NvU32 TransactionCount = 0;
        ReadBuffer[0] = Addr & 0xFF;

        TransactionInfo[TransactionCount].Address = MAX8907B_RTC_SLAVE_ADDR;
        TransactionInfo[TransactionCount].Buf = &ReadBuffer[0];
        TransactionInfo[TransactionCount].Flags =
            NVODM_I2C_IS_WRITE | NVODM_I2C_USE_REPEATED_START;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        // Seconds / day
        if (TransactionCount >= MAX_TRANSACTION_COUNT)
            return NV_FALSE;
        TransactionInfo[TransactionCount].Address =
            (MAX8907B_RTC_SLAVE_ADDR | 0x1);
        TransactionInfo[TransactionCount].Buf = &ReadBuffer[0];
        TransactionInfo[TransactionCount].Flags = 0;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        // Minutes / month
        if (TransactionCount >= MAX_TRANSACTION_COUNT)
            return NV_FALSE;
        TransactionInfo[TransactionCount].Address =
            (MAX8907B_RTC_SLAVE_ADDR | 0x1);
        TransactionInfo[TransactionCount].Buf = &ReadBuffer[1];
        TransactionInfo[TransactionCount].Flags = 0;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        // Hours / YY1
        if (TransactionCount >= MAX_TRANSACTION_COUNT)
            return NV_FALSE;
        TransactionInfo[TransactionCount].Address =
            (MAX8907B_RTC_SLAVE_ADDR | 0x1);
        TransactionInfo[TransactionCount].Buf = &ReadBuffer[2];
        TransactionInfo[TransactionCount].Flags = 0;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        // Weekday / YY2
        if (TransactionCount >= MAX_TRANSACTION_COUNT)
            return NV_FALSE;
        TransactionInfo[TransactionCount].Address =
            (MAX8907B_RTC_SLAVE_ADDR | 0x1);
        TransactionInfo[TransactionCount].Buf = &ReadBuffer[3];
        TransactionInfo[TransactionCount].Flags = 0;
        TransactionInfo[TransactionCount++].NumBytes = 1;

        status = NvOdmI2cTransaction(hPmu->hOdmI2C, &TransactionInfo[0],
            TransactionCount, MAX8907B_I2C_SPEED_KHZ, NV_WAIT_INFINITE);
        if (status == NvOdmI2cStatus_Success)
        {
            *Data = (ReadBuffer[0] << 24) | (ReadBuffer[1] << 16) |
                    (ReadBuffer[2] << 8) | ReadBuffer[3];

            return NV_TRUE;
        }
    }

    // Transaction Error
    switch (status)
    {
        case NvOdmI2cStatus_Timeout:
            NVODMPMU_PRINTF(("Max8907bRtcI2cRead32 Failed: Timeout\n"));
            break;
        case NvOdmI2cStatus_SlaveNotFound:
        default:
            NVODMPMU_PRINTF(("Max8907bRtcI2cRead32 Failed: SlaveNotFound\n"));
            break;
    }
    return NV_FALSE;
}
NvBool Pcf50626Setup(NvOdmPmuDeviceHandle hDevice)
{
    NvOdmIoModule I2cModule = NvOdmIoModule_I2c;
    NvU32  I2cInstance = 0;
    NvU32  I2cAddress  = 0;    
    NvU32  i           = 0;
    NvBool status      = NV_FALSE;
    
    const NvOdmPeripheralConnectivity *pConnectivity = 
                           NvOdmPeripheralGetGuid(PMUGUID);
    
    NV_ASSERT(hDevice);

    
    pPrivData = (Pcf50626PrivData*) NvOdmOsAlloc(sizeof(Pcf50626PrivData));
    if (pPrivData == NULL)
    {
        NVODMPMU_PRINTF(("Error Allocating Pcf50626PrivData. \n"));
        return NV_FALSE;
    }
    NvOdmOsMemset(pPrivData, 0, sizeof(Pcf50626PrivData));
    hDevice->pPrivate = pPrivData;

    ((Pcf50626PrivData*)hDevice->pPrivate)->supplyRefCntTable = NvOdmOsAlloc(sizeof(NvU32) * PCF50626PmuSupply_Num);
    if (((Pcf50626PrivData*)hDevice->pPrivate)->supplyRefCntTable == NULL)
    {     
        NVODMPMU_PRINTF(("Error Allocating RefCntTable. \n"));
        goto fail;
    }
        
    // memset
    for (i = 0; i < PCF50626PmuSupply_Num; i++)
    {
        ((Pcf50626PrivData*)hDevice->pPrivate)->supplyRefCntTable[i] = 0;
    }


    if (pConnectivity != NULL) // PMU is in database
    {        
        for (i = 0; i < pConnectivity->NumAddress; i ++)
        {
            if (pConnectivity->AddressList[i].Interface == NvOdmIoModule_I2c_Pmu)
            {
                I2cModule   = NvOdmIoModule_I2c_Pmu;
                I2cInstance = pConnectivity->AddressList[i].Instance;
                I2cAddress  = pConnectivity->AddressList[i].Address;
                break;
            }
        }

        NV_ASSERT(I2cModule  == NvOdmIoModule_I2c_Pmu);
        NV_ASSERT(I2cAddress != 0);

        ((Pcf50626PrivData*)hDevice->pPrivate)->hOdmI2C = NvOdmI2cOpen(I2cModule, I2cInstance);
        if (!((Pcf50626PrivData*)hDevice->pPrivate)->hOdmI2C)
        {
            NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Error Open I2C device. \n"));     
            NVODMPMU_PRINTF(("[NVODM PMU]Please check PMU device I2C settings. \n"));  
            goto fail;        
        }
        
        ((Pcf50626PrivData*)hDevice->pPrivate)->DeviceAddr = I2cAddress;
        ((Pcf50626PrivData*)hDevice->pPrivate)->hOdmPmuSevice = NvOdmServicesPmuOpen();
        if (!((Pcf50626PrivData*)hDevice->pPrivate)->hOdmPmuSevice)
        {
            NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Error Open PMU Odm service. \n"));
            goto fail;        
        }
    }   
    else
    {
        // if PMU is not presented in the database, then the platform is PMU-less.
        NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: The system did not doscover PMU fromthe data base. \n"));     
        NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: If this is not intended, please check the peripheral database for PMU settings. \n"));     
        goto fail;
    }
    
    if (!Pcf50626BatteryChargerSetup(hDevice))
    {
        NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626BatteryChargerSetup() failed. \n"));
        goto fail;
    }

    //Check battery presence
    if (!Pcf50626BatteryChargerCBCMainBatt(hDevice,&((Pcf50626PrivData*)hDevice->pPrivate)->battPresence))
    {
        NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626BatteryChargerCBCMainBatt() failed. \n"));
        goto fail;
    }
    
    // The interrupt assumes not supported until pcf50626InterruptHandler() is called. 
    ((Pcf50626PrivData*)hDevice->pPrivate)->pmuInterruptSupported = NV_FALSE;

    // setup the interrupt any way.
    if (!Pcf50626SetupInterrupt(hDevice, &((Pcf50626PrivData*)hDevice->pPrivate)->pmuStatus))
    {
        NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626SetupInterrupt() failed. \n"));
        goto fail;
    }

    // Check battery Fullness
    if (((Pcf50626PrivData*)hDevice->pPrivate)->battPresence == NV_TRUE)
    {   
        if (!Pcf50626BatteryChargerCBCBattFul(hDevice,&status))
        {
            NVODMPMU_PRINTF(("[NVODM PMU]Pcf50626Setup: Pcf50626BatteryChargerCBCBattFul() failed. \n"));
            goto fail;
        }

        ((Pcf50626PrivData*)hDevice->pPrivate)->pmuStatus.batFull = status;
    }
    else
    {
        ((Pcf50626PrivData*)hDevice->pPrivate)->pmuStatus.batFull = NV_FALSE;
    }

    return NV_TRUE;

fail:
    Pcf50626Release(hDevice);
    return NV_FALSE;
    
    
}