2 * Acess2 VGA Controller Driver
7 #include <tpl_drv_video.h>
15 int VGA_Install(char **Arguments);
16 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
17 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data);
18 Uint8 VGA_int_GetColourNibble(Uint16 col);
19 Uint16 VGA_int_GetWord(tVT_Char *Char);
20 void VGA_int_SetCursor(Sint16 x, Sint16 y);
23 MODULE_DEFINE(0, 0x000A, x86_VGAText, VGA_Install, NULL, NULL);
24 tDevFS_Driver gVGA_DevInfo = {
28 .Size = VGA_WIDTH*VGA_HEIGHT*sizeof(tVT_Char),
34 Uint16 *gVGA_Framebuffer = (void*)( KERNEL_BASE|0xB8000 );
38 * \fn int VGA_Install(char **Arguments)
40 int VGA_Install(char **Arguments)
44 // Enable Bright Backgrounds
45 inb(0x3DA); // Reset flipflop
46 outb(0x3C0, 0x30); // Index 0x10, PAS
48 byte &= ~8; // Disable Blink
49 outb(0x3C0, byte); // Write value
53 DevFS_AddDevice( &gVGA_DevInfo );
59 * \fn Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
60 * \brief Writes a string of bytes to the VGA controller
62 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
64 int num = Length / sizeof(tVT_Char);
65 int ofs = Offset / sizeof(tVT_Char);
67 tVT_Char *chars = Buffer;
70 //ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
72 for( ; num--; i ++, ofs ++)
74 word = VGA_int_GetWord( &chars[i] );
75 gVGA_Framebuffer[ ofs ] = word;
83 * \fn int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
84 * \brief IO Control Call
86 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
90 case DRV_IOCTL_TYPE: return DRV_TYPE_VIDEO;
91 case DRV_IOCTL_IDENT: memcpy(Data, "VGA\0", 4); return 1;
92 case DRV_IOCTL_VERSION: *(int*)Data = 50; return 1;
93 case DRV_IOCTL_LOOKUP: return 0;
95 case VIDEO_IOCTL_GETSETMODE: return 0; // Mode 0 only
96 case VIDEO_IOCTL_FINDMODE: return 0; // Text Only!
97 case VIDEO_IOCTL_MODEINFO:
98 if( ((tVideo_IOCtl_Mode*)Data)->id != 0) return 0;
99 ((tVideo_IOCtl_Mode*)Data)->width = VGA_WIDTH;
100 ((tVideo_IOCtl_Mode*)Data)->height = VGA_HEIGHT;
101 ((tVideo_IOCtl_Mode*)Data)->bpp = 4;
104 case VIDEO_IOCTL_SETBUFFORMAT:
107 case VIDEO_IOCTL_SETCURSOR:
108 VGA_int_SetCursor( ((tVideo_IOCtl_Pos*)Data)->x, ((tVideo_IOCtl_Pos*)Data)->y );
115 * \fn Uint8 VGA_int_GetColourNibble(Uint16 col)
116 * \brief Converts a 12-bit colour into a VGA 4-bit colour
118 Uint8 VGA_int_GetColourNibble(Uint16 col)
124 col = ((col>>2)&3) | ((col>>4)&0xC) | ((col>>6)&0x30);
125 bright = ( (col & 2 ? 1 : 0) + (col & 8 ? 1 : 0) + (col & 32 ? 1 : 0) ) / 2;
130 case 0x00: ret = 0x0; break;
132 case 0x15: ret = 0x8; break;
135 case 0x02: ret = 0x1; break;
136 case 0x03: ret = 0x9; break;
139 case 0x08: ret = 0x2; break;
140 case 0x0C: ret = 0xA; break;
143 case 0x20: ret = 0x4; break;
144 case 0x30: ret = 0xC; break;
146 case 0x2A: ret = 0x7; break;
148 case 0x3F: ret = 0xF; break;
151 ret |= (col & 0x03 ? 1 : 0);
152 ret |= (col & 0x0C ? 2 : 0);
153 ret |= (col & 0x30 ? 4 : 0);
154 ret |= (bright ? 8 : 0);
161 * \fn Uint16 VGA_int_GetWord(tVT_Char *Char)
162 * \brief Convers a character structure to a VGA character word
164 Uint16 VGA_int_GetWord(tVT_Char *Char)
175 default: ret = 0; break;
179 col = VGA_int_GetColourNibble(Char->BGCol);
182 col = VGA_int_GetColourNibble(Char->FGCol);
189 * \fn void VGA_int_SetCursor(Sint16 x, Sint16 y)
190 * \brief Updates the cursor position
192 void VGA_int_SetCursor(Sint16 x, Sint16 y)
194 int pos = x+y*VGA_WIDTH;
195 if(x == -1 || y == -1)
198 outb(0x3D5, pos >> 8);