stos/amd64: isa: Add legacy i8254 driver
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
@@ -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_ */
|
||||||
Reference in New Issue
Block a user