X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Farmv7%2Fplatform_tegra2.c;h=d955fbfa32f594da7b356d3481360de0b4e8b63d;hb=bf18000f310e627bf8611bffd9d4d07df7da57f8;hp=0ec90f3095b37dc00de087bdfc9ba0bb3e9d6cbe;hpb=0ab008276f88801b5a5a2ed8e96c285e524ead2c;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/armv7/platform_tegra2.c b/KernelLand/Kernel/arch/armv7/platform_tegra2.c index 0ec90f30..d955fbfa 100644 --- a/KernelLand/Kernel/arch/armv7/platform_tegra2.c +++ b/KernelLand/Kernel/arch/armv7/platform_tegra2.c @@ -6,7 +6,9 @@ * - Tegra2 Core code */ #include +#include // MicroSleep #include "platform_tegra2.h" +#include "include/options.h" // === CONSTANTS === #define TIMER0_INT (0*32+0) // Pri #0 @@ -22,12 +24,16 @@ extern void Timer_CallTimers(void); // === PROTORTYPES === void Timer_IRQHandler_SysClock(int IRQ, void *_unused); +void Timer_IRQHandler_Timer2(int IRQ, void *_unused); +void Timer_IRQHandler_Timer3(int IRQ, void *_unused); +void Timer_IRQHandler_Timer4(int IRQ, void *_unused); void Time_Setup(void); +tTime Time_GetTickOffset(void); // TODO: move to header // === GLOBALS === // - Addresses for the GIC to use -tPAddr gGIC_InterfaceAddr = 0x50040000; -tPAddr gGIC_DistributorAddr = 0x50041000; +tPAddr gGIC_InterfaceAddr = GICI_PADDR; +tPAddr gGIC_DistributorAddr = GICD_PADDR; // - Map of timer registers volatile struct sTimersMap *gpTimersMap; volatile struct sClockResetMap *gpClockResetMap; @@ -43,14 +49,48 @@ void Timer_IRQHandler_SysClock(int IRQ, void *_unused) { giTimestamp += 100; gpTimersMap->TMR1.PCR_0 = (1<<30); + Timer_CallTimers(); +} + +void Timer_IRQHandler_Timer2(int IRQ, void *_unused) +{ + Log_Debug("Tegra2Tme", "Timer 2"); +} +void Timer_IRQHandler_Timer3(int IRQ, void *_unused) +{ + Log_Debug("Tegra2Tme", "Timer 3"); +} +void Timer_IRQHandler_Timer4(int IRQ, void *_unused) +{ + Log_Debug("Tegra2Tme", "Timer 4"); +} + +void Time_MicroSleep(Uint16 Microsecs) +{ + Uint32 cur_ts = gpTimersMap->TIMERUS.CNTR_1US; + Uint32 tgt_ts = cur_ts + Microsecs; + if( tgt_ts < cur_ts ) + while( gpTimersMap->TIMERUS.CNTR_1US > cur_ts ) + ; + while( gpTimersMap->TIMERUS.CNTR_1US < tgt_ts ) + ; +} + +tTime Time_GetTickOffset(void) +{ + return (gpTimersMap->TIMERUS.CNTR_1US/1000) % 100; } void Time_Setup(void) { gpTimersMap = (void*)MM_MapHWPages(0x60005000, 1); gpClockResetMap = (void*)MM_MapHWPages(0x60006000, 1); + // Timer 1 (used for system timekeeping) IRQ_AddHandler(0*32+0, Timer_IRQHandler_SysClock, NULL); + IRQ_AddHandler(0*32+1, Timer_IRQHandler_Timer2, NULL); + IRQ_AddHandler(1*32+9, Timer_IRQHandler_Timer3, NULL); + IRQ_AddHandler(1*32+10, Timer_IRQHandler_Timer4, NULL); gpTimersMap->TMR1.PTV_0 = (1<<31)|(1<<30)|(100*1000-1); // enable, periodic, 100 ms gpTimersMap->TMR1.PCR_0 = (1<<30); Log_Debug("Tegra2Tme", "TMR0.PCR = 0x%x", gpTimersMap->TMR1.PCR_0);