OSDN Git Service

80b10e0caa87eb83b73848ddc542feb2b2194300
[trx-305dsp/dsp.git] / hirado / kernel / config / blackfin / _common_bf592 / 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-BF592用)
46  */
47
48
49 #include "jsp_kernel.h"
50 #include <sil.h>
51
52 #ifdef __GNUC__
53 #include <cdefBF592-A.h>        /* gnu tool chain */
54 #elif defined(__ECC__)
55 #include <cdefbf592-A.h>                /* VisualDSP++ */
56 #include <ccblkfn.h>
57 #include <sysreg.h>
58 #else
59 #error "Compiler is not supported"
60 #endif
61
62
63     // セルフネストと64bitカウンタをイネーブルにする
64 #define SYSCFG_VALUE 0x36
65
66 /*
67  *  ターゲットシステム依存の初期化
68  */
69 void
70 sys_initialize()
71 {
72     Asm( "SYSCFG=%0;"  : :"d"(SYSCFG_VALUE) ) ;
73
74     /*
75      * スプリアス割り込みハンドラの設定
76      *
77      * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
78      * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
79      * される。
80      */
81     int i;
82
83     for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
84         dev_vector[i] = &spurious_int_handler;
85
86     exc_vector = &spurious_exc_handler;
87
88     /*
89      *  PLLの設定
90      *
91      */
92     /*
93      *  25MHz*16倍=400MHzに設定する
94      *  CSEL = 1; SSEL = 4 (400MHz)
95      */
96
97      {
98
99         *pSIC_IWR = 1<<0;               // PLLのみIWRを許す
100     // CCLK_DIV1            0x0000
101     // CCLK_DIV2            0x0010
102     // CCLK_DIV4            0x0020
103     // CCLK_DIV8            0x0030
104 #if CSELVAL == 1
105         *pPLL_DIV = 0x0000 | (SSELVAL); // CCLK_DIV1
106 #elif CSELVAL == 2
107         *pPLL_DIV = 0x0010 | (SSELVAL); // CCLK_DIV2
108 #elif CSELVAL == 4
109         *pPLL_DIV = 0x0020 | (SSELVAL); // CCLK_DIV4
110 #elif CSELVAL == 8
111         *pPLL_DIV = 0x0030 | (SSELVAL); // CCLK_DIV8
112 #else
113 #error Wrong CSELVAL. Must be one of 1,2,4,8.
114 #endif
115
116         *pPLL_CTL = MSELVAL << 9;
117
118         asm("cli r0; csync; idle; sti r0;": : :"R0");
119         *pSIC_IWR = 0xFFFFFFFF; // IWR_ENABLE_ALL;
120     }
121
122         /*
123          *  UART分周比の設定
124          *
125          *  Logtaskが動作する前にsys_putc()を使うための設定を行う
126          */
127 #define DLAB 0x80
128
129             /* Blackfin 固有の設定。UARTイネーブル */
130         *pUART0_GCTL = 1;
131
132             /* クロックの設定 */
133         *pUART0_LCR |= DLAB;
134         *pUART0_DLL = UART0_DIVISOR & 0xFF ;
135         *pUART0_DLH = UART0_DIVISOR >> 8;
136         *pUART0_LCR &= ~DLAB;
137
138             /* モード設定, パリティ無し 8bit data, 1 stop bit */
139         *pUART0_LCR = 0x03;
140
141             /* 割込み禁止 */
142         *pUART0_IER = 0;
143
144             /* ADSP-BF592のUART0をPINに割り当てる */
145         *pPORTF_MUX &= 0xE7FF;      // bit 11,12を0に
146         *pPORTF_FER |= 0x1800;      // bit 11,12を1に
147
148
149 }
150
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を参照 */
156
157 unsigned int priority_mask[16]={
158 0x00000000,
159 0x00000000,
160 0x00000000,
161 0x00000000,
162 0x00000000,
163 0x00000000,
164 0x00000000,
165 0x1E0000FF,
166 0x00000100,
167 0x00001E00,
168 0x0001E000,
169 0x003E0000,
170 0x01C00000,
171 0xE0000000,
172 0x00000000,
173 0x00000000
174 };
175
176
177 /*
178 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
179 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
180 * その分補正する。
181 */
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フィールド */ \
188     }
189
190 void make_priority_mask( void )
191 {
192     unsigned int i, priority, device, iar;
193
194
195     /*
196  *  割り込み順位ごとのISRビットマップの作成
197  *  SIC_IARxの設定はこの部分より前に済ませること
198  */
199
200     for ( i=0; i<16; i++ ){
201         priority_mask[i] = 0;
202     }
203
204     device = 1;
205     iar = *pSIC_IAR0;
206     INSTALL_PRIORITY
207
208     iar = *pSIC_IAR1;
209     INSTALL_PRIORITY
210
211     iar = *pSIC_IAR2;
212     INSTALL_PRIORITY
213
214 }
215
216
217 /*
218  * 割り込みの許可、禁止
219  *
220  */
221 ER ena_int( INTNO intno )
222 {
223     unsigned int mask;
224
225     if ( intno >= DEVICE_INTERRUPT_COUNT )
226         return ( E_PAR );
227     else {
228         SIL_PRE_LOC;
229
230         mask = 1 << intno;
231         SIL_LOC_INT();          // 管理外割り込みまで禁止する
232         *pSIC_IMASK |= mask;
233         asm volatile( "ssync;" );
234         SIL_UNL_INT();          // 割り込み再許可
235         return (0);
236     }
237 }
238 /*
239  * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
240  *
241  * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
242  * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
243  * では、この関数を実装しない。
244  *
245 ER dis_int( INTNO intno )
246 {
247     unsigned int mask;
248
249     if ( intno >= DEVICE_INTERRUPT_COUNT )
250         return ( E_PAR );
251     else {
252         mask = 1 << intno;
253         mask = ~mask;
254         *pSIC_IMASK &= mask;
255         return (0);
256     }
257 }
258 */
259
260 /*
261  * chg_ims()は、この実装ではSIC_IMASKを変更する。
262  *
263  * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、
264  * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for
265  * Blackfinでは、この関数を実装しない。
266  *
267 ER chg_ims( IMS ims )
268 {
269     *pSIC_IMASK = ims;
270     return( 0 );
271 }
272 */
273
274
275 extern ER get_ims( IMS * p_ims )
276 {
277     *p_ims = *pSIC_IMASK;
278     return( 0 );;
279 }
280
281
282 /*
283  *  割り込みをデバイスに割り当てる
284  */
285 void device_dispatcher(  unsigned int priority, unsigned int imask )
286 {
287     unsigned int candidates, device;
288
289     candidates = priority_mask[priority] & *pSIC_ISR & *pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する
290
291     asm volatile("sti %0;": : "d"(imask) );
292
293     if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である
294     {
295         if ( priority == ik_hardware_err)
296             dev_vector[INHNO_HW_ERROR]();
297         else
298             if ( priority == ik_timer)
299             dev_vector[INHNO_TIMER]();
300         else
301             dev_vector[INHNO_RAISE]();      // ソフトウェア割り込み
302
303     }
304     else
305     {
306         if ( candidates & 0x80000000 )
307             device = 31;
308         else
309         {
310 #ifdef __GNUC__
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 ) );
314 #else
315 #error "Compiler is not supported"
316 #endif
317             device = 30 - device;       // bit mask is converted to bit number
318         }
319         dev_vector[device]();
320     }
321 }
322
323
324
325 /*
326  *  ターゲットシステムの終了
327  */
328 void
329 sys_exit()
330 {
331     while(1)
332         ;
333 }
334 /*
335  *  ターゲットシステムの文字出力
336  */
337 void
338 sys_putc(char c)
339 {
340     if ( c== 0x0A )         /* もし LF ならば */
341         sys_putc( 0x0D );   /* CRを一文字送信 */
342
343     while( !( *pUART0_LSR & (1<<5)) )
344         ;       /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
345
346     *pUART0_THR = c;    /* 一文字送信 */
347 }
348
349
350