L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
hw_mmio_register_block
1// vi:set ft=cpp: -*- Mode: C++ -*-
2/*
3 * Copyright (C) 2014-2021, 2023-2024 Kernkonzept GmbH.
4 * Author(s): Alexander Warg <alexander.warg@kernkonzept.com>
5 * Sarah Hoffmann <sarah.hoffmann@kernkonzept.com>
6 *
7 * License: see LICENSE.spdx (in this directory or the directories above)
8 */
9#pragma once
10
11#include <l4/drivers/hw_register_block>
12#include <l4/drivers/asm_access.h>
13
14namespace L4drivers {
15
16class Mmio_register_block_base
17{
18protected:
19 l4_addr_t _base;
20 l4_addr_t _shift;
21
22public:
23 explicit Mmio_register_block_base(l4_addr_t base = 0, l4_addr_t shift = 0)
24 : _base(base), _shift(shift) {}
25
26 template< typename T >
27 T read(l4_addr_t reg) const
28 { return Asm_access::read(reinterpret_cast<T const *>(_base + (reg << _shift))); }
29
30 template< typename T >
31 void write(T value, l4_addr_t reg) const
32 { Asm_access::write(value, reinterpret_cast<T *>(_base + (reg << _shift))); }
33
34 void set_base(l4_addr_t base) { _base = base; }
35 void set_shift(l4_addr_t shift) { _shift = shift; }
36};
37
38/**
39 * An MMIO block with up to 64-bit register access (32-bit default) and little
40 * endian byte order.
41 */
42template< unsigned MAX_BITS = 32 >
43struct Mmio_register_block
44: Register_block_impl<Mmio_register_block<MAX_BITS>, MAX_BITS>,
45 Mmio_register_block_base
46{
47 explicit Mmio_register_block(l4_addr_t base = 0, l4_addr_t shift = 0)
48 : Mmio_register_block_base(base, shift) {}
49};
50
51}