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-BF592用)
49 #include "jsp_kernel.h"
53 #include <cdefBF592-A.h> /* gnu tool chain */
54 #elif defined(__ECC__)
55 #include <cdefbf592-A.h> /* VisualDSP++ */
59 #error "Compiler is not supported"
63 // セルフネストと64bitカウンタをイネーブルにする
64 #define SYSCFG_VALUE 0x36
72 Asm( "SYSCFG=%0;" : :"d"(SYSCFG_VALUE) ) ;
77 * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
78 * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
83 for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
84 dev_vector[i] = &spurious_int_handler;
86 exc_vector = &spurious_exc_handler;
93 * 25MHz*16倍=400MHzに設定する
94 * CSEL = 1; SSEL = 4 (400MHz)
99 *pSIC_IWR = 1<<0; // PLLのみIWRを許す
105 *pPLL_DIV = 0x0000 | (SSELVAL); // CCLK_DIV1
107 *pPLL_DIV = 0x0010 | (SSELVAL); // CCLK_DIV2
109 *pPLL_DIV = 0x0020 | (SSELVAL); // CCLK_DIV4
111 *pPLL_DIV = 0x0030 | (SSELVAL); // CCLK_DIV8
113 #error Wrong CSELVAL. Must be one of 1,2,4,8.
116 *pPLL_CTL = MSELVAL << 9;
118 asm("cli r0; csync; idle; sti r0;": : :"R0");
119 *pSIC_IWR = 0xFFFFFFFF; // IWR_ENABLE_ALL;
125 * Logtaskが動作する前にsys_putc()を使うための設定を行う
129 /* Blackfin 固有の設定。UARTイネーブル */
134 *pUART0_DLL = UART0_DIVISOR & 0xFF ;
135 *pUART0_DLH = UART0_DIVISOR >> 8;
136 *pUART0_LCR &= ~DLAB;
138 /* モード設定, パリティ無し 8bit data, 1 stop bit */
144 /* ADSP-BF592のUART0をPINに割り当てる */
145 *pPORTF_MUX &= 0xE7FF; // bit 11,12を0に
146 *pPORTF_FER |= 0x1800; // bit 11,12を1に
151 /* リセット直後のIVGx SIC_IARx対応表。16エントリがIVG0からIVG15を
152 * 表現している。ビットマップはSIC_ISRのビットマップに対応しており、
153 * リセット直後、SIC_IARxによってSICのどの割り込みがどの優先順位に
154 * 対応しているかを表す。 ADSP-BF59x Blackfin Processor Hardware
155 * Referenceの Fig 4-3を参照 */
157 unsigned int priority_mask[16]={
178 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
179 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
182 #define INSTALL_PRIORITY \
183 for ( i=0; i<8; i++ ){ \
184 priority = iar & 0xf; /* IARから優先順位を取り出す */ \
185 priority_mask[priority + 7] |= device; /* 取り出した優先順位に基づきデバイスを登録 */ \
186 device <<= 1; /* 次のデバイス */ \
187 iar >>= 4; /* 次のIARフィールド */ \
190 void make_priority_mask( void )
192 unsigned int i, priority, device, iar;
196 * 割り込み順位ごとのISRビットマップの作成
197 * SIC_IARxの設定はこの部分より前に済ませること
200 for ( i=0; i<16; i++ ){
201 priority_mask[i] = 0;
221 ER ena_int( INTNO intno )
225 if ( intno >= DEVICE_INTERRUPT_COUNT )
231 SIL_LOC_INT(); // 管理外割り込みまで禁止する
233 asm volatile( "ssync;" );
234 SIL_UNL_INT(); // 割り込み再許可
239 * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
241 * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
242 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
245 ER dis_int( INTNO intno )
249 if ( intno >= DEVICE_INTERRUPT_COUNT )
261 * chg_ims()は、この実装ではSIC_IMASKを変更する。
263 * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、
264 * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for
265 * Blackfinでは、この関数を実装しない。
267 ER chg_ims( IMS ims )
275 extern ER get_ims( IMS * p_ims )
277 *p_ims = *pSIC_IMASK;
285 void device_dispatcher( unsigned int priority, unsigned int imask )
287 unsigned int candidates, device;
289 candidates = priority_mask[priority] & *pSIC_ISR & *pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する
291 asm volatile("sti %0;": : "d"(imask) );
293 if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である
295 if ( priority == ik_hardware_err)
296 dev_vector[INHNO_HW_ERROR]();
298 if ( priority == ik_timer)
299 dev_vector[INHNO_TIMER]();
301 dev_vector[INHNO_RAISE](); // ソフトウェア割り込み
306 if ( candidates & 0x80000000 )
311 asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1" );
312 #elif defined(__ECC__)
313 asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) );
315 #error "Compiler is not supported"
317 device = 30 - device; // bit mask is converted to bit number
319 dev_vector[device]();
340 if ( c== 0x0A ) /* もし LF ならば */
341 sys_putc( 0x0D ); /* CRを一文字送信 */
343 while( !( *pUART0_LSR & (1<<5)) )
344 ; /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
346 *pUART0_THR = c; /* 一文字送信 */