summaryrefslogtreecommitdiff
path: root/kernel/src/drivers/ps2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/drivers/ps2.cpp')
-rw-r--r--kernel/src/drivers/ps2.cpp326
1 files changed, 0 insertions, 326 deletions
diff --git a/kernel/src/drivers/ps2.cpp b/kernel/src/drivers/ps2.cpp
deleted file mode 100644
index a0f5dbf..0000000
--- a/kernel/src/drivers/ps2.cpp
+++ /dev/null
@@ -1,326 +0,0 @@
-#include <drivers/tsc.hpp>
-#include <generic/mm/paging.hpp>
-#include <generic/mm/pmm.hpp>
-#include <generic/mm/heap.hpp>
-#include <generic/vfs/vfs.hpp>
-#include <etc/etc.hpp>
-#include <etc/logging.hpp>
-
-#include <drivers/pci.hpp>
-#include <generic/vfs/evdev.hpp>
-
-#include <arch/x86_64/scheduling.hpp>
-#include <drivers/ps2.hpp>
-
-#include <etc/assembly.hpp>
-#include <drivers/io.hpp>
-
-void ps2_wait_write() {
- drivers::io io;
- while (io.inb(PS2_STATUS) & (1 << 1));
-}
-
-void ps2_wait_read() {
- drivers::io io;
- while (!(io.inb(PS2_STATUS) & (1 << 0)));
-}
-
-void ps2_writecmddata(char cmd, char data) {
- drivers::io io;
- ps2_wait_write();
- io.wait();
- io.outb(PS2_STATUS, cmd);
- io.wait();
- io.outb(PS2_DATA, data);
-}
-
-void ps2_writecmd(char cmd) {
- drivers::io io;
- ps2_wait_write();
- io.outb(PS2_STATUS, cmd);
-}
-
-void ps2_writedata(char cmd) {
- drivers::io io;
- ps2_wait_write();
- io.outb(PS2_DATA, cmd);
-}
-
-char ps2_not_empty() {
- drivers::io io;
- return (io.inb(PS2_STATUS) & 1) == 0;
-}
-
-int ps2_is_timeout = 0;
-
-char ps2_read_data() {
- drivers::io io;
- int timeout = 0;
- while(ps2_not_empty()) {
- if(timeout++ == 100) {
- ps2_is_timeout = 1;
- return 0;
- }
- drivers::tsc::sleep(100);
- }
- return io.inb(PS2_DATA);
-}
-
-void ps2_flush() {
- drivers::io io;
- while(io.inb(PS2_STATUS) & (1 << 0)) {
- io.inb(PS2_DATA);
- }
-}
-
-#define STATUS 0x64
-#define COMMAND 0x64
-#define DATA 0x60
-#define RESEND 0xFE
-#define ACK 0xFA
-#define ECHO 0xEE
-
-void ps2_writeport(uint8_t port, uint8_t cmd) {
- if(port == 2)
- ps2_writecmd(0xD4);
-
- ps2_writedata(cmd);
-}
-
-static inline char ps2_wait() {
- drivers::io io;
- return (io.inb(0x64) & 1) == 0;
-}
-
-uint8_t ps2_readtimeout() {
- drivers::io io;
- int timeout = 100;
- while(ps2_wait() && --timeout > 0) drivers::tsc::sleep(100);
- if(timeout <= 0)
- return 0;
- return io.inb(0x60);
-}
-
-void ps2_enableport(uint8_t port) {
- ps2_writeport(port,0xF4);
- int retry = 0;
- while(1) {
- uint8_t response = ps2_readtimeout();
- if(!response)
- break;
- else if(response == ACK)
- break;
- else if(response == RESEND) {
- if(++retry == 10)
- break;
- ps2_writeport(port,0xF4);
- }
- }
- ps2_flush();
-}
-
-#define MOUSE_LB (1 << 0)
-#define MOUSE_RB (1 << 1)
-#define MOUSE_MB (1 << 2)
-#define MOUSE_B4 (1 << 3)
-#define MOUSE_B5 (1 << 4)
-
-/*
-input0_fd = open("/dev/masterps2keyboard",O_RDWR);
- mouse_fd = open("/dev/mastermouse",O_RDWR);
-*/
-
-#define REL_X 0x00
-#define REL_Y 0x01
-#define REL_Z 0x02
-#define REL_RX 0x03
-#define REL_RY 0x04
-#define REL_RZ 0x05
-#define REL_HWHEEL 0x06
-#define REL_DIAL 0x07
-#define REL_WHEEL 0x08
-#define REL_MISC 0x09
-
-typedef struct {
- unsigned char buttons;
- unsigned char x;
- unsigned char y;
- unsigned char z;
-} __attribute__((packed)) mouse_packet_t;
-
-int mouse_evdev = 0;
-int kbd_evdev = 0;
-
-mouse_packet_t last_pack = {0};
-
-void ps2_process(void* arg) {
- int mouse_seq = 0;
- drivers::io io;
- if(1) {
-
- uint8_t mouse_buffer[4] = {0,0,0,0};
-
- while(1) {
-
- if(1) {
-
- int val = 1;
-
- uint8_t status = io.inb(0x64);
- while(status & 1) {
- int data = io.inb(DATA);
-
- if(status & (1 << 5)) {
- mouse_buffer[mouse_seq++] = data;
-
- if(mouse_seq == 3) {
- mouse_packet_t packet = {0,0,0,0};
-
- packet.x = mouse_buffer[1] - (mouse_buffer[0] & 0x10 ? 0x100 : 0);
- packet.y = mouse_buffer[2] - (mouse_buffer[0] & 0x20 ? 0x100 : 0);
- packet.z = (mouse_buffer[3] & 0x7) * (mouse_buffer[3] & 0x8 ? -1 : 1);
-
- packet.buttons |= (mouse_buffer[0] & 1) ? MOUSE_LB : 0;
- packet.buttons |= (mouse_buffer[0] & 2) ? MOUSE_RB : 0;
- packet.buttons |= (mouse_buffer[0] & 4) ? MOUSE_MB : 0;
-
- packet.buttons |= (mouse_buffer[0] & 0x10) ? MOUSE_B4 : 0;
- packet.buttons |= (mouse_buffer[0] & 0x20) ? MOUSE_B5 : 0;
-
- userspace_fd_t fd;
- memset(&fd,0,sizeof(userspace_fd_t));
- memcpy(fd.path,"/dev/mastermouse",strlen("/dev/mastermouse"));
- fd.is_cached_path = 1;
-
- asm volatile("cli");
- std::uint64_t current_nano = drivers::tsc::currentnano();
- input_event ev;
- ev.time.tv_sec = current_nano / 1000000000;
- ev.time.tv_usec = (current_nano & 1000000000) / 1000;
- if(packet.x) {
- ev.code = REL_X;
- ev.type = 2;
- ev.value = (packet.x & 0x80) ? (packet.x | 0xFFFFFF00) : packet.x;
- vfs::evdev::submit(mouse_evdev,ev);
- }
-
- if(packet.y) {
- ev.code = REL_Y;
- ev.type = 2;
- ev.value = (packet.y & 0x80) ? (packet.y | 0xFFFFFF00) : packet.y;
- vfs::evdev::submit(mouse_evdev,ev);
- }
-
- if(packet.z) {
- ev.code = REL_Z;
- ev.type = 2;
- ev.value = (packet.z & 0x80) ? (packet.z | 0xFFFFFF00) : packet.z;
- vfs::evdev::submit(mouse_evdev,ev);
- }
-
- if((packet.buttons & MOUSE_LB) && !(last_pack.buttons & MOUSE_LB)) {
- ev.code = 272;
- ev.type = 1;
- ev.value = 1;
- vfs::evdev::submit(mouse_evdev,ev);
- } else if(!(packet.buttons & MOUSE_LB) && (last_pack.buttons & MOUSE_LB)) {
- ev.code = 272;
- ev.type = 1;
- ev.value = 0;
- vfs::evdev::submit(mouse_evdev,ev);
- }
-
- if((packet.buttons & MOUSE_RB) && !(last_pack.buttons & MOUSE_RB)) {
- ev.code = 273;
- ev.type = 1;
- ev.value = 1;
- vfs::evdev::submit(mouse_evdev,ev);
- } else if(!(packet.buttons & MOUSE_RB) && (last_pack.buttons & MOUSE_RB)) {
- ev.code = 273;
- ev.type = 1;
- ev.value = 0;
- vfs::evdev::submit(mouse_evdev,ev);
- }
-
- if((packet.buttons & MOUSE_MB) && !(last_pack.buttons & MOUSE_MB)) {
- ev.code = 274;
- ev.type = 1;
- ev.value = 1;
- vfs::evdev::submit(mouse_evdev,ev);
- } else if(!(packet.buttons & MOUSE_MB) && (last_pack.buttons & MOUSE_MB)) {
- ev.code = 274;
- ev.type = 1;
- ev.value = 0;
- vfs::evdev::submit(mouse_evdev,ev);
- }
-
- asm volatile("sti");
-
- last_pack = packet;
-
- mouse_seq = 0;
-
- }
-
- } else {
- userspace_fd_t fd;
- memset(&fd,0,sizeof(userspace_fd_t));
- memcpy(fd.path,"/dev/masterps2keyboard",strlen("/dev/masterps2keyboard"));
- fd.is_cached_path = 1;
-
- std::uint64_t current_nano = drivers::tsc::currentnano();
-
- asm volatile("cli");
- input_event ev;
- ev.time.tv_sec = current_nano / 1000000000;
- ev.time.tv_usec = (current_nano & 1000000000) / 1000;
- ev.type = 1;
- ev.code = data & ~(1 << 7);
- ev.value = (data & (1 << 7)) ? 0 : 1;
- vfs::evdev::submit(kbd_evdev,ev);
- vfs::vfs::write(&fd,&data,1);
- asm volatile("sti");
- }
-
- status = io.inb(0x64);
- }
- asm volatile("cli");
- yield();
- asm volatile("sti");
- }
- }
- }
-}
-
-void drivers::ps2::init() {
- ps2_flush();
- ps2_writecmd(CMD_READ_CONFIG);
- std::uint8_t ctrl = (std::uint8_t)ps2_read_data();
- if(ps2_is_timeout) {
- Log::Display(LEVEL_MESSAGE_FAIL,"ps2: there's no ps2 controller !\n");
- return;
- }
-
- ps2_writecmd(0xAD);
- ps2_writecmd(0xA7);
-
- ps2_writecmd(0x20);
- uint8_t config = ps2_read_data();
- config |= (1 << 0) | (1 << 1) | (1 << 6);
- ps2_writecmd(0x60);
- ps2_writedata(config);
-
- ps2_enableport(1);
- ps2_enableport(2);
-
- ps2_writecmd(0xAE);
- ps2_writecmd(0xA8);
-
- ps2_flush();
-
- mouse_evdev = vfs::evdev::create("Generic PS/2 Mouse",EVDEV_TYPE_MOUSE);
- kbd_evdev = vfs::evdev::create("Generic PS/2 Keyboard",EVDEV_TYPE_KEYBOARD);
-
- arch::x86_64::scheduling::create_kernel_thread(ps2_process,0);
- Log::Display(LEVEL_MESSAGE_INFO,"PS/2 Initializied\n");
-} \ No newline at end of file