added base src
[xv6-db.git] / timer.c
blob8df75a98df474c4d00438ae3a48c17a7752553f6
1 // Intel 8253/8254/82C54 Programmable Interval Timer (PIT).
2 // Only used on uniprocessors;
3 // SMP machines use the local APIC timer.
5 #include "types.h"
6 #include "defs.h"
7 #include "traps.h"
8 #include "x86.h"
10 #define IO_TIMER1 0x040 // 8253 Timer #1
12 // Frequency of all three count-down timers;
13 // (TIMER_FREQ/freq) is the appropriate count
14 // to generate a frequency of freq Hz.
16 #define TIMER_FREQ 1193182
17 #define TIMER_DIV(x) ((TIMER_FREQ+(x)/2)/(x))
19 #define TIMER_MODE (IO_TIMER1 + 3) // timer mode port
20 #define TIMER_SEL0 0x00 // select counter 0
21 #define TIMER_RATEGEN 0x04 // mode 2, rate generator
22 #define TIMER_16BIT 0x30 // r/w counter 16 bits, LSB first
24 void
25 timerinit(void)
27 // Interrupt 100 times/sec.
28 outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT);
29 outb(IO_TIMER1, TIMER_DIV(100) % 256);
30 outb(IO_TIMER1, TIMER_DIV(100) / 256);
31 picenable(IRQ_TIMER);