00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id: target_config.c 885 2008-04-11 11:14:50Z hiro $ 00041 */ 00042 00043 /* 00044 * ターゲット依存モジュール(DVE68K/40用) 00045 */ 00046 00047 #include "kernel_impl.h" 00048 #include <sil.h> 00049 00050 /* 00051 * プロセッサ識別のための変数(マルチプロセッサ対応) 00052 */ 00053 uint_t board_id; /* ボードID */ 00054 void *board_addr; /* ローカルメモリの先頭アドレス */ 00055 00056 /* 00057 * ターゲット依存の初期化 00058 */ 00059 void 00060 target_initialize(void) 00061 { 00062 /* 00063 * プロセッサ依存の初期化 00064 */ 00065 prc_initialize(); 00066 00067 /* 00068 * プロセッサ識別のための変数の初期化 00069 */ 00070 board_id = ((uint_t)(sil_rew_mem((void *) TADR_BOARD_REG0)) & 0x1fU); 00071 board_addr = (void *)(board_id << 24); 00072 00073 /* 00074 * 割込み関連の初期化 00075 * 00076 * 割込み属性が設定されているかを判別するための変数を初期化する. 00077 * また,すべての割込みをマスク・クリアし,割込みベクトルを設定す 00078 * る. 00079 */ 00080 dga_write((void *) TADR_DGA_CSR21, 0U); 00081 dga_write((void *) TADR_DGA_CSR23, ~0U); 00082 dga_write((void *) TADR_DGA_CSR19, (TVEC_G0I << 24) | (TVEC_G1I << 16) 00083 | (TVEC_SWI << 8) | TVEC_SPRI); 00084 00085 /* 00086 * アボート割込みの設定(NMI) 00087 * 00088 * アボート割込みをエッジトリガ,割込みレベルをNMIに設定し,マスク 00089 * を解除する. 00090 */ 00091 x_config_int(TINTNO_ABT, TA_EDGE, TIRQ_NMI); 00092 00093 /* 00094 * メモリ領域の設定 00095 * 00096 * ローカルメモリのVMEバス上での先頭アドレスとサイズ(16MB)し,ア 00097 * クセスを受け付けるように設定する.また,VMEバスから拡張アドレス 00098 * アクセスを受け付けるようにに設定する. 00099 */ 00100 dga_write((void *) TADR_DGA_CSR4, (uint32_t) board_addr | 0x00ffU); 00101 dga_write((void *) TADR_DGA_CSR5, 0x0000012fU); 00102 00103 /* 00104 * インタフェースレジスタ(IFR)の設定 00105 * 00106 * インタフェースレジスタのベースアドレスを設定する.また,インタ 00107 * フェースレジスタ0のサービスリクエストフラグをクリア.インタフェー 00108 * スレジスタ3にボードのID番号を設定. 00109 */ 00110 dga_write((void *) TADR_DGA_CSR3, (board_id << 4) | 0x3U); 00111 dga_write((void *) TADR_DGA_IFR0, 0x80000000U); 00112 dga_write((void *) TADR_DGA_IFR3, board_id); 00113 00114 /* 00115 * ラウンドロビンモードに設定(マルチプロセッサ対応) 00116 */ 00117 dga_write((void *) TADR_DGA_CSR1, 00118 (dga_read((void *) TADR_DGA_CSR1) & 0xffeffcffU) 00119 | (1U << 20) | ((board_id % 4) << 8)); 00120 } 00121 00122 /* 00123 * ターゲット依存の終了処理 00124 */ 00125 void 00126 target_exit(void) 00127 { 00128 /* 00129 * プロセッサ依存の終了処理 00130 */ 00131 prc_terminate(); 00132 00133 /* 00134 * すべての割込みをマスク・クリアする. 00135 */ 00136 dga_write((void *) TADR_DGA_CSR21, 0U); 00137 dga_write((void *) TADR_DGA_CSR23, ~0U); 00138 00139 /* 00140 * 開発環境依存の終了処理 00141 */ 00142 dve68k_exit(); 00143 } 00144 00145 /* 00146 * システムログの低レベル出力のための文字出力 00147 */ 00148 void 00149 target_fput_log(char_t c) 00150 { 00151 if (c == '\n') { 00152 dve68k_putc('\r'); 00153 } 00154 dve68k_putc(c); 00155 } 00156 00157 /* 00158 * 割込み要求ラインの属性の設定 00159 * 00160 * ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ 00161 * クしている.cfg_intサービスコールを設ける場合には,エラーを返すよう 00162 * にすべきであろう. 00163 */ 00164 void 00165 x_config_int(INTNO intno, ATR intatr, PRI intpri) 00166 { 00167 uint32_t bitpat = DGA_INT_BITPAT(intno); 00168 00169 assert(VALID_INTNO_CFGINT(intno)); 00170 assert(TIRQ_NMI <= intpri && intpri <= TIRQ_LEVEL1); 00171 00172 /* 00173 * 割込みのマスク 00174 * 00175 * 割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割 00176 * 込み優先度の設定を行うのは危険なため,割込み属性にかかわらず, 00177 * 一旦マスクする. 00178 */ 00179 (void) x_disable_int(intno); 00180 00181 /* 00182 * レベルトリガ/エッジトリガの設定 00183 */ 00184 if ((bitpat & DGA_INT_TRG_CONF) != 0U) { 00185 /* 00186 * いずれにも設定できる場合 00187 */ 00188 if ((intatr & TA_EDGE) != 0U) { 00189 dga_bit_or((void *) TADR_DGA_CSR18, (1U << (24 - (intno)))); 00190 x_clear_int(intno); 00191 } 00192 else { 00193 dga_bit_and((void *) TADR_DGA_CSR18, ~(1U << (24 - (intno)))); 00194 } 00195 } 00196 else if ((bitpat & DGA_INT_TRG_EDGE) != 0U) { 00197 /* 00198 * エッジトリガに固定されている場合 00199 */ 00200 assert((intatr & TA_EDGE) != 0U); 00201 x_clear_int(intno); 00202 } 00203 else { 00204 /* 00205 * レベルトリガに固定されている場合 00206 */ 00207 assert((intatr & TA_EDGE) == 0U); 00208 } 00209 00210 /* 00211 * 割込み優先度の設定 00212 */ 00213 dga_set_ilv((void *)(TADR_DGA_CSR24 + (intno - 1) / 8 * 4), 00214 (uint_t)(((32 - intno) % 8) * 4), (uint_t)(7 + intpri)); 00215 00216 /* 00217 * 割込みのマスク解除(必要な場合) 00218 */ 00219 if ((intatr & TA_ENAINT) != 0U) { 00220 (void) x_enable_int(intno); 00221 } 00222 }
Copyright © 2008 by Kijineko Inc.