11 class Io_register_block
17 virtual unsigned char read8(
unsigned long reg)
const = 0;
22 virtual unsigned short read16(
unsigned long reg)
const = 0;
27 virtual unsigned int read32(
unsigned long reg)
const = 0;
37 virtual void write8(
unsigned long reg,
unsigned char value)
const = 0;
42 virtual void write16(
unsigned long reg,
unsigned short value)
const = 0;
47 virtual void write32(
unsigned long reg,
unsigned int value)
const = 0;
57 virtual unsigned long addr(
unsigned long reg)
const = 0;
64 virtual void delay()
const = 0;
66 virtual ~Io_register_block() = 0;
75 template<
typename R >
76 R
read(
unsigned long reg)
const
78 static_assert(
sizeof(R) == 1 ||
sizeof(R) == 2 ||
sizeof(R) == 4,
83 case 1:
return read8(reg);
84 case 2:
return read16(reg);
85 case 4:
return read32(reg);
96 template<
typename R >
97 void write(
unsigned long reg, R value)
const
99 static_assert(
sizeof(R) == 1 ||
sizeof(R) == 2 ||
sizeof(R) == 4,
104 case 1: write8(reg, value);
return;
105 case 2: write16(reg, value);
return;
106 case 4: write32(reg, value);
return;
120 template<
typename R >
121 R modify(
unsigned long reg, R clear_bits, R set_bits)
const
123 R r = (read<R>(reg) & ~clear_bits) | set_bits;
134 template<
typename R >
135 R set(
unsigned long reg, R set_bits)
const
137 return modify<R>(reg, 0, set_bits);
146 template<
typename R >
147 R clear(
unsigned long reg, R clear_bits)
const
149 return modify<R>(reg, clear_bits, 0);
154 inline Io_register_block::~Io_register_block() {}
157 class Io_register_block_mmio :
public Io_register_block
160 template<
typename R >
161 R _read(
unsigned long reg)
const
162 {
return *
reinterpret_cast<volatile R *
>(_base + (reg << _shift)); }
164 template<
typename R >
165 void _write(
unsigned long reg, R val)
const
166 { *
reinterpret_cast<volatile R *
>(_base + (reg << _shift)) = val; }
169 Io_register_block_mmio(
unsigned long base,
unsigned char shift = 0)
170 : _base(base), _shift(shift)
173 unsigned long addr(
unsigned long reg)
const override
174 {
return _base + (reg << _shift); }
176 unsigned char read8(
unsigned long reg)
const override
177 {
return _read<unsigned char>(reg); }
178 unsigned short read16(
unsigned long reg)
const override
179 {
return _read<unsigned short>(reg); }
180 unsigned int read32(
unsigned long reg)
const override
181 {
return _read<unsigned int>(reg); }
183 void write8(
unsigned long reg,
unsigned char val)
const override
184 { _write(reg, val); }
185 void write16(
unsigned long reg,
unsigned short val)
const override
186 { _write(reg, val); }
187 void write32(
unsigned long reg,
unsigned int val)
const override
188 { _write(reg, val); }
190 void delay()
const override
195 unsigned char _shift;
198 template<
typename ACCESS_TYPE>
199 class Io_register_block_mmio_fixed_width :
public Io_register_block
202 template<
typename R >
203 R _read(
unsigned long reg)
const
204 {
return *
reinterpret_cast<volatile ACCESS_TYPE *
>(_base + (reg << _shift)); }
206 template<
typename R >
207 void _write(
unsigned long reg, R val)
const
208 { *
reinterpret_cast<volatile ACCESS_TYPE *
>(_base + (reg << _shift)) = val; }
211 Io_register_block_mmio_fixed_width(
unsigned long base,
unsigned char shift = 0)
212 : _base(base), _shift(shift)
215 unsigned long addr(
unsigned long reg)
const
216 {
return _base + (reg << _shift); }
218 unsigned char read8(
unsigned long reg)
const override
219 {
return _read<unsigned char>(reg); }
220 unsigned short read16(
unsigned long reg)
const override
221 {
return _read<unsigned short>(reg); }
222 unsigned int read32(
unsigned long reg)
const override
223 {
return _read<unsigned int>(reg); }
225 void write8(
unsigned long reg,
unsigned char val)
const override
226 { _write(reg, val); }
227 void write16(
unsigned long reg,
unsigned short val)
const override
228 { _write(reg, val); }
229 void write32(
unsigned long reg,
unsigned int val)
const override
230 { _write(reg, val); }
232 void delay()
const override
237 unsigned char _shift;
T read(Istream &s)
Read a value out of a stream.
L4 low-level kernel interface.