//! @brief Bootloader global context data.
//!
//! @ingroup context
bootloader_context_t g_bootloaderContext = {.memoryInterface = &g_memoryInterface,
.memoryMap = g_memoryMap,
#if BL_FEATURE_EXPAND_MEMORY
.externalMemoryMap = g_externalMemoryMap,
#endif // BL_FEATURE_EXPAND_MEMORY
.allPeripherals = g_peripherals,
.activePeripheral = NULL, // Filled in at run time.
.propertyInterface = &g_propertyInterface,
.commandInterface = &g_commandInterface,
#if !BL_FEATURE_HAS_NO_INTERNAL_FLASH
.flashDriverInterface = &g_flashDriverInterface,
#if !BL_DEVICE_IS_LPC_SERIES
.allFlashState = &g_flashState,
.allFlashCacheState = &g_flashcacheState,
#if BL_FEATURE_SUPPORT_DFLASH
.dflashDriverInterface = &g_dflashDriverInterface,
.dFlashState = &g_dflashState,
#endif // BL_FEATURE_SUPPORT_DFLASH
#else
.allFlashState = g_flashiapState,
#endif // !BL_DEVICE_IS_LPC_SERIES
#endif // #if !BL_FEATURE_HAS_NO_INTERNAL_FLASH
#if AES_SECURITY_SUPPORTED
.aesInterface = &g_aesInterface,
#endif
};
//! @brief Interface to generic memory operations.
const memory_interface_t g_memoryInterface = {
mem_init, mem_read, mem_write,
#if !BL_FEATURE_MIN_PROFILE || BL_FEATURE_FILL_MEMORY
mem_fill,
#else
NULL,
#endif // !BL_FEATURE_MIN_PROFILE
mem_flush,
#if BL_FEATURE_EXPAND_MEMORY
mem_finalize,
#else
NULL,
#endif // BL_FEATURE_EXPAND_MEMORY
mem_erase,
};
// See memory.h for documentation on this function.
status_t mem_init(void)
{
status_t status = kStatus_Success;
const memory_map_entry_t *map = &g_bootloaderContext.memoryMap[0];
while (map->memoryInterface)
{
if (map->memoryInterface->init)
{
map->memoryInterface->init();
}
++map;
}
#if BL_FEATURE_EXPAND_MEMORY
external_memory_map_entry_t *extMap = (external_memory_map_entry_t *)&g_bootloaderContext.externalMemoryMap[0];
while (extMap->memoryInterface)
{
if (extMap->memoryInterface->init)
{
status = extMap->memoryInterface->init();
}
++extMap;
}
#endif // BL_FEATURE_EXPAND_MEMORY
return status;
}