source: ssp_arm_gcc/trunk/target/at91skyeye_gcc/target_config.c@ 92

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

add separate package of SSP kernel for ARM + SkyEye(experimental)

  • Property svn:executable set to *
File size: 8.6 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006 by GJ Business Division RICOH COMPANY,LTD. JAPAN
7 * Copyright (C) 2007-2013 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 * Copyright (C) 2015 by Naoki Saito
10 * Nagoya Municipal Industrial Research Institute, JAPAN
11 *
12 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * @(#) $Id: target_config.c 619 2014-03-18 06:10:27Z nmir-saito $
42 */
43
44/*
45 * チップ依存モジュール(AT91SKYEYE用)
46 */
47
48#include "kernel_impl.h"
49#include <sil.h>
50#include "target_serial.h"
51#include <stdlib.h>
52
53#ifdef TOPPERS_ENABLE_TRACE
54#include <stdio.h>
55static FILE *trace_log_file;
56#endif /* TOPPERS_ENABLE_TRACE */
57
58/*
59 * 各割込みの割込み要求禁止フラグの状態
60 */
61uint32_t idf;
62
63/*
64 * 現在の割込み優先度マスクの値
65 */
66PRI ipm;
67
68/*
69 * 割込み属性が設定されているかを判別するための変数
70 */
71uint32_t bitpat_cfgint;
72
73/*
74 * 文字列の出力(バージョンチェック用)
75 */
76static void
77target_fput_str(char *c) {
78 while(*c != '\0') {
79 at91skyeye_putc(*c++);
80 }
81}
82
83/*
84 * 数字 to 文字変換(4bit用)
85 */
86static char
87num_to_char(uint8_t num) {
88 if (num <= 9) {
89 return ('0' + num);
90 }
91 else {
92 return ('a' + (num - 10));
93 }
94}
95
96/*
97 * バージョン番号の出力
98 */
99static void
100version_put(uint16_t version) {
101 char c;
102
103 c = num_to_char((version >> 12) & 0x0f);
104 at91skyeye_putc(c);
105 at91skyeye_putc('.');
106 c = num_to_char((version >> 8) & 0x0f);
107 at91skyeye_putc(c);
108 c = num_to_char((version >> 4) & 0x0f);
109 at91skyeye_putc(c);
110 at91skyeye_putc('.');
111 c = num_to_char((version) & 0x0f);
112 at91skyeye_putc(c);
113 at91skyeye_putc('.');
114}
115
116/*
117 * バージョンチェック
118 */
119static void
120version_check(void) {
121
122 /* SkyEye のバージョンを確認 */
123 if (sil_rew_mem((void *)(SKYEYE_VER_REG)) != SUPPORT_SKYEYE_VER) {
124 target_fput_str("SkyEye version is mismatch!!");
125 at91skyeye_putc('\n');
126 target_fput_str("Suppoted version is ");
127 version_put(SUPPORT_SKYEYE_VER);
128 at91skyeye_putc('\n');
129 target_fput_str("Tool version is ");
130 version_put(sil_rew_mem((void *)(SKYEYE_VER_REG)));
131 at91skyeye_putc('\n');
132 target_fput_str("Kernel Exit...");
133 at91skyeye_putc('\n');
134 target_exit();
135 }
136
137 /* DeviceManger Extension のバージョンを確認 */
138 if ((sil_rew_mem((void *)(DEVM_VER_REG)) & 0xfff0)
139 != (SUPPORT_DEVM_VER & 0xfff0)) {
140 target_fput_str("DeviceManager Extension version is mismatch!!");
141 at91skyeye_putc('\n');
142 target_fput_str("Suppoted version is ");
143 version_put(SUPPORT_DEVM_VER);
144 at91skyeye_putc('\n');
145 target_fput_str("Tool version is ");
146 version_put((sil_rew_mem((void *)(DEVM_VER_REG)) & 0xfff0));
147 at91skyeye_putc('\n');
148 target_fput_str("Kernel Exit...");
149 at91skyeye_putc('\n');
150 target_exit();
151 }
152}
153
154/*
155 * ターゲット依存の初期化
156 */
157void
158target_initialize(void)
159{
160 /*
161 * target_fput_logが使えるようにUARTを初期化
162 */
163 at91skyeye_init_uart();
164
165 /*
166 * バージョンの確認
167 */
168 version_check();
169
170 /*
171 * ARM依存の初期化
172 */
173 core_initialize();
174
175 /*
176 * 各割込みの割込み要求禁止フラグ全禁止
177 */
178 idf = ~0U;
179
180 /*
181 * 割込み優先度マスクは0
182 */
183 ipm = 0U;
184
185 /*
186 * 全ての割込みをマスク
187 */
188 at91skyeye_disable_int(~0U);
189
190 /*
191 * 全ての割込み要因をクリア
192 */
193 at91skyeye_clear_int(~0U);
194
195 /*
196 * 割込み属性が設定されているかを判別するための変数を初期化する.
197 */
198 bitpat_cfgint = 0U;
199
200#ifdef TOPPERS_ENABLE_TRACE
201 trace_log_file = fopen("kernel_trace.log","w");
202#endif /* TOPPERS_ENABLE_TRACE */
203}
204
205/*
206 * ターゲット依存の終了処理
207 */
208void
209target_exit(void)
210{
211 extern void software_term_hook(void);
212 void (*volatile fp)(void) = software_term_hook;
213
214 /*
215 * software_term_hookへのポインタを,一旦volatile指定のあるfpに代
216 * 入してから使うのは,0との比較が最適化で削除されないようにするた
217 * めである.
218 */
219 if (fp != 0) {
220 (*fp)();
221 }
222
223 /*
224 * すべての割込みをマスクする.
225 */
226 at91skyeye_disable_int(~0U);
227
228 /*
229 * ARM依存の終了処理
230 */
231 core_terminate();
232
233 /*
234 * 開発環境依存の終了処理
235 */
236 at91skyeye_exit();
237
238#ifdef TOPPERS_ENABLE_TRACE
239 fclose(trace_log_file);
240#endif /* TOPPERS_ENABLE_TRACE */
241
242#ifdef TOPPERS_ENABLE_GCOV_PART
243 /*
244 * 一部取得の場合は終了時に .gcda ファイルを出力しないように_exit()を
245 * 呼び出す.
246 */
247 extern void _exit(int) NoReturn;;
248 _exit(0);
249#else /* TOPPERS_ENABLE_GCOV_FULL */
250 exit(0);
251#endif /* TOPPERS_ENABLE_GCOV_PART */
252}
253
254/*
255 * システムログの低レベル出力のための文字出力
256 */
257void
258target_fput_log(char c)
259{
260 if (c == '\n') {
261 at91skyeye_putc('\r');
262 }
263 at91skyeye_putc(c);
264}
265
266#ifdef TOPPERS_ENABLE_TRACE
267/*
268 * トレースログのファイル出力
269 */
270void
271target_fput_log_file(char c)
272{
273 if (c == '\n') {
274 fputc('\r', trace_log_file);
275 }
276 fputc(c, trace_log_file);
277}
278#endif /* TOPPERS_ENABLE_TRACE */
279
280/*
281 * 割込み要求ラインの属性の設定
282 *
283 * ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ
284 * クしている.FI4カーネルに利用する場合には,エラーを返すようにすべき
285 * であろう.
286 *
287 */
288void
289x_config_int(INTNO intno, ATR intatr, PRI intpri)
290{
291 assert(VALID_INTNO(intno));
292 assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);
293
294 /*
295 * 割込み属性が設定されているかを判別するための変数の設定
296 */
297 bitpat_cfgint |= INTNO_BITPAT(intno);
298
299 /*
300 * いったん割込みを禁止する
301 */
302 x_disable_int(intno);
303
304 if ((intatr & TA_ENAINT) != 0U){
305 (void)x_enable_int(intno);
306 }
307}
308
309#ifndef OMIT_DEFAULT_INT_HANDLER
310/*
311 * 未定義の割込みが入った場合の処理
312 */
313void
314default_int_handler(void){
315 syslog_0(LOG_EMERG, "Unregistered Interrupt occurs.");
316 target_exit();
317}
318#endif /* OMIT_DEFAULT_INT_HANDLER */
319
320/*
321 * コンパイラのスタートアップルーチンから呼び出される.
322 * sta_ker()を呼び出してカーネルをスタートさせる.
323 */
324int
325main(void)
326{
327 extern void software_init_hook(void);
328 void (*volatile fp)(void) = software_init_hook;
329
330 /*
331 * software_init_hook を呼出し(0 でない場合)
332 *
333 * ソフトウェア環境(特にライブラリ)に依存して必要な初期化処
334 * 理がある場合は,software_init_hook という関数を用意すれば
335 * よい.
336 * software_term_hook と同様の理由で一旦volatile指定のあるfpに
337 * 代入する.
338 */
339 if (fp != 0) {
340 (*fp)();
341 }
342
343 /*
344 * カーネルを起動する
345 */
346 sta_ker();
347
348 return 1;
349}
350
351#ifdef TOPPERS_ENABLE_GCOV_PART
352/*
353 * GCOV一部取得用ライブラリ
354 */
355
356extern void __gcov_flush();
357
358/*
359 * GCOV初期化関数
360 * カバレッジを.gcdaに出力し,SkyEyeで*.gcdaファイルを削除する.
361 */
362void
363gcov_init(void)
364{
365 SIL_PRE_LOC;
366
367 SIL_LOC_INT();
368 __gcov_flush();
369 sil_wrw_mem((void*)0xFFFE1020, 0);
370 SIL_UNL_INT();
371}
372
373/*
374 * GCOV中断関数
375 * カバレッジを.gcdaに出力し,SkyEyeで*.gcdaファイルを*.gcda.bakへリネームする.
376 */
377void
378gcov_pause(void)
379{
380 SIL_PRE_LOC;
381
382 SIL_LOC_INT();
383 __gcov_flush();
384 sil_wrw_mem((void*)0xFFFE1024, 0);
385 SIL_UNL_INT();
386}
387
388/*
389 * GCOV再開関数
390 * カバレッジを.gcdaに出力し,SkyEyeで*.gcda.bakファイルを*.gcdaへリネームする.
391 */
392void
393gcov_resume(void)
394{
395 SIL_PRE_LOC;
396
397 SIL_LOC_INT();
398 __gcov_flush();
399 sil_wrw_mem((void*)0xFFFE1028, 0);
400 SIL_UNL_INT();
401}
402
403/*
404 * GCOV出力関数
405 * カバレッジを.gcdaに出力する.
406 */
407void
408gcov_dump(void)
409{
410 SIL_PRE_LOC;
411
412 SIL_LOC_INT();
413 __gcov_flush();
414 SIL_UNL_INT();
415}
416#endif /* TOPPERS_ENABLE_GCOV_PART */
Note: See TracBrowser for help on using the repository browser.