stos/amd64: isa: Add legacy i8254 driver

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-27 05:18:33 -05:00
parent ef72c9d6d5
commit 354cf87a16
2 changed files with 78 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2026, Chloe M.
* Provided under the BSD-3 clause.
*
* Description: i8254 timer driver
* Author: Chloe M.
*/
#include <machine/i8254.h>
#include <machine/pio.h>
USHORT
MdPitGetCount(VOID)
{
UCHAR Low, High;
MdOutb(I8254_COMMAND, 0x00);
Low = MdInb(0x40);
High = MdInb(0x40);
return (High << 8) | Low;
}
VOID
MdPitSetCount(USHORT Value)
{
MdOutb(I8254_COMMAND, 0x34);
MdOutb(0x40, Value & 0xFF);
MdOutb(0x40, (Value >> 8) & 0xFF);
}
VOID
MdPitSetFrequency(UQUAD Frequency)
{
UQUAD Divisor;
Divisor = I8254_DIVIDEND / Frequency;
if ((I8254_DIVIDEND % Frequency) > (Frequency / 2)) {
++Divisor;
}
MdPitSetCount(Divisor);
}
+36
View File
@@ -0,0 +1,36 @@
/*
* Copyright (c) 2026, Chloe M.
* Provided under the BSD-3 clause.
*
* Description: i8254 timer driver
* Author: Chloe M.
*/
#ifndef _MACHINE_I8254_H_
#define _MACHINE_I8254_H_ 1
#include <stdef.h>
#define I8254_COMMAND 0x43
#define I8254_CHANNEL_0 0x40
#define I8254_CHANNEL_2 0x42
#define I8254_DIVIDEND 1193182ULL
/*
* Obtain the current counter value
*/
USHORT MdPitGetCount(VOID);
/*
* Set a new counter value
*/
VOID MdPitSetCount(USHORT Value);
/*
* Set the PIT counter to match a frequency in Hz
*
* @Frequency: Frequency in HZ to set
*/
VOID MdPitSetFrequency(UQUAD Frequency);
#endif /* !_MACHINE_I8254_H_ */