📄 _csl_pscmdstatecfg.c
字号:
#include <csl_pscAux.h>
#pragma CODE_SECTION (CSL_pscMdStateCfg, ".text:csl_section:psc");
CSL_Status CSL_pscMdStateCfg(
CSL_PscHandle hPsc,
CSL_PscMdCfg mdCfg
){
CSL_PscRegsOvly pscRegs = hPsc->regs;
Uint16 i,flagDspPd;
/* Wait for PTSTAT.GOSTAT1 to clear to 0x0 before initiating a new transition */
while( ( CSL_FEXT(pscRegs->PTSTAT, PSC_PTSTAT_GOSTAT1) ) == CSL_PSC_PTSTAT_GOSTAT_TRANSITIONING ){/* wait */;}
for( i = 0; i < mdCfg.numMds; i++ ){
/* Set MDCTLx.NEXT to new state value for all modules in all Power Domains*/
CSL_FINS(pscRegs->MDCTL[mdCfg.mdId[i]], PSC_MDCTL_NEXT, mdCfg.mdState[i]);
/* Set bit for special workaround */
if( (mdCfg.mdState[i] == CSL_PSC_MDCTL_NEXT_ENABLE || mdCfg.mdState[i] == CSL_PSC_MDCTL_NEXT_DISABLE ) &&
(mdCfg.mdId[i] == CSL_PSC_MD_VPSSSLV ||
mdCfg.mdId[i] == CSL_PSC_MD_EMAC ||
mdCfg.mdId[i] == CSL_PSC_MD_EMACCTRL ||
mdCfg.mdId[i] == CSL_PSC_MD_MDIO ||
mdCfg.mdId[i] == CSL_PSC_MD_IEEE1394 ||
mdCfg.mdId[i] == CSL_PSC_MD_USB ||
mdCfg.mdId[i] == CSL_PSC_MD_ATA ||
mdCfg.mdId[i] == CSL_PSC_MD_VLYNQ ||
mdCfg.mdId[i] == CSL_PSC_MD_HPI ||
mdCfg.mdId[i] == CSL_PSC_MD_DDREMIF ||
mdCfg.mdId[i] == CSL_PSC_MD_AEMIF ||
mdCfg.mdId[i] == CSL_PSC_MD_MMCSD ||
mdCfg.mdId[i] == CSL_PSC_MD_MEMSTICK ||
mdCfg.mdId[i] == CSL_PSC_MD_MCBSP ||
mdCfg.mdId[i] == CSL_PSC_MD_GPIO ||
mdCfg.mdId[i] == CSL_PSC_MD_VPSSSLV ||
mdCfg.mdId[i] == CSL_PSC_MD_IMCOP) ){
CSL_FINS(pscRegs->MDCTL[mdCfg.mdId[i]], PSC_MDCTL_EMURSTIE, CSL_PSC_MDCTL_EMURSTIE_INT_ENABLE);
}
/* Update the state record array if not NULL */
if( mdCfg.mdStateRecord != NULL ){
mdCfg.mdStateRecord[mdCfg.mdId[i]] = mdCfg.mdState[i];
}
/* Set a flag if we will need to transition the DSP PD */
if( mdCfg.mdId[i] >= CSL_PSC_MD_DSP ){
flagDspPd = 1;
}
}
/* Set PTCMD.GO0 to 0x1 to initiate the state transition for modules in the ALWAYSON PD */
CSL_FINS(pscRegs->PTCMD, PSC_PTCMD_GO0, CSL_PSC_PTCMD_GO_GO );
/* Wait for PTSTAT.GOSTAT0 to clear to 0x0 */
while( ( CSL_FEXT(pscRegs->PTSTAT, PSC_PTSTAT_GOSTAT0) ) == CSL_PSC_PTSTAT_GOSTAT_TRANSITIONING ){/* wait */;}
if( flagDspPd == 1 ){ /* Transition the DSP PD if necessary */
/* Set PTCMD.GO1 to 0x1 to initiate the state transition for modules in the DSP */
CSL_FINS(pscRegs->PTCMD, PSC_PTCMD_GO1, CSL_PSC_PTCMD_GO_GO );
/* Wait for PTSTAT.GOSTAT1 to clear to 0x0 */
while( ( CSL_FEXT(pscRegs->PTSTAT, PSC_PTSTAT_GOSTAT1) ) == CSL_PSC_PTSTAT_GOSTAT_TRANSITIONING ){/* wait */;}
}
for( i = 0; i < mdCfg.numMds; i++ ){
/* Clear bit for special workaround */
if( (mdCfg.mdState[i] == CSL_PSC_MDCTL_NEXT_ENABLE || mdCfg.mdState[i] == CSL_PSC_MDCTL_NEXT_DISABLE ) &&
(mdCfg.mdId[i] == CSL_PSC_MD_VPSSSLV ||
mdCfg.mdId[i] == CSL_PSC_MD_EMAC ||
mdCfg.mdId[i] == CSL_PSC_MD_EMACCTRL ||
mdCfg.mdId[i] == CSL_PSC_MD_MDIO ||
mdCfg.mdId[i] == CSL_PSC_MD_IEEE1394 ||
mdCfg.mdId[i] == CSL_PSC_MD_USB ||
mdCfg.mdId[i] == CSL_PSC_MD_ATA ||
mdCfg.mdId[i] == CSL_PSC_MD_VLYNQ ||
mdCfg.mdId[i] == CSL_PSC_MD_HPI ||
mdCfg.mdId[i] == CSL_PSC_MD_DDREMIF ||
mdCfg.mdId[i] == CSL_PSC_MD_AEMIF ||
mdCfg.mdId[i] == CSL_PSC_MD_MMCSD ||
mdCfg.mdId[i] == CSL_PSC_MD_MEMSTICK ||
mdCfg.mdId[i] == CSL_PSC_MD_MCBSP ||
mdCfg.mdId[i] == CSL_PSC_MD_GPIO ||
mdCfg.mdId[i] == CSL_PSC_MD_VPSSSLV ||
mdCfg.mdId[i] == CSL_PSC_MD_IMCOP) ){
CSL_FINS(pscRegs->MDCTL[mdCfg.mdId[i]], PSC_MDCTL_EMURSTIE, CSL_PSC_MDCTL_EMURSTIE_INT_DISABLE);
}
}
return (CSL_SOK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -