1 #ifndef __MMIO_H__
2 #define __MMIO_H__
3
4 #define REG16(x)(*((volatile uint16_t *)(x)))
5 #define REG(x)(*((volatile uint32_t *)(x)))
6 #define BIT(x)(0x1 << x)
7
8 /* Write a uint32_t value to a memory address. */
9 static inline void
write32(uint32_t address,uint32_t value)10 write32(uint32_t address, uint32_t value)
11 {
12 REG(address) = value;
13 }
14
15 /* Read an uint32_t from a memory address */
16 static inline uint32_t
read32(uint32_t address)17 read32(uint32_t address)
18 {
19 return REG(address);
20 }
21
22 /* Set a 32 bits value depending on a mask */
23 static inline void
set32(uint32_t address,uint32_t mask,uint32_t value)24 set32(uint32_t address, uint32_t mask, uint32_t value)
25 {
26 uint32_t val;
27 val = read32(address);
28 /* clear the bits */
29 val &= ~(mask);
30 /* apply the value using the mask */
31 val |= (value & mask);
32 write32(address, val);
33 }
34
35 /* Write a uint16_t value to a memory address. */
36 static inline void
write16(uint32_t address,uint16_t value)37 write16(uint32_t address, uint16_t value)
38 {
39 REG16(address) = value;
40 }
41
42 /* Read an uint16_t from a memory address */
43 static inline uint16_t
read16(uint32_t address)44 read16(uint32_t address)
45 {
46 return REG16(address);
47 }
48
49 /* Set a 16 bits value depending on a mask */
50 static inline void
set16(uint32_t address,uint16_t mask,uint16_t value)51 set16(uint32_t address, uint16_t mask, uint16_t value)
52 {
53 uint16_t val;
54 val = read16(address);
55 /* clear the bits */
56 val &= ~(mask);
57 /* apply the value using the mask */
58 val |= (value & mask);
59 write16(address, val);
60 }
61
62 #endif /* __MMIO_H__ */
63