📄 sysc.c
字号:
if(uRegOffset == 0)
{
uRegValue =Inp32(rPWR_CFG);
uRegValue = (uRegValue & ~(0x1<<(uMaskID+7))) | (uMaskCtrl<<(uMaskID+7));
Outp32(rPWR_CFG, uRegValue);
}
else if(uRegOffset == 1)
{
uRegValue = Inp32(rEINT_MASK);
uRegValue = (uRegValue & ~(0x1<<(uMaskID))) | (uMaskCtrl<<(uMaskID));
Outp32(rEINT_MASK, uRegValue);
}
}
//////////
// Function Name : SYSC_CtrlNORCFG
// Function Description : This function control Block Power off of the internal logic during normal operation
//
// Input : eCFGId : Internal block Domain Id
// uPwrCtrl : (0) LP mode, Block Power Off
// (1) Active mode, Block Power ON
//
//
// Output : NONE
// Version :
void SYSC_CtrlNORCFG( NORGFC_eID eCFGId, u32 uPwrCtrl)
{
u32 uRegValue, uTemp;
uRegValue =Inp32(rNORMAL_CFG);
uTemp = eCFGId;
uRegValue = (uRegValue & ~(1<<uTemp)) | (uPwrCtrl <<uTemp);
Outp32(rNORMAL_CFG, uRegValue);
}
//////////
// Function Name : SYSC_ChangeMode
// Function Description : This function change Operating Mode
//
// Input :
// eOPMode : eASYNC_MODE(0) Asynchronous mode
// eSYNC_MODE (1) Synchronous mode
//
//
// Output : NONE
// Version :
void SYSC_ChangeMode(SYSC_eOPMode eOPMode)
{
u32 uRegValue, uCurrMode, uDIV0, uDIV0_org, uSRC, uSRC_org;
u32 uHCLKx2_Ratio;
uRegValue =Inp32(rOTHERS);
uCurrMode = (uRegValue >> 8 ) & 0xF ;
uDIV0_org = Inp32(rCLK_DIV0);
uSRC_org = Inp32(rCLK_SRC);
uHCLKx2_Ratio=(uDIV0_org>>9)&0x7;
if((eOPMode == 0)&&(uCurrMode == 0xF)) // Current = SyncMode, Next = AsyncMode
{
// For FirmWare Test => APLL Out = MPLL*2
if(uHCLKx2_Ratio == 0)
{
uDIV0_org = uDIV0_org;
}
else
{
uDIV0_org = (uDIV0_org & ~(0x7<<9)) | (0 <<9);
}
uSRC = (uSRC_org & ~(0x3<<0)) | (0 <<0); // A&MPLL Change to Clock Source
uDIV0 = (uDIV0_org & ~(0xFFFF<<0)) | (0x1100 <<0); // Clock Divider 1:1 ??
Outp32(rCLK_SRC, uSRC);
Outp32(rCLK_DIV0, uDIV0);
uRegValue = (uRegValue & ~(0x3<<6)) | (1 <<6); // SYNCMODE(SYNCREQ) = ASYNC, VICEN= Async, MUXSEL=Sync
Outp32(rOTHERS, uRegValue);
while(((Inp32(rOTHERS)>>8)&0x7)); // Wait SYNCMODEACK = 0x0
uRegValue = Inp32(rOTHERS);
uRegValue = (uRegValue&~(0x1<<6)) | (0<<6); // Change SYNCMUX to AsyncMode
Outp32(rOTHERS, uRegValue);
Outp32(rCLK_DIV0, uDIV0_org);
Outp32(rCLK_SRC, uSRC_org);
}
else if ((eOPMode == 1)&&(uCurrMode == 0x0)) // Current = AsyncMode, Next = SyncMode
{
uSRC = (uSRC_org & ~(0x3<<0)) | (0 <<0); // A&MPLL Change to Clock Source
uDIV0 = (uDIV0_org & ~(0xFFFF<<0)) | (0x1100 <<0); // Clock Divider 1:1 ??
if(uHCLKx2_Ratio == 0)
{
uDIV0_org = (uDIV0_org & ~(0x7<<9)) | (1 <<9);
}
else
{
uDIV0_org = uDIV0_org;
}
uRegValue = (uRegValue & ~(0x1<<6)) | (1 <<6); // Change SYNCMUX to SyncMode
Outp32(rOTHERS, uRegValue);
__asm {
nop;
nop;
nop;
nop;
nop;
} // Wait for a while (TBD)
uRegValue = (uRegValue & ~(0x1<<7)) | (1 <<7); // SYNCMODE = SYNC, VICEN=SYNC, MUXSEL=SYNC
Outp32(rOTHERS, uRegValue);
while(((Inp32(rOTHERS)>>8)&0x7) == 0xF); // Wait SYNCMODEACK = 0xF
Outp32(rCLK_DIV0, uDIV0_org);
Outp32(rCLK_SRC, uSRC_org);
}
Delay(10);
}
//////////
// Function Name : SYSC_ClrBATFINT
// Function Description : This function clear int pending bit about nBATF Int.
//
// Input :
//
// Output : NONE
// Version :
void SYSC_ClrBATFINT(void)
{
u32 uRegValue;
uRegValue =Inp32(rOTHERS);
uRegValue |= (1<<12);
Outp32(rOTHERS, uRegValue);
}
//////////
// Function Name : SYSC_RdRSTSTAT
// Function Description : This function read Rest Status Register
//
// Input : NONE
//
// Output : Status Value
// Version :
u32 SYSC_RdRSTSTAT(void)
{
u32 uRegValue;
u32 uRstId;
uRegValue =Inp32(rRST_STAT);
printf("Reset Status Register: 0x%x\n", uRegValue);
if( uRegValue & (1<<0))
{
printf("External reset by XnRESET \n\n");
uRstId = 0;
}
else if (uRegValue & (1<<1))
{
printf("Warm reset by XnWRESET \n\n");
uRstId = 1;
}
else if (uRegValue & (1<<2))
{
printf("Watch dog timer reset by WDTRST\n\n");
uRstId = 2;
}
else if (uRegValue & (1<<3))
{
printf("Reset by SLEEP Mode Wake-up \n\n");
uRstId = 3;
}
else if (uRegValue & (1<<4))
{
printf("Reset by ESLEEP mode Wake-up \n\n");
uRstId = 4;
}
else if (uRegValue & (1<<5))
{
printf("Software reset by SWRESET\n\n");
uRstId = 5;
}
return uRstId;
}
//////////
// Function Name : SYSC_RdBLKPWR
// Function Description : This function read Block Power Status Register
//
// Input :
//
// Output : NONE
// Version :
void SYSC_RdBLKPWR(void)
{
u32 uRegValue;
uRegValue =Inp32(rBLK_PWR_STAT);
printf("Block Power Status Register 0x%x\n\n\n", uRegValue);
printf("Block Top Power %d\n", uRegValue&(0x1<<0));
printf("Block V Power %d\n", (uRegValue&(0x1<<1))>>1);
printf("Block I Power %d\n", (uRegValue&(0x1<<2))>>2);
printf("Block P Power %d\n", (uRegValue&(0x1<<3))>>3);
printf("Block F Power %d\n", (uRegValue&(0x1<<4))>>4);
printf("Block S Power %d\n", (uRegValue&(0x1<<5))>>5);
printf("Block ETM Power %d\n", (uRegValue&(0x1<<6))>>6);
}
//////////
// Function Name : SYSC_ClrWKUPSTAT
// Function Description : This function clear Wake-up Status Register
//
// Input :
//
// Output : NONE
// Version :
void SYSC_ClrWKUPSTAT(void)
{
u32 uRegValue;
uRegValue =Inp32(rWAKEUP_STAT);
printf("Wake-up Status Register: 0x%x\n", uRegValue);
if( uRegValue & (1<<0))
{
printf("___ Wake-up by EINT \n");
uRegValue |= (1<<0);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<1))
{
printf("___ Wake-up by RTC ALARM \n");
uRegValue |= (1<<1);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<2))
{
printf("___ Wake-up by RTC Tick \n");
uRegValue |= (1<<2);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<3))
{
printf("___ Wake-up by Touch Screen \n");
uRegValue |= (1<<3);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<4))
{
printf("___ Wake-up by KeyPad \n");
uRegValue |= (1<<4);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<5))
{
printf("___ Wake-up by MSM Modem \n");
uRegValue |= (1<<5);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<6))
{
printf("___ Wake-up by BATFLT \n");
uRegValue |= (1<<6);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<7))
{
printf("___ Wake-up by Warm Reset \n");
uRegValue |= (1<<7);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<8))
{
printf("___ Wake-up by HSI \n");
uRegValue |= (1<<8);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<9))
{
printf("___ Wake-up by MMC0 \n");
uRegValue |= (1<<9);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<10))
{
printf("___ Wake-up by MMC1 \n");
uRegValue |= (1<<10);
Outp32(rWAKEUP_STAT,uRegValue);
}
else if (uRegValue & (1<<11))
{
printf("___ Wake-up by MMC2 \n");
uRegValue |= (1<<11);
Outp32(rWAKEUP_STAT,uRegValue);
}
}
//////////
// Function Name : LTC3714_VoltageSet
// Function Description : CLKGate_Test in the Normal Mode
// Input : uPwr : 1: ARM Voltage Control, 2: Internal Voltage Control, 3: Both Voltage Control
// uVoltage : 1mV
// Output : None
// Version : v0.1
void LTC3714_VoltageSet(u32 uPwr, u32 uVoltage)
{
int uvtg, uRegValue;
//////////////////////////////////////////////
// GPN15 GPN14 GNP13 GPN12 GPN11
// VID4 VID3 VID2 VID1 VID0 // Voltage
// 0 0 0 0 0 // 1.75V
// 0 0 0 0 1 // 1.70V
// 0 0 0 1 0 // 1.65V
// 0 0 0 1 1 // 1.60V
// 0 0 1 0 0 // 1.55V
// 0 0 1 0 1 // 1.50V
// 0 0 1 1 0 // 1.45V
// 0 0 1 1 1 // 1.40V
// 0 1 0 0 0 // 1.35V
// 0 1 0 0 1 // 1.30V
// 0 1 0 1 0 // 1.25V
// 0 1 0 1 1 // 1.20V
// 0 1 1 0 0 // 1.15V
// 0 1 1 0 1 // 1.10V
// 0 1 1 1 0 // 1.05V
// 0 1 1 1 1 // 1.00V
// 1 0 0 0 0 // 0.975V
// 1 0 0 0 1 // 0.950V
// 1 0 0 1 0 // 0.925V
// 1 0 0 1 1 // 0.900V
// 1 0 1 0 0 // 0.875V
// 1 0 1 0 1 // 0.850V
// 1 0 1 1 0 // 0.825V
// 1 0 1 1 1 // 0.800V
// 1 1 0 0 0 // 0.775V
// 1 1 0 0 1 // 0.750V
// 1 1 0 1 0 // 0.725V
// 1 1 0 1 1 // 0.700V
// 1 1 1 0 0 // 0.675V
// 1 1 1 0 1 // 0.650V
// 1 1 1 1 0 // 0.625V
// 1 1 1 1 1 // 0.600V
uvtg=uVoltage;
//GPIO Setting - For LTC3714 VID
GPIO_SetFunctionEach(eGPIO_N, eGPIO_11, 1); //XEINT11(VID0) as Output
GPIO_SetFunctionEach(eGPIO_N, eGPIO_12, 1); //XEINT12(VID1) as Output
GPIO_SetFunctionEach(eGPIO_N, eGPIO_13, 1); //XEINT13(VID2) as Output
GPIO_SetFunctionEach(eGPIO_N, eGPIO_14, 1); //XEINT14(VID3) as Output
GPIO_SetFunctionEach(eGPIO_N, eGPIO_15, 1); //XEINT11(VID4) as Output
GPIO_SetPullUpDownEach(eGPIO_N, eGPIO_11, 0); // Pull-up/dn disable
GPIO_SetPullUpDownEach(eGPIO_N, eGPIO_12, 0);
GPIO_SetPullUpDownEach(eGPIO_N, eGPIO_13, 0);
GPIO_SetPullUpDownEach(eGPIO_N, eGPIO_14, 0);
GPIO_SetPullUpDownEach(eGPIO_N, eGPIO_15, 0);
// Latch Control Signal
// CORE_REG_OE: XhiA9(GPL9), ARM_REG_LE: XhiA8(GPL8), INT_REG_LE: XhiA10(GPL10)
GPIO_SetFunctionEach(eGPIO_L, eGPIO_8, 1); //XhiA8(ARM_REG_LE) as Output
GPIO_SetFunctionEach(eGPIO_L, eGPIO_9, 1); //XhiA9(CORE_REG_OE) as Output
GPIO_SetFunctionEach(eGPIO_L, eGPIO_10,1); //XhiA10(INT_REG_LE)as Output
GPIO_SetPullUpDownEach(eGPIO_L, eGPIO_8, 0); // Pull-up/dn disable
GPIO_SetPullUpDownEach(eGPIO_L, eGPIO_9, 0);
GPIO_SetPullUpDownEach(eGPIO_L, eGPIO_10, 0);
uRegValue = Inp32(0x7F008834); // GPNDAT Register
switch (uvtg)
{
case 1750:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1700:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1650:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1600:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 1550:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1500:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1450:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1400:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 1350:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1300:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1250:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1200:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 1150:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1100:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1050:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1000:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 975:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 950:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 925:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 900:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 875:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 850:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 825:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 800:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 775:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 750:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 725:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 700:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 675:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 650:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 625:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 600:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
default: // 1.00V
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
}
printf("uRegValue(VID_Data) 0x%x\n", uRegValue);
// Control Data
Outp32(0x7F008834,uRegValue);
if(uPwr == 1 ) //ARM Voltage Control => ARM_REG_LE => Output H => Data Changed
{
GPIO_SetDataEach(eGPIO_L, eGPIO_8, 1);
printf("ARM REG LE\n");
}
else if(uPwr == 2 ) // INT Voltage Control
{
GPIO_SetDataEach(eGPIO_L, eGPIO_10, 1);
printf("INT REG LE\n");
}
else if (uPwr== 3) // Both Voltage Control
{
GPIO_SetDataEach(eGPIO_L, eGPIO_8, 1);
GPIO_SetDataEach(eGPIO_L, eGPIO_10, 1);
//printf("ARM&INT REG LE\n");
//while(!UART_GetKey());
}
// Output Enable
GPIO_SetDataEach(eGPIO_L, eGPIO_9, 1);
printf("Latch Out Enable\n");
//while(!UART_GetKey());
Delay(100);
GPIO_SetDataEach(eGPIO_L, eGPIO_8, 0); // Latch Disable
GPIO_SetDataEach(eGPIO_L, eGPIO_10,0); // Latch Disable
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -