2 * Acess2 VGA Controller Driver
6 #include <tpl_drv_video.h>
14 int VGA_Install(char **Arguments);
15 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
16 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data);
17 Uint16 VGA_int_GetWord(tVT_Char *Char);
18 void VGA_int_SetCursor(Sint16 x, Sint16 y);
21 MODULE_DEFINE(0, 0x000A, VGA, VGA_Install, NULL, NULL);
22 tDevFS_Driver gVGA_DevInfo = {
26 .Size = VGA_WIDTH*VGA_HEIGHT*sizeof(tVT_Char),
32 Uint16 *gVGA_Framebuffer = (void*)( KERNEL_BASE|0xB8000 );
36 * \fn int VGA_Install(char **Arguments)
38 int VGA_Install(char **Arguments)
42 // Enable Bright Backgrounds
43 inb(0x3DA); // Reset flipflop
44 outb(0x3C0, 0x30); // Index 0x10, PAS
46 byte &= ~8; // Disable Blink
47 outb(0x3C0, byte); // Write value
51 DevFS_AddDevice( &gVGA_DevInfo );
57 * \fn Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
58 * \brief Writes a string of bytes to the VGA controller
60 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
62 int num = Length / sizeof(tVT_Char);
63 int ofs = Offset / sizeof(tVT_Char);
65 tVT_Char *chars = Buffer;
68 //ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
70 for( ; num--; i ++, ofs ++)
72 word = VGA_int_GetWord( &chars[i] );
73 gVGA_Framebuffer[ ofs ] = word;
81 * \fn int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
82 * \brief IO Control Call
84 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
88 case DRV_IOCTL_TYPE: return DRV_TYPE_VIDEO;
89 case DRV_IOCTL_IDENT: memcpy(Data, "VGA\0", 4); return 1;
90 case DRV_IOCTL_VERSION: *(int*)Data = 50; return 1;
91 case DRV_IOCTL_LOOKUP: return 0;
93 case VIDEO_IOCTL_GETMODE: return 0; // Mode 0 only
94 case VIDEO_IOCTL_SETMODE: return 0; // Ignored (Text Only ATM)
95 case VIDEO_IOCTL_FINDMODE: return 0; // Text Only!
96 case VIDEO_IOCTL_MODEINFO:
97 if( ((tVideo_IOCtl_Mode*)Data)->id != 0) return 0;
98 ((tVideo_IOCtl_Mode*)Data)->width = VGA_WIDTH;
99 ((tVideo_IOCtl_Mode*)Data)->height = VGA_HEIGHT;
100 ((tVideo_IOCtl_Mode*)Data)->bpp = 4;
102 case VIDEO_IOCTL_SETCURSOR:
103 VGA_int_SetCursor( ((tVideo_IOCtl_Pos*)Data)->x, ((tVideo_IOCtl_Pos*)Data)->y );
110 * \fn Uint8 VGA_int_GetColourNibble(Uint16 col)
111 * \brief Converts a 12-bit colour into a VGA 4-bit colour
113 Uint8 VGA_int_GetColourNibble(Uint16 col)
119 col = ((col>>2)&3) | ((col>>4)&0xC) | ((col>>6)&0x30);
120 bright = ( (col & 2 ? 1 : 0) + (col & 8 ? 1 : 0) + (col & 32 ? 1 : 0) ) / 2;
126 case 0x00: ret = 0x0; break;
128 case 0x15: ret = 0x8; break;
131 case 0x02: ret = 0x1; break;
132 case 0x03: ret = 0x9; break;
135 case 0x08: ret = 0x2; break;
136 case 0x0C: ret = 0xA; break;
139 case 0x20: ret = 0x4; break;
140 case 0x30: ret = 0xC; break;
142 case 0x2A: ret = 0x7; break;
144 case 0x3F: ret = 0xF; break;
147 ret |= (col & 0x03 ? 1 : 0);
148 ret |= (col & 0x0C ? 2 : 0);
149 ret |= (col & 0x30 ? 4 : 0);
150 ret |= (bright ? 8 : 0);
157 * \fn Uint16 VGA_int_GetWord(tVT_Char *Char)
158 * \brief Convers a character structure to a VGA character word
160 Uint16 VGA_int_GetWord(tVT_Char *Char)
171 default: ret = 0; break;
175 col = VGA_int_GetColourNibble(Char->BGCol);
178 col = VGA_int_GetColourNibble(Char->FGCol);
185 * \fn void VGA_int_SetCursor(Sint16 x, Sint16 y)
186 * \brief Updates the cursor position
188 void VGA_int_SetCursor(Sint16 x, Sint16 y)
190 int pos = x+y*VGA_WIDTH;
191 if(x == -1 || y == -1)
194 outb(0x3D5, pos >> 8);