SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
io.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0+ */
2
3#ifndef __IO_H__
4#define __IO_H__
5
6#include <stdint.h>
7
13#define BIT(x) (1 << (x))
14
22#define clrsetbits_le32(addr, clear, set) write32((addr), (read32(addr) & ~(clear)) | (set))
23
30#define setbits_le32(addr, set) write32((addr), read32(addr) | (set))
31
38#define clrbits_le32(addr, clear) write32((addr), read32(addr) & ~(clear))
39
45#define readb(addr) read8(addr)
46
53#define writeb(val, addr) write8((addr), (val))
54
60#define readw(addr) read16(addr)
61
68#define writew(val, addr) write16((addr), (val))
69
75#define readl(addr) read32(addr)
76
83#define writel(val, addr) write32((addr), (val))
84
91static inline __attribute__((__always_inline__)) uint8_t read8(virtual_addr_t addr) {
93
94 asm volatile("lb %0, 0(%1)"
95 : "=r"(val)
96 : "r"(addr));
97 return val;
98}
99
106static inline __attribute__((__always_inline__)) uint16_t read16(virtual_addr_t addr) {
108
109 asm volatile("lh %0, 0(%1)"
110 : "=r"(val)
111 : "r"(addr));
112 return val;
113}
114
121static inline __attribute__((__always_inline__)) uint32_t read32(virtual_addr_t addr) {
123
124 asm volatile("lw %0, 0(%1)"
125 : "=r"(val)
126 : "r"(addr));
127 return val;
128}
129
136static inline __attribute__((__always_inline__)) uint64_t read64(virtual_addr_t addr) {
138
139 asm volatile("ld %0, 0(%1)"
140 : "=r"(val)
141 : "r"(addr));
142 return val;
143}
144
151static inline __attribute__((__always_inline__)) void write8(virtual_addr_t addr, uint8_t value) {
152 asm volatile("sb %0, 0(%1)"
153 :
154 : "r"(value), "r"(addr));
155}
156
163static inline __attribute__((__always_inline__)) void write16(virtual_addr_t addr, uint16_t value) {
164 asm volatile("sh %0, 0(%1)"
165 :
166 : "r"(value), "r"(addr));
167}
168
175static inline __attribute__((__always_inline__)) void write32(virtual_addr_t addr, uint32_t value) {
176 asm volatile("sw %0, 0(%1)"
177 :
178 : "r"(value), "r"(addr));
179}
180
187static inline __attribute__((__always_inline__)) void write64(virtual_addr_t addr, uint64_t value) {
188 asm volatile("sd %0, 0(%1)"
189 :
190 : "r"(value), "r"(addr));
191}
192
193#endif
ul val
Definition memtester.c:33
static void write64(virtual_addr_t addr, u64_t value)
Definition io.h:34
static u16_t read16(virtual_addr_t addr)
Definition io.h:10
static u64_t read64(virtual_addr_t addr)
Definition io.h:18
static void write8(virtual_addr_t addr, u8_t value)
Definition io.h:22
static u32_t read32(virtual_addr_t addr)
Definition io.h:14
static void write16(virtual_addr_t addr, u16_t value)
Definition io.h:26
static void write32(virtual_addr_t addr, u32_t value)
Definition io.h:30
static u8_t read8(virtual_addr_t addr)
Definition io.h:6
u64_t uint64_t
Definition stdint.h:16
u32_t uint32_t
Definition stdint.h:13
u8_t uint8_t
Definition stdint.h:7
u16_t uint16_t
Definition stdint.h:10
unsigned long long virtual_addr_t
Definition types.h:32
static __attribute__((__always_inline__)) uint8_t read8(virtual_addr_t addr)
Inline function to read an 8-bit value from the specified address.
Definition io.h:104
static uint8_t value
Definition io.h:144