2 * Acess2 VGA Controller Driver
6 #include <tpl_drv_video.h>
10 int VGA_Install(char **Arguments);
11 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
12 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data);
13 Uint16 VGA_int_GetWord(tVT_Char *Char);
16 MODULE_DEFINE(0, 0x000A, VGA, VGA_Install, NULL, NULL);
17 tDevFS_Driver gVGA_DevInfo = {
21 .Size = 80*25*sizeof(tVT_Char),
27 Uint16 *gVGA_Framebuffer = (void*)( KERNEL_BASE|0xB8000 );
31 * \fn int VGA_Install(char **Arguments)
33 int VGA_Install(char **Arguments)
37 // Enable Bright Backgrounds
38 inb(0x3DA); // Reset flipflop
39 outb(0x3C0, 0x30); // Index 0x10, PAS
41 byte &= ~8; // Disable Blink
42 outb(0x3C0, byte); // Write value
46 DevFS_AddDevice( &gVGA_DevInfo );
52 * \fn Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
53 * \brief Writes a string of bytes to the VGA controller
55 Uint64 VGA_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
57 int num = Length / sizeof(tVT_Char);
58 int ofs = Offset / sizeof(tVT_Char);
60 tVT_Char *chars = Buffer;
63 //ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
65 for( ; num--; i ++, ofs ++)
67 word = VGA_int_GetWord( &chars[i] );
68 gVGA_Framebuffer[ ofs ] = word;
76 * \fn int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
77 * \brief IO Control Call
79 int VGA_IOCtl(tVFS_Node *Node, int Id, void *Data)
83 case DRV_IOCTL_TYPE: return DRV_TYPE_VIDEO;
84 case DRV_IOCTL_IDENT: memcpy(Data, "VGA\0", 4); return 1;
85 case DRV_IOCTL_VERSION: *(int*)Data = 50; return 1;
86 case DRV_IOCTL_LOOKUP: return 0;
88 case VIDEO_IOCTL_SETMODE: return 0; // Ignored (Text Only ATM)
89 case VIDEO_IOCTL_GETMODE: return 0; // Mode 0 only
90 case VIDEO_IOCTL_FINDMODE: return 0; // Text Only!
91 case VIDEO_IOCTL_MODEINFO:
92 if( ((tVideo_IOCtl_Mode*)Data)->id != 0) return 0;
93 ((tVideo_IOCtl_Mode*)Data)->width = 80;
94 ((tVideo_IOCtl_Mode*)Data)->height = 25;
95 ((tVideo_IOCtl_Mode*)Data)->bpp = 4;
102 * \fn Uint8 VGA_int_GetColourNibble(Uint16 col)
103 * \brief Converts a 12-bit colour into a VGA 4-bit colour
105 Uint8 VGA_int_GetColourNibble(Uint16 col)
111 col = ((col>>2)&3) | ((col>>4)&0xC) | ((col>>6)&0x30);
112 bright = ( (col & 2 ? 1 : 0) + (col & 8 ? 1 : 0) + (col & 32 ? 1 : 0) ) / 2;
118 case 0x00: ret = 0x0; break;
120 case 0x15: ret = 0x8; break;
123 case 0x02: ret = 0x1; break;
124 case 0x03: ret = 0x9; break;
127 case 0x08: ret = 0x2; break;
128 case 0x0C: ret = 0xA; break;
131 case 0x20: ret = 0x4; break;
132 case 0x30: ret = 0xC; break;
134 case 0x2A: ret = 0x7; break;
136 case 0x3F: ret = 0xF; break;
139 ret |= (col & 0x03 ? 1 : 0);
140 ret |= (col & 0x0C ? 2 : 0);
141 ret |= (col & 0x30 ? 4 : 0);
142 ret |= (bright ? 8 : 0);
149 * \fn Uint16 VGA_int_GetWord(tVT_Char *Char)
150 * \brief Convers a character structure to a VGA character word
152 Uint16 VGA_int_GetWord(tVT_Char *Char)
163 default: ret = 0; break;
167 col = VGA_int_GetColourNibble(Char->BGCol);
170 col = VGA_int_GetColourNibble(Char->FGCol);