X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Ftime.c;h=5f7d59271dd33861cad6d6fec712eeae9e48b2f9;hb=54746c855c6e2fe42fde9f93b0ce3f41aeefc2e5;hp=f7d02cc10d3f32b1ac5396a7962156b30487f7d6;hpb=49337730d17bb690fef6fc4429b25b84e6a44479;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/time.c b/Kernel/arch/x86/time.c index f7d02cc1..5f7d5927 100644 --- a/Kernel/arch/x86/time.c +++ b/Kernel/arch/x86/time.c @@ -3,12 +3,13 @@ * Timekeeping * arch/x86/time.c */ -#include +#include // === MACROS === #define NUM_TIMERS 8 #define TIMER_QUANTUM 100 -#define TIMER_FREQ 1024 //Hz +#define TIMER_RATE 13 // (Max: 15, Min: 2) - 15 = 1Hz, 13 = 4Hz, 10 = 1024Hz +#define TIMER_FREQ (32768>>TIMER_RATE) //Hz #define MS_PER_TICK_WHOLE (1000/(TIMER_FREQ)) #define MS_PER_TICK_FRACT ((Uint64)(1000*TIMER_FREQ-((Uint64)MS_PER_TICK_WHOLE)*0x80000000/TIMER_FREQ)) @@ -41,6 +42,14 @@ int Time_Setup() outb(0x70, inb(0x70)&0x7F); // Disable NMIs __asm__ __volatile__ ("cli"); // Disable normal interrupts + // Set IRQ8 firing rate + outb(0x70, 0x0A); // Set the index to register A + val = inb(0x71); // Get the current value of register A + outb(0x70, 0x0A); // Reset index to A + val &= 0xF0; + val |= TIMER_RATE; + outb(0x71, val); // Update the timer rate + // Enable IRQ8 outb(0x70, 0x0B); // Set the index to register B val = inb(0x71); // Read the current value of register B @@ -69,13 +78,19 @@ void Time_Interrupt() giPartMiliseconds -= 0x80000000; } + //Log("giTimestamp = %lli", giTimestamp); + Timer_CallTimers(); + + // Make sure the RTC Fires again + outb(0x70, 0x0C); // Select register C + inb(0x71); // Just throw away contents. } +#if 0 /** * \fn void Time_TimerThread() */ -#if 0 void Time_TimerThread() { Sint64 next; @@ -126,6 +141,9 @@ void Timer_CallTimers() int Time_CreateTimer(int Delta, void *Callback, void *Argument) { int ret; + + if(Callback == NULL) return -1; + for(ret = 0; ret < NUM_TIMERS; ret++) @@ -134,6 +152,8 @@ int Time_CreateTimer(int Delta, void *Callback, void *Argument) gTimers[ret].Callback = Callback; gTimers[ret].FiresAfter = giTimestamp + Delta; gTimers[ret].Argument = Argument; + //Log("Callback = %p", Callback); + //Log("Timer %i fires at %lli", ret, gTimers[ret].FiresAfter); return ret; } return -1; @@ -157,3 +177,9 @@ void Time_Delay(int Delay) Sint64 dest = giTimestamp + Delay; while(dest < giTimestamp) Threads_Yield(); } + +// === EXPORTS === +EXPORT(now); +EXPORT(Time_CreateTimer); +EXPORT(Time_RemoveTimer); +EXPORT(Time_Delay);