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-BF531/2/3用)
48 #include "jsp_kernel.h"
50 #include <cdefBF533.h>
53 #define SYSCFG_VALUE 0x36
61 // BF531/2/3のアノーマリー対策 rev 0.1, 0.2用
62 Asm( "SYSCFG=%0;" : :"d"(SYSCFG_VALUE) ) ;
67 * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
68 * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
73 for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
74 dev_vector[i] = &spurious_int_handler;
76 exc_vector = &spurious_exc_handler;
83 * 27MHz*22倍=594MHzに設定する(600MHz)
84 * 27MHz*28倍=756MHzに設定する(750MHz)
85 * CSEL = 1; SSEL = 5 (600MHz)
86 * CSEL = 1; SSEL = 6 (750MHz)
88 #ifndef FORCE_PLL_INITIALIZE
89 // PLLが初期値のままであり、かつ、SDRAMが利用中でなければPLLを初期化する
91 if ( ( *__pPLL_CTL == 0x1400 ) && ( !(*__pEBIU_SDBCTL & 0x00000001 /* EBE */ ) ) )
95 *__pSIC_IWR = 1<<0; // PLLのみIWRを許す
101 *__pPLL_DIV = 0x0000 | (SSELVAL); // CCLK_DIV1
103 *__pPLL_DIV = 0x0010 | (SSELVAL); // CCLK_DIV2
105 *__pPLL_DIV = 0x0020 | (SSELVAL); // CCLK_DIV4
107 *__pPLL_DIV = 0x0030 | (SSELVAL); // CCLK_DIV8
109 #error Wrong CSELVAL. Must be one of 1,2,4,8.
112 *__pPLL_CTL = MSELVAL << 9;
114 asm("cli r0; csync; idle; sti r0;": : :"R0");
115 *__pSIC_IWR = 0xFFFFFFFF; // IWR_ENABLE_ALL;
121 * Logtaskが動作する前にsys_putc()を使うための設定を行う
125 /* Blackfin 固有の設定。UARTイネーブル */
130 *pUART_DLL = UART0_DIVISOR & 0xFF ;
131 *pUART_DLH = UART0_DIVISOR >> 8;
134 /* モード設定, パリティ無し 8bit data, 1 stop bit */
144 unsigned int priority_mask[16]={
165 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
166 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
169 #define INSTALL_PRIORITY \
170 for ( i=0; i<8; i++ ){ \
171 priority = iar & 0xf; /* IARから優先順位を取り出す */ \
172 priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \
173 device <<= 1; /* 次のデバイス */ \
174 iar >>= 4; /* 次のIARフィールド */ \
177 void make_priority_mask( void )
179 unsigned int i, priority, device, iar;
183 * 割り込み順位ごとのISRビットマップの作成
184 * SIC_IARxの設定はこの部分より前に済ませること
187 for ( i=0; i<16; i++ ){
188 priority_mask[i] = 0;
208 ER ena_int( INTNO intno )
212 if ( intno >= DEVICE_INTERRUPT_COUNT )
218 SIL_LOC_INT(); // 管理外割り込みまで禁止する
219 *__pSIC_IMASK |= mask;
220 asm volatile( "ssync;" );
221 SIL_UNL_INT(); // 割り込み再許可
226 * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
228 * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
229 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
232 ER dis_int( INTNO intno )
236 if ( intno >= DEVICE_INTERRUPT_COUNT )
241 *__pSIC_IMASK &= mask;
248 * chg_ims()は、この実装ではSIC_IMASKを変更する。
250 * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、
251 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for
252 * Blackfinでは、この関数を実装しない。
254 ER chg_ims( IMS ims )
262 extern ER get_ims( IMS * p_ims )
264 *p_ims = *__pSIC_IMASK;
272 void device_dispatcher( unsigned int priority, unsigned int imask )
274 unsigned int candidates, device;
276 candidates = priority_mask[priority] & *__pSIC_ISR & *__pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する
278 asm volatile("sti %0;": : "d"(imask) );
280 if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である
282 if ( priority == ik_hardware_err)
283 dev_vector[INHNO_HW_ERROR]();
285 if ( priority == ik_timer)
286 dev_vector[INHNO_TIMER]();
288 dev_vector[INHNO_RAISE](); // ソフトウェア割り込み
293 if ( candidates & 0x80000000 )
298 asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" );
299 #elif defined(__ECC__)
300 asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) );
302 #error "Compiler is not supported"
304 device = 30 - device; // bit mask is converted to bit number
306 dev_vector[device]();
327 if ( c== 0x0A ) /* もし LF ならば */
328 sys_putc( 0x0D ); /* CRを一文字送信 */
330 while( !( *pUART_LSR & (1<<5)) )
331 ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
333 *pUART_THR = c; /* 一文字送信 */