mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-11 23:39:20 +00:00
Restructured and rewritten entire codebase
This commit is contained in:
227
modules/PersonalSystem2/Keyboard.cpp
Normal file
227
modules/PersonalSystem2/Keyboard.cpp
Normal file
@ -0,0 +1,227 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "keyboard.hpp"
|
||||
|
||||
#include <limits.h>
|
||||
#include <debug.h>
|
||||
#include <io.h>
|
||||
|
||||
#include "../../mapi.hpp"
|
||||
#include "../mod.hpp"
|
||||
#include "../../kernel.h"
|
||||
|
||||
namespace PS2Keyboard
|
||||
{
|
||||
KernelAPI KAPI;
|
||||
|
||||
uint8_t ScanCode = 0;
|
||||
bool InputReceived = false;
|
||||
|
||||
void PS2Wait(bool Read)
|
||||
{
|
||||
int Timeout = 100000;
|
||||
uint8_t Status = 0;
|
||||
while (Timeout--)
|
||||
{
|
||||
Status = inb(0x64);
|
||||
if (Read)
|
||||
{
|
||||
if ((Status & 1) == 1)
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((Status & 2) == 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int DriverEntry(void *Data)
|
||||
{
|
||||
if (!Data)
|
||||
return INVALID_KERNEL_API;
|
||||
KAPI = *(KernelAPI *)Data;
|
||||
if (KAPI.Version.Major < 0 || KAPI.Version.Minor < 0 || KAPI.Version.Patch < 0)
|
||||
return KERNEL_API_VERSION_NOT_SUPPORTED;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int CallbackHandler(KernelCallback *Data)
|
||||
{
|
||||
switch (Data->Reason)
|
||||
{
|
||||
case AcknowledgeReason:
|
||||
{
|
||||
debug("Kernel acknowledged the driver.");
|
||||
break;
|
||||
}
|
||||
case ConfigurationReason:
|
||||
{
|
||||
#define WaitRead PS2Wait(true)
|
||||
#define WaitWrite PS2Wait(false)
|
||||
|
||||
WaitWrite;
|
||||
outb(0x64, 0xAD);
|
||||
WaitWrite;
|
||||
outb(0x64, 0xA7);
|
||||
|
||||
WaitRead;
|
||||
inb(0x60);
|
||||
|
||||
WaitWrite;
|
||||
outb(0x64, 0x20);
|
||||
WaitRead;
|
||||
uint8_t cfg = inb(0x60);
|
||||
bool DualChannel = cfg & 0b00100000;
|
||||
if (DualChannel)
|
||||
trace("Dual channel PS/2 controller detected.");
|
||||
cfg |= 0b01000011;
|
||||
WaitWrite;
|
||||
outb(0x64, 0x60);
|
||||
WaitWrite;
|
||||
outb(0x60, cfg);
|
||||
|
||||
WaitWrite;
|
||||
outb(0x64, 0xAA);
|
||||
WaitRead;
|
||||
uint8_t test = inb(0x60);
|
||||
if (test != 0x55)
|
||||
{
|
||||
error("PS/2 controller self test failed! (%#x)", test);
|
||||
printf("PS/2 controller self test failed! (%#x)\n", test);
|
||||
CPU::Stop();
|
||||
}
|
||||
|
||||
WaitWrite;
|
||||
outb(0x64, 0x60);
|
||||
WaitWrite;
|
||||
outb(0x60, cfg);
|
||||
|
||||
bool DCExists = false;
|
||||
if (DualChannel)
|
||||
{
|
||||
WaitWrite;
|
||||
outb(0x64, 0xAE);
|
||||
WaitWrite;
|
||||
outb(0x64, 0x20);
|
||||
WaitRead;
|
||||
cfg = inb(0x60);
|
||||
DCExists = !(cfg & 0b00100000);
|
||||
WaitWrite;
|
||||
outb(0x64, 0xAD);
|
||||
debug("DCExists: %d", DCExists);
|
||||
}
|
||||
|
||||
WaitWrite;
|
||||
outb(0x64, 0xAB);
|
||||
WaitRead;
|
||||
test = inb(0x60);
|
||||
if (test != 0x00)
|
||||
{
|
||||
error("PS/2 keyboard self test failed! (%#x)", test);
|
||||
printf("PS/2 keyboard self test failed! (%#x)\n", test);
|
||||
CPU::Stop();
|
||||
}
|
||||
|
||||
if (DCExists)
|
||||
{
|
||||
WaitWrite;
|
||||
outb(0x64, 0xA9);
|
||||
WaitRead;
|
||||
test = inb(0x60);
|
||||
if (test != 0x00)
|
||||
{
|
||||
error("PS/2 mouse self test failed! (%#x)", test);
|
||||
printf("PS/2 mouse self test failed! (%#x)\n", test);
|
||||
CPU::Stop();
|
||||
}
|
||||
}
|
||||
|
||||
WaitWrite;
|
||||
outb(0x64, 0xAE);
|
||||
|
||||
if (DCExists)
|
||||
{
|
||||
WaitWrite;
|
||||
outb(0x64, 0xA8);
|
||||
}
|
||||
|
||||
WaitWrite;
|
||||
outb(0x60, 0xFF);
|
||||
WaitRead;
|
||||
test = inb(0x60);
|
||||
if (test == 0xFC)
|
||||
{
|
||||
error("PS/2 keyboard reset failed! (%#x)", test);
|
||||
printf("PS/2 keyboard reset failed! (%#x)\n", test);
|
||||
CPU::Stop();
|
||||
}
|
||||
|
||||
WaitWrite;
|
||||
outb(0x60, 0xD4);
|
||||
WaitWrite;
|
||||
outb(0x60, 0xFF);
|
||||
WaitRead;
|
||||
test = inb(0x60);
|
||||
if (test == 0xFC)
|
||||
{
|
||||
error("PS/2 mouse reset failed! (%#x)", test);
|
||||
printf("PS/2 mouse reset failed! (%#x)\n", test);
|
||||
CPU::Stop();
|
||||
}
|
||||
|
||||
trace("PS/2 keyboard configured.");
|
||||
break;
|
||||
}
|
||||
case QueryReason:
|
||||
{
|
||||
Data->InputCallback.Keyboard.Key = ScanCode;
|
||||
break;
|
||||
}
|
||||
case PollWaitReason:
|
||||
{
|
||||
while (!InputReceived)
|
||||
TaskManager->Yield();
|
||||
InputReceived = false;
|
||||
|
||||
Data->InputCallback.Keyboard.Key = ScanCode;
|
||||
break;
|
||||
}
|
||||
case StopReason:
|
||||
{
|
||||
fixme("Module stopped.");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
warn("Unknown reason.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
int InterruptCallback(CPURegisters *)
|
||||
{
|
||||
ScanCode = inb(0x60);
|
||||
InputReceived = true;
|
||||
return OK;
|
||||
}
|
||||
}
|
265
modules/PersonalSystem2/Mouse.cpp
Normal file
265
modules/PersonalSystem2/Mouse.cpp
Normal file
@ -0,0 +1,265 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "mouse.hpp"
|
||||
|
||||
#include <debug.h>
|
||||
#include <io.h>
|
||||
|
||||
#include "../../mapi.hpp"
|
||||
#include "../mod.hpp"
|
||||
#include "../../kernel.h"
|
||||
|
||||
namespace PS2Mouse
|
||||
{
|
||||
KernelAPI KAPI;
|
||||
|
||||
int MouseX = 0, MouseY = 0, MouseZ = 0;
|
||||
int MouseLeft = 0, MouseMiddle = 0, MouseRight = 0;
|
||||
|
||||
uint8_t Packet[4];
|
||||
bool PacketReady = false;
|
||||
uint8_t Cycle = 0;
|
||||
|
||||
void WaitRead()
|
||||
{
|
||||
uint64_t Timeout = 100000;
|
||||
while (Timeout--)
|
||||
if (inb(Ports::STATUS) & State::OUTPUT_FULL)
|
||||
return;
|
||||
}
|
||||
|
||||
void WaitWrite()
|
||||
{
|
||||
uint64_t Timeout = 100000;
|
||||
while (Timeout--)
|
||||
if ((inb(Ports::STATUS) & State::INPUT_FULL) == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t Read()
|
||||
{
|
||||
WaitRead();
|
||||
return inb(Ports::DATA);
|
||||
}
|
||||
|
||||
void Write(uint16_t Port, uint8_t Value)
|
||||
{
|
||||
WaitWrite();
|
||||
outb(Port, Value);
|
||||
}
|
||||
|
||||
int DriverEntry(void *Data)
|
||||
{
|
||||
if (!Data)
|
||||
return INVALID_KERNEL_API;
|
||||
KAPI = *(KernelAPI *)Data;
|
||||
if (KAPI.Version.Major < 0 || KAPI.Version.Minor < 0 || KAPI.Version.Patch < 0)
|
||||
return KERNEL_API_VERSION_NOT_SUPPORTED;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int CallbackHandler(KernelCallback *Data)
|
||||
{
|
||||
switch (Data->Reason)
|
||||
{
|
||||
case AcknowledgeReason:
|
||||
{
|
||||
debug("Kernel acknowledged the driver.");
|
||||
break;
|
||||
}
|
||||
case ConfigurationReason:
|
||||
{
|
||||
outb(COMMAND, 0xA8);
|
||||
Write(COMMAND, READ_CONFIG);
|
||||
uint8_t Status = Read();
|
||||
Status |= 0b10;
|
||||
Write(COMMAND, WRITE_CONFIG);
|
||||
Write(DATA, Status);
|
||||
Write(COMMAND, 0xD4);
|
||||
Write(DATA, 0xF6);
|
||||
Read();
|
||||
Write(COMMAND, 0xD4);
|
||||
Write(DATA, 0xF4);
|
||||
Read();
|
||||
|
||||
trace("PS/2 mouse configured.");
|
||||
break;
|
||||
}
|
||||
case QueryReason:
|
||||
{
|
||||
Data->InputCallback.Mouse.X = MouseX;
|
||||
Data->InputCallback.Mouse.Y = MouseY;
|
||||
Data->InputCallback.Mouse.Z = MouseZ;
|
||||
Data->InputCallback.Mouse.Buttons.Left = MouseLeft;
|
||||
Data->InputCallback.Mouse.Buttons.Right = MouseRight;
|
||||
Data->InputCallback.Mouse.Buttons.Middle = MouseMiddle;
|
||||
break;
|
||||
}
|
||||
case PollWaitReason:
|
||||
{
|
||||
while (!PacketReady)
|
||||
TaskManager->Yield();
|
||||
|
||||
Data->InputCallback.Mouse.X = MouseX;
|
||||
Data->InputCallback.Mouse.Y = MouseY;
|
||||
Data->InputCallback.Mouse.Z = MouseZ;
|
||||
Data->InputCallback.Mouse.Buttons.Left = MouseLeft;
|
||||
Data->InputCallback.Mouse.Buttons.Right = MouseRight;
|
||||
Data->InputCallback.Mouse.Buttons.Middle = MouseMiddle;
|
||||
break;
|
||||
}
|
||||
case StopReason:
|
||||
{
|
||||
outb(COMMAND, 0xA8);
|
||||
Write(COMMAND, READ_CONFIG);
|
||||
uint8_t Status = Read();
|
||||
Status &= ~0b10;
|
||||
Write(COMMAND, WRITE_CONFIG);
|
||||
Write(DATA, Status);
|
||||
Write(COMMAND, 0xD4);
|
||||
Write(DATA, 0xF5);
|
||||
Read();
|
||||
|
||||
debug("Module stopped.");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
warn("Unknown reason.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
int InterruptCallback(CPURegisters *)
|
||||
{
|
||||
uint8_t Data = inb(0x60);
|
||||
|
||||
if (__builtin_expect(!!(PacketReady), 0))
|
||||
{
|
||||
bool XNegative, YNegative, XOverflow, YOverflow;
|
||||
|
||||
if (Packet[0] & PS2XSign)
|
||||
XNegative = true;
|
||||
else
|
||||
XNegative = false;
|
||||
|
||||
if (Packet[0] & PS2YSign)
|
||||
YNegative = true;
|
||||
else
|
||||
YNegative = false;
|
||||
|
||||
if (Packet[0] & PS2XOverflow)
|
||||
XOverflow = true;
|
||||
else
|
||||
XOverflow = false;
|
||||
|
||||
if (Packet[0] & PS2YOverflow)
|
||||
YOverflow = true;
|
||||
else
|
||||
YOverflow = false;
|
||||
|
||||
if (!XNegative)
|
||||
{
|
||||
MouseX += Packet[1];
|
||||
if (XOverflow)
|
||||
MouseX += 255;
|
||||
}
|
||||
else
|
||||
{
|
||||
Packet[1] = (uint8_t)(256 - Packet[1]);
|
||||
MouseX -= Packet[1];
|
||||
if (XOverflow)
|
||||
MouseX -= 255;
|
||||
}
|
||||
|
||||
if (!YNegative)
|
||||
{
|
||||
MouseY -= Packet[2];
|
||||
if (YOverflow)
|
||||
MouseY -= 255;
|
||||
}
|
||||
else
|
||||
{
|
||||
Packet[2] = (uint8_t)(256 - Packet[2]);
|
||||
MouseY += Packet[2];
|
||||
if (YOverflow)
|
||||
MouseY += 255;
|
||||
}
|
||||
|
||||
uint32_t Width = KAPI.Display.GetWidth();
|
||||
uint32_t Height = KAPI.Display.GetHeight();
|
||||
|
||||
if (MouseX < 0)
|
||||
MouseX = 0;
|
||||
|
||||
if ((uint32_t)MouseX > Width - 1)
|
||||
MouseX = Width - 1;
|
||||
|
||||
if (MouseY < 0)
|
||||
MouseY = 0;
|
||||
if ((uint32_t)MouseY > Height - 1)
|
||||
MouseY = Height - 1;
|
||||
|
||||
MouseLeft = 0;
|
||||
MouseMiddle = 0;
|
||||
MouseRight = 0;
|
||||
|
||||
if (Packet[0] & PS2LeftButton)
|
||||
MouseLeft = 1;
|
||||
if (Packet[0] & PS2MiddleButton)
|
||||
MouseMiddle = 1;
|
||||
if (Packet[0] & PS2RightButton)
|
||||
MouseRight = 1;
|
||||
PacketReady = false;
|
||||
}
|
||||
|
||||
switch (Cycle)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if ((Data & 0b00001000) == 0)
|
||||
break;
|
||||
Packet[0] = Data;
|
||||
Cycle++;
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
Packet[1] = Data;
|
||||
Cycle++;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
Packet[2] = Data;
|
||||
PacketReady = true;
|
||||
Cycle = 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
warn("Unknown cycle %d", Cycle);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
}
|
237
modules/PersonalSystem2/keyboard.hpp
Normal file
237
modules/PersonalSystem2/keyboard.hpp
Normal file
@ -0,0 +1,237 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __FENNIX_KERNEL_PS2_KEYBOARD_H__
|
||||
#define __FENNIX_KERNEL_PS2_KEYBOARD_H__
|
||||
|
||||
#include <types.h>
|
||||
#include "../../mapi.hpp"
|
||||
|
||||
namespace PS2Keyboard
|
||||
{
|
||||
enum DownKeys
|
||||
{
|
||||
KEY_D_ESCAPE = 0x1,
|
||||
|
||||
KEY_D_1 = 0x2,
|
||||
KEY_D_2 = 0x3,
|
||||
KEY_D_3 = 0x4,
|
||||
KEY_D_4 = 0x5,
|
||||
KEY_D_5 = 0x6,
|
||||
KEY_D_6 = 0x7,
|
||||
KEY_D_7 = 0x8,
|
||||
KEY_D_8 = 0x9,
|
||||
KEY_D_9 = 0xa,
|
||||
KEY_D_0 = 0xb,
|
||||
|
||||
KEY_D_MINUS = 0xc,
|
||||
KEY_D_EQUALS = 0xd,
|
||||
KEY_D_BACKSPACE = 0xe,
|
||||
KEY_D_TAB = 0xf,
|
||||
|
||||
KEY_D_Q = 0x10,
|
||||
KEY_D_W = 0x11,
|
||||
KEY_D_E = 0x12,
|
||||
KEY_D_R = 0x13,
|
||||
KEY_D_T = 0x14,
|
||||
KEY_D_Y = 0x15,
|
||||
KEY_D_U = 0x16,
|
||||
KEY_D_I = 0x17,
|
||||
KEY_D_O = 0x18,
|
||||
KEY_D_P = 0x19,
|
||||
|
||||
KEY_D_LBRACKET = 0x1a,
|
||||
KEY_D_RBRACKET = 0x1b,
|
||||
KEY_D_RETURN = 0x1c,
|
||||
KEY_D_LCTRL = 0x1d,
|
||||
|
||||
KEY_D_A = 0x1e,
|
||||
KEY_D_S = 0x1f,
|
||||
KEY_D_D = 0x20,
|
||||
KEY_D_F = 0x21,
|
||||
KEY_D_G = 0x22,
|
||||
KEY_D_H = 0x23,
|
||||
KEY_D_J = 0x24,
|
||||
KEY_D_K = 0x25,
|
||||
KEY_D_L = 0x26,
|
||||
|
||||
KEY_D_SEMICOLON = 0x27,
|
||||
KEY_D_APOSTROPHE = 0x28,
|
||||
KEY_D_GRAVE = 0x29,
|
||||
KEY_D_LSHIFT = 0x2a,
|
||||
KEY_D_BACKSLASH = 0x2b,
|
||||
|
||||
KEY_D_Z = 0x2c,
|
||||
KEY_D_X = 0x2d,
|
||||
KEY_D_C = 0x2e,
|
||||
KEY_D_V = 0x2f,
|
||||
KEY_D_B = 0x30,
|
||||
KEY_D_N = 0x31,
|
||||
KEY_D_M = 0x32,
|
||||
|
||||
KEY_D_COMMA = 0x33,
|
||||
KEY_D_PERIOD = 0x34,
|
||||
KEY_D_SLASH = 0x35,
|
||||
KEY_D_RSHIFT = 0x36,
|
||||
KEY_D_PRTSC = 0x37,
|
||||
KEY_D_LALT = 0x38,
|
||||
KEY_D_SPACE = 0x39,
|
||||
KEY_D_CAPSLOCK = 0x3a,
|
||||
KEY_D_NUMLOCK = 0x45,
|
||||
KEY_D_SCROLLLOCK = 0x46,
|
||||
|
||||
KEY_D_KP_MULTIPLY = 0x37,
|
||||
KEY_D_KP_7 = 0x47,
|
||||
KEY_D_KP_8 = 0x48,
|
||||
KEY_D_KP_9 = 0x49,
|
||||
KEY_D_KP_MINUS = 0x4a,
|
||||
KEY_D_KP_4 = 0x4b,
|
||||
KEY_D_KP_5 = 0x4c,
|
||||
KEY_D_KP_6 = 0x4d,
|
||||
KEY_D_KP_PLUS = 0x4e,
|
||||
KEY_D_KP_1 = 0x4f,
|
||||
KEY_D_KP_2 = 0x50,
|
||||
KEY_D_KP_3 = 0x51,
|
||||
KEY_D_KP_0 = 0x52,
|
||||
KEY_D_KP_PERIOD = 0x53,
|
||||
|
||||
KEY_D_F1 = 0x3b,
|
||||
KEY_D_F2 = 0x3c,
|
||||
KEY_D_F3 = 0x3d,
|
||||
KEY_D_F4 = 0x3e,
|
||||
KEY_D_F5 = 0x3f,
|
||||
KEY_D_F6 = 0x40,
|
||||
KEY_D_F7 = 0x41,
|
||||
KEY_D_F8 = 0x42,
|
||||
KEY_D_F9 = 0x43,
|
||||
KEY_D_F10 = 0x44,
|
||||
KEY_D_F11 = 0x57,
|
||||
KEY_D_F12 = 0x58,
|
||||
|
||||
KEY_D_UP = 0x48,
|
||||
KEY_D_LEFT = 0x4b,
|
||||
KEY_D_RIGHT = 0x4d,
|
||||
KEY_D_DOWN = 0x50,
|
||||
};
|
||||
|
||||
enum UpKeys
|
||||
{
|
||||
KEY_U_ESCAPE = 0x81,
|
||||
|
||||
KEY_U_1 = 0x82,
|
||||
KEY_U_2 = 0x83,
|
||||
KEY_U_3 = 0x84,
|
||||
KEY_U_4 = 0x85,
|
||||
KEY_U_5 = 0x86,
|
||||
KEY_U_6 = 0x87,
|
||||
KEY_U_7 = 0x88,
|
||||
KEY_U_8 = 0x89,
|
||||
KEY_U_9 = 0x8a,
|
||||
KEY_U_0 = 0x8b,
|
||||
|
||||
KEY_U_MINUS = 0x8c,
|
||||
KEY_U_EQUALS = 0x8d,
|
||||
KEY_U_BACKSPACE = 0x8e,
|
||||
KEY_U_TAB = 0x8f,
|
||||
|
||||
KEY_U_Q = 0x90,
|
||||
KEY_U_W = 0x91,
|
||||
KEY_U_E = 0x92,
|
||||
KEY_U_R = 0x93,
|
||||
KEY_U_T = 0x94,
|
||||
KEY_U_Y = 0x95,
|
||||
KEY_U_U = 0x96,
|
||||
KEY_U_I = 0x97,
|
||||
KEY_U_O = 0x98,
|
||||
KEY_U_P = 0x99,
|
||||
|
||||
KEY_U_LBRACKET = 0x9a,
|
||||
KEY_U_RBRACKET = 0x9b,
|
||||
KEY_U_RETURN = 0x9c,
|
||||
KEY_U_LCTRL = 0x9d,
|
||||
|
||||
KEY_U_A = 0x9e,
|
||||
KEY_U_S = 0x9f,
|
||||
KEY_U_D = 0xa0,
|
||||
KEY_U_F = 0xa1,
|
||||
KEY_U_G = 0xa2,
|
||||
KEY_U_H = 0xa3,
|
||||
KEY_U_J = 0xa4,
|
||||
KEY_U_K = 0xa5,
|
||||
KEY_U_L = 0xa6,
|
||||
|
||||
KEY_U_SEMICOLON = 0xa7,
|
||||
KEY_U_APOSTROPHE = 0xa8,
|
||||
KEY_U_GRAVE = 0xa9,
|
||||
KEY_U_LSHIFT = 0xaa,
|
||||
KEY_U_BACKSLASH = 0xab,
|
||||
|
||||
KEY_U_Z = 0xac,
|
||||
KEY_U_X = 0xad,
|
||||
KEY_U_C = 0xae,
|
||||
KEY_U_V = 0xaf,
|
||||
KEY_U_B = 0xb0,
|
||||
KEY_U_N = 0xb1,
|
||||
KEY_U_M = 0xb2,
|
||||
|
||||
KEY_U_COMMA = 0xb3,
|
||||
KEY_U_PERIOD = 0xb4,
|
||||
KEY_U_SLASH = 0xb5,
|
||||
KEY_U_RSHIFT = 0xb6,
|
||||
KEY_U_KP_MULTIPLY = 0xb7,
|
||||
KEY_U_LALT = 0xb8,
|
||||
KEY_U_SPACE = 0xb9,
|
||||
KEY_U_CAPSLOCK = 0xba,
|
||||
|
||||
KEY_U_F1 = 0xbb,
|
||||
KEY_U_F2 = 0xbc,
|
||||
KEY_U_F3 = 0xbd,
|
||||
KEY_U_F4 = 0xbe,
|
||||
KEY_U_F5 = 0xbf,
|
||||
KEY_U_F6 = 0xc0,
|
||||
KEY_U_F7 = 0xc1,
|
||||
KEY_U_F8 = 0xc2,
|
||||
KEY_U_F9 = 0xc3,
|
||||
KEY_U_F10 = 0xc4,
|
||||
|
||||
KEY_U_NUMLOCK = 0xc5,
|
||||
KEY_U_SCROLLLOCK = 0xc6,
|
||||
|
||||
KEY_U_KP_7 = 0xc7,
|
||||
KEY_U_KP_8 = 0xc8,
|
||||
KEY_U_KP_9 = 0xc9,
|
||||
KEY_U_KP_MINUS = 0xca,
|
||||
KEY_U_KP_4 = 0xcb,
|
||||
KEY_U_KP_5 = 0xcc,
|
||||
KEY_U_KP_6 = 0xcd,
|
||||
KEY_U_KP_PLUS = 0xce,
|
||||
KEY_U_KP_1 = 0xcf,
|
||||
KEY_U_KP_2 = 0xd0,
|
||||
KEY_U_KP_3 = 0xd1,
|
||||
KEY_U_KP_0 = 0xd2,
|
||||
KEY_U_KP_PERIOD = 0xd3,
|
||||
|
||||
KEY_U_F11 = 0xd7,
|
||||
KEY_U_F12 = 0xd8,
|
||||
};
|
||||
|
||||
int DriverEntry(void *);
|
||||
int CallbackHandler(KernelCallback *);
|
||||
int InterruptCallback(CPURegisters *);
|
||||
}
|
||||
|
||||
#endif // !__FENNIX_KERNEL_PS2_KEYBOARD_H__
|
59
modules/PersonalSystem2/mouse.hpp
Normal file
59
modules/PersonalSystem2/mouse.hpp
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
This file is part of Fennix Kernel.
|
||||
|
||||
Fennix Kernel is free software: you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation, either version 3 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Fennix Kernel is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __FENNIX_KERNEL_PS2_MOUSE_H__
|
||||
#define __FENNIX_KERNEL_PS2_MOUSE_H__
|
||||
|
||||
#include <types.h>
|
||||
#include "../../mapi.hpp"
|
||||
|
||||
namespace PS2Mouse
|
||||
{
|
||||
#define PS2LeftButton 0b00000001
|
||||
#define PS2MiddleButton 0b00000100
|
||||
#define PS2RightButton 0b00000010
|
||||
#define PS2XSign 0b00010000
|
||||
#define PS2YSign 0b00100000
|
||||
#define PS2XOverflow 0b01000000
|
||||
#define PS2YOverflow 0b10000000
|
||||
|
||||
enum Config
|
||||
{
|
||||
READ_CONFIG = 0x20,
|
||||
WRITE_CONFIG = 0x60
|
||||
};
|
||||
|
||||
enum Ports
|
||||
{
|
||||
DATA = 0x60,
|
||||
STATUS = 0x64,
|
||||
COMMAND = 0x64,
|
||||
};
|
||||
|
||||
enum State
|
||||
{
|
||||
OUTPUT_FULL = (1 << 0),
|
||||
INPUT_FULL = (1 << 1),
|
||||
MOUSE_BYTE = (1 << 5)
|
||||
};
|
||||
|
||||
int DriverEntry(void *);
|
||||
int CallbackHandler(KernelCallback *);
|
||||
int InterruptCallback(CPURegisters *);
|
||||
}
|
||||
|
||||
#endif // !__FENNIX_KERNEL_PS2_MOUSE_H__
|
Reference in New Issue
Block a user