target_config.c

説明を見る。
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.

ホームページ制作