mirror of
https://github.com/Fennix-Project/Drivers.git
synced 2025-05-28 15:34:29 +00:00
Update drivers after the new DAPI
This commit is contained in:
parent
a3769735bc
commit
31c0898bff
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -16,6 +17,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.TypeFlags = FexDriverInputTypes_None,
|
.TypeFlags = FexDriverInputTypes_None,
|
||||||
.OverrideOnConflict = false,
|
.OverrideOnConflict = false,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -99,13 +101,20 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
DescriptorList = (BufferDescriptorList *)KAPI->Memory.RequestPage((sizeof(BufferDescriptorList) * DescriptorListLength) / KAPI->Memory.PageSize + 1);
|
DescriptorList = (BufferDescriptorList *)KAPI->Memory.RequestPage((sizeof(BufferDescriptorList) * DescriptorListLength) / KAPI->Memory.PageSize + 1);
|
||||||
KAPI->Util.memset(DescriptorList, 0, sizeof(BufferDescriptorList) * DescriptorListLength);
|
KAPI->Util.memset(DescriptorList, 0, sizeof(BufferDescriptorList) * DescriptorListLength);
|
||||||
|
|
||||||
|
uint16_t DLSampleCount = KAPI->Memory.PageSize / SampleSize;
|
||||||
|
char DLLogBuffer[128];
|
||||||
for (int i = 0; i < DescriptorListLength; i++)
|
for (int i = 0; i < DescriptorListLength; i++)
|
||||||
{
|
{
|
||||||
DescriptorList[i] = {
|
int DescriptorPages = sizeof(uint16_t *) / KAPI->Memory.PageSize + 1;
|
||||||
.Address = (uint32_t)(uint64_t)KAPI->Memory.RequestPage(sizeof(uint16_t *) / KAPI->Memory.PageSize + 1),
|
DescriptorList[i].Address = (uint32_t)(uint64_t)KAPI->Memory.RequestPage(DescriptorPages);
|
||||||
.SampleCount = (uint16_t)(KAPI->Memory.PageSize / SampleSize),
|
DescriptorList[i].SampleCount = DLSampleCount;
|
||||||
.Flags = 0,
|
DescriptorList[i].Flags = 0;
|
||||||
};
|
KAPI->Util.sprintf(DLLogBuffer, "DescriptorList[%d] = { Address: 0x%x (%d %s), SampleCount: %d, Flags: 0x%x }",
|
||||||
|
i,
|
||||||
|
DescriptorList[i].Address, DescriptorPages, DescriptorPages == 1 ? "page" : "pages",
|
||||||
|
DescriptorList[i].SampleCount,
|
||||||
|
DescriptorList[i].Flags);
|
||||||
|
print(DLLogBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
outw(BAR.MixerAddress + NAM_MasterVolume, MixerVolume(Volume, Volume, Mute));
|
outw(BAR.MixerAddress + NAM_MasterVolume, MixerVolume(Volume, Volume, Mute));
|
||||||
@ -236,10 +245,19 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
case SendReason:
|
case SendReason:
|
||||||
{
|
{
|
||||||
|
for (size_t i = 0; i < 10; i++)
|
||||||
|
KAPI->Util.Sleep(1000);
|
||||||
|
return OK;
|
||||||
unsigned char *Buffer = (unsigned char *)Data->AudioCallback.Send.Data;
|
unsigned char *Buffer = (unsigned char *)Data->AudioCallback.Send.Data;
|
||||||
unsigned int Length = Data->AudioCallback.Send.Length;
|
unsigned int Length = Data->AudioCallback.Send.Length;
|
||||||
|
|
||||||
if (Length % (SampleSize * Channels))
|
if (Buffer == nullptr)
|
||||||
|
{
|
||||||
|
print("Invalid buffer.");
|
||||||
|
return INVALID_DATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((Length == 0) || (Length % (SampleSize * Channels)))
|
||||||
{
|
{
|
||||||
print("Invalid buffer length.");
|
print("Invalid buffer length.");
|
||||||
return INVALID_DATA;
|
return INVALID_DATA;
|
||||||
@ -270,10 +288,7 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
{
|
{
|
||||||
long SampleCount = DescriptorList[(CurrentBDL + 1) % DescriptorListLength].SampleCount / Channels;
|
long SampleCount = DescriptorList[(CurrentBDL + 1) % DescriptorListLength].SampleCount / Channels;
|
||||||
if (SampleCount > 0)
|
if (SampleCount > 0)
|
||||||
{
|
|
||||||
// KAPI->Util.Sleep(SampleCount * 1000000 / SampleRate); // microseconds
|
|
||||||
KAPI->Util.Sleep(SampleCount * 1000 / SampleRate); // milliseconds
|
KAPI->Util.Sleep(SampleCount * 1000 / SampleRate); // milliseconds
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (RemainingBDL >= DescriptorListLength - 1 && !(inw(BAR.BusMasterAddress + PCMOUT_Status) & TC_DMAControllerControl));
|
} while (RemainingBDL >= DescriptorListLength - 1 && !(inw(BAR.BusMasterAddress + PCMOUT_Status) & TC_DMAControllerControl));
|
||||||
@ -294,7 +309,7 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
int Wrote = ((KAPI->Memory.PageSize > Length) ? Length : KAPI->Memory.PageSize);
|
int Wrote = (KAPI->Memory.PageSize > Length) ? Length : KAPI->Memory.PageSize;
|
||||||
|
|
||||||
if (Wrote == 0)
|
if (Wrote == 0)
|
||||||
break;
|
break;
|
||||||
@ -343,35 +358,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
print("Driver stopped.");
|
print("Driver stopped.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
break; // Not working as expected
|
|
||||||
uint16_t Status = inw(BAR.MixerAddress + PCMOUT_Status);
|
|
||||||
|
|
||||||
if (Status & TC_IOCInterruptEnable)
|
|
||||||
{
|
|
||||||
print("Interrupt on completion.");
|
|
||||||
}
|
|
||||||
else if (Status & TC_LastBufferEntryInterruptEnable)
|
|
||||||
{
|
|
||||||
print("Last buffer entry.");
|
|
||||||
// Stop DMA
|
|
||||||
outb(BAR.BusMasterAddress + PCMOUT_TransferControl, inb(BAR.BusMasterAddress + PCMOUT_TransferControl) & ~TC_DMAControllerControl);
|
|
||||||
}
|
|
||||||
else if (Status & TC_FifoERRORInterruptEnable)
|
|
||||||
{
|
|
||||||
print("FIFO error.");
|
|
||||||
}
|
|
||||||
else if (Status != 0x0)
|
|
||||||
{
|
|
||||||
char UnknownStatusText[64];
|
|
||||||
KAPI->Util.sprintf(UnknownStatusText, "Unknown status: %#lx", Status);
|
|
||||||
print(UnknownStatusText);
|
|
||||||
}
|
|
||||||
|
|
||||||
outw(BAR.MixerAddress + PCMOUT_Status, 0xFFFF);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
print("Unknown reason.");
|
print("Unknown reason.");
|
||||||
@ -380,3 +366,32 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
uint16_t Status = inw(BAR.MixerAddress + PCMOUT_Status);
|
||||||
|
|
||||||
|
if (Status & TC_IOCInterruptEnable)
|
||||||
|
{
|
||||||
|
print("Interrupt on completion.");
|
||||||
|
}
|
||||||
|
else if (Status & TC_LastBufferEntryInterruptEnable)
|
||||||
|
{
|
||||||
|
print("Last buffer entry.");
|
||||||
|
// Stop DMA
|
||||||
|
outb(BAR.BusMasterAddress + PCMOUT_TransferControl, inb(BAR.BusMasterAddress + PCMOUT_TransferControl) & ~TC_DMAControllerControl);
|
||||||
|
}
|
||||||
|
else if (Status & TC_FifoERRORInterruptEnable)
|
||||||
|
{
|
||||||
|
print("FIFO error.");
|
||||||
|
}
|
||||||
|
else if (Status != 0x0)
|
||||||
|
{
|
||||||
|
char UnknownStatusText[64];
|
||||||
|
KAPI->Util.sprintf(UnknownStatusText, "Unknown status: %#lx", Status);
|
||||||
|
print(UnknownStatusText);
|
||||||
|
}
|
||||||
|
|
||||||
|
outw(BAR.MixerAddress + PCMOUT_Status, 0xFFFF);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
/* The driver is
|
/* The driver is
|
||||||
* This is a driver for Fennix Driver Entry Extended Header
|
* This is a driver for Fennix Driver Entry Extended Header
|
||||||
@ -18,10 +19,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "Example Driver",
|
.Name = "Example Driver",
|
||||||
.Type = FexDriverType_Generic,
|
.Type = FexDriverType_Generic,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_INTERRUPT,
|
.Type = BIND_INTERRUPT,
|
||||||
.Interrupt = {
|
.Interrupt = {
|
||||||
.Vector = {0xFF},
|
.Vector = {222}, // IRQ222
|
||||||
}}}};
|
}}}};
|
||||||
|
|
||||||
// Global variable that holds the kernel API
|
// Global variable that holds the kernel API
|
||||||
@ -61,11 +63,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
print("Kernel acknowledged the driver.");
|
print("Kernel acknowledged the driver.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
print("Interrupt received.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case StopReason:
|
case StopReason:
|
||||||
{
|
{
|
||||||
print("Driver stopped.");
|
print("Driver stopped.");
|
||||||
@ -79,3 +76,9 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
print("Interrupt received.");
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -18,10 +19,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.TypeFlags = FexDriverInputTypes_Mouse,
|
.TypeFlags = FexDriverInputTypes_Mouse,
|
||||||
.OverrideOnConflict = false,
|
.OverrideOnConflict = false,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_INTERRUPT,
|
.Type = BIND_INTERRUPT,
|
||||||
.Interrupt = {
|
.Interrupt = {
|
||||||
.Vector = {0xC}, // IRQ12
|
.Vector = {12}, // IRQ12
|
||||||
}}}};
|
}}}};
|
||||||
|
|
||||||
KernelAPI *KAPI;
|
KernelAPI *KAPI;
|
||||||
@ -156,115 +158,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
print("Driver stopped.");
|
print("Driver stopped.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
uint8_t Data = inb(0x60);
|
|
||||||
|
|
||||||
if (__builtin_expect(!!(PacketReady), 0))
|
|
||||||
{
|
|
||||||
bool XNegative, YNegative, XOverflow, YOverflow;
|
|
||||||
|
|
||||||
if (Packet[0] & PS2XSign)
|
|
||||||
XNegative = true;
|
|
||||||
else
|
|
||||||
XNegative = false;
|
|
||||||
|
|
||||||
if (Packet[0] & PS2YSign)
|
|
||||||
YNegative = true;
|
|
||||||
else
|
|
||||||
YNegative = false;
|
|
||||||
|
|
||||||
if (Packet[0] & PS2XOverflow)
|
|
||||||
XOverflow = true;
|
|
||||||
else
|
|
||||||
XOverflow = false;
|
|
||||||
|
|
||||||
if (Packet[0] & PS2YOverflow)
|
|
||||||
YOverflow = true;
|
|
||||||
else
|
|
||||||
YOverflow = false;
|
|
||||||
|
|
||||||
if (!XNegative)
|
|
||||||
{
|
|
||||||
MouseX += Packet[1];
|
|
||||||
if (XOverflow)
|
|
||||||
MouseX += 255;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Packet[1] = 256 - Packet[1];
|
|
||||||
MouseX -= Packet[1];
|
|
||||||
if (XOverflow)
|
|
||||||
MouseX -= 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!YNegative)
|
|
||||||
{
|
|
||||||
MouseY -= Packet[2];
|
|
||||||
if (YOverflow)
|
|
||||||
MouseY -= 255;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Packet[2] = 256 - Packet[2];
|
|
||||||
MouseY += Packet[2];
|
|
||||||
if (YOverflow)
|
|
||||||
MouseY += 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Width = KAPI->Display.GetWidth();
|
|
||||||
uint32_t Height = KAPI->Display.GetHeight();
|
|
||||||
|
|
||||||
if (MouseX < 0)
|
|
||||||
MouseX = 0;
|
|
||||||
|
|
||||||
if ((uint32_t)MouseX > Width - 1)
|
|
||||||
MouseX = Width - 1;
|
|
||||||
|
|
||||||
if (MouseY < 0)
|
|
||||||
MouseY = 0;
|
|
||||||
if ((uint32_t)MouseY > Height - 1)
|
|
||||||
MouseY = Height - 1;
|
|
||||||
|
|
||||||
MouseLeft = 0;
|
|
||||||
MouseMiddle = 0;
|
|
||||||
MouseRight = 0;
|
|
||||||
|
|
||||||
if (Packet[0] & PS2LeftButton)
|
|
||||||
MouseLeft = 1;
|
|
||||||
if (Packet[0] & PS2MiddleButton)
|
|
||||||
MouseMiddle = 1;
|
|
||||||
if (Packet[0] & PS2RightButton)
|
|
||||||
MouseRight = 1;
|
|
||||||
PacketReady = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (Cycle)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
if ((Data & 0b00001000) == 0)
|
|
||||||
break;
|
|
||||||
Packet[0] = Data;
|
|
||||||
Cycle++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
Packet[1] = Data;
|
|
||||||
Cycle++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
Packet[2] = Data;
|
|
||||||
PacketReady = true;
|
|
||||||
Cycle = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
print("Unknown reason.");
|
print("Unknown reason.");
|
||||||
@ -273,3 +166,113 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
uint8_t Data = inb(0x60);
|
||||||
|
|
||||||
|
if (__builtin_expect(!!(PacketReady), 0))
|
||||||
|
{
|
||||||
|
bool XNegative, YNegative, XOverflow, YOverflow;
|
||||||
|
|
||||||
|
if (Packet[0] & PS2XSign)
|
||||||
|
XNegative = true;
|
||||||
|
else
|
||||||
|
XNegative = false;
|
||||||
|
|
||||||
|
if (Packet[0] & PS2YSign)
|
||||||
|
YNegative = true;
|
||||||
|
else
|
||||||
|
YNegative = false;
|
||||||
|
|
||||||
|
if (Packet[0] & PS2XOverflow)
|
||||||
|
XOverflow = true;
|
||||||
|
else
|
||||||
|
XOverflow = false;
|
||||||
|
|
||||||
|
if (Packet[0] & PS2YOverflow)
|
||||||
|
YOverflow = true;
|
||||||
|
else
|
||||||
|
YOverflow = false;
|
||||||
|
|
||||||
|
if (!XNegative)
|
||||||
|
{
|
||||||
|
MouseX += Packet[1];
|
||||||
|
if (XOverflow)
|
||||||
|
MouseX += 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Packet[1] = 256 - Packet[1];
|
||||||
|
MouseX -= Packet[1];
|
||||||
|
if (XOverflow)
|
||||||
|
MouseX -= 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!YNegative)
|
||||||
|
{
|
||||||
|
MouseY -= Packet[2];
|
||||||
|
if (YOverflow)
|
||||||
|
MouseY -= 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Packet[2] = 256 - Packet[2];
|
||||||
|
MouseY += Packet[2];
|
||||||
|
if (YOverflow)
|
||||||
|
MouseY += 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Width = KAPI->Display.GetWidth();
|
||||||
|
uint32_t Height = KAPI->Display.GetHeight();
|
||||||
|
|
||||||
|
if (MouseX < 0)
|
||||||
|
MouseX = 0;
|
||||||
|
|
||||||
|
if ((uint32_t)MouseX > Width - 1)
|
||||||
|
MouseX = Width - 1;
|
||||||
|
|
||||||
|
if (MouseY < 0)
|
||||||
|
MouseY = 0;
|
||||||
|
if ((uint32_t)MouseY > Height - 1)
|
||||||
|
MouseY = Height - 1;
|
||||||
|
|
||||||
|
MouseLeft = 0;
|
||||||
|
MouseMiddle = 0;
|
||||||
|
MouseRight = 0;
|
||||||
|
|
||||||
|
if (Packet[0] & PS2LeftButton)
|
||||||
|
MouseLeft = 1;
|
||||||
|
if (Packet[0] & PS2MiddleButton)
|
||||||
|
MouseMiddle = 1;
|
||||||
|
if (Packet[0] & PS2RightButton)
|
||||||
|
MouseRight = 1;
|
||||||
|
PacketReady = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Cycle)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
if ((Data & 0b00001000) == 0)
|
||||||
|
break;
|
||||||
|
Packet[0] = Data;
|
||||||
|
Cycle++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
Packet[1] = Data;
|
||||||
|
Cycle++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
Packet[2] = Data;
|
||||||
|
PacketReady = true;
|
||||||
|
Cycle = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -18,10 +19,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.TypeFlags = FexDriverInputTypes_Mouse,
|
.TypeFlags = FexDriverInputTypes_Mouse,
|
||||||
.OverrideOnConflict = true,
|
.OverrideOnConflict = true,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_INTERRUPT,
|
.Type = BIND_INTERRUPT,
|
||||||
.Interrupt = {
|
.Interrupt = {
|
||||||
.Vector = {0xC}, // IRQ12
|
.Vector = {12}, // IRQ12
|
||||||
}}}};
|
}}}};
|
||||||
|
|
||||||
KernelAPI *KAPI;
|
KernelAPI *KAPI;
|
||||||
@ -240,38 +242,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
print("Driver stopped.");
|
print("Driver stopped.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
uint8_t Data = inb(0x60);
|
|
||||||
(void)Data;
|
|
||||||
VMwareCommand cmd;
|
|
||||||
cmd.bx = 0;
|
|
||||||
cmd.command = CMD_ABSPOINTER_STATUS;
|
|
||||||
CommandSend(&cmd);
|
|
||||||
|
|
||||||
if (cmd.ax == 0xFFFF0000)
|
|
||||||
{
|
|
||||||
print("VMware mouse is not connected?");
|
|
||||||
Relative();
|
|
||||||
Absolute();
|
|
||||||
return ERROR;
|
|
||||||
}
|
|
||||||
if ((cmd.ax & 0xFFFF) < 4)
|
|
||||||
return ERROR;
|
|
||||||
|
|
||||||
cmd.bx = 4;
|
|
||||||
cmd.command = CMD_ABSPOINTER_DATA;
|
|
||||||
CommandSend(&cmd);
|
|
||||||
|
|
||||||
int flags = (cmd.ax & 0xFFFF0000) >> 16; /* Not important */
|
|
||||||
(void)flags;
|
|
||||||
MouseButton = (cmd.ax & 0xFFFF); /* 0x10 = Right, 0x20 = Left, 0x08 = Middle */
|
|
||||||
MouseX = cmd.bx; /* Both X and Y are scaled from 0 to 0xFFFF */
|
|
||||||
MouseY = cmd.cx; /* You should map these somewhere to the actual resolution. */
|
|
||||||
MouseZ = (int8_t)cmd.dx; /* Z is a single signed byte indicating scroll direction. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
print("Unknown reason.");
|
print("Unknown reason.");
|
||||||
@ -280,3 +250,35 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
uint8_t Data = inb(0x60);
|
||||||
|
(void)Data;
|
||||||
|
VMwareCommand cmd;
|
||||||
|
cmd.bx = 0;
|
||||||
|
cmd.command = CMD_ABSPOINTER_STATUS;
|
||||||
|
CommandSend(&cmd);
|
||||||
|
|
||||||
|
if (cmd.ax == 0xFFFF0000)
|
||||||
|
{
|
||||||
|
print("VMware mouse is not connected?");
|
||||||
|
Relative();
|
||||||
|
Absolute();
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
if ((cmd.ax & 0xFFFF) < 4)
|
||||||
|
return ERROR;
|
||||||
|
|
||||||
|
cmd.bx = 4;
|
||||||
|
cmd.command = CMD_ABSPOINTER_DATA;
|
||||||
|
CommandSend(&cmd);
|
||||||
|
|
||||||
|
int flags = (cmd.ax & 0xFFFF0000) >> 16; /* Not important */
|
||||||
|
(void)flags;
|
||||||
|
MouseButton = (cmd.ax & 0xFFFF); /* 0x10 = Right, 0x20 = Left, 0x08 = Middle */
|
||||||
|
MouseX = cmd.bx; /* Both X and Y are scaled from 0 to 0xFFFF */
|
||||||
|
MouseY = cmd.cx; /* You should map these somewhere to the actual resolution. */
|
||||||
|
MouseZ = (int8_t)cmd.dx; /* Z is a single signed byte indicating scroll direction. */
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -18,6 +19,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.TypeFlags = FexDriverInputTypes_Mouse,
|
.TypeFlags = FexDriverInputTypes_Mouse,
|
||||||
.OverrideOnConflict = true,
|
.OverrideOnConflict = true,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -78,11 +80,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -90,3 +87,8 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "AMD PCNET",
|
.Name = "AMD PCNET",
|
||||||
.Type = FexDriverType_Network,
|
.Type = FexDriverType_Network,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -114,10 +116,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SendReason:
|
case SendReason:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -136,3 +134,8 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "Intel Gigabit Ethernet Controller",
|
.Name = "Intel Gigabit Ethernet Controller",
|
||||||
.Type = FexDriverType_Network,
|
.Type = FexDriverType_Network,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -469,24 +471,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
WriteCMD(REG::IMASK, 0x1);
|
|
||||||
uint32_t status = ReadCMD(0xC0);
|
|
||||||
UNUSED(status);
|
|
||||||
|
|
||||||
while ((RX[RXCurrent]->Status & 0x1))
|
|
||||||
{
|
|
||||||
uint8_t *Data = (uint8_t *)RX[RXCurrent]->Address;
|
|
||||||
uint16_t DataLength = RX[RXCurrent]->Length;
|
|
||||||
KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, Data, DataLength);
|
|
||||||
RX[RXCurrent]->Status = 0;
|
|
||||||
uint16_t OldRXCurrent = RXCurrent;
|
|
||||||
RXCurrent = (RXCurrent + 1) % E1000_NUM_RX_DESC;
|
|
||||||
WriteCMD(REG::RXDESCTAIL, OldRXCurrent);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SendReason:
|
case SendReason:
|
||||||
{
|
{
|
||||||
TX[TXCurrent]->Address = (uint64_t)Data->NetworkCallback.Send.Data;
|
TX[TXCurrent]->Address = (uint64_t)Data->NetworkCallback.Send.Data;
|
||||||
@ -532,3 +516,22 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
WriteCMD(REG::IMASK, 0x1);
|
||||||
|
uint32_t status = ReadCMD(0xC0);
|
||||||
|
UNUSED(status);
|
||||||
|
|
||||||
|
while ((RX[RXCurrent]->Status & 0x1))
|
||||||
|
{
|
||||||
|
uint8_t *Data = (uint8_t *)RX[RXCurrent]->Address;
|
||||||
|
uint16_t DataLength = RX[RXCurrent]->Length;
|
||||||
|
KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, Data, DataLength);
|
||||||
|
RX[RXCurrent]->Status = 0;
|
||||||
|
uint16_t OldRXCurrent = RXCurrent;
|
||||||
|
RXCurrent = (RXCurrent + 1) % E1000_NUM_RX_DESC;
|
||||||
|
WriteCMD(REG::RXDESCTAIL, OldRXCurrent);
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "RTL8139",
|
.Name = "RTL8139",
|
||||||
.Type = FexDriverType_Network,
|
.Type = FexDriverType_Network,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -173,23 +175,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
uint16_t Status = RTLIW(0x3E);
|
|
||||||
UNUSED(Status);
|
|
||||||
|
|
||||||
uint16_t *Data = (uint16_t *)(RXBuffer + CurrentPacket);
|
|
||||||
uint16_t DataLength = *(Data + 1);
|
|
||||||
Data = Data + 2;
|
|
||||||
KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, (uint8_t *)Data, DataLength);
|
|
||||||
CurrentPacket = (CurrentPacket + DataLength + 4 + 3) & (~3);
|
|
||||||
if (CurrentPacket > 8192)
|
|
||||||
CurrentPacket -= 8192;
|
|
||||||
RTLOW(0x38, CurrentPacket - 0x10);
|
|
||||||
|
|
||||||
RTLOW(0x3E, (1 << 0) | (1 << 2));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SendReason:
|
case SendReason:
|
||||||
{
|
{
|
||||||
RTLOL(TSAD[TXCurrent], static_cast<uint32_t>(reinterpret_cast<uint64_t>(Data->NetworkCallback.Send.Data)));
|
RTLOL(TSAD[TXCurrent], static_cast<uint32_t>(reinterpret_cast<uint64_t>(Data->NetworkCallback.Send.Data)));
|
||||||
@ -212,3 +197,21 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
uint16_t Status = RTLIW(0x3E);
|
||||||
|
UNUSED(Status);
|
||||||
|
|
||||||
|
uint16_t *Data = (uint16_t *)(RXBuffer + CurrentPacket);
|
||||||
|
uint16_t DataLength = *(Data + 1);
|
||||||
|
Data = Data + 2;
|
||||||
|
KAPI->Command.Network.ReceivePacket(KAPI->Info.DriverUID, (uint8_t *)Data, DataLength);
|
||||||
|
CurrentPacket = (CurrentPacket + DataLength + 4 + 3) & (~3);
|
||||||
|
if (CurrentPacket > 8192)
|
||||||
|
CurrentPacket -= 8192;
|
||||||
|
RTLOW(0x38, CurrentPacket - 0x10);
|
||||||
|
|
||||||
|
RTLOW(0x3E, (1 << 0) | (1 << 2));
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "RTL8169",
|
.Name = "RTL8169",
|
||||||
.Type = FexDriverType_Network,
|
.Type = FexDriverType_Network,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -84,10 +86,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SendReason:
|
case SendReason:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -106,3 +104,8 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "Virtio Network",
|
.Name = "Virtio Network",
|
||||||
.Type = FexDriverType_Network,
|
.Type = FexDriverType_Network,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -84,10 +86,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
Data->NetworkCallback.Fetch.MAC = MAC.ToHex();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SendReason:
|
case SendReason:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -106,3 +104,8 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "AHCI",
|
.Name = "AHCI",
|
||||||
.Type = FexDriverType_Storage,
|
.Type = FexDriverType_Storage,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_PCI,
|
.Type = BIND_PCI,
|
||||||
.PCI = {
|
.PCI = {
|
||||||
@ -500,3 +502,9 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *)
|
||||||
|
{
|
||||||
|
/* There's no need to do anything here. */
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
extern "C" int DriverEntry(void *Data);
|
extern "C" int DriverEntry(void *Data);
|
||||||
int CallbackHandler(KernelCallback *Data);
|
int CallbackHandler(KernelCallback *Data);
|
||||||
|
int InterruptCallback(CPURegisters *Registers);
|
||||||
|
|
||||||
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
HEAD(FexFormatType_Driver, FexOSType_Fennix, DriverEntry);
|
||||||
|
|
||||||
@ -17,10 +18,11 @@ __attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|||||||
.Name = "ATA",
|
.Name = "ATA",
|
||||||
.Type = FexDriverType_Storage,
|
.Type = FexDriverType_Storage,
|
||||||
.Callback = CallbackHandler,
|
.Callback = CallbackHandler,
|
||||||
|
.InterruptCallback = InterruptCallback,
|
||||||
.Bind = {
|
.Bind = {
|
||||||
.Type = BIND_INTERRUPT,
|
.Type = BIND_INTERRUPT,
|
||||||
.Interrupt = {
|
.Interrupt = {
|
||||||
.Vector = {0xE, 0xF}, // IRQ14, IRQ15
|
.Vector = {14, 15}, // IRQ14, IRQ15
|
||||||
}}}};
|
}}}};
|
||||||
|
|
||||||
KernelAPI *KAPI;
|
KernelAPI *KAPI;
|
||||||
@ -57,18 +59,6 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case InterruptReason:
|
|
||||||
{
|
|
||||||
if (Data->InterruptInfo.Vector == 0xE)
|
|
||||||
{
|
|
||||||
print("IRQ14");
|
|
||||||
}
|
|
||||||
else if (Data->InterruptInfo.Vector == 0xF)
|
|
||||||
{
|
|
||||||
print("IRQ15");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SendReason:
|
case SendReason:
|
||||||
case ReceiveReason:
|
case ReceiveReason:
|
||||||
{
|
{
|
||||||
@ -88,3 +78,16 @@ int CallbackHandler(KernelCallback *Data)
|
|||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InterruptCallback(CPURegisters *Registers)
|
||||||
|
{
|
||||||
|
if (Registers->InterruptNumber == 0xE)
|
||||||
|
{
|
||||||
|
print("IRQ14");
|
||||||
|
}
|
||||||
|
else if (Registers->InterruptNumber == 0xF)
|
||||||
|
{
|
||||||
|
print("IRQ15");
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user