version 4.1.0 from http://fpga4u.epfl.ch/wiki/FX2
[fx2fw-sdcc] / fx2 / timer.c
1 /* -*- c++ -*- */\r
2 \r
3 /*-----------------------------------------------------------------------------\r
4 \r
5  * Timer handling for FX2\r
6 \r
7  *-----------------------------------------------------------------------------\r
8 \r
9  * Code taken from USRP2 firmware (GNU Radio Project), version 3.0.2,\r
10 \r
11  * Copyright 2003 Free Software Foundation, Inc.\r
12 \r
13  *-----------------------------------------------------------------------------\r
14 \r
15  * This code is part of usbjtag. usbjtag is free software; you can redistribute\r
16 \r
17  * it and/or modify it under the terms of the GNU General Public License as\r
18 \r
19  * published by the Free Software Foundation; either version 2 of the License,\r
20 \r
21  * or (at your option) any later version. usbjtag is distributed in the hope\r
22 \r
23  * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied\r
24 \r
25  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
26 \r
27  * GNU General Public License for more details.  You should have received a\r
28 \r
29  * copy of the GNU General Public License along with this program in the file\r
30 \r
31  * COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin\r
32 \r
33  * St, Fifth Floor, Boston, MA  02110-1301  USA\r
34 \r
35  *-----------------------------------------------------------------------------\r
36 \r
37  */\r
38 \r
39 \r
40 \r
41 #include "timer.h"\r
42 \r
43 #include "fx2regs.h"\r
44 \r
45 #include "isr.h"\r
46 \r
47 \r
48 \r
49 /*\r
50 \r
51  * Arrange to have isr_tick_handler called at 100 Hz.\r
52 \r
53  *\r
54 \r
55  * The cpu clock is running at 48e6.  The input to the timer\r
56 \r
57  * is 48e6 / 12 = 4e6.\r
58 \r
59  *\r
60 \r
61  * We arrange to have the timer overflow every 40000 clocks == 100 Hz\r
62 \r
63  */\r
64 \r
65 \r
66 \r
67 #define RELOAD_VALUE    ((unsigned short) -40000)\r
68 \r
69 \r
70 \r
71 void \r
72 \r
73 hook_timer_tick (unsigned short isr_tick_handler)\r
74 \r
75 {\r
76 \r
77   ET2 = 0;                      // disable timer 2 interrupts\r
78 \r
79   hook_sv (SV_TIMER_2, isr_tick_handler);\r
80 \r
81   \r
82 \r
83   RCAP2H = RELOAD_VALUE >> 8;   // setup the auto reload value\r
84 \r
85   RCAP2L = RELOAD_VALUE & 0xFF;\r
86 \r
87 \r
88 \r
89   T2CON = 0x04;                 // interrupt on overflow; reload; run\r
90 \r
91   ET2 = 1;                      // enable timer 2 interrupts\r
92 \r
93 }\r
94 \r