OSDN Git Service

Doxygenコメントを追加した。
[uzume/uzume_bfin.git] / uzume_prototype / kernel / config / blackfin / _common_bf537 / 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-BF537用)
46  */
47
48 #include "jsp_kernel.h"
49 #include <sil.h>
50 #include <cdefBF537.h>
51
52
53 /*
54  *  ターゲットシステム依存の初期化
55  */
56 void
57 sys_initialize()
58 {
59
60     /*
61      * スプリアス割り込みハンドラの設定
62      *
63      * cpu_initialize()が行うダミーの割り込みハンドラの設定を上書きする。
64      * アプリケーションが割り込みハンドラを設定すると、以下の設定も上書き
65      * される。
66      */
67     int i;
68
69     for ( i=0; i<DEVICE_INTERRUPT_COUNT+3; i++ )
70         dev_vector[i] = &spurious_int_handler;
71
72     exc_vector = &spurious_exc_handler;
73
74
75     /*
76      *  PLLの設定
77      *
78      */
79     /*
80      *  SSELVAL, CSELVALはboard_config.hにて定義。
81      */
82 #ifndef FORCE_PLL_INITIALIZE
83         // PLLが初期値のままであり、かつ、SDRAMが利用中でなければPLLを初期化する
84      if ( ( *__pPLL_CTL == 0x1400 ) && ( !(*__pEBIU_SDBCTL & 0x0001 /*EBE*/ ) ) )
85 #endif
86      {
87
88         *__pSIC_IWR = 0x00000001; // IWR_ENABLE(0);             // PLLのみIWRを許す
89 #if CSELVAL == 1
90         *__pPLL_DIV = 0x0000 | (SSELVAL);   // CSEL_DIV1
91 #elif CSELVAL == 2
92         *__pPLL_DIV = 0x0010 | (SSELVAL);   // CSEL_DIV2
93 #elif CSELVAL == 4
94         *__pPLL_DIV = 0x0020 | (SSELVAL);   // CSEL_DIV4
95 #elif CSELVAL == 8
96         *__pPLL_DIV = 0x0030 | (SSELVAL);   // CSEL_DIV8
97 #else
98 #error Wrong CSELVAL. Must be one of 1,2,4,8.
99 #endif
100
101         *__pPLL_CTL = MSELVAL << 9;
102
103         asm("cli r0; csync; idle; sti r0;": : :"R0");
104         *__pSIC_IWR = 0xFFFFFFFF; // IWR_ENABLE_ALL;
105     }
106         /*
107          *  UART分周比の設定
108          *
109          *  Logtaskが動作する前にsys_putc()を使うための設定を行う
110          */
111 #define DLAB 0x80
112
113             /* Blackfin 固有の設定。UARTイネーブル */
114         *pUART0_GCTL = 1;
115
116             /* クロックの設定 */
117         *pUART0_LCR |= DLAB;
118         *pUART0_DLL = UART0_DIVISOR & 0xFF ;
119         *pUART0_DLH = UART0_DIVISOR >> 8;
120         *pUART0_LCR &= ~DLAB;
121
122             /* モード設定, パリティ無し 8bit data, 1 stop bit */
123         *pUART0_LCR = 0x03;
124
125             /* 割込み禁止 */
126         *pUART0_IER = 0;
127 }
128
129         // priority_maskは、event順位0..15に応じた
130         // 割り込み要求のビットマップを保持する。
131 unsigned int priority_mask[16]={
132 0x00000000,
133 0x00000000,
134 0x00000000,
135 0x00000000,
136 0x00000000,
137 0x00000000,
138 0x00000000,
139 0x00000007,
140 0x00000018,
141 0x000001E0,
142 0x00007E00,
143 0x00078000,
144 0x1FF80000,
145 0xE0000000,
146 0x00000000,
147 0x00000000
148 };
149
150
151 /*
152 * SIC_IARxを解析して、イベント順位ごとに割り当てられている割り込み
153 * のビットマップを作る。SIC_IARxのフィールド値は優先順位-7なので
154 * その分補正する。
155 */
156 #define INSTALL_PRIORITY    \
157     for ( i=0; i<8; i++ ){ \
158         priority = iar & 0xf;                         /* IARから優先順位を取り出す */ \
159         priority_mask[priority + 7] |= device;        /* 取り出した優先順位に基づきデバイスを登録 */ \
160         device <<= 1;                                 /* 次のデバイス */ \
161         iar >>= 4;                                    /* 次のIARフィールド */ \
162     }
163
164 void make_priority_mask( void )
165 {
166     unsigned int i, priority, device, iar;
167
168
169     /*
170  *  割り込み順位ごとのISRビットマップの作成
171  *  SIC_IARxの設定はこの部分より前に済ませること
172  */
173
174         // priority_maskは、event順位0..15に応じた
175         // 割り込み要求のビットマップを保持する。
176     for ( i=0; i<16; i++ ){
177         priority_mask[i] = 0;
178     }
179
180     device = 1;
181     iar = *__pSIC_IAR0;
182     INSTALL_PRIORITY
183
184     iar = *__pSIC_IAR1;
185     INSTALL_PRIORITY
186
187     iar = *__pSIC_IAR2;
188     INSTALL_PRIORITY
189
190     iar = *__pSIC_IAR3;
191     INSTALL_PRIORITY
192
193 }
194
195
196 /*
197  * 割り込みの許可、禁止
198  *
199  */
200 ER ena_int( INTNO intno )
201 {
202     unsigned int mask;
203
204     if ( intno >= DEVICE_INTERRUPT_COUNT )
205         return ( E_PAR );
206     else {
207         SIL_PRE_LOC;
208
209         mask = 1 << intno;
210         SIL_LOC_INT();          // 管理外割り込みまで禁止する
211         *__pSIC_IMASK |= mask;
212         asm volatile( "ssync;" );
213         SIL_UNL_INT();          // 割り込み再許可
214         return (0);
215     }
216 }
217
218 /*
219  * dis_int()は、この実装ではSIC_IMASKの指定ビットをクリアする。
220  *
221  * しかし、SIC_IMASKのクリアはアプリケーション実行中には危険であり、
222  * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for Blackfin
223  * では、この関数を実装しない。
224  *
225  ER dis_int( INTNO intno )
226 {
227     unsigned int mask;
228
229     if ( intno >= DEVICE_INTERRUPT_COUNT )
230         return ( E_PAR );
231     else {
232         mask = 1 << intno;
233         mask = ~mask;
234         *__pSIC_IMASK &= mask;
235         return (0);
236     }
237 }
238 */
239
240 /*
241  * chg_ims()は、この実装ではSIC_IMASKを変更する。
242  *
243  * しかし、SIC_IMASKのビットのクリアはアプリケーション実行中には危険であり、
244  * Blackfinのマニュアルでも婉曲的に禁止されている。そのため、TOPPERS/JSP for
245  * Blackfinでは、この関数を実装しない。
246  * ER chg_ims( IMS ims )
247 {
248     *__pSIC_IMASK = ims;
249     return( 0 );
250 }
251 */
252
253 extern ER get_ims( IMS * p_ims )
254 {
255     *p_ims = *__pSIC_IMASK;
256     return( 0 );;
257 }
258
259
260 /*
261  *  割り込みをデバイスに割り当てる
262  */
263 void device_dispatcher(  unsigned int priority, unsigned int imask )
264 {
265     unsigned int candidates, device;
266
267     candidates = priority_mask[priority] & *__pSIC_ISR & *__pSIC_IMASK; // 現在のプライオリティに相当する割込み源を特定する
268
269     asm volatile("sti %0;": : "d"(imask) );
270
271     if ( ! candidates ) // 割り込み源が特定できないなら、コア由来である
272     {
273         if ( priority == ik_hardware_err)
274             dev_vector[INHNO_HW_ERROR]();
275         else
276             if ( priority == ik_timer)
277             dev_vector[INHNO_TIMER]();
278         else
279             dev_vector[INHNO_RAISE]();      // ソフトウェア割り込み
280
281     }
282     else
283     {
284         if ( candidates & 0x80000000 )
285             device = 31;
286         else
287         {
288 #ifdef __GNUC__
289     asm ( "r1.L = signbits %1; %0 = r1.L(z);":"=d"(device) :"d"(candidates): "R1"  );
290 #elif defined(__ECC__)
291     asm( "%0 = signbits %1;" : "=l"( device ) : "d"( candidates ) );
292 #else
293 #error "Compiler is not supported"
294 #endif
295             device = 30 - device;       // bit mask is converted to bit number
296         }
297         dev_vector[device]();
298     }
299 }
300
301
302
303 /*
304  *  ターゲットシステムの終了
305  */
306 void
307 sys_exit()
308 {
309     while(1)
310         ;
311 }
312
313 /*
314  *  ターゲットシステムの文字出力
315  */
316 void
317 sys_putc(char c)
318 {
319     if ( c== 0x0A )         /* もし LF ならば */
320         sys_putc( 0x0D );   /* CRを一文字送信 */
321
322     while( !( *pUART0_LSR & (1<<5)) )
323         ;       /* UART0 LSRのTHREが1になるまで待つ。1ならば送信レジスタ空き。*/
324
325     *pUART0_THR = c;    /* 一文字送信 */
326 }
327
328
329