器件型号: AM6442
您好、我当前遇到了 ospi 多分区引导问题。 我的应用程序正在使用所有内核、这些是我要刷写的具有正确偏移量的文件:
r5fss0-0.mcelf.hs_fs
r5fss0-1.mcelf.hs_fs
r5fss1-0.mcelf.hs_fs
r5fss1-1.mcelf.hs_fs
m4.mcelf.hs_fs
a53ss0-0.mcelf.hs_fs
a53ss0-1.mcelf.hs_fs
我的应用中的所有内核都在引导期间进行自初始化。 我修改了示例“sbl_opsi_multi_partition“以包含 a53ss0-1、根据我的内核应用程序的大小设置正确的偏移、并更改了关于如何加载和引导 R5FSS0-0 内核的代码。
原始设置采用以下方式进行设置:
if(SystemP_SUCCESS == status)
{
status = App_bootLoadSelfCpu( CONFIG_BOOTLOADER_FLASH_R5FSS0_0, CSL_CORE_ID_R5FSS0_0 );
}
if(SystemP_SUCCESS == status)
{
status = App_bootLoadSelfCpu( CONFIG_BOOTLOADER_FLASH_R5FSS0_1, CSL_CORE_ID_R5FSS0_1 );
}
我将其更改为:
if(SystemP_SUCCESS == status)
{
status = App_bootCpu( CONFIG_BOOTLOADER_FLASH_R5FSS0_0, CSL_CORE_ID_R5FSS0_0 );
}
if(SystemP_SUCCESS == status)
{
status = App_bootCpu( CONFIG_BOOTLOADER_FLASH_R5FSS0_1, CSL_CORE_ID_R5FSS0_1 );
}
原因是我需要运行这些内核上的应用程序、并且 CPU.Cpu() 函数负责加载和运行 App_Boot。 虽然,该函数是为那些“不在自 CPU 集群“而被调用的原始函数, App_bootLoadSelfCpu (),是为“加载但不在自 CPU 集群中运行 CPU,即 R5FSS0-0“而设计的。
因此、我有以下问题:
1.错误是由于在 R5FSS0 内核上运行错误的函数而造成的,但是为什么 App_bootCpu () 不能与它们一起工作?
2.在这种情况下,“自 CPU 集群,即 R5FSS0-0“的含义是什么?
3.如何正确加载 R5FSS0 内核、然后引导? 或者 App_bootLoadSelfCpu () 是否已经处理了这个问题?
App_bootLoadSelfCpu ():
/* load but DONT run CPU in self CPU cluster, i.e R5FSS0-0 */
int32_t App_bootLoadSelfCpu(uint32_t bootDrvInstanceId, uint32_t cpuId)
{
int32_t status = SystemP_FAILURE;
Bootloader_BootImageInfo bootImageInfo;
Bootloader_Handle bootHandle;
Bootloader_Params bootParams;
Bootloader_Config *bootConfig;
Bootloader_Params_init(&bootParams);
Bootloader_BootImageInfo_init(&bootImageInfo);
bootHandle = Bootloader_open(bootDrvInstanceId, &bootParams);
bootConfig = (Bootloader_Config *)bootHandle;
bootConfig->scratchMemPtr = gAppimage;
if(bootHandle != NULL)
{
status = Bootloader_parseMultiCoreAppImage(bootHandle, &bootImageInfo);
if(status == SystemP_SUCCESS)
{
bootImageInfo.cpuInfo[cpuId].clkHz = Bootloader_socCpuGetClkDefault(cpuId);
status = Bootloader_loadSelfCpu( bootHandle, &bootImageInfo.cpuInfo[cpuId], FALSE);
}
Bootloader_close(bootHandle);
}
return status;
}
/* boot, i.e load and run CPUs not in self CPU cluster */
int32_t App_bootCpu(uint32_t bootDrvInstanceId, uint32_t cpuId)
{
int32_t status = SystemP_FAILURE;
Bootloader_BootImageInfo bootImageInfo;
Bootloader_Params bootParams;
Bootloader_Handle bootHandle;
Bootloader_Config *bootConfig;
Bootloader_Params_init(&bootParams);
Bootloader_BootImageInfo_init(&bootImageInfo);
bootHandle = Bootloader_open(bootDrvInstanceId, &bootParams);
bootConfig = (Bootloader_Config *)bootHandle;
bootConfig->scratchMemPtr = gAppimage;
if(bootHandle != NULL)
{
status = Bootloader_parseMultiCoreAppImage(bootHandle, &bootImageInfo);
if(status == SystemP_SUCCESS)
{
bootImageInfo.cpuInfo[cpuId].clkHz = Bootloader_socCpuGetClkDefault(cpuId);
status = Bootloader_bootCpu(bootHandle, &bootImageInfo.cpuInfo[cpuId]);
}
Bootloader_close(bootHandle);
}
return status;
}
