vgaregs.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /*
  2. * GRUB -- GRand Unified Bootloader
  3. * Copyright (C) 2010 Free Software Foundation, Inc.
  4. *
  5. * GRUB is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * GRUB is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifndef GRUB_VGAREGS_HEADER
  19. #define GRUB_VGAREGS_HEADER 1
  20. #ifdef ASM_FILE
  21. #define GRUB_VGA_IO_SR_INDEX 0x3c4
  22. #define GRUB_VGA_IO_SR_DATA 0x3c5
  23. #else
  24. enum
  25. {
  26. GRUB_VGA_IO_CR_BW_INDEX = 0x3b4,
  27. GRUB_VGA_IO_CR_BW_DATA = 0x3b5,
  28. GRUB_VGA_IO_ARX = 0x3c0,
  29. GRUB_VGA_IO_ARX_READ = 0x3c1,
  30. GRUB_VGA_IO_MISC_WRITE = 0x3c2,
  31. GRUB_VGA_IO_SR_INDEX = 0x3c4,
  32. GRUB_VGA_IO_SR_DATA = 0x3c5,
  33. GRUB_VGA_IO_PIXEL_MASK = 0x3c6,
  34. GRUB_VGA_IO_PALLETTE_READ_INDEX = 0x3c7,
  35. GRUB_VGA_IO_PALLETTE_WRITE_INDEX = 0x3c8,
  36. GRUB_VGA_IO_PALLETTE_DATA = 0x3c9,
  37. GRUB_VGA_IO_GR_INDEX = 0x3ce,
  38. GRUB_VGA_IO_GR_DATA = 0x3cf,
  39. GRUB_VGA_IO_CR_INDEX = 0x3d4,
  40. GRUB_VGA_IO_CR_DATA = 0x3d5,
  41. GRUB_VGA_IO_INPUT_STATUS1_REGISTER = 0x3da
  42. };
  43. #define GRUB_VGA_IO_INPUT_STATUS1_VERTR_BIT 0x08
  44. enum
  45. {
  46. GRUB_VGA_CR_HTOTAL = 0x00,
  47. GRUB_VGA_CR_HORIZ_END = 0x01,
  48. GRUB_VGA_CR_HBLANK_START = 0x02,
  49. GRUB_VGA_CR_HBLANK_END = 0x03,
  50. GRUB_VGA_CR_HORIZ_SYNC_PULSE_START = 0x04,
  51. GRUB_VGA_CR_HORIZ_SYNC_PULSE_END = 0x05,
  52. GRUB_VGA_CR_VERT_TOTAL = 0x06,
  53. GRUB_VGA_CR_OVERFLOW = 0x07,
  54. GRUB_VGA_CR_BYTE_PANNING = 0x08,
  55. GRUB_VGA_CR_CELL_HEIGHT = 0x09,
  56. GRUB_VGA_CR_CURSOR_START = 0x0a,
  57. GRUB_VGA_CR_CURSOR_END = 0x0b,
  58. GRUB_VGA_CR_START_ADDR_HIGH_REGISTER = 0x0c,
  59. GRUB_VGA_CR_START_ADDR_LOW_REGISTER = 0x0d,
  60. GRUB_VGA_CR_CURSOR_ADDR_HIGH = 0x0e,
  61. GRUB_VGA_CR_CURSOR_ADDR_LOW = 0x0f,
  62. GRUB_VGA_CR_VSYNC_START = 0x10,
  63. GRUB_VGA_CR_VSYNC_END = 0x11,
  64. GRUB_VGA_CR_VDISPLAY_END = 0x12,
  65. GRUB_VGA_CR_PITCH = 0x13,
  66. GRUB_VGA_CR_UNDERLINE_LOCATION = 0x14,
  67. GRUB_VGA_CR_VERTICAL_BLANK_START = 0x15,
  68. GRUB_VGA_CR_VERTICAL_BLANK_END = 0x16,
  69. GRUB_VGA_CR_MODE = 0x17,
  70. GRUB_VGA_CR_LINE_COMPARE = 0x18,
  71. };
  72. enum
  73. {
  74. GRUB_VGA_CR_BYTE_PANNING_NORMAL = 0
  75. };
  76. enum
  77. {
  78. GRUB_VGA_CR_UNDERLINE_LOCATION_DWORD_MODE = 0x40
  79. };
  80. enum
  81. {
  82. GRUB_VGA_IO_MISC_COLOR = 0x01,
  83. GRUB_VGA_IO_MISC_ENABLE_VRAM_ACCESS = 0x02,
  84. GRUB_VGA_IO_MISC_28MHZ = 0x04,
  85. GRUB_VGA_IO_MISC_EXTERNAL_CLOCK_0 = 0x08,
  86. GRUB_VGA_IO_MISC_UPPER_64K = 0x20,
  87. GRUB_VGA_IO_MISC_NEGATIVE_HORIZ_POLARITY = 0x40,
  88. GRUB_VGA_IO_MISC_NEGATIVE_VERT_POLARITY = 0x80,
  89. };
  90. enum
  91. {
  92. GRUB_VGA_ARX_MODE = 0x10,
  93. GRUB_VGA_ARX_OVERSCAN = 0x11,
  94. GRUB_VGA_ARX_COLOR_PLANE_ENABLE = 0x12,
  95. GRUB_VGA_ARX_HORIZONTAL_PANNING = 0x13,
  96. GRUB_VGA_ARX_COLOR_SELECT = 0x14
  97. };
  98. enum
  99. {
  100. GRUB_VGA_ARX_MODE_TEXT = 0x00,
  101. GRUB_VGA_ARX_MODE_GRAPHICS = 0x01,
  102. GRUB_VGA_ARX_MODE_ENABLE_256COLOR = 0x40
  103. };
  104. #define GRUB_VGA_CR_WIDTH_DIVISOR 8
  105. #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_SHIFT 7
  106. #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_MASK 0x02
  107. #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_SHIFT 3
  108. #define GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_MASK 0x40
  109. #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_SHIFT 8
  110. #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_MASK 0x01
  111. #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_SHIFT 4
  112. #define GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_MASK 0x20
  113. #define GRUB_VGA_CR_OVERFLOW_VSYNC_START1_SHIFT 6
  114. #define GRUB_VGA_CR_OVERFLOW_VSYNC_START1_MASK 0x04
  115. #define GRUB_VGA_CR_OVERFLOW_VSYNC_START2_SHIFT 2
  116. #define GRUB_VGA_CR_OVERFLOW_VSYNC_START2_MASK 0x80
  117. #define GRUB_VGA_CR_OVERFLOW_HEIGHT1_SHIFT 7
  118. #define GRUB_VGA_CR_OVERFLOW_HEIGHT1_MASK 0x02
  119. #define GRUB_VGA_CR_OVERFLOW_HEIGHT2_SHIFT 3
  120. #define GRUB_VGA_CR_OVERFLOW_HEIGHT2_MASK 0xc0
  121. #define GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_SHIFT 4
  122. #define GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_MASK 0x10
  123. #define GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_MASK 0x40
  124. #define GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT 3
  125. #define GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_MASK 0x20
  126. #define GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_SHIFT 4
  127. #define GRUB_VGA_CR_CELL_HEIGHT_DOUBLE_SCAN 0x80
  128. enum
  129. {
  130. GRUB_VGA_CR_CURSOR_START_DISABLE = (1 << 5)
  131. };
  132. #define GRUB_VGA_CR_PITCH_DIVISOR 8
  133. enum
  134. {
  135. GRUB_VGA_CR_MODE_NO_CGA = 0x01,
  136. GRUB_VGA_CR_MODE_NO_HERCULES = 0x02,
  137. GRUB_VGA_CR_MODE_ADDRESS_WRAP = 0x20,
  138. GRUB_VGA_CR_MODE_BYTE_MODE = 0x40,
  139. GRUB_VGA_CR_MODE_TIMING_ENABLE = 0x80
  140. };
  141. enum
  142. {
  143. GRUB_VGA_SR_RESET = 0,
  144. GRUB_VGA_SR_CLOCKING_MODE = 1,
  145. GRUB_VGA_SR_MAP_MASK_REGISTER = 2,
  146. GRUB_VGA_SR_CHAR_MAP_SELECT = 3,
  147. GRUB_VGA_SR_MEMORY_MODE = 4,
  148. };
  149. enum
  150. {
  151. GRUB_VGA_SR_RESET_ASYNC = 1,
  152. GRUB_VGA_SR_RESET_SYNC = 2
  153. };
  154. enum
  155. {
  156. GRUB_VGA_SR_CLOCKING_MODE_8_DOT_CLOCK = 1
  157. };
  158. enum
  159. {
  160. GRUB_VGA_SR_MEMORY_MODE_NORMAL = 0,
  161. GRUB_VGA_SR_MEMORY_MODE_EXTERNAL_VIDEO_MEMORY = 2,
  162. GRUB_VGA_SR_MEMORY_MODE_SEQUENTIAL_ADDRESSING = 4,
  163. GRUB_VGA_SR_MEMORY_MODE_CHAIN4 = 8,
  164. };
  165. enum
  166. {
  167. GRUB_VGA_GR_SET_RESET_PLANE = 0,
  168. GRUB_VGA_GR_SET_RESET_PLANE_ENABLE = 1,
  169. GRUB_VGA_GR_COLOR_COMPARE = 2,
  170. GRUB_VGA_GR_DATA_ROTATE = 3,
  171. GRUB_VGA_GR_READ_MAP_REGISTER = 4,
  172. GRUB_VGA_GR_MODE = 5,
  173. GRUB_VGA_GR_GR6 = 6,
  174. GRUB_VGA_GR_COLOR_COMPARE_DISABLE = 7,
  175. GRUB_VGA_GR_BITMASK = 8,
  176. GRUB_VGA_GR_MAX
  177. };
  178. #define GRUB_VGA_ALL_PLANES 0xf
  179. #define GRUB_VGA_NO_PLANES 0x0
  180. enum
  181. {
  182. GRUB_VGA_GR_DATA_ROTATE_NOP = 0
  183. };
  184. enum
  185. {
  186. GRUB_VGA_TEXT_TEXT_PLANE = 0,
  187. GRUB_VGA_TEXT_ATTR_PLANE = 1,
  188. GRUB_VGA_TEXT_FONT_PLANE = 2
  189. };
  190. enum
  191. {
  192. GRUB_VGA_GR_GR6_GRAPHICS_MODE = 1,
  193. GRUB_VGA_GR_GR6_MMAP_A0 = (1 << 2),
  194. GRUB_VGA_GR_GR6_MMAP_CGA = (3 << 2)
  195. };
  196. enum
  197. {
  198. GRUB_VGA_GR_MODE_READ_MODE1 = 0x08,
  199. GRUB_VGA_GR_MODE_ODD_EVEN = 0x10,
  200. GRUB_VGA_GR_MODE_ODD_EVEN_SHIFT = 0x20,
  201. GRUB_VGA_GR_MODE_256_COLOR = 0x40
  202. };
  203. struct grub_video_hw_config
  204. {
  205. unsigned vertical_total;
  206. unsigned vertical_blank_start;
  207. unsigned vertical_blank_end;
  208. unsigned vertical_sync_start;
  209. unsigned vertical_sync_end;
  210. unsigned line_compare;
  211. unsigned vdisplay_end;
  212. unsigned pitch;
  213. unsigned horizontal_total;
  214. unsigned horizontal_blank_start;
  215. unsigned horizontal_blank_end;
  216. unsigned horizontal_sync_pulse_start;
  217. unsigned horizontal_sync_pulse_end;
  218. unsigned horizontal_end;
  219. };
  220. static inline void
  221. grub_vga_set_geometry (struct grub_video_hw_config *config,
  222. void (*cr_write) (grub_uint8_t val, grub_uint8_t addr))
  223. {
  224. unsigned vertical_total = config->vertical_total - 2;
  225. unsigned vertical_blank_start = config->vertical_blank_start - 1;
  226. unsigned vdisplay_end = config->vdisplay_end - 1;
  227. grub_uint8_t overflow, cell_height_reg;
  228. /* Disable CR0-7 write protection. */
  229. cr_write (0, GRUB_VGA_CR_VSYNC_END);
  230. overflow = ((vertical_total >> GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_SHIFT)
  231. & GRUB_VGA_CR_OVERFLOW_VERT_TOTAL1_MASK)
  232. | ((vertical_total >> GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_SHIFT)
  233. & GRUB_VGA_CR_OVERFLOW_VERT_TOTAL2_MASK)
  234. | ((config->vertical_sync_start >> GRUB_VGA_CR_OVERFLOW_VSYNC_START2_SHIFT)
  235. & GRUB_VGA_CR_OVERFLOW_VSYNC_START2_MASK)
  236. | ((config->vertical_sync_start >> GRUB_VGA_CR_OVERFLOW_VSYNC_START1_SHIFT)
  237. & GRUB_VGA_CR_OVERFLOW_VSYNC_START1_MASK)
  238. | ((vdisplay_end >> GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_SHIFT)
  239. & GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END1_MASK)
  240. | ((vdisplay_end >> GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_SHIFT)
  241. & GRUB_VGA_CR_OVERFLOW_VERT_DISPLAY_ENABLE_END2_MASK)
  242. | ((config->vertical_sync_start >> GRUB_VGA_CR_OVERFLOW_VSYNC_START1_SHIFT)
  243. & GRUB_VGA_CR_OVERFLOW_VSYNC_START1_MASK)
  244. | ((config->line_compare >> GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_SHIFT)
  245. & GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_MASK);
  246. cell_height_reg = ((vertical_blank_start
  247. >> GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_SHIFT)
  248. & GRUB_VGA_CR_CELL_HEIGHT_VERTICAL_BLANK_MASK)
  249. | ((config->line_compare >> GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT)
  250. & GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_MASK);
  251. cr_write (config->horizontal_total - 1, GRUB_VGA_CR_HTOTAL);
  252. cr_write (config->horizontal_end - 1, GRUB_VGA_CR_HORIZ_END);
  253. cr_write (config->horizontal_blank_start - 1, GRUB_VGA_CR_HBLANK_START);
  254. cr_write (config->horizontal_blank_end, GRUB_VGA_CR_HBLANK_END);
  255. cr_write (config->horizontal_sync_pulse_start,
  256. GRUB_VGA_CR_HORIZ_SYNC_PULSE_START);
  257. cr_write (config->horizontal_sync_pulse_end,
  258. GRUB_VGA_CR_HORIZ_SYNC_PULSE_END);
  259. cr_write (vertical_total & 0xff, GRUB_VGA_CR_VERT_TOTAL);
  260. cr_write (overflow, GRUB_VGA_CR_OVERFLOW);
  261. cr_write (cell_height_reg, GRUB_VGA_CR_CELL_HEIGHT);
  262. cr_write (config->vertical_sync_start & 0xff, GRUB_VGA_CR_VSYNC_START);
  263. cr_write (config->vertical_sync_end & 0x0f, GRUB_VGA_CR_VSYNC_END);
  264. cr_write (vdisplay_end & 0xff, GRUB_VGA_CR_VDISPLAY_END);
  265. cr_write (config->pitch & 0xff, GRUB_VGA_CR_PITCH);
  266. cr_write (vertical_blank_start & 0xff, GRUB_VGA_CR_VERTICAL_BLANK_START);
  267. cr_write (config->vertical_blank_end & 0xff, GRUB_VGA_CR_VERTICAL_BLANK_END);
  268. cr_write (config->line_compare & 0xff, GRUB_VGA_CR_LINE_COMPARE);
  269. }
  270. #endif
  271. #endif