This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
如题,使用C6678过程中由于功耗太大,想通过配置PSC来降低功耗,但遇到一个问题,能通过PSC配置开启模块但不能关闭。
我使用的是TMDSEVM6678LE开发板,默认上电后PCIE是开启的,SRIO和HYPERLINK是关闭的,我想通过软件将这三部分都关闭,但是不行,于是我测试了一下开启,我发现SRIO和HYPERLINK可以开启,但开启后无法关闭。也许是我的程序有问题,希望能有人解答。以下是我的程序。
开启:
/*开启外设*/ void enableperipherals() { /* Set SRIO Power domain to ON */ CSL_PSC_enablePowerDomain (CSL_PSC_PD_SRIO); /* Enable the clocks too for SRIO */ CSL_PSC_setModuleNextState (CSL_PSC_LPSC_SRIO, PSC_MODSTATE_ENABLE); /* Start the state transition */ CSL_PSC_startStateTransition (CSL_PSC_PD_SRIO); /* Wait until the state transition process is completed. */ while (!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_SRIO)); /* Return SRIO PSC status */ if ((CSL_PSC_getPowerDomainState(CSL_PSC_PD_SRIO) == PSC_PDSTATE_ON) && (CSL_PSC_getModuleState (CSL_PSC_LPSC_SRIO) == PSC_MODSTATE_ENABLE)) printf("SRIO is enabled!\n"); /* Set SRIO Power domain to ON */ CSL_PSC_enablePowerDomain (CSL_PSC_PD_HYPERBRIDGE); /* Enable the clocks too for SRIO */ CSL_PSC_setModuleNextState (CSL_PSC_LPSC_HYPERBRIDGE, PSC_MODSTATE_ENABLE); /* Start the state transition */ CSL_PSC_startStateTransition (CSL_PSC_PD_HYPERBRIDGE); /* Wait until the state transition process is completed. */ while (!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_HYPERBRIDGE)); /* Return SRIO PSC status */ if ((CSL_PSC_getPowerDomainState(CSL_PSC_PD_HYPERBRIDGE) == PSC_PDSTATE_ON) && (CSL_PSC_getModuleState (CSL_PSC_LPSC_HYPERBRIDGE) == PSC_MODSTATE_ENABLE)) printf("HYPERLInK is enabled!\n"); }
关闭:
/*关闭外设*/ void disableperipherals() { /* Wait until the state transition process is completed. */ while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_PCIEX));//pcie /* Disable the clocks too for PCIE */ /* Module is in Reset state. Clock is off. */ CSL_PSC_setModuleNextState (CSL_PSC_LPSC_PCIEX, PSC_MODSTATE_SWRSTDISABLE); /* Set PCIE Power domain to OFF */ CSL_PSC_disablePowerDomain (CSL_PSC_PD_PCIEX); /* Wait until the state transition process is completed. */ while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_PCIEX)); if(CSL_PSC_getPowerDomainState (CSL_PSC_PD_PCIEX) == PSC_PDSTATE_OFF) printf("PCIE POWER DOMAIN is disabled!\n"); if(CSL_PSC_getModuleState (CSL_PSC_LPSC_PCIEX) == PSC_MODSTATE_SWRSTDISABLE) /*if((CSL_PSC_getPowerDomainState (CSL_PSC_PD_PCIEX) == PSC_PDSTATE_OFF) && (CSL_PSC_getModuleState (CSL_PSC_LPSC_PCIEX) == PSC_MODSTATE_SWRSTDISABLE))*/ printf("PCIE module is disabled!\n"); /**************************************************************************************/ /* Wait until the state transition process is completed. */ while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_SRIO));//SRIO /* Disable the clocks too for SRIO */ /* Module is in Reset state. Clock is off. */ CSL_PSC_setModuleNextState (CSL_PSC_LPSC_SRIO, PSC_MODSTATE_SWRSTDISABLE); /* Set PCIE Power domain to OFF */ CSL_PSC_disablePowerDomain (CSL_PSC_PD_SRIO); /* Wait until the state transition process is completed. */ while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_SRIO)); if((CSL_PSC_getPowerDomainState (CSL_PSC_PD_SRIO) == PSC_PDSTATE_OFF) && (CSL_PSC_getModuleState (CSL_PSC_LPSC_SRIO) == PSC_MODSTATE_SWRSTDISABLE)) printf("SRIO module is disabled!\n"); /**************************************************************************************/ /* Wait until the state transition process is completed. */ while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_HYPERBRIDGE));//HYPERLINK /* Disable the clocks too for HYPERLINK */ /* Module is in Reset state. Clock is off. */ CSL_PSC_setModuleNextState (CSL_PSC_LPSC_HYPERBRIDGE, PSC_MODSTATE_SWRSTDISABLE); /* Set PCIE Power domain to OFF */ CSL_PSC_disablePowerDomain (CSL_PSC_PD_HYPERBRIDGE); /* Wait until the state transition process is completed. */ while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_HYPERBRIDGE)); if((CSL_PSC_getPowerDomainState (CSL_PSC_PD_HYPERBRIDGE) == PSC_PDSTATE_OFF) && (CSL_PSC_getModuleState (CSL_PSC_LPSC_HYPERBRIDGE) == PSC_MODSTATE_SWRSTDISABLE)) printf("HYPERLINK module is disabled!\n"); /**************************************************************************************/ }
我查看过寄存器,上电连接好仿真器后srio与hyperlink处于关闭状态,可以通过我上面的程序开启,但无法关闭,pcie也是。如果官方有例程的话希望能提供一下,谢谢。
1. 可以参考置顶贴里的例程,KeyStone_disable_PSC_module和KeyStone_disable_PSC_Power_DomainKeystone两个函数的源码在\K1_STK_v1.1\common\KeyStone_common.c
https://e2echina.ti.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664
2. 需要设置PDCCMD第16位,然后使能唤醒中断,再执行idle指令,在corepac user guide上有步骤说明。
12.2.5 C66x CorePac Powerdown
www.ti.com/.../sprugw0c.pdf