OSDN Git Service

1d64760a65f552a467d109bd61aec71e6ba624df
[toppersasp4lpc/asp.git] / asp / target / cq_starm_gcc / target_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  * 
11  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32  *      免責すること.
33  * 
34  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38  *  の責任を負わない.
39  * 
40  */
41
42 /*
43  * ターゲット依存モジュール(CQ-STARM用)
44  */
45 #include "kernel_impl.h"
46 #include <sil.h>
47 #include "cq_starm.h"
48 #include "target_serial.h"
49 #include "target_syssvc.h"
50
51
52 /*
53  * GPIOレジスタ操作関数
54  */
55 Inline void set_cr_mode(uint32_t reg, uint_t p, int_t v)
56 {
57         if (p < 8) {
58                 sil_andw((void*)GPIO_CRL(reg), ~CR_MODE_MASK(p));
59                 sil_orw((void*)GPIO_CRL(reg), CR_MODE(p, v));
60         } else if (8 <= p && p < 16) {
61                 sil_andw((void*)GPIO_CRH(reg), ~CR_MODE_MASK(p - 8));
62                 sil_orw((void*)GPIO_CRH(reg), CR_MODE(p - 8, v));
63         }
64 }
65
66 Inline void set_cr_cnf(uint32_t reg, uint_t p, int_t v)
67 {
68         if (p < 8) {
69                 sil_andw((void*)GPIO_CRL(reg), ~CR_CNF_MASK(p));
70                 sil_orw((void*)GPIO_CRL(reg), CR_CNF(p, v));
71         } else if (8 <= p && p < 16) {
72                 sil_andw((void*)GPIO_CRH(reg), ~CR_CNF_MASK(p - 8));
73                 sil_orw((void*)GPIO_CRH(reg), CR_CNF(p - 8, v));
74         }
75 }
76
77 Inline void set_port_pull(uint32_t reg, uint_t p, bool_t up)
78 {
79         if (up) {
80                 sil_wrw_mem((void*)GPIO_BSRR(reg), 0x01 << p);
81         } else {
82                 sil_wrw_mem((void*)GPIO_BRR(reg), 0x01 << p);
83         }
84 }
85
86 /*
87  * ターゲット依存部 初期化処理
88  */
89 void target_initialize(void)
90 {
91         /*
92          *  プロセッサクロック(RCC)の初期化
93          */
94         /* HSEの有効化 */
95         sil_orw((void*)RCC_CR, CR_HSE_ON);
96
97         /* HSE有効待ち */
98         while ((sil_rew_mem((void*)RCC_CR) & CR_HSE_RDY) == 0) ;
99
100         /* FLASH ROMは2wait待ち */
101         sil_andw((void*)FLASH_ACR, ~ACR_LATENCY_MASK);
102         sil_orw((void*)FLASH_ACR, ACR_LATENCY_TWO);
103
104         /* HCLK = SYSCLK, PCLK2 = HCLK, PCLK1 = HCLK/2  */
105         sil_orw((void*)RCC_CFGR, 0x00 | (0x00 << 11) | (0x04 << 8));
106
107         /* PLLCLK = 8MHz x 9 = 72MHz, HSE as PLL clock */
108         sil_orw((void*)RCC_CFGR, 0x07 << 18);
109         sil_orw((void*)RCC_CFGR, CFGR_PLL_SRC);
110
111         /* PLLの有効化 */
112         sil_orw((void*)RCC_CR, CR_PLL_ON);
113
114         /* PLL有効待ち */
115         while ((sil_rew_mem((void*)RCC_CR) & CR_PLL_RDY) == 0) ;
116
117         /* PLLをシステムクロックに選択 */
118         sil_orw((void*)RCC_CFGR, CFGR_SW_PLL);
119
120         /* PLLのシステムクロック選択待ち */
121         while ((sil_rew_mem((void*)RCC_CFGR) & CFGR_SWS_MASK) != (CFGR_SW_PLL << 2)) ;
122
123
124         /*
125          *  プロセッサ依存部の初期化
126          */
127         prc_initialize();
128
129         /*
130          *  ペリフェラルの有効化
131          */
132         sil_orw((void*)RCC_APB2ENR, APB2ENR_USART1_EN | APB2ENR_IOPA_EN |
133                         APB2ENR_IOPC_EN | APB2ENR_AFIO_EN);
134 #if (TNUM_PORT >= 2)
135         sil_orw((void*)RCC_APB2ENR, APB2ENR_IOPD_EN);
136         sil_orw((void*)RCC_APB1ENR, APB1ENR_USART2_EN);
137 #endif
138         /*
139          *  I/Oポートの初期化
140          */
141         /* USART1(RX)  プルアップ */
142         set_cr_mode(GPIOA_BASE, 10, MODE_INPUT);
143         set_cr_cnf(GPIOA_BASE, 10, CNF_IN_FLOATING);
144
145         /* USART1(TX) */
146         set_cr_mode(GPIOA_BASE, 9, MODE_OUTPUT_50MHZ);
147         set_cr_cnf(GPIOA_BASE, 9, CNF_OUT_AF_PP);
148
149 #if (TNUM_PORT >= 2)
150         /* USART2(RX)  プルアップ */
151         set_cr_mode(GPIOD_BASE, 6, MODE_INPUT);
152         set_cr_cnf(GPIOD_BASE, 6, CNF_IN_FLOATING);
153
154         /* USART2(TX) */
155         set_cr_mode(GPIOD_BASE, 5, MODE_OUTPUT_50MHZ);
156         set_cr_cnf(GPIOD_BASE, 5, CNF_OUT_AF_PP);
157
158         /* USART2ポートのリマップ(PD5,6) */
159         sil_orw((void*)AFIO_MAPR, MAPR_USART2_REMAP);
160 #endif
161         /* LEDポート */
162         set_cr_mode(GPIOC_BASE, 6, MODE_OUTPUT_50MHZ);
163         set_cr_cnf(GPIOC_BASE, 6, CNF_OUT_GP_PP);
164
165         /*
166          *  バーナー出力用のシリアル初期化
167          */
168         target_usart_init(SIO_PORTID);
169 }
170
171 /*
172  * ターゲット依存部 終了処理
173  */
174 void target_exit(void)
175 {
176         /* プロセッサ依存部の終了処理 */
177         prc_terminate();
178 }
179
180 /*
181  * システムログの低レベル出力のための文字出力
182  */
183 void target_fput_log(char_t c)
184 {
185         if (c == '\n') {
186                 sio_pol_snd_chr('\r', SIO_PORTID);
187         }
188         sio_pol_snd_chr(c, SIO_PORTID);
189 }