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 Uint16 VGA_int_GetWord(tVT_Char *Char);
19 void VGA_int_SetCursor(Sint16 x, Sint16 y);
22 MODULE_DEFINE(0, 0x000A, VGA, VGA_Install, NULL, NULL);
23 tDevFS_Driver gVGA_DevInfo = {
27 .Size = VGA_WIDTH*VGA_HEIGHT*sizeof(tVT_Char),
33 Uint16 *gVGA_Framebuffer = (void*)( KERNEL_BASE|0xB8000 );
37 * \fn int VGA_Install(char **Arguments)
39 int VGA_Install(char **Arguments)
43 // Enable Bright Backgrounds
44 inb(0x3DA); // Reset flipflop
45 outb(0x3C0, 0x30); // Index 0x10, PAS
47 byte &= ~8; // Disable Blink
48 outb(0x3C0, byte); // Write value
52 DevFS_AddDevice( &gVGA_DevInfo );
58 * \fn Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
59 * \brief Writes a string of bytes to the VGA controller
61 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
63 int num = Length / sizeof(tVT_Char);
64 int ofs = Offset / sizeof(tVT_Char);
66 tVT_Char *chars = Buffer;
69 //ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
71 for( ; num--; i ++, ofs ++)
73 word = VGA_int_GetWord( &chars[i] );
74 gVGA_Framebuffer[ ofs ] = word;
82 * \fn int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
83 * \brief IO Control Call
85 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
89 case DRV_IOCTL_TYPE: return DRV_TYPE_VIDEO;
90 case DRV_IOCTL_IDENT: memcpy(Data, "VGA\0", 4); return 1;
91 case DRV_IOCTL_VERSION: *(int*)Data = 50; return 1;
92 case DRV_IOCTL_LOOKUP: return 0;
94 case VIDEO_IOCTL_GETSETMODE: return 0; // Mode 0 only
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;
103 case VIDEO_IOCTL_SETBUFFORMAT:
106 case VIDEO_IOCTL_SETCURSOR:
107 VGA_int_SetCursor( ((tVideo_IOCtl_Pos*)Data)->x, ((tVideo_IOCtl_Pos*)Data)->y );
114 * \fn Uint8 VGA_int_GetColourNibble(Uint16 col)
115 * \brief Converts a 12-bit colour into a VGA 4-bit colour
117 Uint8 VGA_int_GetColourNibble(Uint16 col)
123 col = ((col>>2)&3) | ((col>>4)&0xC) | ((col>>6)&0x30);
124 bright = ( (col & 2 ? 1 : 0) + (col & 8 ? 1 : 0) + (col & 32 ? 1 : 0) ) / 2;
129 case 0x00: ret = 0x0; break;
131 case 0x15: ret = 0x8; break;
134 case 0x02: ret = 0x1; break;
135 case 0x03: ret = 0x9; break;
138 case 0x08: ret = 0x2; break;
139 case 0x0C: ret = 0xA; break;
142 case 0x20: ret = 0x4; break;
143 case 0x30: ret = 0xC; break;
145 case 0x2A: ret = 0x7; break;
147 case 0x3F: ret = 0xF; break;
150 ret |= (col & 0x03 ? 1 : 0);
151 ret |= (col & 0x0C ? 2 : 0);
152 ret |= (col & 0x30 ? 4 : 0);
153 ret |= (bright ? 8 : 0);
160 * \fn Uint16 VGA_int_GetWord(tVT_Char *Char)
161 * \brief Convers a character structure to a VGA character word
163 Uint16 VGA_int_GetWord(tVT_Char *Char)
174 default: ret = 0; break;
178 col = VGA_int_GetColourNibble(Char->BGCol);
181 col = VGA_int_GetColourNibble(Char->FGCol);
188 * \fn void VGA_int_SetCursor(Sint16 x, Sint16 y)
189 * \brief Updates the cursor position
191 void VGA_int_SetCursor(Sint16 x, Sint16 y)
193 int pos = x+y*VGA_WIDTH;
194 if(x == -1 || y == -1)
197 outb(0x3D5, pos >> 8);