#if !defined(PICO_CRT0_INCLUDE_PICOBIN_IMAGE_TYPE_ITEM) // todo decide whether we want this item for RP2040 by default, probably not (there are a zilloon binaries out there without it) #if !PICO_RP2040 #define PICO_CRT0_INCLUDE_PICOBIN_IMAGE_TYPE_ITEM 1 #endif #endif #ifndef PICO_CRT0_INCLUDE_PICOBIN_BLOCK #define PICO_CRT0_INCLUDE_PICOBIN_BLOCK PICO_CRT0_INCLUDE_PICOBIN_IMAGE_TYPE_ITEM #endif #ifndef PICO_CRT0_INCLUDE_PICOBIN_END_BLOCK #define PICO_CRT0_INCLUDE_PICOBIN_END_BLOCK (PICO_CRT0_INCLUDE_PICOBIN_BLOCK && !PICO_NO_FLASH) #endif #if PICO_CRT0_IMAGE_TYPE_TBYB #define CRT0_TBYB_FLAG PICOBIN_IMAGE_TYPE_EXE_TBYB_BITS #else #define CRT0_TBYB_FLAG 0 #endif #if defined(PICO_CRT0_VERSION_MINOR) && !defined(PICO_CRT0_VERSION_MAJOR) #define PICO_CRT0_VERSION_MAJOR 0 #endif #if PICO_CRT0_INCLUDE_PICOBIN_BLOCK .section .embedded_block, "a" .p2align 2 embedded_block: .word PICOBIN_BLOCK_MARKER_START #if PICO_CRT0_INCLUDE_PICOBIN_IMAGE_TYPE_ITEM // include an IMAGE_TYPE item at the start so this block is a valid IMAGE_DEF block, and can be used as a basis // for booting the binary with a known type. .byte PICOBIN_BLOCK_ITEM_1BS_IMAGE_TYPE .byte 0x1 // 1 word #ifdef PICO_CRT0_IMAGE_TYPE_ITEM_VALUE .hword PICO_CRT0_IMAGE_TYPE_ITEM_VALUE #elif defined(__riscv) .hword PICOBIN_IMAGE_TYPE_IMAGE_TYPE_AS_BITS(EXE) | \ PICOBIN_IMAGE_TYPE_EXE_CPU_AS_BITS(RISCV) | \ PICOBIN_IMAGE_TYPE_EXE_CHIP_AS_BITS(RP2350) | \ CRT0_TBYB_FLAG #elif defined(PICO_RP2040) .hword PICOBIN_IMAGE_TYPE_IMAGE_TYPE_AS_BITS(EXE) | \ PICOBIN_IMAGE_TYPE_EXE_SECURITY_AS_BITS(NS) | \ PICOBIN_IMAGE_TYPE_EXE_CPU_AS_BITS(ARM) | \ PICOBIN_IMAGE_TYPE_EXE_CHIP_AS_BITS(RP2040) | \ CRT0_TBYB_FLAG #else .hword PICOBIN_IMAGE_TYPE_IMAGE_TYPE_AS_BITS(EXE) | \ PICOBIN_IMAGE_TYPE_EXE_SECURITY_AS_BITS(S) | \ PICOBIN_IMAGE_TYPE_EXE_CPU_AS_BITS(ARM) | \ PICOBIN_IMAGE_TYPE_EXE_CHIP_AS_BITS(RP2350) | \ CRT0_TBYB_FLAG #endif #else // if no image type, then add ignored item .byte PICOBIN_BLOCK_ITEM_2BS_IGNORED .byte 0x1 // 1 word .hword 0 #endif #ifdef PICO_CRT0_VERSION_MAJOR .byte PICOBIN_BLOCK_ITEM_1BS_VERSION .byte 0x2 // 2 words .hword 0 #ifdef PICO_CRT0_VERSION_MINOR .hword PICO_CRT0_VERSION_MINOR #else .hword 0 #endif .hword PICO_CRT0_VERSION_MAJOR #endif #ifdef __riscv // On RISC-V the default entry point from bootrom is the start of the binary, but // we have our vtable at the start, so we must include an entry point .byte PICOBIN_BLOCK_ITEM_1BS_ENTRY_POINT .byte 0x3 // word size to next item .byte 0 // pad .byte 0 // pad .word _reset_handler .word SRAM_END // stack pointer #endif #ifndef PICO_RP2040 #if PICO_NO_FLASH // If no_flash bin, then include a vector table item .byte PICOBIN_BLOCK_ITEM_1BS_VECTOR_TABLE .byte 0x2 .hword 0 .word __vectors #endif #endif .byte PICOBIN_BLOCK_ITEM_2BS_LAST .hword (embedded_block_end - embedded_block - 16 ) / 4 // total size of all .byte 0 #if PICO_CRT0_INCLUDE_PICOBIN_END_BLOCK .word embedded_end_block - embedded_block #else // offset from this block to next block in loop (since we are a single block loop, we point back to ourselves // so the offset is 0) .word 0 #endif .word PICOBIN_BLOCK_MARKER_END embedded_block_end: #endif