xv6

port of xv6 to x86-64
git clone http://frotz.net/git/xv6.git
Log | Files | Refs | README | LICENSE

timer.c (938B)


      1 // Intel 8253/8254/82C54 Programmable Interval Timer (PIT).
      2 // Only used on uniprocessors;
      3 // SMP machines use the local APIC timer.
      4 
      5 #include "types.h"
      6 #include "defs.h"
      7 #include "traps.h"
      8 #include "x86.h"
      9 
     10 #define IO_TIMER1       0x040           // 8253 Timer #1
     11 
     12 // Frequency of all three count-down timers;
     13 // (TIMER_FREQ/freq) is the appropriate count
     14 // to generate a frequency of freq Hz.
     15 
     16 #define TIMER_FREQ      1193182
     17 #define TIMER_DIV(x)    ((TIMER_FREQ+(x)/2)/(x))
     18 
     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
     23 
     24 void
     25 timerinit(void)
     26 {
     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);
     32 }