3 typedef volatile u8_t vga_reg8;
5 #define regaddr(type, i, vga) \
6 ((vga_reg8*)(vga_gfx_regmap[type][i] + (vga)->io_off))
8 #define arx_reset(v) (void)(*regaddr(VGA_STATX, 1, v))
10 // Port IO Address - 0x3C0
11 static u32_t vga_gfx_regmap[][2] = {
12 [VGA_ARX] = { 0x0, 0x1 }, [VGA_SRX] = { 0x04, 0x05 },
13 [VGA_GRX] = { 0x0E, 0x0F }, [VGA_CRX] = { 0x14, 0x15 },
14 [VGA_DACX] = { 0x08, 0x09 }, [VGA_MISCX] = { 0x02, 0x0C },
15 [VGA_STATX] = { 0x02, 0x1A }
19 vga_mmio_read(struct vga* v, u32_t type, u32_t index, u32_t mask)
21 vga_reg8* reg_ix = regaddr(type, VGA_REG_X, v);
22 vga_reg8* reg_rd = regaddr(type, VGA_REG_D, v);
23 *reg_ix = (u8_t)index;
24 return ((u32_t)*reg_rd) & mask;
28 vga_mmio_write(struct vga* v, u32_t type, u32_t index, u32_t val, u32_t mask)
32 vga_reg8* reg_ix = regaddr(type, VGA_REG_X, v);
33 if (type == VGA_ARX) {
34 // reset ARX filp-flop
36 *reg_ix = ((u8_t)index) | 0x20;
39 } else if (type == VGA_MISCX) {
44 *((u16_t*)reg_ix) = (u16_t)(((val) << 8) | index);
48 vga_mmio_set_regs(struct vga* v, u32_t type, size_t off, u32_t* seq, size_t len)
50 vga_reg8* reg_ix = regaddr(type, VGA_REG_X, v);
51 if (type == VGA_ARX) {
53 for (size_t i = 0; i < len; i++) {
54 *reg_ix = (u8_t)(off + i) | 0x20;
59 for (size_t i = 0; i < len; i++) {
60 *((u16_t*)reg_ix) = (u16_t)((seq[i] << 8) | ((off + i) & 0xff));
66 vga_mmio_set_dacp(struct vga* v, u32_t* lut, size_t len)
68 #define R(c) (u8_t)(((c) & 0xff0000) >> 16)
69 #define G(c) (u8_t)(((c) & 0x00ff00) >> 8)
70 #define B(c) (u8_t)(((c) & 0x0000ff))
72 vga_reg8* reg_ix = regaddr(VGA_DACX, VGA_REG_X, v);
73 vga_reg8* reg_dat = regaddr(VGA_DACX, VGA_REG_D, v);
76 for (size_t i = 0; i < len; i++) {
84 struct vga_regops vga_default_mmio_ops = { .read = vga_mmio_read,
85 .write = vga_mmio_write,
86 .set_seq = vga_mmio_set_regs,