86afe4e06b3a6b7c984b6559264a664dc734e260
[lunaix-os.git] / lunaix-os / hal / gfxa / vga / vga.h
1 #ifndef __LUNAIX_VGA_H
2 #define __LUNAIX_VGA_H
3
4 #include <lunaix/types.h>
5
6 /* -- Attribute Controller -- */
7
8 #define VGA_ARX 0
9 // Attribute Mode Control Register
10 #define VGA_AR10 0x10
11
12 // Overscan Color Register
13 #define VGA_AR11 0x11
14
15 // Color Plane Enable Register
16 #define VGA_AR12 0x12
17
18 // Horizontal Pixel Panning Register
19 #define VGA_AR13 0x13
20
21 // Color Select Register
22 #define VGA_AR14 0x14
23
24 /* -- Sequencer -- */
25
26 #define VGA_SRX 1
27 // Reset Register
28 #define VGA_SR00 0x00
29
30 // Clocking Mode Register
31 #define VGA_SR01 0x01
32
33 // Map Mask Register
34 #define VGA_SR02 0x02
35
36 // Character Map Select Register
37 #define VGA_SR03 0x03
38
39 // Sequencer Memory Mode Register
40 #define VGA_SR04 0x04
41
42 /* -- GFX Controller -- */
43
44 #define VGA_GRX 2
45 // Set/Reset Register
46 #define VGA_GR00 0x00
47
48 // Enable Set/Reset Register
49 #define VGA_GR01 0x01
50
51 // Color Compare Register
52 #define VGA_GR02 0x02
53
54 // Data Rotate Register
55 #define VGA_GR03 0x03
56
57 // Read Map Select Register
58 #define VGA_GR04 0x04
59
60 // Graphics Mode Register
61 #define VGA_GR05 0x05
62
63 // Miscellaneous Graphics Register
64 #define VGA_GR06 0x06
65
66 // Color Don't Care Register
67 #define VGA_GR07 0x07
68
69 // Bit Mask Register
70 #define VGA_GR08 0x08
71
72 /* -- CRT Controller -- */
73
74 #define VGA_CRX 3
75
76 // Horizontal Total Register
77 #define VGA_CR00 0x00
78
79 // End Horizontal Display Register
80 #define VGA_CR01 0x01
81
82 // Start Horizontal Blanking Register
83 #define VGA_CR02 0x02
84
85 // End Horizontal Blanking Register
86 #define VGA_CR03 0x03
87
88 // Start Horizontal Retrace Register
89 #define VGA_CR04 0x04
90
91 // End Horizontal Retrace Register
92 #define VGA_CR05 0x05
93
94 // Vertical Total Register
95 #define VGA_CR06 0x06
96
97 // Overflow Register
98 #define VGA_CR07 0x07
99
100 // Preset Row Scan Register
101 #define VGA_CR08 0x08
102
103 // Maximum Scan Line Register
104 #define VGA_CR09 0x09
105
106 // Cursor Start Register
107 #define VGA_CR0A 0x0A
108
109 // Cursor End Register
110 #define VGA_CR0B 0x0B
111
112 // Start Address High Register
113 #define VGA_CR0C 0x0C
114
115 // Start Address Low Register
116 #define VGA_CR0D 0x0D
117
118 // Cursor Location High Register
119 #define VGA_CR0E 0x0E
120
121 // Cursor Location Low Register
122 #define VGA_CR0F 0x0F
123
124 // Vertical Retrace Start Register
125 #define VGA_CR10 0x10
126
127 // Vertical Retrace End Register
128 #define VGA_CR11 0x11
129
130 // Vertical Display End Register
131 #define VGA_CR12 0x12
132
133 // Offset Register
134 #define VGA_CR13 0x13
135
136 // Underline Location Register
137 #define VGA_CR14 0x14
138
139 // Start Vertical Blanking Register
140 #define VGA_CR15 0x15
141
142 // End Vertical Blanking
143 #define VGA_CR16 0x16
144
145 // CRTC Mode Control Register
146 #define VGA_CR17 0x17
147
148 // Line Compare Register
149 #define VGA_CR18 0x18
150 #define VGA_CRCOUNT 0x19
151
152 /* -- Digital-Analogue Converter -- */
153
154 // DAC register
155 #define VGA_DACX 4
156
157 // DAC Data Register
158 #define VGA_DAC1 0x3C9
159
160 // DAC State Register
161 #define VGA_DAC2 0x3C7
162
163 #define VGA_MISCX 5
164 #define VGA_STATX 6
165
166 #define VGA_REG_X 0
167 #define VGA_REG_D 1
168
169 #define VGA_MODE_GFX (0b0001)
170
171 struct vga;
172
173 struct vga_regops
174 {
175     u32_t (*read)(struct vga*, u32_t type, u32_t index, u32_t mask);
176     void (*write)(struct vga*, u32_t type, u32_t index, u32_t val, u32_t mask);
177     void (
178       *set_seq)(struct vga*, u32_t type, size_t off, u32_t* seq, size_t len);
179     void (*set_dac_palette)(struct vga*);
180 };
181
182 struct vga
183 {
184     ptr_t io_off;
185     ptr_t fb;
186     size_t fb_sz;
187     u32_t options;
188
189     struct
190     {
191         size_t h_cclk;  // horizontal char clock count;
192         size_t v_cclk;  // vertical char clock count;
193         size_t pel_dot; // pixel per dot clock
194         size_t freq;
195         size_t fb_off;
196     } crt;
197
198     struct
199     {
200         u32_t* colors;
201         u32_t len;
202     } lut;
203
204     struct vga_regops reg_ops;
205 };
206
207 /**
208  * @brief Create a new VGA state
209  *
210  * @param reg_base base address for register accessing
211  * @param fb address to frame buffer
212  * @param fb_sz size of usable frame buffer
213  * @return struct vga* VGA state
214  */
215 struct vga*
216 vga_new_state(ptr_t reg_base, ptr_t fb, ptr_t fb_sz);
217
218 /**
219  * @brief Config VGA active displaying region dimension (resolution)
220  *
221  * @param width width in pixel counts
222  * @param hight height in pixel counts
223  * @param freq frame update frequency
224  * @param d9 use D9 character clock
225  */
226 void
227 vga_config_rect(struct vga*, size_t width, size_t hight, size_t freq, int d9);
228
229 void
230 vga_reload_config(struct vga*);
231
232 #endif /* __LUNAIX_VGA_H */