OSDN Git Service

first commit
[toppersjsp4bf/sandbox.git] / sandbox / kernel / config / blackfin / _common_bf533 / chip_config.c
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  *
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *
9  *  TOPPERS/JSP for Blackfin
10  *
11  *  Copyright (C) 2004,2006,2006 by Takemasa Nakamura
12  *  Copyright (C) 2004 by Ujinosuke
13  *
14  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
15  *  によって公表されている GNU General Public License の Version 2 に記
16  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
18  *  利用と呼ぶ)することを無償で許諾する.
19  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21  *      スコード中に含まれていること.
22  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
25  *      の無保証規定を掲載すること.
26  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
28  *      と.
29  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
31  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
32  *        報告すること.
33  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
35  *
36  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
40  *
41  *
42  */
43
44 /*
45  *  ターゲットシステム依存モジュール(ADSP-BF531/2/3用)
46  */
47
48 #include "jsp_kernel.h"
49 #include <sil.h>
50 #include <cdefBF533.h>
51
52
53 #define SYSCFG_VALUE 0x36
54
55 /*
56  *  ターゲットシステム依存の初期化
57  */
58 void
59 sys_initialize()
60 {
61     // BF531/2/3のアノーマリー対策 rev 0.1, 0.2用
62     Asm( "SYSCFG=%0;"  : :"d"(SYSCFG_VALUE) ) ;
63
64     /*
65      * スプリアス割り込みハンドラの設定
66      *
67      * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
68      * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
69      * される。
70      */
71     int i;
72
73     for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
74         dev_vector[i] = &spurious_int_handler;
75
76     exc_vector = &spurious_exc_handler;
77
78     /*
79      *  PLLの設定
80      *
81      */
82     /*
83      *  27MHz*22倍=594MHzに設定する(600MHz)
84      *  27MHz*28倍=756MHzに設定する(750MHz)
85      *  CSEL = 1; SSEL = 5 (600MHz)
86      *  CSEL = 1; SSEL = 6 (750MHz)
87      */
88 #ifndef FORCE_PLL_INITIALIZE
89         // PLLが初期値のままであり、かつ、SDRAMが利用中でなければPLLを初期化する
90     // EBE  0x00000001
91      if ( ( *__pPLL_CTL == 0x1400 ) && ( !(*__pEBIU_SDBCTL & 0x00000001 /* EBE */ ) ) )
92 #endif
93      {
94
95         *__pSIC_IWR = 1<<0;             // PLLのみIWRを許す
96     // CCLK_DIV1            0x0000
97     // CCLK_DIV2            0x0010
98     // CCLK_DIV4            0x0020
99     // CCLK_DIV8            0x0030
100 #if CSELVAL == 1
101         *__pPLL_DIV = 0x0000 | (SSELVAL);   // CCLK_DIV1
102 #elif CSELVAL == 2
103         *__pPLL_DIV = 0x0010 | (SSELVAL);   // CCLK_DIV2
104 #elif CSELVAL == 4
105         *__pPLL_DIV = 0x0020 | (SSELVAL);   // CCLK_DIV4
106 #elif CSELVAL == 8
107         *__pPLL_DIV = 0x0030 | (SSELVAL);   // CCLK_DIV8
108 #else
109 #error Wrong CSELVAL. Must be one of 1,2,4,8.
110 #endif
111
112         *__pPLL_CTL = MSELVAL << 9;
113
114         asm("cli r0; csync; idle; sti r0;": : :"R0");
115         *__pSIC_IWR = 0xFFFFFFFF;   // IWR_ENABLE_ALL;
116     }
117
118         /*
119          *  UART分周比の設定
120          *
121          *  Logtaskが動作する前にsys_putc()を使うための設定を行う
122          */
123 #define DLAB 0x80
124
125             /* Blackfin 固有の設定。UARTイネーブル */
126         *pUART_GCTL = 1;
127
128             /* クロックの設定 */
129         *pUART_LCR |= DLAB;
130         *pUART_DLL = UART0_DIVISOR & 0xFF ;
131         *pUART_DLH = UART0_DIVISOR >> 8;
132         *pUART_LCR &= ~DLAB;
133
134             /* モード設定, パリティ無し 8bit data, 1 stop bit */
135         *pUART_LCR = 0x03;
136
137             /* 割込み禁止 */
138         *pUART_IER = 0;
139
140
141 }
142
143
144 unsigned int priority_mask[16]={
145 0x00000000,
146 0x00000000,
147 0x00000000,
148 0x00000000,
149 0x00000000,
150 0x00000000,
151 0x00000000,
152 0x0000007F,
153 0x00000180,
154 0x00001E00,
155 0x0000E000,
156 0x00070000,
157 0x00180000,
158 0x00E00000,
159 0x00000000,
160 0x00000000
161 };
162
163
164 /*
165 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
166 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
167 * その分補正する。
168 */
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フィールド */ \
175     }
176
177 void make_priority_mask( void )
178 {
179     unsigned int i, priority, device, iar;
180
181
182     /*
183  *  割り込み順位ごとのISRビットマップの作成
184  *  SIC_IARxの設定はこの部分より前に済ませること
185  */
186
187     for ( i=0; i<16; i++ ){
188         priority_mask[i] = 0;
189     }
190
191     device = 1;
192     iar = *__pSIC_IAR0;
193     INSTALL_PRIORITY
194
195     iar = *__pSIC_IAR1;
196     INSTALL_PRIORITY
197
198     iar = *__pSIC_IAR2;
199     INSTALL_PRIORITY
200
201 }
202
203
204 /*
205  * 割り込みの許可、禁止
206  *
207  */
208 ER ena_int( INTNO intno )
209 {
210     unsigned int mask;
211
212     if ( intno >= DEVICE_INTERRUPT_COUNT )
213         return ( E_PAR );
214     else {
215         SIL_PRE_LOC;
216
217         mask = 1 << intno;
218         SIL_LOC_INT();          // 管理外割り込みまで禁止する
219         *__pSIC_IMASK |= mask;
220         asm volatile( "ssync;" );
221         SIL_UNL_INT();          // 割り込み再許可
222         return (0);
223     }
224 }
225 /*
226  * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
227  *
228  * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
229  * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
230  * では、この関数を実装しない。
231  *
232 ER dis_int( INTNO intno )
233 {
234     unsigned int mask;
235
236     if ( intno >= DEVICE_INTERRUPT_COUNT )
237         return ( E_PAR );
238     else {
239         mask = 1 << intno;
240         mask = ~mask;
241         *__pSIC_IMASK &= mask;
242         return (0);
243     }
244 }
245 */
246
247 /*
248  * chg_ims()は、この実装ではSIC_IMASKを変更する。
249  *
250  * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、
251  * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for
252  * Blackfinでは、この関数を実装しない。
253  *
254 ER chg_ims( IMS ims )
255 {
256     *__pSIC_IMASK = ims;
257     return( 0 );
258 }
259 */
260
261
262 extern ER get_ims( IMS * p_ims )
263 {
264     *p_ims = *__pSIC_IMASK;
265     return( 0 );;
266 }
267
268
269 /*
270  *  割り込みをデバイスに割り当てる
271  */
272 void device_dispatcher(  unsigned int priority, unsigned int imask )
273 {
274     unsigned int candidates, device;
275
276     candidates = priority_mask[priority] & *__pSIC_ISR & *__pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する
277
278     asm volatile("sti %0;": : "d"(imask) );
279
280     if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である
281     {
282         if ( priority == ik_hardware_err)
283             dev_vector[INHNO_HW_ERROR]();
284         else
285             if ( priority == ik_timer)
286             dev_vector[INHNO_TIMER]();
287         else
288             dev_vector[INHNO_RAISE]();      // ソフトウェア割り込み
289
290     }
291     else
292     {
293         if ( candidates & 0x80000000 )
294             device = 31;
295         else
296         {
297 #ifdef __GNUC__
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 ) );
301 #else
302 #error "Compiler is not supported"
303 #endif
304             device = 30 - device;       // bit mask is converted to bit number
305         }
306         dev_vector[device]();
307     }
308 }
309
310
311
312 /*
313  *  ターゲットシステムの終了
314  */
315 void
316 sys_exit()
317 {
318     while(1)
319         ;
320 }
321 /*
322  *  ターゲットシステムの文字出力
323  */
324 void
325 sys_putc(char c)
326 {
327     if ( c== 0x0A )         /* もし LF ならば */
328         sys_putc( 0x0D );   /* CRを一文字送信 */
329
330     while( !( *pUART_LSR & (1<<5)) )
331         ;       /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
332
333     *pUART_THR = c; /* 一文字送信 */
334 }
335
336
337