Kernel  |  4.1

下载     查看原文件
C++程序  |  240行  |  5.08 KB
#include "ddk750_help.h"
#include "ddk750_reg.h"
#include "ddk750_power.h"

void ddk750_setDPMS(DPMS_t state)
{
	unsigned int value;
	if(getChipType() == SM750LE){
		value = PEEK32(CRT_DISPLAY_CTRL);
		POKE32(CRT_DISPLAY_CTRL,FIELD_VALUE(value,CRT_DISPLAY_CTRL,DPMS,state));
	}else{
		value = PEEK32(SYSTEM_CTRL);
		value= FIELD_VALUE(value,SYSTEM_CTRL,DPMS,state);
		POKE32(SYSTEM_CTRL, value);
	}
}

unsigned int getPowerMode(void)
{
	if(getChipType() == SM750LE)
		return 0;
    return (FIELD_GET(PEEK32(POWER_MODE_CTRL), POWER_MODE_CTRL, MODE));
}


/*
 * SM50x can operate in one of three modes: 0, 1 or Sleep.
 * On hardware reset, power mode 0 is default.
 */
void setPowerMode(unsigned int powerMode)
{
    unsigned int control_value = 0;

    control_value = PEEK32(POWER_MODE_CTRL);

	if(getChipType() == SM750LE)
		return;

    switch (powerMode)
    {
        case POWER_MODE_CTRL_MODE_MODE0:
            control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, MODE0);
            break;

        case POWER_MODE_CTRL_MODE_MODE1:
            control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, MODE1);
            break;

        case POWER_MODE_CTRL_MODE_SLEEP:
            control_value = FIELD_SET(control_value, POWER_MODE_CTRL, MODE, SLEEP);
            break;

        default:
            break;
    }

    /* Set up other fields in Power Control Register */
    if (powerMode == POWER_MODE_CTRL_MODE_SLEEP)
    {
        control_value =
#ifdef VALIDATION_CHIP
            FIELD_SET(  control_value, POWER_MODE_CTRL, 336CLK, OFF) |
#endif
            FIELD_SET(  control_value, POWER_MODE_CTRL, OSC_INPUT,  OFF);
    }
    else
    {
        control_value =
#ifdef VALIDATION_CHIP
            FIELD_SET(  control_value, POWER_MODE_CTRL, 336CLK, ON) |
#endif
            FIELD_SET(  control_value, POWER_MODE_CTRL, OSC_INPUT,  ON);
    }

    /* Program new power mode. */
    POKE32(POWER_MODE_CTRL, control_value);
}

void setCurrentGate(unsigned int gate)
{
    unsigned int gate_reg;
    unsigned int mode;

    /* Get current power mode. */
    mode = getPowerMode();

    switch (mode)
    {
        case POWER_MODE_CTRL_MODE_MODE0:
            gate_reg = MODE0_GATE;
            break;

        case POWER_MODE_CTRL_MODE_MODE1:
            gate_reg = MODE1_GATE;
            break;

        default:
            gate_reg = MODE0_GATE;
            break;
    }
    POKE32(gate_reg, gate);
}



/*
 * This function enable/disable the 2D engine.
 */
void enable2DEngine(unsigned int enable)
{
    uint32_t gate;

    gate = PEEK32(CURRENT_GATE);
    if (enable)
    {
        gate = FIELD_SET(gate, CURRENT_GATE, DE,  ON);
        gate = FIELD_SET(gate, CURRENT_GATE, CSC, ON);
    }
    else
    {
        gate = FIELD_SET(gate, CURRENT_GATE, DE,  OFF);
        gate = FIELD_SET(gate, CURRENT_GATE, CSC, OFF);
    }

    setCurrentGate(gate);
}


/*
 * This function enable/disable the ZV Port.
 */
void enableZVPort(unsigned int enable)
{
    uint32_t gate;

    /* Enable ZV Port Gate */
    gate = PEEK32(CURRENT_GATE);
    if (enable)
    {
        gate = FIELD_SET(gate, CURRENT_GATE, ZVPORT, ON);
#if 1
        /* Using Software I2C */
        gate = FIELD_SET(gate, CURRENT_GATE, GPIO, ON);
#else
        /* Using Hardware I2C */
        gate = FIELD_SET(gate, CURRENT_GATE, I2C,    ON);
#endif
    }
    else
    {
        /* Disable ZV Port Gate. There is no way to know whether the GPIO pins are being used
           or not. Therefore, do not disable the GPIO gate. */
        gate = FIELD_SET(gate, CURRENT_GATE, ZVPORT, OFF);
    }

    setCurrentGate(gate);
}


void enableSSP(unsigned int enable)
{
    uint32_t gate;

    /* Enable SSP Gate */
    gate = PEEK32(CURRENT_GATE);
    if (enable)
        gate = FIELD_SET(gate, CURRENT_GATE, SSP, ON);
    else
        gate = FIELD_SET(gate, CURRENT_GATE, SSP, OFF);

    setCurrentGate(gate);
}

void enableDMA(unsigned int enable)
{
    uint32_t gate;

    /* Enable DMA Gate */
    gate = PEEK32(CURRENT_GATE);
    if (enable)
        gate = FIELD_SET(gate, CURRENT_GATE, DMA, ON);
    else
        gate = FIELD_SET(gate, CURRENT_GATE, DMA, OFF);

    setCurrentGate(gate);
}

/*
 * This function enable/disable the GPIO Engine
 */
void enableGPIO(unsigned int enable)
{
    uint32_t gate;

    /* Enable GPIO Gate */
    gate = PEEK32(CURRENT_GATE);
    if (enable)
        gate = FIELD_SET(gate, CURRENT_GATE, GPIO, ON);
    else
        gate = FIELD_SET(gate, CURRENT_GATE, GPIO, OFF);

    setCurrentGate(gate);
}

/*
 * This function enable/disable the PWM Engine
 */
void enablePWM(unsigned int enable)
{
    uint32_t gate;

    /* Enable PWM Gate */
    gate = PEEK32(CURRENT_GATE);
    if (enable)
        gate = FIELD_SET(gate, CURRENT_GATE, PWM, ON);
    else
        gate = FIELD_SET(gate, CURRENT_GATE, PWM, OFF);

    setCurrentGate(gate);
}

/*
 * This function enable/disable the I2C Engine
 */
void enableI2C(unsigned int enable)
{
    uint32_t gate;

    /* Enable I2C Gate */
    gate = PEEK32(CURRENT_GATE);
    if (enable)
        gate = FIELD_SET(gate, CURRENT_GATE, I2C, ON);
    else
        gate = FIELD_SET(gate, CURRENT_GATE, I2C, OFF);

    setCurrentGate(gate);
}