1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#ifndef IO_H
#define IO_H
#include "def.h"
static inline void outb(u16 port, u8 val)
{
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) : "memory");
}
static inline u8 inb(u16 port)
{
u8 val;
asm volatile("inb %1, %0" : "=a"(val) : "dN"(port) : "memory");
return val;
}
static inline void outw(u16 port, u16 val)
{
asm volatile("outw %0, %1" : : "a"(val), "Nd"(port) : "memory");
}
static inline u16 inw(u16 port)
{
u16 val;
asm volatile("inw %1, %0" : "=a"(val) : "dN"(port) : "memory");
return val;
}
static inline void outl(u16 port, u32 val)
{
asm volatile("outl %0, %1" : : "a"(val), "Nd"(port) : "memory");
}
static inline u32 inl(u16 port)
{
u32 val;
asm volatile("inl %1, %0" : "=a"(val) : "dN"(port) : "memory");
return val;
}
typedef enum {
IO_PIC1_CTRL = 0x20,
IO_PIC1_DATA = 0x21,
IO_PIC2_CTRL = 0xA0,
IO_PIC2_DATA = 0xA1,
IO_PS2_DATA = 0x60,
IO_PS2_CTRL = 0x64,
} io_port;
static inline void io_wait(void)
{
outb(0x80, 0);
}
#endif
|