7#ifndef _HARDWARE_ADDRESS_MAPPED_H
8#define _HARDWARE_ADDRESS_MAPPED_H
11#include "hardware/regs/addressmap.h"
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")
59#ifndef PARAM_ASSERTIONS_ENABLED_ADDRESS_ALIAS
60#define PARAM_ASSERTIONS_ENABLED_ADDRESS_ALIAS 0
63typedef volatile uint64_t io_rw_64;
64typedef const volatile uint64_t io_ro_64;
65typedef volatile uint64_t io_wo_64;
66typedef volatile uint32_t io_rw_32;
67typedef const volatile uint32_t io_ro_32;
68typedef volatile uint32_t io_wo_32;
69typedef volatile uint16_t io_rw_16;
70typedef const volatile uint16_t io_ro_16;
71typedef volatile uint16_t io_wo_16;
72typedef volatile uint8_t io_rw_8;
73typedef const volatile uint8_t io_ro_8;
74typedef volatile uint8_t io_wo_8;
76typedef volatile uint8_t *
const ioptr;
77typedef ioptr
const const_ioptr;
87#define hw_alias_check_addr(addr) ((uintptr_t)(addr))
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);
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)))
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)))
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))
136 *(io_rw_32 *) hw_set_alias_untyped((
volatile void *) addr) = mask;
146 *(io_rw_32 *) hw_clear_alias_untyped((
volatile void *) addr) = mask;
156 *(io_rw_32 *) hw_xor_alias_untyped((
volatile void *) addr) = mask;
177#include "hardware/structs/accessctrl.h"
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
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
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
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