cd /u1/Projects/rp2040/pico-examples/build make -f pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/build.make pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/depend /usr/bin/cmake -E cmake_depends "Unix Makefiles" /u1/Projects/rp2040/pico-examples /u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2 /u1/Projects/rp2040/pico-examples/build /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2 /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/DependInfo.cmake "--color=" Dependee "/u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/DependInfo.cmake" is newer than depender "/u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/depend.internal". Dependee "/u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/depend.internal". make -f pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/build.make pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/build cd /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2 /usr/bin/arm-none-eabi-gcc -DPICO_BOARD=\"pico\" -DPICO_BUILD=1 -DPICO_NO_HARDWARE=0 -DPICO_ON_DEVICE=1 -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/asminclude -I/u1/Projects/rp2040/pico-sdk/src/rp2040/hardware_regs/include -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/hardware_base/include -I/u1/Projects/rp2040/pico-sdk/src/common/pico_base/include -I/u1/Projects/rp2040/pico-examples/build/generated/pico_base -I/u1/Projects/rp2040/pico-sdk/src/boards/include -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/pico_platform/include -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/include -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -o CMakeFiles/bs2_default.dir/compile_time_choice.S.obj -c /u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/compile_time_choice.S /usr/bin/cmake -E cmake_link_script CMakeFiles/bs2_default.dir/link.txt --verbose=xxx /usr/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -Wl,--build-id=none --specs=nosys.specs -nostartfiles -Wl,--script=/u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/boot_stage2.ld -Wl,-Map=bs2_default.elf.map CMakeFiles/bs2_default.dir/compile_time_choice.S.obj -o bs2_default.elf /usr/bin/arm-none-eabi-objdump -h /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.elf > bs2_default.dis /usr/bin/arm-none-eabi-objdump -d /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.elf >> bs2_default.dis make -f pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default_padded_checksummed_asm.dir/build.make pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default_padded_checksummed_asm.dir/depend cd /u1/Projects/rp2040/pico-examples/build /usr/bin/cmake -E cmake_depends "Unix Makefiles" /u1/Projects/rp2040/pico-examples /u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2 /u1/Projects/rp2040/pico-examples/build /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2 /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default_padded_checksummed_asm.dir/DependInfo.cmake "--color=" make -f pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default_padded_checksummed_asm.dir/build.make pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default_padded_checksummed_asm.dir/build cd /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2 /usr/bin/arm-none-eabi-objcopy -Obinary /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.elf /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.bin /usr/bin/python3.11 /u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/pad_checksum -s 0xffffffff /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.bin /u1/Projects/rp2040/pico-examples/build/pico-sdk/src/rp2_common/boot_stage2/bs2_default_padded_checksummed.SThe key line is this:
/usr/bin/arm-none-eabi-gcc -DPICO_BOARD=\"pico\" -DPICO_BUILD=1 -DPICO_NO_HARDWARE=0 -DPICO_ON_DEVICE=1 -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/asminclude -I/u1/Projects/rp2040/pico-sdk/src/rp2040/hardware_regs/include -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/hardware_base/include -I/u1/Projects/rp2040/pico-sdk/src/common/pico_base/include -I/u1/Projects/rp2040/pico-examples/build/generated/pico_base -I/u1/Projects/rp2040/pico-sdk/src/boards/include -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/pico_platform/include -I/u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/include -mcpu=cortex-m0plus -mthumb -O3 -DNDEBUG -o CMakeFiles/bs2_default.dir/compile_time_choice.S.obj -c /u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2/compile_time_choice.SAnd the key source file is:
cd /u1/Projects/rp2040/pico-sdk/src/rp2_common/boot_stage2 compile_time_choice.SThis simply includes some other file, given by PICO_BOOT_STAGE2_ASM
#define PICO_BOOT_STAGE2_ASM __PICO_XSTRING(__PICO_CONCAT1(_BOOT_STAGE2,.S))I was mistaken by this on my first pass thinking it would pull in boot2_generic_03h.S -- this is not the case. It pulls in boot2_at25sf128a.S !!
The code includes "pico/asm_helper.S" which has:
.macro pico_default_asm_setup .syntax unified .cpu cortex-m0plus .thumb .endmIt also includes boot2_helpers/exit_from_boot2.S, which is as follows:
#include "hardware/regs/m0plus.h" // If entered from the bootrom, lr (which we earlier pushed) will be 0, // and we vector through the table at the start of the main flash image. // Any regular function call will have a nonzero value for lr. check_return: pop {r0} cmp r0, #0 beq vector_into_flash bx r0 vector_into_flash: ldr r0, =(XIP_BASE + 0x100) ldr r1, =(PPB_BASE + M0PLUS_VTOR_OFFSET) str r0, [r1] ldmia r0, {r0, r1} msr msp, r0 bx r1The actual stage2 boot code is:
regular_func _stage2_boot push {lr} ldr r3, =XIP_SSI_BASE // Use as base address where possible // Disable SSI to allow further config movs r1, #0 str r1, [r3, #SSI_SSIENR_OFFSET] // Set baud rate movs r1, #PICO_FLASH_SPI_CLKDIV str r1, [r3, #SSI_BAUDR_OFFSET] ldr r1, =(CTRLR0_XIP) str r1, [r3, #SSI_CTRLR0_OFFSET] ldr r1, =(SPI_CTRLR0_XIP) ldr r0, =(XIP_SSI_BASE + SSI_SPI_CTRLR0_OFFSET) str r1, [r0] // NDF=0 (single 32b read) movs r1, #0x0 str r1, [r3, #SSI_CTRLR1_OFFSET] // Re-enable SSI movs r1, #1 str r1, [r3, #SSI_SSIENR_OFFSET] // We are now in XIP mode. Any bus accesses to the XIP address window will be // translated by the SSI into 03h read commands to the external flash (if cache is missed), // and the data will be returned to the bus. // Pull in standard exit routine #include "boot2_helpers/exit_from_boot2.S"Note that nothing here is copying anything into SRAM. The game is to set up the XIP (execute in place) scheme to work with whatever external flash chip is present.
The norm is to execute from flash via XIP. If there is some desire to move code into SRAM so it will run faster, that is entirely upon the user to set up.
Tom's electronics pages / [email protected]