Skip to content

Commit c01cf0e

Browse files
committed
Add psram_check_address to check if psram variable can be used
Also fix no_flash binaries, and the tiny_psram test
1 parent 110dea4 commit c01cf0e

6 files changed

Lines changed: 31 additions & 5 deletions

File tree

src/rp2_common/hardware_flash/flash.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ void __no_inline_not_in_flash_func(flash_range_program)(uint32_t flash_offs, con
261261
//-----------------------------------------------------------------------------
262262
// Lower-level flash access functions
263263

264-
#if !PICO_NO_FLASH
265264
// Bitbanging the chip select using IO overrides, in case RAM-resident IRQs
266265
// are still running, and the FIFO bottoms out. (the bootrom does the same)
267266
static void __no_inline_not_in_flash_func(flash_cs_force)(bool high, uint8_t cs) {
@@ -340,7 +339,6 @@ void __no_inline_not_in_flash_func(flash_do_cmd_cs)(const uint8_t *txbuf, uint8_
340339
flash_enable_xip_via_boot2();
341340
flash_restore_hardware_state(&state);
342341
}
343-
#endif
344342

345343
// Use standard RUID command to get a unique identifier for the flash (and
346344
// hence the board)

src/rp2_common/hardware_psram/include/hardware/psram.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,13 @@ bool psram_is_available(void);
129129
*/
130130
size_t psram_get_size(void);
131131

132+
/*! \brief Check if an address is in available PSRAM
133+
* \ingroup hardware_psram
134+
*
135+
* \return true if the address is in available PSRAM, false otherwise
136+
*/
137+
bool psram_check_address(void* addr);
138+
132139
/*! \brief Detect PSRAM size
133140
* \ingroup hardware_psram
134141
*

src/rp2_common/hardware_psram/psram.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,15 @@ size_t psram_get_size(void) {
298298
return flash_devinfo_size_to_bytes(flash_devinfo_get_cs_size(1));
299299
}
300300

301+
bool psram_check_address(void* addr) {
302+
uint32_t offset = (uint32_t)addr - (XIP_BASE + flash_devinfo_size_to_bytes(FLASH_DEVINFO_SIZE_MAX));
303+
if (offset < psram_get_size()) {
304+
return true;
305+
} else {
306+
return false;
307+
}
308+
}
309+
301310
#if !PICO_RUNTIME_NO_INIT_PSRAM
302311
void runtime_init_setup_psram(void) {
303312
// Setup flash_devinfo from compile definitions if it is unset

src/rp2_common/pico_standard_link/script_include/sections_psram.incl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ SECTIONS
33
.psram_load : {
44
__psram_start__ = .;
55
__psram_load_start__ = .;
6-
*(.psram_initialised.*)
6+
*(SORT(.psram_initialised.*))
77
. = ALIGN(4);
88
__psram_load_end__ = .;
99
} > PSRAM AT> PSRAM_STORE
1010
__psram_load_source__ = LOADADDR(.psram_load);
1111

1212
.psram_noload (NOLOAD) : {
13-
*(.psram_uninitialised.*)
13+
*(SORT(.psram_uninitialised.*))
1414
. = ALIGN(4);
1515
__psram_end__ = .;
1616
} > PSRAM

test/kitchen_sink/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ if (NOT PICO_RP2040)
170170
target_link_libraries(kitchen_sink_psram_tiny kitchen_sink_libs kitchen_sink_options)
171171
target_compile_definitions(kitchen_sink_psram_tiny PRIVATE FIXED_PSRAM_SIZE=1 TINY_PSRAM=1)
172172
# Override the PSRAM size to allow variables in PSRAM
173+
target_compile_definitions(kitchen_sink_psram_tiny PRIVATE PICO_AUTO_DETECT_PSRAM=1)
173174
pico_override_psram_size(kitchen_sink_psram_tiny "(1 * 1024 * 1024)")
174175
pico_add_extra_outputs(kitchen_sink_psram_tiny)
175176
target_compile_definitions(kitchen_sink_psram_tiny PRIVATE KITCHEN_SINK_ID="psram tiny size binary")
@@ -182,7 +183,15 @@ if (NOT PICO_RP2040)
182183
target_compile_definitions(kitchen_sink_psram_detect PRIVATE PICO_AUTO_DETECT_PSRAM=1)
183184
pico_add_extra_outputs(kitchen_sink_psram_detect)
184185
target_compile_definitions(kitchen_sink_psram_detect PRIVATE KITCHEN_SINK_ID="psram detect size binary")
185-
set_target_properties(kitchen_sink_psram_fixed PROPERTIES PICO_TEST_FAILURE_STRING "ERROR:")
186+
set_target_properties(kitchen_sink_psram_detect PROPERTIES PICO_TEST_FAILURE_STRING "ERROR:")
187+
188+
add_executable(kitchen_sink_no_flash_psram_detect ${CMAKE_CURRENT_LIST_DIR}/kitchen_sink.c)
189+
target_link_libraries(kitchen_sink_no_flash_psram_detect kitchen_sink_libs kitchen_sink_options)
190+
target_compile_definitions(kitchen_sink_no_flash_psram_detect PRIVATE PICO_AUTO_DETECT_PSRAM=1)
191+
pico_set_binary_type(kitchen_sink_no_flash_psram_detect no_flash)
192+
pico_add_extra_outputs(kitchen_sink_no_flash_psram_detect)
193+
target_compile_definitions(kitchen_sink_no_flash_psram_detect PRIVATE KITCHEN_SINK_ID="psram detect size no_flash binary")
194+
set_target_properties(kitchen_sink_no_flash_psram_detect PROPERTIES PICO_TEST_FAILURE_STRING "ERROR:")
186195

187196
add_executable(kitchen_sink_psram_flash_fixed ${CMAKE_CURRENT_LIST_DIR}/kitchen_sink.c)
188197
target_link_libraries(kitchen_sink_psram_flash_fixed kitchen_sink_libs kitchen_sink_options)

test/kitchen_sink/kitchen_sink.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ char __psram_uninitialised("bar") bar_psram[0x8000];
5555
void make_tiny_psram(void) {
5656
// Override flash_devinfo cs size to be tiny, so bar_psram doesn't fit in it
5757
flash_devinfo_set_cs_size(1, FLASH_DEVINFO_SIZE_8K);
58+
// Still auto-detect CS pin, as we don't know that
59+
uint8_t cs_gpios[] = PICO_AVAILABLE_CS1_GPIOS;
60+
psram_detect_cs_and_size(cs_gpios, sizeof(cs_gpios));
5861
}
5962
PICO_RUNTIME_INIT_FUNC_RUNTIME(make_tiny_psram, "11000");
6063
#endif

0 commit comments

Comments
 (0)