feat(drivers): remap PIC and drive PIT at 100 Hz
This commit is contained in:
1 parent
8c846c9ca5
commit
371b50a3a5
4 files changed
+119
No files matched your search
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user