Loading...
Searching...
No Matches
psram.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2026 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _HARDWARE_PSRAM_H
8#define _HARDWARE_PSRAM_H
9
10#include "pico.h"
11#include "hardware/clocks.h"
12#include "hardware/flash.h"
13
61
62// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_HARDWARE_PSRAM, Enable/disable assertions in the hardware_psram module, type=bool, default=0, group=hardware_psram
63#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_PSRAM
64#define PARAM_ASSERTIONS_ENABLED_HARDWARE_PSRAM 0
65#endif
66
67// PICO_CONFIG: PICO_PSRAM_SIZE_BYTES, size of psram in bytes, type=int, default=Usually provided via board header if psram is present, group=hardware_psram
68// PICO_CONFIG: PICO_PSRAM_CS_PIN, chip select pin for psram, type=int, default=Usually provided via board header if psram is present, group=hardware_psram
69
70// PICO_CONFIG: PICO_AUTO_DETECT_PSRAM, automatically detect if psram is present, type=bool, default=0, group=hardware_psram
71#ifndef PICO_AUTO_DETECT_PSRAM
72#define PICO_AUTO_DETECT_PSRAM 0
73#endif
74
75// PICO_CONFIG: PICO_AUTO_DETECT_PSRAM_SIZE, automatically detect psram size, type=bool, default=PICO_AUTO_DETECT_PSRAM, group=hardware_psram
76#ifndef PICO_AUTO_DETECT_PSRAM_SIZE
77#define PICO_AUTO_DETECT_PSRAM_SIZE PICO_AUTO_DETECT_PSRAM
78#endif
79
80// PICO_CONFIG: PICO_AUTO_DETECT_PSRAM_CS, automatically detect psram chip select pin, type=bool, default=PICO_AUTO_DETECT_PSRAM, group=hardware_psram
81#ifndef PICO_AUTO_DETECT_PSRAM_CS
82#define PICO_AUTO_DETECT_PSRAM_CS PICO_AUTO_DETECT_PSRAM
83#elif PICO_AUTO_DETECT_PSRAM_CS && !PICO_AUTO_DETECT_PSRAM_SIZE
84#error "PICO_AUTO_DETECT_PSRAM_SIZE must be set to use PICO_AUTO_DETECT_PSRAM_CS"
85#endif
86
87// PICO_CONFIG: PICO_AUTO_DETECT_PSRAM_CS_SKIP_DEFAULTS, skip any _DEFAULT_ GPIOs defined in the board header when auto-detecting psram chip select pin, type=bool, default=PICO_AUTO_DETECT_PSRAM_CS, group=hardware_psram
88// PICO_CONFIG: PICO_AUTO_DETECT_PSRAM_CS_SKIP_PINS, comma separated list of extra pins to not check when auto-detecting psram chip select pin, type=list, group=hardware_psram
89#ifndef PICO_AUTO_DETECT_PSRAM_CS_SKIP_DEFAULTS
90#define PICO_AUTO_DETECT_PSRAM_CS_SKIP_DEFAULTS PICO_AUTO_DETECT_PSRAM_CS
91#endif
92
93// PICO_CONFIG: PICO_DEFAULT_PSRAM_ID, Default ID of psram used for auto-detection, type=int, default=0x5D, group=hardware_psram
94#ifndef PICO_DEFAULT_PSRAM_ID
95#define PICO_DEFAULT_PSRAM_ID 0x5D
96#endif
97
98// PICO_CONFIG: PICO_DEFAULT_PSRAM_MAX_FREQ, Default max frequency of psram, type=int, default=133 * MHZ, group=hardware_psram
99#ifndef PICO_DEFAULT_PSRAM_MAX_FREQ
100#define PICO_DEFAULT_PSRAM_MAX_FREQ (133 * MHZ)
101#endif
102
103// PICO_CONFIG: PICO_DEFAULT_PSRAM_MAX_SELECT, Default max select time of psram in ns, type=int, default=8000, group=hardware_psram
104#ifndef PICO_DEFAULT_PSRAM_MAX_SELECT
105#define PICO_DEFAULT_PSRAM_MAX_SELECT 8000
106#endif
107
108// PICO_CONFIG: PICO_DEFAULT_PSRAM_MIN_DESELECT, Default min deselect time of psram in ns, type=int, default=18, group=hardware_psram
109#ifndef PICO_DEFAULT_PSRAM_MIN_DESELECT
110#define PICO_DEFAULT_PSRAM_MIN_DESELECT 18
111#endif
112
113
114// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PSRAM, Skip calling of `runtime_init_setup_psram` function during runtime init, type=bool, default=0, group=pico_runtime_init
115// PICO_CONFIG: PICO_RUNTIME_NO_INIT_PSRAM, Do not include SDK implementation of `runtime_init_setup_psram` function, type=bool, default=0, group=pico_runtime_init
116
117#ifndef PICO_RUNTIME_INIT_PSRAM
118#define PICO_RUNTIME_INIT_PSRAM "11080"
119#endif
120
121#ifndef PICO_RUNTIME_SKIP_INIT_PSRAM
122#define PICO_RUNTIME_SKIP_INIT_PSRAM 0
123#endif
124
125#ifndef PICO_RUNTIME_NO_INIT_PSRAM
126#define PICO_RUNTIME_NO_INIT_PSRAM 0
127#endif
128
129#ifdef __cplusplus
130extern "C" {
131#endif
132
138bool psram_is_available(void);
139
148size_t psram_get_size(void);
149
155bool psram_check_address(void* addr);
156
168size_t psram_detect_size(void);
169
182size_t psram_detect_cs_and_size(uint8_t *cs_gpios, size_t num);
183
196int psram_configure_params(uint32_t max_psram_freq, uint32_t max_select_ns, uint32_t min_deselect_ns);
197
211int psram_set_params(uint32_t divisor, uint32_t rxdelay, uint32_t max_select, uint32_t min_deselect);
212
223int psram_reinitialize(void);
224
239size_t psram_eid_to_size(uint8_t kgd, uint8_t eid);
240
248#define psram_or_malloc(group, type, var, size) \
249 static type __uninitialized_psram(group) var##_psram[size]; static type* var; \
250 if (!var) { \
251 if (psram_check_address(var##_psram + (size))) { \
252 var = (type*)var##_psram; \
253 } else { \
254 var = (type*)malloc((size) * sizeof(type)); \
255 } \
256 }
257
263#define psram_or_free(var) if (!psram_check_address(var##_psram)) { free(var); }
264
265#ifdef __cplusplus
266}
267#endif
268
269#endif // _HARDWARE_PSRAM_H
int psram_reinitialize(void)
Re-initialize PSRAM.
Definition psram.c:289
int psram_set_params(uint32_t divisor, uint32_t rxdelay, uint32_t max_select, uint32_t min_deselect)
Explicitly set PSRAM timing parameters.
Definition psram.c:221
size_t psram_eid_to_size(uint8_t kgd, uint8_t eid)
Convert PSRAM EID to size.
Definition psram.c:25
size_t psram_get_size(void)
Get the size of the PSRAM.
Definition psram.c:315
bool psram_check_address(void *addr)
Check if an address is in available PSRAM.
Definition psram.c:322
bool psram_is_available(void)
Check if PSRAM is available and initialized.
Definition psram.c:311
int psram_configure_params(uint32_t max_psram_freq, uint32_t max_select_ns, uint32_t min_deselect_ns)
Configure PSRAM timing parameters.
Definition psram.c:195
size_t psram_detect_size(void)
Detect PSRAM size.
Definition psram.c:49
size_t psram_detect_cs_and_size(uint8_t *cs_gpios, size_t num)
Detect PSRAM chip select pin and size.
Definition psram.c:70