blob: da62f7842461183ea908a56c85a8b6d5635d3649 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
/// 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)
....
*/
#include "kernel.h"
static uint64_t timer64=0;
static uint8_t timer8=0;
uint16_t timer16=0;
// clock handler
void int_clock_handler()
{
__asm__("pusha");
timer64++;
#ifdef DEBUG
timer8++;
// show point once every 1 second
if(timer8==25)
{
scr_put_string(".");
timer8=0;
}
#endif
timer8++;
if(timer8==25)
{
timer16++;
timer8=0;
}
// todo also the other pic!// TODO
__asm__("mov $0x20, %al");
__asm__("out %al, $0x20");
//
__asm__("popa");
__asm__("leave");
__asm__("iret");
__asm__("popa");
__asm__("leave");
__asm__("iret");
}
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");
scr_put_string_nl("timer: Configured PIT Channel 0 : Mode 2 : 1/25 s.");
}
|