OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / target / dve68k_gcc / target_config.c
1 /*
2  *  TOPPERS/ASP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Advanced Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
9  *              Graduate School of Information Science, Nagoya Univ., JAPAN
10  * 
11  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32  *      免責すること.
33  * 
34  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38  *  の責任を負わない.
39  * 
40  *  @(#) $Id: target_config.c 885 2008-04-11 11:14:50Z hiro $
41  */
42
43 /*
44  *              ターゲット依存モジュール(DVE68K/40用)
45  */
46
47 #include "kernel_impl.h"
48 #include <sil.h>
49
50 /*
51  *  プロセッサ識別のための変数(マルチプロセッサ対応)
52  */
53 uint_t  board_id;                       /* ボードID */
54 void    *board_addr;            /* ローカルメモリの先頭アドレス */
55
56 /*
57  *  ターゲット依存の初期化
58  */
59 void
60 target_initialize(void)
61 {
62         /*
63          *  プロセッサ依存の初期化
64          */
65         prc_initialize();
66
67         /*
68          *  プロセッサ識別のための変数の初期化
69          */
70         board_id = ((uint_t)(sil_rew_mem((void *) TADR_BOARD_REG0)) & 0x1fU);
71         board_addr = (void *)(board_id << 24);
72
73         /*
74          *  割込み関連の初期化
75          *
76          *  割込み属性が設定されているかを判別するための変数を初期化する.
77          *  また,すべての割込みをマスク・クリアし,割込みベクトルを設定す
78          *  る.
79          */
80         dga_write((void *) TADR_DGA_CSR21, 0U);
81         dga_write((void *) TADR_DGA_CSR23, ~0U);
82         dga_write((void *) TADR_DGA_CSR19, (TVEC_G0I << 24) | (TVEC_G1I << 16)
83                                                                                 | (TVEC_SWI << 8) | TVEC_SPRI);
84
85         /*
86          *  アボート割込みの設定(NMI)
87          *
88          *  アボート割込みをエッジトリガ,割込みレベルをNMIに設定し,マスク
89          *  を解除する.
90          */
91         x_config_int(TINTNO_ABT, TA_EDGE, TIRQ_NMI);
92
93         /*
94          *  メモリ領域の設定
95          *
96          *  ローカルメモリのVMEバス上での先頭アドレスとサイズ(16MB)し,ア
97          *  クセスを受け付けるように設定する.また,VMEバスから拡張アドレス
98          *  アクセスを受け付けるようにに設定する.
99          */
100         dga_write((void *) TADR_DGA_CSR4, (uint32_t) board_addr | 0x00ffU);
101         dga_write((void *) TADR_DGA_CSR5, 0x0000012fU);
102
103         /*
104          *  インタフェースレジスタ(IFR)の設定
105          *
106          *  インタフェースレジスタのベースアドレスを設定する.また,インタ
107          *  フェースレジスタ0のサービスリクエストフラグをクリア.インタフェー
108          *  スレジスタ3にボードのID番号を設定.
109          */
110         dga_write((void *) TADR_DGA_CSR3, (board_id << 4) | 0x3U);
111         dga_write((void *) TADR_DGA_IFR0, 0x80000000U);
112         dga_write((void *) TADR_DGA_IFR3, board_id);
113
114         /*
115          *  ラウンドロビンモードに設定(マルチプロセッサ対応)
116          */
117         dga_write((void *) TADR_DGA_CSR1,
118                                                 (dga_read((void *) TADR_DGA_CSR1) & 0xffeffcffU)
119                                                                         | (1U << 20) | ((board_id % 4) << 8));
120 }
121
122 /*
123  *  ターゲット依存の終了処理
124  */
125 void
126 target_exit(void)
127 {
128         /*
129          *  プロセッサ依存の終了処理
130          */
131         prc_terminate();
132
133         /*
134          *  すべての割込みをマスク・クリアする.
135          */
136         dga_write((void *) TADR_DGA_CSR21, 0U);
137         dga_write((void *) TADR_DGA_CSR23, ~0U);
138
139         /*
140          *  開発環境依存の終了処理
141          */
142         dve68k_exit();
143 }
144
145 /*
146  *  システムログの低レベル出力のための文字出力
147  */
148 void
149 target_fput_log(char_t c)
150 {
151         if (c == '\n') {
152                 dve68k_putc('\r');
153         }
154         dve68k_putc(c);
155 }
156
157 /*
158  *  割込み要求ラインの属性の設定
159  *
160  *  ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ
161  *  クしている.cfg_intサービスコールを設ける場合には,エラーを返すよう
162  *  にすべきであろう.
163  */
164 void
165 x_config_int(INTNO intno, ATR intatr, PRI intpri)
166 {
167         uint32_t        bitpat = DGA_INT_BITPAT(intno);
168
169         assert(VALID_INTNO_CFGINT(intno));
170         assert(TIRQ_NMI <= intpri && intpri <= TIRQ_LEVEL1);
171
172         /*
173          *  割込みのマスク
174          *
175          *  割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割
176          *  込み優先度の設定を行うのは危険なため,割込み属性にかかわらず,
177          *  一旦マスクする.
178          */
179         (void) x_disable_int(intno);
180
181         /*
182          *  レベルトリガ/エッジトリガの設定
183          */
184         if ((bitpat & DGA_INT_TRG_CONF) != 0U) {
185                 /*
186                  *  いずれにも設定できる場合
187                  */
188                 if ((intatr & TA_EDGE) != 0U) {
189                         dga_bit_or((void *) TADR_DGA_CSR18, (1U << (24 - (intno))));
190                         x_clear_int(intno);
191                 }
192                 else {
193                         dga_bit_and((void *) TADR_DGA_CSR18, ~(1U << (24 - (intno))));
194                 }
195         }
196         else if ((bitpat & DGA_INT_TRG_EDGE) != 0U) {
197                 /*
198                  *  エッジトリガに固定されている場合
199                  */
200                 assert((intatr & TA_EDGE) != 0U);
201                 x_clear_int(intno);
202         }
203         else {
204                 /*
205                  *  レベルトリガに固定されている場合
206                  */
207                 assert((intatr & TA_EDGE) == 0U);
208         }
209
210         /*
211          *  割込み優先度の設定
212          */
213         dga_set_ilv((void *)(TADR_DGA_CSR24 + (intno - 1) / 8 * 4),
214                                 (uint_t)(((32 - intno) % 8) * 4), (uint_t)(7 + intpri));
215
216         /*
217          *  割込みのマスク解除(必要な場合)
218          */
219         if ((intatr & TA_ENAINT) != 0U) {
220                 (void) x_enable_int(intno);
221         }
222 }