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,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
|
||||||
@@ -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
|
||||||
@@ -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