source: atk2-sc3_fl850f1l/arch/v850_gcc/tauj_hw_counter.c@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 10.5 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2014 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2014 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2014 by Spansion LLC, USA
10 * Copyright (C) 2014 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2014 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2014 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2014 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2014 by Witz Corporation, JAPAN
16 *
17 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
18 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
19 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
20 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * スコード中に含まれていること.
23 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
25 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29 * と.
30 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33 * 報告すること.
34 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
37 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
38 * 免責すること.
39 *
40 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
41 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
42 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
43 * 用する者に対して,AUTOSARパートナーになることを求めている.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
47 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
48 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49 * の責任を負わない.
50 *
51 * $Id: tauj_hw_counter.c 154 2015-01-28 11:33:39Z t_ishikawa $
52 */
53
54/*
55 * 以下ハードウェアカウンタプログラムのターゲット依存定義(fl850fx4用)
56 *
57 * 使用するタイマ:
58 * 差分タイマ:目的の時間を設定する時の現在時間(現在値タイマ)
59 * と次の満了時間との相対時間をカウントすることで
60 * 目的の絶対時間に満了したこととする
61 * count mode:count down once
62 *
63 * 現在値タイマ:カウンタ周期分のベースタイマを実現
64 * (絶対時間をカウント)
65 * count mode:continuous count down
66 *
67 * また上記のタイマは32bitのダウンカウンタタイマである
68 *
69 * 制御方針:
70 *
71 * 現在値タイマはユーザ定義カウンタ最大値2倍+1までカウントし,
72 * 周期タイマとして連続カウントダウンして,常に現在時刻を
73 * 取得する.割込み発生する必要がないため,割込みなしモード
74 *
75 * 差分タイマは,満了処理を行うため,割込みありモードで動く
76 * アラームなどの満了点とタイマー1で示した現在時刻の差を
77 * 現在値タイマに設定する
78 *
79 * ポイント:
80 * 満了処理は,現在時刻を影響しないため,現在値タイマを設けている
81 *
82 */
83
84#include "Os.h"
85#include "prc_sil.h"
86#include "target_hw_counter.h"
87
88/*
89 * =begin ハードウェアカウンタのTAUJn依存部
90 */
91/*
92 * ハードウェアカウンタの初期化
93 * n_d : 差分タイマのユニット番号
94 * ch_d : 差分タイマのチャネル
95 * n_c : 現在値タイマのユニット番号
96 * ch_c : 現在値タイマのチャネル
97 */
98static void
99init_hwcounter_tauj(uint8 n_d, uint8 ch_d, uint8 n_c, uint8 ch_c, TickType maxval, TimeType nspertick, TickRefType cycle)
100{
101 uint16 wk;
102 *cycle = maxval;
103
104 /* assert((tauj_id + 1) < TAUJ_MAX); */
105
106 /* 差分タイマ停止処理 */
107 SetTimerStopTAUJ(n_d, ch_d);
108 /* 割込み禁止 */
109 HwcounterDisableInterrupt(TAUJ_INTNO(n_d, ch_d));
110 /* 割込み要求クリア */
111 HwcounterClearInterrupt(TAUJ_INTNO(n_d, ch_d));
112
113 /* 差分タイマのプリスケーラを設定 PCLK/2^0 */
114 wk = sil_reh_mem((void *) TAUJTPS(n_d));
115 wk &= MCU_TAUJ_MASK_CK0;
116 wk |= MCU_TAUJ_CK0_0;
117 sil_wrh_mem((void *) TAUJTPS(n_d), wk);
118
119 /* 現在値タイマのプリスケーラを設定 PCLK/2^0 */
120 wk = sil_reh_mem((void *) TAUJTPS(n_c));
121 wk &= MCU_TAUJ_MASK_CK0;
122 wk |= MCU_TAUJ_CK0_0;
123 sil_wrh_mem((void *) TAUJTPS(n_c), wk);
124
125 /* 差分タイマをインターバルタイマとして設定 */
126 sil_wrh_mem((void *) TAUJCMOR(n_d, ch_d), MCU_TAUJ00_CMOR);
127 sil_wrb_mem((void *) TAUJCMUR(n_d, ch_d), MCU_TAUJ00_CMUR);
128
129 /* 現在値タイマ停止処理 */
130 SetTimerStopTAUJ(n_c, ch_c);
131 /* 割込み禁止 */
132 HwcounterDisableInterrupt(TAUJ_INTNO(n_c, ch_c));
133 /* 割込み要求クリア */
134 HwcounterClearInterrupt(TAUJ_INTNO(n_c, ch_c));
135
136 /* 現在値タイマをインターバルタイマとして設定 */
137 sil_wrh_mem((void *) TAUJCMOR(n_c, ch_c), MCU_TAUJ00_CMOR);
138 sil_wrb_mem((void *) TAUJCMUR(n_c, ch_c), MCU_TAUJ00_CMUR);
139
140 /* タイマカウント周期設定 */
141 sil_wrw_mem((void *) TAUJCDR(n_c, ch_c), maxval);
142}
143/*
144 * ハードウェアカウンタの開始
145 */
146static void
147start_hwcounter_tauj(uint8 n_c, uint8 ch_c)
148{
149 /* 現在値タイマ開始 */
150 SetTimerStartTAUJ(n_c, ch_c);
151}
152
153/*
154 * ハードウェアカウンタの停止
155 * n_d : 差分タイマのユニット番号
156 * ch_d : 差分タイマのチャネル
157 * n_c : 現在値タイマのユニット番号
158 * ch_c : 現在値タイマのチャネル
159 */
160static void
161stop_hwcounter_tauj(uint8 n_d, uint8 ch_d, uint8 n_c, uint8 ch_c)
162{
163 /* 差分タイマの停止 */
164 SetTimerStopTAUJ(n_d, ch_d);
165
166 /* 差分タイマの割込み禁止 */
167 HwcounterDisableInterrupt(TAUJ_INTNO(n_d, ch_d));
168 /* 差分タイマの割込み要求のクリア */
169 HwcounterClearInterrupt(TAUJ_INTNO(n_d, ch_d));
170
171 /* 現在値タイマの停止 */
172 SetTimerStopTAUJ(n_c, ch_c);
173
174 /* 現在値タイマの割込み禁止 */
175 /* HwcounterDisableInterrupt(TAUJ_INTNO(tauj_id + 1)); */
176 /* 現在値タイマの割込み要求のクリア */
177 HwcounterClearInterrupt(TAUJ_INTNO(n_c, ch_c));
178}
179
180/*
181 * ハードウェアカウンタへの満了時間の設定
182 * n_d : 差分タイマのユニット番号
183 * ch_d : 差分タイマのチャネル
184 * n_c : 現在値タイマのユニット番号
185 * ch_c : 現在値タイマのチャネル
186 */
187static void
188set_hwcounter_tauj(uint8 n_d, uint8 ch_d, uint8 n_c, uint8 ch_c, TickType exprtick, TickType maxval)
189{
190 TickType curr_time;
191 TickType value;
192
193 /* 差分タイマの割込み要求のクリア */
194 HwcounterClearInterrupt(TAUJ_INTNO(n_d, ch_d));
195 /* 差分タイマの割込み許可 */
196 HwcounterEnableInterrupt(TAUJ_INTNO(n_d, ch_d));
197
198 /* 現在時刻の取得 */
199 curr_time = GetCurrentTimeTAUJ(n_c, ch_c, maxval);
200
201 /* タイマに設定する値を算出 */
202 if (exprtick >= curr_time) {
203 value = exprtick - curr_time;
204 }
205 else {
206 value = (exprtick - curr_time) + (maxval + 1U);
207 }
208
209 /*
210 * タイマに0x00を設定し,割込み発生後,再度0を設定した場合,2回目の
211 * 0x00設定後の割込みは発生しないので,0x00設定値を0x01に直して設定
212 */
213 if (value == 0x00U) {
214 value = 0x01U;
215 }
216
217 /* 差分タイマのタイマ値設定 */
218 sil_wrw_mem((void *) TAUJCDR(n_d, ch_d), (value));
219
220 /*
221 * カウント開始
222 */
223 SetTimerStartTAUJ(n_d, ch_d);
224}
225
226/*
227 * ハードウェアカウンタの現在時間の取得
228 */
229static TickType
230get_hwcounter_tauj(uint8 n_c, uint8 ch_c, TickType maxval)
231{
232 return(GetCurrentTimeTAUJ(n_c, ch_c, maxval));
233}
234
235/*
236 * ハードウェアカウンタの設定された満了時間の取消
237 */
238static void
239cancel_hwcounter_tauj(uint8 n_d, uint8 ch_d)
240{
241 /* 差分タイマの停止 */
242 SetTimerStopTAUJ(n_d, ch_d);
243}
244
245/*
246 * ハードウェアカウンタの強制割込み要求
247 */
248static void
249trigger_hwcounter_tauj(uint8 n_d, uint8 ch_d)
250{
251 /* 差分タイマ停止 */
252 SetTimerStopTAUJ(n_d, ch_d);
253
254 /* 差分タイマの割込み要求のクリア */
255 HwcounterClearInterrupt(TAUJ_INTNO(n_d, ch_d));
256 /* 差分タイマの割込み許可 */
257 HwcounterEnableInterrupt(TAUJ_INTNO(n_d, ch_d));
258
259 /* 差分タイマカウンターに0x01をセットすることで,すぐ満了 */
260 sil_wrw_mem((void *) TAUJCDR(n_d, ch_d), (1));
261
262 /* 差分タイマ開始 */
263 SetTimerStartTAUJ(n_d, ch_d);
264}
265
266/*
267 * 割込み要求のクリア
268 */
269static void
270int_clear_hwcounter_tauj(uint8 n_d, uint8 ch_d)
271{
272 /* 割込み要求クリア */
273 HwcounterClearInterrupt(TAUJ_INTNO(n_d, ch_d));
274}
275
276/*
277 * 割込み要求のキャンセル
278 * ペンディングされている割込み要求をキャンセル
279 */
280static void
281int_cancel_hwcounter_tauj(uint8 n_d, uint8 ch_d)
282{
283 /* 割込み要求クリア */
284 HwcounterClearInterrupt(TAUJ_INTNO(n_d, ch_d));
285}
286
287/*
288 * ハードウェアカウンタのインクリメント
289 */
290static void
291increment_hwcounter_tauj(uint8 n_d, uint8 ch_d)
292{
293 /* 未サポート */
294 return;
295}
296/*
297 * =end ハードウェアカウンタのTAUJn依存部
298 */
299
300
301/*
302 * =begin MAIN_HW_COUNTERの定義
303 */
304/* カウンタの最大値の2倍+1 */
305static TickType MAIN_HW_COUNTER_maxval;
306
307/*
308 * ハードウェアカウンタの初期化
309 */
310void
311init_hwcounter_MAIN_HW_COUNTER(TickType maxval, TimeType nspertick)
312{
313 init_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID,
314 HWC_CTIM_UNIT, HWC_CTIM_ID,
315 maxval, nspertick, &MAIN_HW_COUNTER_maxval);
316}
317
318/*
319 * ハードウェアカウンタの開始
320 */
321void
322start_hwcounter_MAIN_HW_COUNTER(void)
323{
324 start_hwcounter_tauj(HWC_CTIM_UNIT, HWC_CTIM_ID);
325}
326
327/*
328 * ハードウェアカウンタの停止
329 */
330void
331stop_hwcounter_MAIN_HW_COUNTER(void)
332{
333 stop_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID,
334 HWC_CTIM_UNIT, HWC_CTIM_ID);
335}
336
337/*
338 * ハードウェアカウンタへの満了時間の設定
339 */
340void
341set_hwcounter_MAIN_HW_COUNTER(TickType exprtick)
342{
343 set_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID,
344 HWC_CTIM_UNIT, HWC_CTIM_ID,
345 exprtick, MAIN_HW_COUNTER_maxval);
346}
347
348/*
349 * ハードウェアカウンタの現在時間の取得
350 */
351TickType
352get_hwcounter_MAIN_HW_COUNTER(void)
353{
354 return(get_hwcounter_tauj(HWC_CTIM_UNIT, HWC_CTIM_ID,
355 MAIN_HW_COUNTER_maxval));
356}
357
358/*
359 * ハードウェアカウンタの設定された満了時間の取消
360 */
361void
362cancel_hwcounter_MAIN_HW_COUNTER(void)
363{
364 cancel_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID);
365}
366
367/*
368 * ハードウェアカウンタの強制割込み要求
369 */
370void
371trigger_hwcounter_MAIN_HW_COUNTER(void)
372{
373 trigger_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID);
374}
375
376/*
377 * ハードウェアカウンタの設定された満了時間の取消
378 */
379void
380int_clear_hwcounter_MAIN_HW_COUNTER(void)
381{
382 int_clear_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID);
383}
384
385/*
386 * ハードウェアカウンタの設定された満了時間の取消
387 */
388void
389int_cancel_hwcounter_MAIN_HW_COUNTER(void)
390{
391 int_cancel_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID);
392}
393
394/*
395 * ハードウェアカウンタのインクリメント
396 */
397void
398increment_hwcounter_MAIN_HW_COUNTER(void)
399{
400 increment_hwcounter_tauj(HWC_DTIM_UNIT, HWC_DTIM_ID);
401}
402
403/*
404 * =end MAIN_HW_COUNTERの定義
405 */
Note: See TracBrowser for help on using the repository browser.