From 371b50a3a521558a9f278e9faa0539f3397d3ffb Mon Sep 17 00:00:00 2001 From: DualFroz Date: Tue, 25 Aug 2026 09:41:20 +0200 Subject: [PATCH] feat(drivers): remap PIC and drive PIT at 100 Hz --- include/pic.h | 11 +++++++++ include/pit.h | 11 +++++++++ src/pic.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/pit.c | 34 +++++++++++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 include/pic.h create mode 100644 include/pit.h create mode 100644 src/pic.c create mode 100644 src/pit.c diff --git a/include/pic.h b/include/pic.h new file mode 100644 index 0000000..6d3d391 --- /dev/null +++ b/include/pic.h @@ -0,0 +1,11 @@ +#ifndef FROSTBYTE_PIC_H +#define FROSTBYTE_PIC_H + +#include "types.h" + +void picRemap(void); +void picSendEoi(uint8 irq); +void picSetMask(uint8 irq); +void picClearMask(uint8 irq); + +#endif diff --git a/include/pit.h b/include/pit.h new file mode 100644 index 0000000..2f98a05 --- /dev/null +++ b/include/pit.h @@ -0,0 +1,11 @@ +#ifndef FROSTBYTE_PIT_H +#define FROSTBYTE_PIT_H + +#include "types.h" + +void pitInit(uint32 frequency); +void pitTick(void); +uint64 pitTicks(void); +uint32 pitFrequency(void); + +#endif diff --git a/src/pic.c b/src/pic.c new file mode 100644 index 0000000..7d5b090 --- /dev/null +++ b/src/pic.c @@ -0,0 +1,63 @@ +#include "pic.h" +#include "ports.h" + +#define picMasterCommand 0x20 +#define picMasterData 0x21 +#define picSlaveCommand 0xA0 +#define picSlaveData 0xA1 +#define picEoi 0x20 + +#define icw1Init 0x11 +#define icw4Mode 0x01 + +#define masterVectorBase 0x20 +#define slaveVectorBase 0x28 + +void picRemap(void) +{ + uint8 masterMask = inb(picMasterData); + uint8 slaveMask = inb(picSlaveData); + + outb(picMasterCommand, icw1Init); + ioWait(); + outb(picSlaveCommand, icw1Init); + ioWait(); + outb(picMasterData, masterVectorBase); + ioWait(); + outb(picSlaveData, slaveVectorBase); + ioWait(); + outb(picMasterData, 0x04); + ioWait(); + outb(picSlaveData, 0x02); + ioWait(); + outb(picMasterData, icw4Mode); + ioWait(); + outb(picSlaveData, icw4Mode); + ioWait(); + + outb(picMasterData, masterMask); + outb(picSlaveData, slaveMask); +} + +void picSendEoi(uint8 irq) +{ + if (irq >= 8) + outb(picSlaveCommand, picEoi); + outb(picMasterCommand, picEoi); +} + +void picSetMask(uint8 irq) +{ + uint16 port = irq < 8 ? picMasterData : picSlaveData; + uint8 bit = irq < 8 ? irq : (uint8)(irq - 8); + uint8 value = inb(port) | (uint8)(1 << bit); + outb(port, value); +} + +void picClearMask(uint8 irq) +{ + uint16 port = irq < 8 ? picMasterData : picSlaveData; + uint8 bit = irq < 8 ? irq : (uint8)(irq - 8); + uint8 value = inb(port) & (uint8)~(1 << bit); + outb(port, value); +} diff --git a/src/pit.c b/src/pit.c new file mode 100644 index 0000000..11ad072 --- /dev/null +++ b/src/pit.c @@ -0,0 +1,34 @@ +#include "pit.h" +#include "ports.h" + +#define pitChannel0 0x40 +#define pitCommand 0x43 +#define pitBaseFrequency 1193182 + +static volatile uint64 tickCount; +static uint32 configuredFrequency; + +void pitInit(uint32 frequency) +{ + configuredFrequency = frequency; + uint32 divisor = pitBaseFrequency / frequency; + + outb(pitCommand, 0x36); + outb(pitChannel0, (uint8)(divisor & 0xFF)); + outb(pitChannel0, (uint8)((divisor >> 8) & 0xFF)); +} + +void pitTick(void) +{ + tickCount++; +} + +uint64 pitTicks(void) +{ + return tickCount; +} + +uint32 pitFrequency(void) +{ + return configuredFrequency; +}