Skip to content

Commit 664d230

Browse files
committed
Add pico_set_modified_binary_type function
Allows creating binaries using an existing binary type & linker script, but with modified RAM/SCRATCH addresses For example, to only use SRAM1 so you can power down SRAM0 in your binary you could use `pico_set_modified_binary_type(<my_exe> no_flash RAM "0x20040000" "256k"`
1 parent 969f589 commit 664d230

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/rp2_common/pico_standard_link/CMakeLists.txt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,51 @@ if (NOT TARGET pico_standard_link)
3030
set_target_properties(${TARGET} PROPERTIES PICO_TARGET_BINARY_TYPE ${TYPE})
3131
endfunction()
3232

33+
function(pico_set_modified_binary_type TARGET TYPE)
34+
set(multiValueArgs RAM SCRATCH_X SCRATCH_Y)
35+
cmake_parse_arguments(PARSE_ARGV 0 args
36+
"" "" "${multiValueArgs}"
37+
)
38+
39+
pico_set_binary_type(${TARGET} ${TYPE})
40+
41+
# Scripts that will be created by this function
42+
set(LINKER_CMAKE_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/memmap_${TARGET}.cmake")
43+
set(LINKER_LD_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/memmap_${TARGET}.ld")
44+
45+
# Configure memmap_${TARGET}.cmake script file to create memmap_${TARGET}.ld
46+
if (args_RAM)
47+
list(POP_FRONT args_RAM ORIGIN LENGTH)
48+
set(RAM "string(REGEX REPLACE \"RAM\\\\(rwx\\\\) *: *ORIGIN *= *[0-9xX]*, *LENGTH *= *[0-9kKmM]*\\n\" \"RAM(rwx) : ORIGIN = ${ORIGIN}, LENGTH = ${LENGTH}\\n\" LINKER_SCRIPT \"\${LINKER_SCRIPT}\")\n")
49+
endif()
50+
if (args_SCRATCH_X)
51+
list(POP_FRONT args_SCRATCH_X ORIGIN LENGTH)
52+
set(SCRATCH_X "string(REGEX REPLACE \"SCRATCH_X\\\\(rwx\\\\) *: *ORIGIN *= *[0-9xX]*, *LENGTH *= *[0-9kKmM]*\\n\" \"SCRATCH_X(rwx) : ORIGIN = ${ORIGIN}, LENGTH = ${LENGTH}\\n\" LINKER_SCRIPT \"\${LINKER_SCRIPT}\")\n")
53+
endif()
54+
if (args_SCRATCH_Y)
55+
list(POP_FRONT args_SCRATCH_Y ORIGIN LENGTH)
56+
set(SCRATCH_Y "string(REGEX REPLACE \"SCRATCH_Y\\\\(rwx\\\\) *: *ORIGIN *= *[0-9xX]*, *LENGTH *= *[0-9kKmM]*\\n\" \"SCRATCH_Y(rwx) : ORIGIN = ${ORIGIN}, LENGTH = ${LENGTH}\\n\" LINKER_SCRIPT \"\${LINKER_SCRIPT}\")\n")
57+
endif()
58+
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0")
59+
# CMAKE_CURRENT_FUNCTION_LIST_DIR added in 3.17.0
60+
configure_file(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/memmap_script.template.cmake ${LINKER_CMAKE_SCRIPT} @ONLY)
61+
else()
62+
configure_file(${PICO_SDK_PATH}src/rp2_common/pico_standard_link/memmap_script.template.cmake ${LINKER_CMAKE_SCRIPT} @ONLY)
63+
endif()
64+
65+
# Add command to run this script whenever it or memmap_${TYPE}.ld changes
66+
add_custom_command(OUTPUT ${LINKER_LD_SCRIPT}
67+
COMMAND ${CMAKE_COMMAND}
68+
-DPICO_LINKER_SCRIPT_PATH:PATH=${PICO_LINKER_SCRIPT_PATH}
69+
-Doutput_file:FILEPATH=${LINKER_LD_SCRIPT}
70+
-P "${LINKER_CMAKE_SCRIPT}"
71+
DEPENDS ${PICO_LINKER_SCRIPT_PATH}/memmap_${TYPE}.ld ${LINKER_CMAKE_SCRIPT})
72+
add_custom_target(memmap_${TARGET}_ld DEPENDS ${LINKER_LD_SCRIPT})
73+
add_dependencies(${TARGET} memmap_${TARGET}_ld)
74+
75+
pico_set_linker_script(${TARGET} ${CMAKE_CURRENT_BINARY_DIR}/memmap_${TARGET}.ld)
76+
endfunction()
77+
3378
if (NOT PICO_DEFAULT_BINARY_TYPE)
3479
if (PICO_NO_FLASH)
3580
set(PICO_DEFAULT_BINARY_TYPE no_flash)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
file(READ ${PICO_LINKER_SCRIPT_PATH}/memmap_@TYPE@.ld LINKER_SCRIPT)
2+
@RAM@
3+
@SCRATCH_X@
4+
@SCRATCH_Y@
5+
file(WRITE ${output_file} "${LINKER_SCRIPT}")

0 commit comments

Comments
 (0)