RTEMS  5.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
clock.h
1 /*
2  * Copyright (c) 2018.
3  * Amaan Cheval <amaan.cheval@gmail.com>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #ifndef _AMD64_CLOCK_H
28 #define _AMD64_CLOCK_H
29 
30 #include <rtems/score/basedefs.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #ifndef ASM
37  extern volatile uint32_t *amd64_apic_base;
38  bool has_apic_support(void);
39  void apic_initialize(void);
40  void apic_timer_install_handler(void);
41  uint32_t apic_timer_calibrate(void);
42  void apic_timer_initialize(uint64_t desired_freq_hz);
43  void amd64_clock_driver_initialize(void);
44 #endif
45 
46 /* Number of times to calibrate the APIC timer to average it out */
47 #define APIC_TIMER_NUM_CALIBRATIONS 5
48 /* Default divide value used by APIC timer */
49 #define APIC_TIMER_DIVIDE_VALUE 16
50 /* Value to set in register to pick the divide value above */
51 #define APIC_TIMER_SELECT_DIVIDER 3
52 
53 #define PIT_FREQUENCY 1193180
54 /*
55  * The PIT_FREQUENCY determines how many times the PIT counter is decremented
56  * per second - therefore, we can calculate how many ticks we set based on what
57  * fraction of a second we're okay with spending on calibration
58  */
59 #define PIT_CALIBRATE_DIVIDER 20
60 #define PIT_CALIBRATE_TICKS (PIT_FREQUENCY/PIT_CALIBRATE_DIVIDER)
61 /* Since the PIT only has 2 one-byte registers, the maximum tick value is
62  * limited to 16-bits. We can set the PIT to use a frequency divider if
63  * needed. */
64 RTEMS_STATIC_ASSERT(
65  PIT_CALIBRATE_TICKS <= 0xffff,
66  PIT_CALIBRATE_DIVIDER
67 );
68 
69 /* I/O ports for the PIT */
70 #define PIT_PORT_CHAN0 0x40
71 #define PIT_PORT_CHAN1 0x41
72 #define PIT_PORT_CHAN2 0x42
73 /*
74  * The input to channel 2 can be gated through software, using bit 0 of port
75  * 0x61.
76  */
77 #define PIT_PORT_CHAN2_GATE 0x61
78 #define PIT_CHAN2_TIMER_BIT 1
79 #define PIT_CHAN2_SPEAKER_BIT 2
80 /* The PIT mode/command register */
81 #define PIT_PORT_MCR 0x43
82 
83 /* PIT values to select channels, access, and operating modes */
84 #define PIT_SELECT_CHAN0 0b00000000
85 #define PIT_SELECT_CHAN1 0b01000000
86 #define PIT_SELECT_CHAN2 0b10000000
87 /*
88  * In the lo/hi mode, the low-byte is sent to the data port, followed by the
89  * high-byte; this makes it important that this be an atomic operation.
90  */
91 #define PIT_SELECT_ACCESS_LOHI 0b00110000
92 #define PIT_SELECT_ONE_SHOT_MODE 0b00000010
93 #define PIT_SELECT_BINARY_MODE 0
94 
95 #ifdef __cplusplus
96 }
97 #endif
98 
99 #endif /* _AMD64_CLOCK_H */
Basic Definitions.