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-BF518用)
48 #include "jsp_kernel.h"
52 #include <cdefBF518.h> /* gnu tool chain */
53 #elif defined(__ECC__)
54 #include <cdefbf518.h> /* VisualDSP++ */
58 #error "Compiler is not supported"
70 * チップのシリコンリビジョンに応じたPLL_CTLのデフォルト値.
71 * Silicon RevによるPLL_CTLの変化については anomaly および
72 * http://ez.analog.com/thread/14209 を参照。
76 if (( *pDSPID & 0xFF ) < 2 )
84 * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
85 * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
90 for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
91 dev_vector[i] = &spurious_int_handler;
93 exc_vector = &spurious_exc_handler;
100 * SSELVAL, CSELVALはboard_config.hにて定義。FORCE_PLL_INITIALIZEはsys_config.hで
103 #ifndef FORCE_PLL_INITIALIZE
104 // PLLが初期値のままであり、かつ、SDRAMが利用中でなければPLLを初期化する
105 if ( ( *pPLL_CTL == plldefault ) && ( !(*pEBIU_SDBCTL & EBE ) ) )
109 *pSIC_IWR = IWR_ENABLE(0); // PLLのみIWRを許す
111 *pPLL_DIV = CSEL_DIV1 | SET_SSEL(SSELVAL);
113 *pPLL_DIV = CSEL_DIV2 | SET_SSEL(SSELVAL);
115 *pPLL_DIV = CSEL_DIV4 | SET_SSEL(SSELVAL);
117 *pPLL_DIV = CSEL_DIV8 | SET_SSEL(SSELVAL);
119 #error Wrong CSELVAL. Must be one of 1,2,4,8.
122 *pPLL_CTL = MSELVAL << 9;
125 asm("cli r0; csync; idle; sti r0;": : :"R0");
126 *pSIC_IWR = IWR_ENABLE_ALL;
132 * Logtaskが動作する前にsys_putc()を使うための設定を行う。以下の設定は
133 * serial関連のタスクが起動したときに上書きされる。
137 /* Blackfin 固有の設定。UARTイネーブル */
142 *pUART0_DLL = UART0_DIVISOR & 0xFF ;
143 *pUART0_DLH = UART0_DIVISOR >> 8;
144 *pUART0_LCR &= ~DLAB;
146 /* モード設定, パリティ無し 8bit data, 1 stop bit */
152 *pPORTG_MUX &= ~(0x0C00); // bit11:10 だけを0にする
153 *pPORTG_MUX |= 0x01<<10; // bit11:10 だけを01にする
154 *pPORTG_FER |= 0x0600; // PG9,PG10をUART0に割り振る
158 * priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。
159 * priority_mask[]のインデックスはevent順位と同じである。割り込み要因は BF51xでは
160 * 64要因あるので、unsigned long longによる64bit型としている。
162 * device_dispatch()はpriority_mask[]を参照して、現在起きたイベントがどの割り込み
165 * この変数はmake_priority_mask()を呼ぶ度に、実際のIARxの値に応じて上書きされる。
168 unsigned long long int priority_mask[16]={
169 0x0000000000000000ull, /* EMU */
170 0x0000000000000000ull, /* RST */
171 0x0000000000000000ull, /* NMI */
172 0x0000000000000000ull, /* EVX */
173 0x0000000000000000ull,
174 0x0000000000000000ull, /* IVHW */
175 0x0000000000000000ull, /* IVTMR */
176 0x0007800000003FFFull, /* IVG7 */
177 0x000000000000C000ull, /* IVG8 */
178 0x00000000000F0000ull, /* IVG9 */
179 0x00F8000003F00000ull, /* IVG10 */
180 0x00000000FC000000ull, /* IVG11 */
181 0x000003FF00000000ull, /* IVG12 */
182 0x00007C0000000000ull, /* IVG13 */
183 0x0000000000000000ull, /* IVG14 */
184 0x0000000000000000ull /* IVG15 */
189 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
190 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
193 #define INSTALL_PRIORITY \
194 for ( i=0; i<8; i++ ){ \
195 priority = iar & 0xf; /* IARから優先順位を取り出す */ \
196 priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \
197 device <<= 1; /* 次のデバイス */ \
198 iar >>= 4; /* 次のIARフィールド */ \
202 * 割り込み順位ごとのISRビットマップの作成SIC_IARxの設定はこの部分より前に済ませること。
203 * この関数はuITRONのイニシャライザで使用することを想定しており、特に割り込みから保護していない。
205 void make_priority_mask( void )
207 unsigned int i, priority, iar;
208 unsigned long long int device;
212 // priority_maskは、event順位0..15に応じた割り込み要求のビットマップを保持する。
214 for ( i=0; i<16; i++ ){
215 priority_mask[i] = 0;
247 * 割り込みの許可。ADSP-BF51xは効率的な割り込み処理と安全な割り込み禁止を両立する
248 * 手段を持たないため、禁止関数は置いていない。
250 * 不便ではあるが、プログラマに注意を促すためにそうしている。
252 ER ena_int( INTNO intno )
257 if ( intno >= DEVICE_INTERRUPT_COUNT )
263 *pSIC_IMASK0 |= mask;
264 asm volatile( "ssync;" );
268 mask = 1 << (intno-32);
270 *pSIC_IMASK1 |= mask;
271 asm volatile( "ssync;" );
280 * 割り込みマスクの取得。ADSP-BF51xは効率的な割り込み処理と安全な割り込み禁止を両立する
281 * 手段を持たないため、禁止関数は置いていない。
283 * 不便ではあるが、プログラマに注意を促すためにそうしている。
287 extern ER get_ims( IMS * p_ims )
292 *p_ims = (((IMS)*pSIC_IMASK1)<<32 ) | (IMS)*pSIC_IMASK0;
301 * この間数は割り込み発生時に共通割り込みハンドラの一部としてアセンブリ言語から割り込み禁止状態で
302 * 呼ばれる。実割り込みハンドラを割り込み可能にするため、asm文を使って途中で割り込み可能にしている。
303 * 割り込み禁止状態で呼ぶのは割り込み源の特定を安全におこなうためである。
306 void device_dispatcher( unsigned int priority, unsigned int imask )
308 unsigned int device, candidates;
309 unsigned long long int longcandidates, sic_isr, sic_imask;
311 // 以下では SIC_IMASK0,1をまとめて64bitレジスタとして扱っている。SIC_ISRも同じである。
313 sic_isr = (((IMS)*pSIC_ISR1)<<32 ) | (IMS)*pSIC_ISR0;
315 // 現在のプライオリティに相当する割込み源を特定する。
316 longcandidates = priority_mask[priority] & sic_isr & sic_imask;
318 asm volatile("sti %0;": : "d"(imask) );
320 if ( ! longcandidates ) // 割り込み源が特定できないなら、コア由来である
322 if ( priority == ik_hardware_err)
323 dev_vector[INHNO_HW_ERROR]();
325 if ( priority == ik_timer)
326 dev_vector[INHNO_TIMER]();
328 dev_vector[INHNO_RAISE](); // ソフトウェア割り込み
331 else if ( longcandidates & 0xFFFFFFFF00000000ull )
333 candidates = longcandidates >> 32;
334 if ( candidates & 0x80000000 )
339 asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" );
340 #elif defined(__ECC__)
341 asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) );
343 #error "Compiler is not supported"
345 device = 30 - device; // bit mask is converted to bit number
347 dev_vector[device+32]();
351 candidates = (unsigned int)longcandidates;
352 if ( candidates & 0x80000000 )
357 asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" );
358 #elif defined(__ECC__)
359 asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) );
361 #error "Compiler is not supported"
363 device = 30 - device; // bit mask is converted to bit number
365 dev_vector[device]();
372 * ターゲットシステムの終了。TOPPERS/JSPは対話型ROMモニタに戻ることを想定しているが、
383 * ターゲットシステムの文字出力。割り込みが無効な状態でポーリングによる出力を行う。
388 if ( c== 0x0A ) /* もし LF ならば */
389 sys_putc( 0x0D ); /* CRを一文字送信 */
391 while( !( *pUART0_LSR & (1<<5)) )
392 ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
394 *pUART0_THR = c; /* 一文字送信 */