/// PIT /// Timer stuff /* http://www.brokenthorn.com/Resources/OSDevPit.html vcc/gnd - voltage/ground D0-D7 - data lines (data bus) wr/rd - writing / reading (system control bus) cs - ignore wr/rd or not (address bus) a0-a1 (address bus) // the three 16bit down counters/timers/channels clk 0-2 (in) gate 0-2 (in) out 0-2 (out) //typical out1 -> pic interrupt on every tick (system timer) out2 - was used for genearting dram memory refresh (Do not use) out3 -> pc speaker gate pins : depend on mode of operation we do have modes 0-5. mode0: counts down to zero , triggers interrupt and waits mode1: mode2: rate generator (sys timer) .... */ #define FOOLOS_MODULE_NAME "timer" #include "timer.h" #include "x86.h" #include "../lib/logger/log.h" // logger facilities //static volatile static uint64_t task_system_clock=0; void timer_init() { // config out timer on channel 0 : mode 2 (sys timer) // http://en.wikipedia.org/wiki/Intel_8253#Control_Word_Register // http://www.brokenthorn.com/Resources/OSDevPit.html // int0 will be triggered ~25 times a second. __asm__("pusha"); __asm__("mov %0, %%dx"::"X" (1193180 / 25)); __asm__("mov $0b00110100, %al"); __asm__("out %al,$0x43"); __asm__("mov %dx,%ax"); __asm__("out %al, $0x40"); __asm__("xchg %ah,%al"); __asm__("out %al, $0x40"); __asm__("popa"); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Configured PIT Channel 0 : Mode 2 : 1/25 s."); } void timer_tick() { task_system_clock++; } uint64_t timer_get_ticks() { return task_system_clock; }