2025-12-17 15:55:25 +08:00

42 lines
1.3 KiB
C

#ifndef IO_H
#define IO_H
#define readl(addr) (*(volatile unsigned int *)(addr))
#define writel(val, addr) (*(volatile unsigned int *)(addr) = (val))
#define readw(addr) (*(volatile unsigned short *)(addr))
#define writew(val, addr) (*(volatile unsigned short *)(addr) = (val))
#define readb(addr) (*(volatile unsigned char *)(addr))
#define writeb(val, addr) (*(volatile unsigned char *)(addr) = (val))
#define inw(port) readl(port)
#define outw(port, val) writel(val, port)
#define inb(port) readb(port)
#define outb(port, val) writeb(val, port)
#define inhw(port) readw(port)
#define outhw(port, val) writew(val, port)
#define masked_outw(port, val, mask) outw(port, (inw(port) & ~mask) | (val & mask))
#define GET_BIT(port, __bit) \
((inw(port) & BIT##__bit) >> __bit)
#define GET_BITS(port, __s_bit, __e_bit) \
((inw(port) & (BIT##__e_bit | (BIT##__e_bit - BIT##__s_bit))) >> __s_bit)
#define SET_BIT(port, __bit) \
outw(port, BIT##__bit)
#define SET_MASKED_BIT(port, val, __bit) \
outw(port, (inw(port) & ~BIT##__bit) | ((val << __bit) & BIT##__bit))
#define SET_MASKED_BITS(port, val, __s_bit, __e_bit) \
outw(port, ((inw(port) & ~(BIT##__e_bit | (BIT##__e_bit - BIT##__s_bit))) | (val << __s_bit)));
#endif // IO_H