fix dependency check logic cause config always disabled
[lunaix-os.git] / lunaix-os / hal / gfxa / vga / vga_mmio_ops.c
1 #include "vga.h"
2
3 typedef volatile u8_t vga_reg8;
4
5 #define regaddr(type, i, vga)                                                  \
6     ((vga_reg8*)(vga_gfx_regmap[type][i] + (vga)->io_off))
7
8 #define arx_reset(v) (void)(*regaddr(VGA_STATX, 1, v))
9
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 }
16 };
17
18 static u32_t
19 vga_mmio_read(struct vga* v, u32_t type, u32_t index, u32_t mask)
20 {
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;
25 }
26
27 static void
28 vga_mmio_write(struct vga* v, u32_t type, u32_t index, u32_t val, u32_t mask)
29 {
30     index = index & 0xff;
31     val = val & mask;
32     vga_reg8* reg_ix = regaddr(type, VGA_REG_X, v);
33     if (type == VGA_ARX) {
34         // reset ARX filp-flop
35         arx_reset(v);
36         *reg_ix = ((u8_t)index) | 0x20;
37         *reg_ix = val;
38         return;
39     } else if (type == VGA_MISCX) {
40         *reg_ix = val;
41         return;
42     }
43
44     *((u16_t*)reg_ix) = (u16_t)(((val) << 8) | index);
45 }
46
47 static void
48 vga_mmio_set_regs(struct vga* v, u32_t type, size_t off, u32_t* seq, size_t len)
49 {
50     vga_reg8* reg_ix = regaddr(type, VGA_REG_X, v);
51     if (type == VGA_ARX) {
52         arx_reset(v);
53         for (size_t i = 0; i < len; i++) {
54             *reg_ix = (u8_t)(off + i) | 0x20;
55             *reg_ix = seq[i];
56         }
57
58     } else {
59         for (size_t i = 0; i < len; i++) {
60             *((u16_t*)reg_ix) = (u16_t)((seq[i] << 8) | ((off + i) & 0xff));
61         }
62     }
63 }
64
65 static void
66 vga_mmio_set_dacp(struct vga* v, u32_t* lut, size_t len)
67 {
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))
71
72     vga_reg8* reg_ix = regaddr(VGA_DACX, VGA_REG_X, v);
73     vga_reg8* reg_dat = regaddr(VGA_DACX, VGA_REG_D, v);
74
75     *reg_ix = 0;
76     for (size_t i = 0; i < len; i++) {
77         u32_t color = lut[i];
78         *reg_dat = R(color);
79         *reg_dat = G(color);
80         *reg_dat = B(color);
81     }
82 }
83
84 struct vga_regops vga_default_mmio_ops = { .read = vga_mmio_read,
85                                            .write = vga_mmio_write,
86                                            .set_seq = vga_mmio_set_regs,
87                                            .set_dac_palette =
88                                              vga_mmio_set_dacp };