Menu Toggle
v2.3.1 (RP2350)
Toggle main menu visibility
Loading...
Searching...
No Matches
address_mapped.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3
*
4
* SPDX-License-Identifier: BSD-3-Clause
5
*/
6
7
#ifndef _HARDWARE_ADDRESS_MAPPED_H
8
#define _HARDWARE_ADDRESS_MAPPED_H
9
10
#include "
pico.h
"
11
#include "hardware/regs/addressmap.h"
12
50
51
#ifdef __cplusplus
52
extern
"C"
{
53
#endif
54
55
#define check_hw_layout(type, member, offset) static_assert(offsetof(type, member) == (offset), "hw offset mismatch")
56
#define check_hw_size(type, size) static_assert(sizeof(type) == (size), "hw size mismatch")
57
58
// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_ADDRESS_ALIAS, Enable/disable assertions in memory address aliasing macros, type=bool, default=0, group=hardware_base
59
#ifndef PARAM_ASSERTIONS_ENABLED_ADDRESS_ALIAS
60
#define PARAM_ASSERTIONS_ENABLED_ADDRESS_ALIAS 0
61
#endif
62
63
typedef
volatile
uint64_t io_rw_64;
64
typedef
const
volatile
uint64_t io_ro_64;
65
typedef
volatile
uint64_t io_wo_64;
66
typedef
volatile
uint32_t io_rw_32;
67
typedef
const
volatile
uint32_t io_ro_32;
68
typedef
volatile
uint32_t io_wo_32;
69
typedef
volatile
uint16_t io_rw_16;
70
typedef
const
volatile
uint16_t io_ro_16;
71
typedef
volatile
uint16_t io_wo_16;
72
typedef
volatile
uint8_t io_rw_8;
73
typedef
const
volatile
uint8_t io_ro_8;
74
typedef
volatile
uint8_t io_wo_8;
75
76
typedef
volatile
uint8_t *
const
ioptr;
77
typedef
ioptr
const
const_ioptr;
78
79
// A non-functional (empty) helper macro to help IDEs follow links from the autogenerated
80
// hardware struct headers in hardware/structs/xxx.h to the raw register definitions
81
// in hardware/regs/xxx.h. A preprocessor define such as TIMER_TIMEHW_OFFSET (a timer register offset)
82
// is not generally clickable (in an IDE) if placed in a C comment, so _REG_(TIMER_TIMEHW_OFFSET) is
83
// included outside of a comment instead
84
#define _REG_(x)
85
86
// Helper method used by hw_alias macros to optionally check input validity
87
#define hw_alias_check_addr(addr) ((uintptr_t)(addr))
88
// can't use the following impl as it breaks existing static declarations using hw_alias, so would be a backwards incompatibility
89
//static __force_inline uint32_t hw_alias_check_addr(volatile void *addr) {
90
// uint32_t rc = (uintptr_t)addr;
91
// invalid_params_if(ADDRESS_ALIAS, rc < 0x40000000); // catch likely non HW pointer types
92
// return rc;
93
//}
94
95
#if PICO_RP2040
96
// Helper method used by xip_alias macros to optionally check input validity
97
__force_inline
static
uint32_t xip_alias_check_addr(
const
void
*addr) {
98
uint32_t rc = (uintptr_t)addr;
99
valid_params_if(ADDRESS_ALIAS, rc >= XIP_MAIN_BASE && rc < XIP_NOALLOC_BASE);
100
return
rc;
101
}
102
#else
103
//static __force_inline uint32_t xip_alias_check_addr(const void *addr) {
104
// uint32_t rc = (uintptr_t)addr;
105
// valid_params_if(ADDRESS_ALIAS, rc >= XIP_BASE && rc < XIP_END);
106
// return rc;
107
//}
108
#endif
109
110
// Untyped conversion alias pointer generation macros
111
#define hw_set_alias_untyped(addr) ((void *)(REG_ALIAS_SET_BITS + hw_alias_check_addr(addr)))
112
#define hw_clear_alias_untyped(addr) ((void *)(REG_ALIAS_CLR_BITS + hw_alias_check_addr(addr)))
113
#define hw_xor_alias_untyped(addr) ((void *)(REG_ALIAS_XOR_BITS + hw_alias_check_addr(addr)))
114
115
#if PICO_RP2040
116
#define xip_noalloc_alias_untyped(addr) ((void *)(XIP_NOALLOC_BASE | xip_alias_check_addr(addr)))
117
#define xip_nocache_alias_untyped(addr) ((void *)(XIP_NOCACHE_BASE | xip_alias_check_addr(addr)))
118
#define xip_nocache_noalloc_alias_untyped(addr) ((void *)(XIP_NOCACHE_NOALLOC_BASE | xip_alias_check_addr(addr)))
119
#endif
120
121
// Typed conversion alias pointer generation macros
122
#define hw_set_alias(p) ((typeof(p))hw_set_alias_untyped(p))
123
#define hw_clear_alias(p) ((typeof(p))hw_clear_alias_untyped(p))
124
#define hw_xor_alias(p) ((typeof(p))hw_xor_alias_untyped(p))
125
#define xip_noalloc_alias(p) ((typeof(p))xip_noalloc_alias_untyped(p))
126
#define xip_nocache_alias(p) ((typeof(p))xip_nocache_alias_untyped(p))
127
#define xip_nocache_noalloc_alias(p) ((typeof(p))xip_nocache_noalloc_alias_untyped(p))
128
135
__force_inline
static
void
hw_set_bits
(io_rw_32 *addr, uint32_t mask) {
136
*(io_rw_32 *) hw_set_alias_untyped((
volatile
void
*) addr) = mask;
137
}
138
145
__force_inline
static
void
hw_clear_bits
(io_rw_32 *addr, uint32_t mask) {
146
*(io_rw_32 *) hw_clear_alias_untyped((
volatile
void
*) addr) = mask;
147
}
148
155
__force_inline
static
void
hw_xor_bits
(io_rw_32 *addr, uint32_t mask) {
156
*(io_rw_32 *) hw_xor_alias_untyped((
volatile
void
*) addr) = mask;
157
}
158
171
__force_inline
static
void
hw_write_masked
(io_rw_32 *addr, uint32_t values, uint32_t write_mask) {
172
hw_xor_bits
(addr, (*addr ^ values) & write_mask);
173
}
174
175
#if !PICO_RP2040
176
// include this here to avoid the check in every other hardware/structs header that needs it
177
#include "hardware/structs/accessctrl.h"
178
#endif
179
180
#ifdef __cplusplus
181
}
182
#endif
183
184
#endif
hw_set_bits
static __force_inline void hw_set_bits(io_rw_32 *addr, uint32_t mask)
Atomically set the specified bits to 1 in a HW register.
Definition
address_mapped.h:135
hw_xor_bits
static __force_inline void hw_xor_bits(io_rw_32 *addr, uint32_t mask)
Atomically flip the specified bits in a HW register.
Definition
address_mapped.h:155
hw_write_masked
static __force_inline void hw_write_masked(io_rw_32 *addr, uint32_t values, uint32_t write_mask)
Set new values for a sub-set of the bits in a HW register.
Definition
address_mapped.h:171
hw_clear_bits
static __force_inline void hw_clear_bits(io_rw_32 *addr, uint32_t mask)
Atomically clear the specified bits to 0 in a HW register.
Definition
address_mapped.h:145
__force_inline
#define __force_inline
Attribute to force inlining of a function regardless of optimization level.
Definition
compiler.h:128
pico.h