diff options
Diffstat (limited to 'src/host/imxrt-boot-header-1180.x')
| -rw-r--r-- | src/host/imxrt-boot-header-1180.x | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/host/imxrt-boot-header-1180.x b/src/host/imxrt-boot-header-1180.x new file mode 100644 index 0000000..101725a --- /dev/null +++ b/src/host/imxrt-boot-header-1180.x @@ -0,0 +1,104 @@ +/* ===--- Begin imxrt-boot-header-1180.x ---=== + * This extra content is injected into the linker script depending on the + * runtime configuration. + */ + +__image_size = SIZEOF(.vector_table) + SIZEOF(.text) + SIZEOF(.xip) + SIZEOF(.rodata) + SIZEOF(.data); + +EXTERN(FLEXSPI_CONFIGURATION_BLOCK); + +/* # Sections */ +SECTIONS +{ + /* Boot header for serial NOR FlexSPI XIP. + * + * It's 'XIP' in that it starts executing instructions + * from flash immediately out of reset. The runtime then + * manually copies instructions (data, etc.), and we jump + * to that. After that jump, we're no longer XIP. + * + * The i.MX RT boot ROM also supports a way to copy the + * application image by changing the boot data configuration. + * Specifically, point the 'Image offset' to somewhere other + * than the start of flash, and specify how many bytes to copy. + * The boot ROM copies the image, then jumps to the entry point. + * It is currently not tested or used, mainly for consistency + * with the other iMXRT families. + */ + .boot1 ORIGIN(FLASH): + { + FILL(0x00); + /* ------------------ + * Memory configuration block + * ------------------ + * + * The size and layout is different for different boot devices. Currently, + * only NOR flash is supported. + */ + . += __fcb_offset; /* Can change based on boot source */ + KEEP(*(.fcb)); + . = ORIGIN(FLASH) + 0x1000; + + /* ------------------ + * Container 1 + * ------------------ + */ + __container1_start = .; + LONG(0x87000000 | (__container1_len << 8)); /* Tag, length, version */ + LONG(0); /* Flags */ + LONG(0x01000000); /* 1 image, fuse version 0, SW version 0 */ + LONG(__signature_block_start - __container1_start); /* Signature block offset */ + + /* Image array, image 0 */ + LONG(0xa000); /* Image offset */ + LONG(__image_size); /* Image size */ + QUAD(LOADADDR(.vector_table)); /* Load address (execute in place) */ + QUAD(Reset); /* Entry point */ + LONG(0x213); /* Flags: Unencrypted, SHA512 hashed, executable image for Cortex-M33 */ + LONG(0); /* Reserved (image meta data) */ + } > FLASH + + /* Put the hash in a separate section for easier replacement in a post-build step */ + .image_hash : + { + QUAD(0); /* Hash 512 bytes */ + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + QUAD(0); + } > FLASH + + .boot2 : + { + FILL(0x00); + QUAD(0); /* IV 256 bytes, zero for unencrypted image */ + QUAD(0); + QUAD(0); + QUAD(0); + + /* ------------------ + * Signature block + * ------------------ + */ + __signature_block_start = .; + LONG(0x90000000 | (__signature_block_len << 8)); /* Tag, length, version */ + LONG(0); /* SRK Table offset, Certificate Offset */ + LONG(0); /* Signature offset, Blob offset */ + LONG(0); /* Reserved */ + __signature_block_end = .; + __signature_block_len = __signature_block_end - __signature_block_start; + __container1_end = .; + __container1_len = __container1_end - __container1_start; + + /* DCD is replaced by XMCD. Satisfy assertions intended for other families. */ + __dcd_start = .; + __dcd_end = .; + + . = ORIGIN(FLASH) + 0x2000; /* Pad to 8k alignment for the container/images boundary */ + } > FLASH +} + +/* ===--- End imxrt-boot-header-1180.x ---=== */ |
