diff --git a/examples/drivers/boot/sbl_ospi/am261x-som/r5fss0-0_nortos/main.c b/examples/drivers/boot/sbl_ospi/am261x-som/r5fss0-0_nortos/main.c index 0c86ab6..dc22ced 100644 --- a/examples/drivers/boot/sbl_ospi/am261x-som/r5fss0-0_nortos/main.c +++ b/examples/drivers/boot/sbl_ospi/am261x-som/r5fss0-0_nortos/main.c @@ -79,9 +79,12 @@ __attribute__((weak)) int32_t Keyring_init(HsmClient_t *gHSMClient) return SystemP_SUCCESS; } +extern uint32_t gR5ClockFrequency; + int main(void) { int32_t status; + gR5ClockFrequency = SOC_RCM_R5_FREQ_200MHZ; Bootloader_profileReset(); Bootloader_socConfigurePll(); Bootloader_socSetAutoClock(); diff --git a/source/drivers/bootloader/soc/am261x/bootloader_soc.c b/source/drivers/bootloader/soc/am261x/bootloader_soc.c index 49f04da..ef161c2 100644 --- a/source/drivers/bootloader/soc/am261x/bootloader_soc.c +++ b/source/drivers/bootloader/soc/am261x/bootloader_soc.c @@ -60,6 +60,19 @@ Bootloader_resMemSections gResMemSection = .memSection[0].memEnd = 0x70040000, }; +Bootloader_CoreBootInfo gCoreBootInfo200Mhz[] = +{ + { + .defaultClockHz = (uint32_t)(200*1000000), + .coreName = "r5f0-0", + }, + + { + .defaultClockHz = (uint32_t)(200*1000000), + .coreName = "r5f0-1", + }, +}; + Bootloader_CoreBootInfo gCoreBootInfo400Mhz[] = { { @@ -167,6 +180,10 @@ uint32_t Bootloader_socCpuGetClkDefault(uint32_t cpuId) { defClock = gCoreBootInfo400Mhz[cpuId].defaultClockHz; } + else if(gR5ClockFrequency == SOC_RCM_R5_FREQ_200MHZ) + { + defClock = gCoreBootInfo200Mhz[cpuId].defaultClockHz; + } else { defClock = gCoreBootInfo500Mhz[cpuId].defaultClockHz; @@ -231,7 +248,14 @@ int32_t Bootloader_socCpuSetClock(uint32_t cpuId, uint32_t cpuHz) { case CSL_CORE_ID_R5FSS0_0: case CSL_CORE_ID_R5FSS0_1: - status = SOC_rcmSetR5Clock(cpuHz, cpuHz/2, cpuId); + if(gR5ClockFrequency == SOC_RCM_R5_FREQ_200MHZ) + { + status = SOC_rcmSetR5Clock(cpuHz, cpuHz, cpuId); + } + else + { + status = SOC_rcmSetR5Clock(cpuHz, cpuHz/2, cpuId); + } break; } return status; @@ -398,6 +422,29 @@ void Bootloader_socConfigurePll(void) hsDivCfg.hsDivOutFreqHz[2] = SOC_RCM_FREQ_MHZ2HZ(120U); SOC_rcmPerApllConfig(RCM_PLL_FOUT_FREQID_CLK_960MHZ, &hsDivCfg); } + else if (gR5ClockFrequency == SOC_RCM_R5_FREQ_200MHZ) + { + hsDivCfg.hsdivOutEnMask = RCM_PLL_HSDIV_OUTPUT_ENABLE_ALL; + hsDivCfg.hsDivOutFreqHz[0] = SOC_RCM_FREQ_MHZ2HZ(200U); + hsDivCfg.hsDivOutFreqHz[1] = SOC_RCM_FREQ_MHZ2HZ(500U); + hsDivCfg.hsDivOutFreqHz[2] = SOC_RCM_FREQ_MHZ2HZ(400U); + hsDivCfg.hsDivOutFreqHz[3] = SOC_RCM_FREQ_MHZ2HZ(166U); + SOC_rcmCoreApllConfig(RCM_PLL_FOUT_FREQID_CLK_2000MHZ, &hsDivCfg); + + hsDivCfg.hsdivOutEnMask = RCM_PLL_HSDIV_OUTPUT_ENABLE_0 | + RCM_PLL_HSDIV_OUTPUT_ENABLE_2; + hsDivCfg.hsDivOutFreqHz[0] = SOC_RCM_FREQ_MHZ2HZ(450U); + hsDivCfg.hsDivOutFreqHz[2] = SOC_RCM_FREQ_MHZ2HZ(150U); + SOC_rcmEthApllConfig(RCM_PLL_FOUT_FREQID_CLK_900MHZ, &hsDivCfg); + + hsDivCfg.hsdivOutEnMask = (RCM_PLL_HSDIV_OUTPUT_ENABLE_0 | + RCM_PLL_HSDIV_OUTPUT_ENABLE_2 | + RCM_PLL_HSDIV_OUTPUT_ENABLE_3); + hsDivCfg.hsDivOutFreqHz[0] = SOC_RCM_FREQ_MHZ2HZ(192U); + hsDivCfg.hsDivOutFreqHz[2] = SOC_RCM_FREQ_MHZ2HZ(160U); + hsDivCfg.hsDivOutFreqHz[2] = SOC_RCM_FREQ_MHZ2HZ(120U); + SOC_rcmPerApllConfig(RCM_PLL_FOUT_FREQID_CLK_960MHZ, &hsDivCfg); + } else { hsDivCfg.hsdivOutEnMask = RCM_PLL_HSDIV_OUTPUT_ENABLE_ALL; @@ -487,6 +534,10 @@ void Bootloader_socSetAutoClock() { Bootloader_socCpuSetClock(CSL_CORE_ID_R5FSS0_0, (uint32_t)(400*1000000)); } + else if(gR5ClockFrequency == SOC_RCM_R5_FREQ_200MHZ) + { + Bootloader_socCpuSetClock(CSL_CORE_ID_R5FSS0_0, (uint32_t)(200*1000000)); + } else { Bootloader_socCpuSetClock(CSL_CORE_ID_R5FSS0_0, (uint32_t)(500*1000000)); diff --git a/source/drivers/soc/am261x/soc_rcm.c b/source/drivers/soc/am261x/soc_rcm.c index 3c5c611..01956af 100644 --- a/source/drivers/soc/am261x/soc_rcm.c +++ b/source/drivers/soc/am261x/soc_rcm.c @@ -194,7 +194,7 @@ const SOC_RcmClkSrcInfo gPeripheralClkSrcInfoMap[] = const SOC_RcmClkSrcInfo gCR5ClkSrcInfoMap = { .pllId = RCM_PLLID_CORE, - .hsDivOut = RCM_PLLHSDIV_OUT_2, + .hsDivOut = RCM_PLLHSDIV_OUT_0, }; const SOC_RcmClkSrcInfo gTraceClkSrcInfoMap = diff --git a/source/drivers/soc/am261x/soc_rcm.h b/source/drivers/soc/am261x/soc_rcm.h index 018b8f9..af134b7 100644 --- a/source/drivers/soc/am261x/soc_rcm.h +++ b/source/drivers/soc/am261x/soc_rcm.h @@ -56,6 +56,7 @@ extern "C" #define SOC_RCM_R5_FREQ_400MHZ (0x0U) #define SOC_RCM_R5_FREQ_500MHZ (0x1U) +#define SOC_RCM_R5_FREQ_200MHZ (0x2U) /** * \anchor SOC_WarmResetCause_t