📄 xllp_dvm.c
字号:
#include "xllp_dvm.h"
/******************************************************************************
XDP_DOC_HDR_END
Function Name: XllpDvmInit(P_XLLP_PWRMGR_T v_pPmgrReg, P_XLLP_CLKMGR_T v_pClkReg)
Description: Enable I2C bus, and configure
Input Arguments: P_XLLP_CLOCK_T P_XLLP_PWRMGR_T
Output Arguments:
None
return:
true
false
XLLP_DOC_HDR_END
*******************************************************************************/
void XllpDvmInit(P_XLLP_PWRMGR_T v_pPmgrReg, P_XLLP_CLKMGR_T v_pClkReg, P_XLLP_GPIO_T gpio)
{
v_pClkReg->cken |= XLLP_CLKEN_PWRI2C;
v_pClkReg->cken |= XLLP_CLKEN_I2C;
v_pPmgrReg->PCFR |= XLLP_PCFR_PI2C_EN; //unncessary for XLLP_PCFR_SYSEN_EN
gpio->GPDR3 |= (XLLP_GPIO_BIT_SCL | XLLP_GPIO_BIT_SDA);
gpio->GAFR3_U |= ( XLLP_GPIO_AF_BIT_SCL | XLLP_GPIO_AF_BIT_SDA);
}
/******************************************************************************
XDP_DOC_HDR_END
Function Name: XLLPGetCurrentFreqSetting( )
Description: return current frequency setting
Input Arguments: P_XLLP_CLOCK_T
Output Arguments:
None
return:
XLLP_FREQ_PARAM
XLLP_DOC_HDR_END
*******************************************************************************/
XLLP_FREQ_PARAM XLLPGetCurrentFreqSetting(volatile XLLP_CLKMGR_T *v_pClkReg)
{
XLLP_FREQ_PARAM freq_status;
XLLP_UINT32_T CLKCFGValue = 0;
XLLP_UINT32_T LMulti;
XLLP_UINT32_T NMulti;
CLKCFGValue = XllpXSC1ReadCLKCFG();
freq_status.turbo_mode = (CLKCFGValue & XLLP_CLKCFG_T);
freq_status.fastbus_mode = (CLKCFGValue & XLLP_CLKCFG_B) >>3;
LMulti = v_pClkReg->ccsr & XLLP_CCCR_L;
NMulti = ((v_pClkReg->ccsr & XLLP_CCCR_2N)>>7);
if (freq_status.turbo_mode == 1)
freq_status.frequency = (PRIMARY_CLOCK_FREQ * LMulti * NMulti)/2;
else
freq_status.frequency = (PRIMARY_CLOCK_FREQ * LMulti);
//read coprocessor
return freq_status;
}
/******************************************************************************
XDP_DOC_HDR_END
Function Name: XLLPSetCoreRunFrequency(P_XLLP_CLOCK_T, XLLP_FREQ_PARAM)
Description: Set the run mode corfrequency
Input Arguments: P_XLLP_CLOCK_T P_XLLP_PWRMGR_T
Output Arguments:
None
return:
true
false
XLLP_DOC_HDR_END
*******************************************************************************/
XLLP_BOOL_T XLLPSetCoreRunFrequency(P_XLLP_CLKMGR_T v_pClkReg, XLLP_FREQ_PARAM freq_param)
{
//set up the new frequency mulitipliers, N and L
XLLP_UINT32_T newCLKCFGValue = 0;
XLLP_UINT32_T CLKCFGValue = 0;
XLLP_UINT32_T Int_num;
XLLP_UINT32_T LMulti, NMulti;
LMulti = freq_param.frequency / PRIMARY_CLOCK_FREQ;
NMulti = 2; //run mode N=2
v_pClkReg->cccr = (NMulti<<7) | LMulti;
newCLKCFGValue =(XLLP_CLKCFG_F | (freq_param.fastbus_mode<<3) );
Int_num = XllpIntcDisableInts();
XllpXSC1FreqChange(newCLKCFGValue);
XllpIntcRestoreInts(Int_num);
return XLLP_TRUE;
}
/******************************************************************************
XDP_DOC_HDR_END
Function Name: XLLPSetCoreVoltage(P_XLLP_I2C_T v_pI2CReg)
Description: Set the voltage through I2C
Input Arguments: P_XLLP_I2C_T
Output Arguments:
None
return:
NONE
XLLP_DOC_HDR_END
*******************************************************************************/
void XllpSetCoreVoltage(P_XLLP_I2C_T v_pI2CReg, XLLP_UINT32_T dacValue)
{
// lpWriteDebugStringFunc(TEXT("SetCoreVoltage...\r\n"));
v_pI2CReg->ISAR = 0x0; // Set Slave address
v_pI2CReg->ICR = 0x0; // Clear interrupts in ICR
v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA); // Enable I2C unit, and enable clock output
v_pI2CReg->IDBR = 0x40; // Set D/A's slave address and enable write mode
v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_START | XLLP_ICR_TB); // Send START and then TRANSMIT the byte.
while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
v_pI2CReg->IDBR = 0x0; // Command
v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_TB); // Clear START, STOP, set TB
while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
v_pI2CReg->IDBR = dacValue & 0x000000FF; // LSB
// EdbgOutputDebugString("Enters here - LSB I2C->IDBR = %x\r\n",I2C->IDBR);
v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_TB); // Clear START, STOP, set TB
while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
v_pI2CReg->IDBR = (dacValue & 0x0000FF00) >> 8; // MSB
// EdbgOutputDebugString("Enters here - MSB I2C->IDBR = %x\r\n",I2C->IDBR);
v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_TB); // Clear START, STOP, set TB
while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
v_pI2CReg->ICR = (XLLP_ICR_UIE | XLLP_ICR_SCLEA | XLLP_ICR_STOP | XLLP_ICR_TB);
while((v_pI2CReg->ISR & XLLP_ISR_ITE) != XLLP_ISR_ITE); // Wait for ITE to go high
v_pI2CReg->ISR = XLLP_ISR_ITE; // Write the ITE bit to clear it.
// EdbgOutputDebugString("Enters here - I2C->ISR = %x\r\n",I2C->ISR);
}
/******************************************************************************
XDP_DOC_HDR_END
Function Name: XllpVMSetVoltage(DWORD DACValue, P_XLLP_PWRMGR_T v_pPmgrReg)
Description: Set the voltage through I2C
Input Arguments: P_XLLP_I2C_T
Output Arguments:
None
return:
NONE
XLLP_DOC_HDR_END
*******************************************************************************/
void XllpVMSetVoltage(XLLP_UINT32_T DACValue, P_XLLP_PWRMGR_T v_pPmgrReg)
{
XLLP_UINT32_T dataArray[3];
XLLP_UINT32_T start = 0, end = 0;
XLLP_UINT32_T i = 0;
dataArray[0] = 0; //Command 0
dataArray[1] = (DACValue & 0x000000FF);
dataArray[2] = (DACValue & 0x0000FF00)>>8;
v_pPmgrReg->PVCR = 0;
v_pPmgrReg->PCFR &= ~XLLP_PCFR_FVC; // ~PCFR_FVC;
v_pPmgrReg->PVCR &=0xFFFFF07F; //no delay is necessary
v_pPmgrReg->PVCR &= 0xFFFFFF80; //clear slave address
v_pPmgrReg->PVCR |= VOLTAGE_REGULATOR_ADDRESS; //set slave address
v_pPmgrReg->PVCR &= 0xFE0FFFFF; //clear read pointer 0
//Clear SQC DCE and MBC
for(i=0; i<32; i++)
{
v_pPmgrReg->PCMDn[i] &= ~XLLP_PCMD_SQC;
v_pPmgrReg->PCMDn[i] &= ~XLLP_PCMD_DCE; //Clear DCE
v_pPmgrReg->PCMDn[i] &= ~XLLP_PCMD_MBC; //Clear MBC
}
//Set MBC bit
v_pPmgrReg->PCMDn[0] |= XLLP_PCMD_MBC;
v_pPmgrReg->PCMDn[1] |= XLLP_PCMD_MBC;
//indicate the last byte of this command is holded in this register
v_pPmgrReg->PCMDn[2] &=~ XLLP_PCMD_MBC;
//indicate this is the first and last command also
v_pPmgrReg->PCMDn[0] |= XLLP_PCMD_LC ; //LC bit
v_pPmgrReg->PCMDn[1] |= XLLP_PCMD_LC ;
v_pPmgrReg->PCMDn[2] |= XLLP_PCMD_LC ;
//programming the command data bits
v_pPmgrReg->PCMDn[0] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[0] |= dataArray[0];
v_pPmgrReg->PCMDn[1] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[1] |= dataArray[1];
v_pPmgrReg->PCMDn[2] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[2] |= dataArray[2];
//indicate this is the first and last command also
v_pPmgrReg->PCMDn[0] |= XLLP_PCMD_LC; //LC bit
v_pPmgrReg->PCMDn[1] |= XLLP_PCMD_LC;
v_pPmgrReg->PCMDn[2] |= XLLP_PCMD_LC;
//programming the command data bits
v_pPmgrReg->PCMDn[0] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[0] |= dataArray[0];
v_pPmgrReg->PCMDn[1] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[1] |= dataArray[1];
v_pPmgrReg->PCMDn[2] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[2] |= dataArray[2];
//Enable Power I2C
v_pPmgrReg->PCFR |= XLLP_PCFR_PI2C_EN; //enable Pwr I2C
//Execute voltage change sequence
XllpXSC1ChangeVoltage( ); //set VC on the PWRMODE on CP14
while ( ( (v_pPmgrReg->PVCR) & XLLP_PVCR_VCSA) !=0 );
}
/******************************************************************************
XDP_DOC_HDR_END
Function Name: XllpVMSetVoltage(DWORD DACValue, P_XLLP_PWRMGR_T v_pPmgrReg)
Description: Set the voltage through I2C
Input Arguments: P_XLLP_I2C_T
Output Arguments:
None
return:
NONE
XLLP_DOC_HDR_END
*******************************************************************************/
void XllpFreqVoltageChange(P_XLLP_PWRMGR_T v_pPmgrReg,P_XLLP_CLKMGR_T v_pClkReg, XLLP_COMBO_PARAM combo_param)
{
XLLP_UINT32_T newCLKCFGValue = 0;
XLLP_UINT32_T CLKCFGValue = 0;
XLLP_UINT32_T ReadPointer = 0, i=0;
XLLP_UINT32_T NumOfBytes = 3;
XLLP_UINT32_T dataArray[3];
XLLP_UINT32_T LMulti, NMulti;
dataArray[0] = 0; //Command 0
dataArray[1] = (combo_param.DacValue & 0x000000FF);
dataArray[2] = (combo_param.DacValue & 0x0000FF00)>>8;
NMulti = 2; //run mode, N=2
LMulti = combo_param.frequency / PRIMARY_CLOCK_FREQ;
//set up the new frequency mulitipliers, N and L
v_pClkReg->cccr = (NMulti<<7) | LMulti;
newCLKCFGValue = (XLLP_CLKCFG_F | combo_param.fastbus_mode<<3);
//votlage change configureation
v_pPmgrReg->PVCR = 0;
v_pPmgrReg->PCFR &= ~XLLP_PCFR_FVC; // First disable Frequency/Voltage Sequence
v_pPmgrReg->PVCR &= 0xFFFFF07F; //no delay is necessary
v_pPmgrReg->PVCR |= 0x20; //set Slave address
v_pPmgrReg->PVCR &= 0xFE0FFFFF; //clear read pointer 0
//Clear SQC DCE and MBC
for(i=0; i<32; i++)
{
v_pPmgrReg->PCMDn[i] &= ~XLLP_PCMD_SQC;
v_pPmgrReg->PCMDn[i] &= ~XLLP_PCMD_DCE; //Clear DCE
v_pPmgrReg->PCMDn[i] &= ~XLLP_PCMD_MBC; //Clear MBC
}
//Set MBC bit
v_pPmgrReg->PCMDn[0] |= XLLP_PCMD_MBC;
v_pPmgrReg->PCMDn[1] |= XLLP_PCMD_MBC;
//indicate the last byte of this command is holded in this register
v_pPmgrReg->PCMDn[2] &=~ XLLP_PCMD_MBC ;
//indicate this is the first and last command also
v_pPmgrReg->PCMDn[0] |= XLLP_PCMD_LC; //LC bit
v_pPmgrReg->PCMDn[1] |= XLLP_PCMD_LC;
v_pPmgrReg->PCMDn[2] |= XLLP_PCMD_LC;
//programming the command data bits
v_pPmgrReg->PCMDn[0] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[0] |= dataArray[0];
v_pPmgrReg->PCMDn[1] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[1] |= dataArray[1];
v_pPmgrReg->PCMDn[2] &= 0xFFFFFF00;
v_pPmgrReg->PCMDn[2] |= dataArray[2];
v_pPmgrReg->PCFR |= (XLLP_PCFR_PI2C_EN | XLLP_PCFR_FVC); //PCFR_PI2C_EN; //enable Pwr I2C
//set CLKCFG reigster in CP14 to initiate the freq/voltage change sequence
XllpXSC1FreqChange(newCLKCFGValue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -