io.h#
io.h中提供了io操作函数
- Author
Shihong Wang (jack4shihong@gmail.com)
- Version
0.1
- Date
2023-04-09
- Copyright
Copyright Shihong Wang (c) 2023 with GNU Public License V3.0
Note
RISC-V通过Memory Mapping IO (MMIO)的方式操作设备寄存器. 关于具体的MMIO Map, 参阅QEMU中的virt_memmap[]: qemu/qemu
Defines
-
dmb()#
dmb(Define Memory Barrier)定义了内存屏障(Memory Barrier)Note
关于内存屏障, 参考:
-
__iormb()#
__iormb定义了读取寄存器的内存屏障
-
__iowmb()#
__iowmb定义了写入寄存器的内存屏障
-
glue(x, y, z)#
glue用于将符号x,y,z拼接为符号x_y_z- Parameters:
x – 第一个符号
y – 第二个符号
z – 第三个符号
-
mkname(type, width)#
mkname用于方便的拼接得到函数名- Parameters:
type – 读还是写寄存器, 只能是read或write
width – 读写的位数
-
mkread(width)#
mkread用于生成读不同长度寄存器的函数Note
通常情况下,在内联汇编代码块的最后一条语句中将需要返回的值存储在一个特定的变量中,然后该变量将被作为代码块的返回值返回给调用者。在GCC扩展中,这个变量通常被命名为__v(两个下划线 + v),并且在代码块的最后一行写上__v;语句来表示将其作为返回值返回给调用者。
Note
因为地址的值(寄存器的值)可能会被设备改变, 因此必须声明是volatile, 以避免GCC进行优化
- Parameters:
width – 读取的位数
-
mkwrite(width)#
mkwrite用于生成写不同长度寄存器的函数Note
因为地址的值(寄存器的值)可能会被设备改变, 因此必须声明是volatile, 以避免GCC进行优化
- Parameters:
width – 写入的位数
Functions
-
static inline void write_8_bits(uint64_t addr, uint8_t value)#
write_8_bits向addr映射的寄存器写1个字节的数据- Parameters:
addr – 寄存器映射的地址
value – 需要写入的数据, 1个字节
-
static inline void write_16_bits(uint64_t addr, uint16_t value)#
write_16_bits向addr映射的寄存器写2个字节的数据- Parameters:
addr – 寄存器映射的地址
value – 需要写入的数据, 2个字节
-
static inline void write_32_bits(uint64_t addr, uint32_t value)#
write_32_bits向addr映射的寄存器写4个字节的数据- Parameters:
addr – 寄存器映射的地址
value – 需要写入的数据, 4个字节
-
static inline void write_64_bits(uint64_t addr, uint64_t value)#
write_64_bits向addr映射的寄存器写8个字节的数据- Parameters:
addr – 寄存器映射的地址
value – 需要写入的数据, 8个字节
-
static inline uint8_t read_8_bits(uint64_t addr)#
read_8_bits从addr映射的寄存器读取1个字节的数据- Parameters:
addr – 寄存器映射的地址
- Returns:
uint8_t 读取的数据
-
static inline uint16_t read_16_bits(uint64_t addr)#
read_16_bits从addr映射的寄存器读取2个字节的数据- Parameters:
addr – 寄存器映射的地址
- Returns:
uint16_t 读取的数据
-
static inline uint32_t read_32_bits(uint64_t addr)#
read_32_bits从addr映射的寄存器读取4个字节的数据- Parameters:
addr – 寄存器映射的地址
- Returns:
uint32_t 读取的数据
-
static inline uint64_t read_64_bits(uint64_t addr)#
read_64_bits从addr映射的寄存器读取8个字节的数据- Parameters:
addr – 寄存器映射的地址
- Returns:
uint64_t 读取的数据
- mkread (8)
- mkread (16)
- mkread (32)
- mkread (64)
- mkwrite (8)
- mkwrite (16)
- mkwrite (32)
- mkwrite (64)