feat(drivers): remap PIC and drive PIT at 100 Hz

This commit is contained in:
dualfroz committed 2026-08-25 09:41:20 +02:00
1 parent 8c846c9ca5
commit 371b50a3a5
4 files changed
+119

No files matched your search

+63
View File
@@ -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);
}
+34
View File
@@ -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;
}