3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * TOPPERS/JSP for Blackfin
11 * Copyright (C) 2004,2006,2006 by Takemasa Nakamura
12 * Copyright (C) 2004 by Ujinosuke
14 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によって公表されている GNU General Public License の Version 2 に記
16 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
45 * ターゲットシステム依存モジュール(ADSP-BF537用)
48 #include "jsp_kernel.h"
50 #include <cdefBF537.h>
63 * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
64 * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
69 for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
70 dev_vector[i] = &spurious_int_handler;
72 exc_vector = &spurious_exc_handler;
80 * SSELVAL, CSELVALはboard_config.hにて定義。
82 #ifndef FORCE_PLL_INITIALIZE
83 // PLLが初期値のままであり、かつ、SDRAMが利用中でなければPLLを初期化する
84 if ( ( *__pPLL_CTL == 0x1400 ) && ( !(*__pEBIU_SDBCTL & 0x0001 /*EBE*/ ) ) )
88 *__pSIC_IWR = 0x00000001; // IWR_ENABLE(0); // PLLのみIWRを許す
90 *__pPLL_DIV = 0x0000 | (SSELVAL); // CSEL_DIV1
92 *__pPLL_DIV = 0x0010 | (SSELVAL); // CSEL_DIV2
94 *__pPLL_DIV = 0x0020 | (SSELVAL); // CSEL_DIV4
96 *__pPLL_DIV = 0x0030 | (SSELVAL); // CSEL_DIV8
98 #error Wrong CSELVAL. Must be one of 1,2,4,8.
101 *__pPLL_CTL = MSELVAL << 9;
103 asm("cli r0; csync; idle; sti r0;": : :"R0");
104 *__pSIC_IWR = 0xFFFFFFFF; // IWR_ENABLE_ALL;
109 * Logtaskが動作する前にsys_putc()を使うための設定を行う
113 /* Blackfin 固有の設定。UARTイネーブル */
118 *pUART0_DLL = UART0_DIVISOR & 0xFF ;
119 *pUART0_DLH = UART0_DIVISOR >> 8;
120 *pUART0_LCR &= ~DLAB;
122 /* モード設定, パリティ無し 8bit data, 1 stop bit */
129 // priority_maskは、event順位0..15に応じた
130 // 割り込み要求のビットマップを保持する。
131 unsigned int priority_mask[16]={
152 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
153 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
156 #define INSTALL_PRIORITY \
157 for ( i=0; i<8; i++ ){ \
158 priority = iar & 0xf; /* IARから優先順位を取り出す */ \
159 priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \
160 device <<= 1; /* 次のデバイス */ \
161 iar >>= 4; /* 次のIARフィールド */ \
164 void make_priority_mask( void )
166 unsigned int i, priority, device, iar;
170 * 割り込み順位ごとのISRビットマップの作成
171 * SIC_IARxの設定はこの部分より前に済ませること
174 // priority_maskは、event順位0..15に応じた
175 // 割り込み要求のビットマップを保持する。
176 for ( i=0; i<16; i++ ){
177 priority_mask[i] = 0;
200 ER ena_int( INTNO intno )
204 if ( intno >= DEVICE_INTERRUPT_COUNT )
210 SIL_LOC_INT(); // 管理外割り込みまで禁止する
211 *__pSIC_IMASK |= mask;
212 asm volatile( "ssync;" );
213 SIL_UNL_INT(); // 割り込み再許可
219 * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
221 * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
222 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
225 ER dis_int( INTNO intno )
229 if ( intno >= DEVICE_INTERRUPT_COUNT )
234 *__pSIC_IMASK &= mask;
241 * chg_ims()は、この実装ではSIC_IMASKを変更する。
243 * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、
244 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for
245 * Blackfinでは、この関数を実装しない。
246 * ER chg_ims( IMS ims )
253 extern ER get_ims( IMS * p_ims )
255 *p_ims = *__pSIC_IMASK;
263 void device_dispatcher( unsigned int priority, unsigned int imask )
265 unsigned int candidates, device;
267 candidates = priority_mask[priority] & *__pSIC_ISR & *__pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する
269 asm volatile("sti %0;": : "d"(imask) );
271 if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である
273 if ( priority == ik_hardware_err)
274 dev_vector[INHNO_HW_ERROR]();
276 if ( priority == ik_timer)
277 dev_vector[INHNO_TIMER]();
279 dev_vector[INHNO_RAISE](); // ソフトウェア割り込み
284 if ( candidates & 0x80000000 )
289 asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" );
290 #elif defined(__ECC__)
291 asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) );
293 #error "Compiler is not supported"
295 device = 30 - device; // bit mask is converted to bit number
297 dev_vector[device]();
319 if ( c== 0x0A ) /* もし LF ならば */
320 sys_putc( 0x0D ); /* CRを一文字送信 */
322 while( !( *pUART0_LSR & (1<<5)) )
323 ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
325 *pUART0_THR = c; /* 一文字送信 */