示例#1
0
/*
 *  ======== PMI_initVoltageControl ========
 */
PMI_Status PMI_initVoltageControl(void)
{
    unsigned state;
    unsigned mask;
    unsigned temp;

    /* drive BUFF_OEn low to enable I2C clock on Beta EVM boards and later... */
    /*  a. setup PINMUX to select GPIO function */
    temp = REG(PINMUX6);
    REG(PINMUX6) = (temp & SELECT_6_7_4_MASK) | SELECT_GP2_FXN;

    /*  b. make sure GPIO module is enabled */
    PMI_getModuleState(0, GPIO_PSC, GPIO_LPSC, &state);
    if (state != GPIO_LPSC_ENABLE_STATE) {
        PMI_setModuleState(0, GPIO_PSC, GPIO_LPSC, GPIO_LPSC_ENABLE_STATE);
    }

    /*  c. setup GPIO direction and data register to drive GP2[6] low */ 
    REG(GPIO_DIR23) &= ~GPIO_BIT6;
    REG(GPIO_CLR_DATA23) |= GPIO_BIT6;

    /* now initialize I2C bus control... */
    PMI_initI2C();

    /* setup PMIC's  max SLEW rate for voltage transitions */
    PMI_writeI2C(PMIC_ADDR, DEFSLEW_REG, DEFSLEW_VALUE);

    /* setup PMIC's PGOODMASK to avoid resets during core voltage scaling */
    PMI_readI2C(PMIC_ADDR, PGOODMASK_REG, &mask);
    mask &= ~PGOODMASK_BITS;
    PMI_writeI2C(PMIC_ADDR, PGOODMASK_REG, mask);

    return (PMI_OK);
}
示例#2
0
/*
 *  ======== Power_releaseDependency ========
 *  Release a dependency that has been previously declared by
 *  Power_setDependency.
 *
 */
Power_Status Power_releaseDependency(Power_Resource resourceID)
{
    Power_Status status = Power_SOK;
    PMI_Status pmi = PMI_BUSY;
    Bool callStatus;
    UInt checks = 0;
    UInt state = 0;
    UInt refCount;
    UInt key;

    /* make sure RT has been configured ON */
    if (!ti_sysbios_family_c674_Power_trackResources) {
        status = Power_ENOTSUPPORTED;
    }

    /* validate resource ID is within range of pre-defined  resources */
    else if (resourceID >= Power_RSRC_END) {
        status = Power_EOUTOFRANGE;
    }

    /* make sure this resource is 'valid' for DSP control */
    else if ((ti_sysbios_family_c674_Power_database[resourceID].flags & VALID)
        == 0) {
        status = Power_EINVALIDVALUE;
    }

    /* else, check reference count, de-activate resource */
    else {

        /* disable scheduling */
        key = Swi_disable();

        /* read reference count */
        refCount = ti_sysbios_family_c674_Power_database[resourceID].count;

        /* if reference count already zero return an error code */
        if (refCount == 0) {
            status = Power_ETOOMANYCALLS;
        }
        /* else, if dependencies remain simply decrement count */
        else if (refCount > 1) {
            ti_sysbios_family_c674_Power_database[resourceID].count = 
                refCount - 1;
        }

        /* else, one remaining dependency, and it is being released... */
        else {

            /* if resource has special handler - call it now */
            if (ti_sysbios_family_c674_Power_database[resourceID].specialHandler != NULL) {
                callStatus = (*ti_sysbios_family_c674_Power_database[resourceID].specialHandler)
                    (resourceID, Power_RELEASE);
            }
            /* else, call to PMI to deactivate the resource */
            else {

                state = ti_sysbios_family_c674_Power_database[resourceID].inactiveState;

                /* optionally assert force for the transition */
                if ((ti_sysbios_family_c674_Power_database[resourceID].flags 
                    & FORCE_MODE) != 0) {
                    state = state | FORCE_BIT;
                }

                /* initiate transition to inactive state */
                PMI_setModuleState(0,
                (UInt)ti_sysbios_family_c674_Power_database[resourceID].pscNum,
                (UInt)ti_sysbios_family_c674_Power_database[resourceID].lpscNum,
                 state);

                /* now wait for the PSC transition to complete */
                while ((pmi == PMI_BUSY) && (checks++ < PSCWAITTHRESHOLD)) {
                    pmi = PMI_getModuleState(0,
                        (UInt)ti_sysbios_family_c674_Power_database[resourceID].pscNum,
                        (UInt)ti_sysbios_family_c674_Power_database[resourceID].lpscNum, &state);
                }

                /* check that transitioned to inactive state */
                if ((pmi == PMI_OK) &&
                   (state == (UInt)ti_sysbios_family_c674_Power_database[resourceID].inactiveState)) {
                    callStatus = TRUE;
                }
                else {
                    callStatus = FALSE;
                }
            }

            /* if returned status is good, set reference count to 0 */
            if (callStatus == TRUE) {
                ti_sysbios_family_c674_Power_database[resourceID].count = 0;
            }
            /* else, don't modify reference count, return failure code */
            else {
                status = Power_EFAIL;
            }
        }

        /* re-enable scheduling */
        Swi_restore(key);
    }

    return (status);
}