OSDN Git Service

コメントの修正及びPLL設定ルーチンの記述。
[toppersasp4lpc/asp.git] / asp / arch / arm_m_gcc / lpc1800_gcc / chip_config.c
1 /*
2  *  TOPPERS/ASP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Advanced Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
9  *              Graduate School of Information Science, Nagoya Univ., JAPAN
10  *  Copyright (C) 2010 by TOPPERS/ASP for LPC project
11  *              http://sourceforge.jp/projects/toppersasp4lpc/
12  * 
13  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
14  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
15  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
16  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18  *      スコード中に含まれていること.
19  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
21  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
22  *      の無保証規定を掲載すること.
23  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
25  *      と.
26  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
27  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
28  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
29  *        報告すること.
30  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
31  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
32  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
33  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
34  *      免責すること.
35  * 
36  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
38  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
39  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40  *  の責任を負わない.
41  * 
42  */
43 /**
44  * \addtogroup TOPPERS_CHIP
45  * \{
46  */
47 /**
48  * \file chip_config.c
49  * \brief カーネル実装のチップ依存モジュール(LPC18xx汎用)
50  */
51 #include "kernel_impl.h"
52 #include <sil.h>
53 #include "lpc1800.h"
54 #include "target_serial.h"
55 #include "target_syssvc.h"
56
57
58
59 void chip_initialize(void)
60 {
61
62         /*
63          *  プロセッサ依存部の初期化
64          */
65         core_initialize();
66
67 }
68
69 extern void initPLL1( unsigned int  Hz  )
70 {
71
72     LPC_CGU->BASE_M3_CLK = 0x01000800;          // select IRC as cortex-m4 input, auto hold
73
74             // Set PLL1 frequency to 96MHz
75     LPC_CGU->PLL1_CTRL =
76                         1 << 24 |   // 28:24, clock sel = 1 (IRC)
77                        23 << 16 |   // 23:16, MSEL = 23 ( multiply by (MSEL+1) )
78                         2 << 12 |   // 13:12, NSEL = 2  ( pre division by (NSEL+1) )
79                         1 << 11 |   // 11,    AUTOBLOCK = 1
80                         1 << 8  |   // 9:8,   PSEL = 1 ( post division by (PSEL+1))
81                         1 << 7  |   // 7,     DIRECT=1 ( 1 : bypass PSEL, 0 : use PSEL )
82                         0 << 6  |   // 6,     FBSEL=0  ( 1 : output, 0 : CCO )
83                         0 << 1  |   // 1,     BYPASS=0 ( 1 : input, 0 : CCO )
84                              0;      // 0,     PD = 0   ( 1 : power down, 0 active );
85             // wait for lock
86     while ( ! LPC_CGU->PLL1_STAT )
87        ;
88         // Set PLL1 frequency to desired
89         // PLL reference is 4MHz (12MHz/3). So, the multiplier have to be ( desired freq / 4 )-1
90     LPC_CGU->PLL1_CTRL =
91                 1 << 24 |   // 28:24, clock sel = 1 (IRC)
92                (Hz/4000000-1) << 16 |   // 23:16, MSEL = 47 ( multiply by (MSEL+1) )
93                 2 << 12 |   // 13:12, NSEL = 2  ( pre division by (NSEL+1) )
94                 1 << 11 |   // 11,    AUTOBLOCK = 1
95                 1 << 8  |   // 9:8,   PSEL = 1 ( post division by (PSEL+1))
96                 1 << 7  |   // 7,     DIRECT=1 ( 1 : bypass PSEL, 0 : use PSEL )
97                 0 << 6  |   // 6,     FBSEL=0  ( 1 : output, 0 : CCO )
98                 0 << 1  |   // 1,     BYPASS=0 ( 1 : input, 0 : CCO )
99                      0;      // 0,     PD = 0   ( 1 : power down, 0 active );
100     // wait for lock
101     while ( ! LPC_CGU->PLL1_STAT )
102         ;
103     LPC_CGU->BASE_M3_CLK = 0x09000800;          // select PLL1, auto hold
104
105 }
106
107
108 void chip_exit(void)
109 {
110         /* チップ依存部の終了処理 */
111         core_terminate();
112 }
113
114
115
116 void chip_fput_log(char_t c)
117 {
118         /* Newlineなら、CRも追加する */
119         if (c == '\n') {
120                 sio_pol_snd_chr('\r', LOGTASK_PORTID);
121         }
122         sio_pol_snd_chr(c, LOGTASK_PORTID);
123 }
124
125 //Todo : これが必要かどうか慎重にチェックすること。
126 /**
127  * \brief 低レベルのターゲット依存の初期化
128  * \details
129  * メモリ初期化の前に呼び出される
130  * CCRのSTKALIGNビットをクリアする
131  * このビットはCORTEX-M3コアがR1からR2に変化する過程で"1"に変更された。クリアしないと
132  * TOPPERS/ASPはクラッシュする。
133  */
134 void hardware_init_hook()
135 {
136         SCB->CCR &= ~SCB_CCR_STKALIGN_Msk;
137 }
138
139 /**
140  * \}
141  */
142
143