MEMORY { /* * The RP2350 has either external or internal flash. * * 2 MiB is a safe default here, although a Pico 2 has 4 MiB. */ FLASH : ORIGIN = 0x10000000, LENGTH = 2048K /* * RAM consists of 8 banks, SRAM0-SRAM7, with a striped mapping. * This is usually good for performance, as it distributes load on * those banks evenly. */ RAM : ORIGIN = 0x20000000, LENGTH = 512K /* * RAM banks 8 and 9 use a direct mapping. They can be used to have * memory areas dedicated for some specific job, improving predictability * of access times. * Example: Separate stacks for core0 and core1. */ SRAM4 : ORIGIN = 0x20080000, LENGTH = 4K SRAM5 : ORIGIN = 0x20081000, LENGTH = 4K } SECTIONS { /* ### Boot ROM info * * Goes after .vector_table, to keep it in the first 4K of flash * where the Boot ROM (and picotool) can find it */ .start_block : ALIGN(4) { __start_block_addr = .; KEEP(*(.start_block)); } > FLASH } INSERT AFTER .vector_table; /* move .text to start /after/ the boot info */ _stext = ADDR(.start_block) + SIZEOF(.start_block); SECTIONS { /* ### Picotool 'Binary Info' Entries * * Picotool looks through this block (as we have pointers to it in our * header) to find interesting information. */ .bi_entries : ALIGN(4) { /* We put this in the header */ __bi_entries_start = .; /* Here are the entries */ KEEP(*(.bi_entries)); /* Keep this block a nice round size */ . = ALIGN(4); /* We put this in the header */ __bi_entries_end = .; } > FLASH } INSERT AFTER .text; SECTIONS { /* ### Boot ROM extra info * * Goes after everything in our program, so it can contain a signature. */ .end_block : ALIGN(4) { __end_block_addr = .; KEEP(*(.end_block)); } > FLASH } INSERT AFTER .uninit; PROVIDE(start_to_end = __end_block_addr - __start_block_addr); PROVIDE(end_to_start = __start_block_addr - __end_block_addr);