source: ssp_aarch64/trunk/arm64_gcc/prc_timer.c@ 353

Last change on this file since 353 was 353, checked in by nmir-saito, 6 years ago

initial import

File size: 5.5 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2013-2015 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2018 by Naoki Saito
8 * Nagoya Municipal Industrial Research Institute, JAPAN
9 *
10 * 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28 * と.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44 * å…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id$
55 */
56
57/*
58 * タイマドライバ(Generic Timer)
59 */
60#include "kernel_impl.h"
61#include "time_event.h"
62#include "target_timer.h"
63#include <sil.h>
64
65/*
66 * 仮想タイマの制御レジスタからの読み出し
67 */
68Inline uint64_t
69clock_read_ctrl(void) {
70 uint64_t cntv_ctrl;
71
72 Asm ("isb; mrs %0, cntv_ctl_el0; isb;"
73 : "=r"(cntv_ctrl) :: "memory");
74
75 return cntv_ctrl;
76}
77
78/*
79 * 仮想タイマの制御レジスタへの書き込み
80 */
81Inline void
82clock_write_ctrl(uint64_t cntv_ctrl) {
83
84 Asm ("isb; msr cntv_ctl_el0, %0; isb;"
85 :: "r"(cntv_ctrl) : "memory");
86 return ;
87}
88
89/*
90 * 仮想タイマ(フリーカウンタ)のカウント値の読み出し
91 */
92Inline uint64_t
93clock_read_counter(void){
94 uint64_t cval;
95
96 Asm ("mrs %0, cntvct_el0" : "=r" (cval));
97
98 return cval;
99}
100
101/*
102 * 仮想タイマの値の読み出し
103 */
104Inline uint64_t
105clock_read_tval(void){
106 uint64_t cntv_tval;
107
108 Asm ("isb; mrs %0, cntv_tval_el0; isb;" : "=r"(cntv_tval)
109 :: "memory");
110 return cntv_tval;
111}
112
113/*
114 * 仮想タイマの値の書き込み
115 */
116Inline void
117clock_write_tval(uint64_t cntv_tval){
118
119 Asm ("isb; msr cntv_tval_el0, %0; isb;" :: "r"(cntv_tval)
120 : "memory");
121}
122
123/*
124 * システムカウンタのクロック周波数の取得
125 */
126Inline uint64_t
127get_timer_freq(void) {
128 uint64_t freq_hz;
129
130 Asm ("mrs %0, cntfrq_el0; isb; " : "=r"(freq_hz) :: "memory");
131 return freq_hz;
132}
133
134/*
135 * タイマの開始
136 */
137static void
138target_timer_start(void)
139{
140 uint64_t cntv_ctl;
141
142 cntv_ctl = clock_read_ctrl();
143 cntv_ctl |= ( CNTV_CTL_ENABLE | CNTV_CTL_START );
144 cntv_ctl &= ~CNTV_CTL_MASK; //mask
145 clock_write_ctrl(cntv_ctl);
146}
147
148/*
149 * タイマの停止
150 */
151static void
152target_timer_stop(void)
153{
154 uint64_t cntv_ctl;
155
156 cntv_ctl = clock_read_ctrl();
157 cntv_ctl &= ~( CNTV_CTL_ENABLE | CNTV_CTL_START );
158 cntv_ctl |= CNTV_CTL_MASK;
159 clock_write_ctrl(cntv_ctl);
160}
161
162/*
163 * タイマ割込み要求のクリア
164 */
165static void
166target_timer_int_clear(void){
167
168 gicd_clear_pending(INTNO_TIMER);
169}
170
171/*
172 * 次のタイマ割込み発生までのオフセット
173 */
174static uint64_t next_tval;
175
176/*
177 * タイマの起動処理
178 */
179void
180target_timer_initialize(intptr_t exinf)
181{
182 target_timer_stop();
183 target_timer_int_clear();
184
185 // 次回のタイマ割込み発生までのオフセット算出
186 next_tval = get_timer_freq() * 1000 / 1000000UL; /* 1ms */
187 clock_write_tval(next_tval);
188
189 target_timer_start();
190}
191
192/*
193 * タイマの停止処理
194 */
195void
196target_timer_terminate(intptr_t exinf)
197{
198 target_timer_stop();
199}
200
201/*
202 * タイマ割込みハンドラ
203 */
204void
205target_timer_handler(void)
206{
207 target_timer_stop();
208 target_timer_int_clear();
209 clock_write_tval(next_tval); // 次回の割込み
210 target_timer_start();
211
212 i_begin_int(INTNO_TIMER);
213 signal_time();
214 i_end_int(INTNO_TIMER);
215}
Note: See TracBrowser for help on using the repository browser.