source: atk2-sc3_fl850f1l/arch/v850_gcc/v850e2_fx4.c@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 11.9 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2012-2014 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2012-2014 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2012-2013 by Spansion LLC, USA
10 * Copyright (C) 2012-2013 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2012-2014 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2012-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2012-2014 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2012-2014 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2012-2014 by Witz Corporation, JAPAN
16 *
17 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
18 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
19 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
20 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * スコード中に含まれていること.
23 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
25 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29 * と.
30 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33 * 報告すること.
34 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
35 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
37 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
38 * 免責すること.
39 *
40 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
41 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
42 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
43 * 用する者に対して,AUTOSARパートナーになることを求めている.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
47 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
48 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
49 * の責任を負わない.
50 *
51 * $Id: v850e2_fx4.c 117 2014-12-10 03:58:03Z t_ishikawa $
52 */
53#include "kernel_impl.h"
54#include "v850e2_fx4.h"
55#include "Os.h"
56#include "prc_sil.h"
57
58/*******************************************************************************************/
59/* Outline : Write protected register */
60/* Argument : Register address */
61/* Register data */
62/* Register No */
63/* Return value : 0: write success / 1: write error */
64/* Description : Write protected register */
65/* */
66/*******************************************************************************************/
67static uint32
68write_protected_reg(uint32 addr, uint32 data, uint8 regno)
69{
70 uint32 reg_top = 0xff420000;
71 uint32 reg_stat;
72 uint8 wk;
73 SIL_PRE_LOC;
74
75 if (regno > 2) {
76 return(UC_INVALIDPARAM);
77 }
78
79 switch (regno) {
80 case 0:
81 reg_top += 0x4000; /* PROTCMD0 */
82 break;
83 case 1:
84 reg_top += 0x8000; /* PROTCMD1 */
85 break;
86 case 2:
87 reg_top += 0x0300; /* PROTCMD2 */
88 break;
89 }
90 reg_stat = reg_top + 4; /* PROTS0/PROTS1/PROTS2 */
91
92 SIL_LOC_INT();
93 sil_wrb_mem((void *) reg_top, 0xA5);
94
95 sil_wrw_mem((void *) addr, data);
96 sil_wrw_mem((void *) addr, ~data);
97 sil_wrw_mem((void *) addr, data);
98 SIL_UNL_INT();
99
100 wk = sil_reb_mem((void *) reg_stat);
101 wk &= 0x01;
102
103 return((wk == 0) ? UC_SUCCESS : UC_PROTREGERROR);
104} /* write_protected_reg */
105
106/********************************************************************************************/
107/* Function Name : V850Drv_nop */
108/* Input : none */
109/* Output : none */
110/* Description : nop command */
111/********************************************************************************************/
112static void
113V850Drv_nop(void)
114{
115 Asm("nop");
116
117} /* V850Drv_nop */
118
119/*******************************************************************************************/
120/* Outline : Sub Oscillator enable */
121/* Argument : - */
122/* Return value : 0: successfly set / 1: set error */
123/* Description : Sub Oscillator register setting */
124/* */
125/*******************************************************************************************/
126uint32
127EnableSubOSC(void)
128{
129 uint32 ucret;
130
131 sil_wrw_mem((void *) SOSCST, 0x02); /* stabilization time -> 262ms */
132
133 ucret = write_protected_reg(SOSCE, 0x01, PROT_SOSCE); /* SubOSC start */
134
135 if (ucret != UC_SUCCESS) return(ucret);
136
137 while (((sil_rew_mem((void *) SOSCS)) & CLK_S_CLKSTAB) == 0) { /* Wait stabilization */
138 V850Drv_nop();
139 }
140 return(UC_SUCCESS);
141} /* EnableSubOSC */
142
143/*******************************************************************************************/
144/* Outline : Main Oscillator enable */
145/* Argument : Main Cscillator frequency(Hz) */
146/* Return value : 0: successfly set / 1: set error */
147/* Description : Main Oscillator register setting */
148/* */
149/*******************************************************************************************/
150uint32
151EnableMainOSC(uint32 clk_in)
152{
153 uint8 ampsel;
154 uint32 ucret;
155
156 if (clk_in == CLK_MHz(4)) {
157 ampsel = 0x03;
158 }
159 else if (CLK_MHz(4) < clk_in && clk_in <= CLK_MHz(8)) {
160 ampsel = 0x02;
161 }
162 else if (CLK_MHz(8) < clk_in && clk_in <= CLK_MHz(16)) {
163 ampsel = 0x01;
164 }
165 else if (CLK_MHz(16) < clk_in && clk_in <= CLK_MHz(20)) {
166 ampsel = 0x00;
167 }
168 else {
169 return(UC_INVALIDPARAM);
170 }
171
172 sil_wrw_mem((void *) MOSCC, 0x00 | ampsel); /* Normal stabilization time mode */
173 sil_wrw_mem((void *) MOSCST, 0x0F); /* stabilization time -> Max */
174
175 ucret = write_protected_reg(MOSCE, 0x01, PROT_MOSCE); /* MainOSC start */
176
177 if (ucret != UC_SUCCESS) return(ucret);
178
179 while (((sil_rew_mem((void *) MOSCS)) & CLK_S_CLKSTAB) == 0) { /* Wait stabilization */
180 V850Drv_nop();
181 }
182
183 return(UC_SUCCESS);
184} /* EnableMainOSC */
185
186/*******************************************************************************************/
187/* Outline : PLL enable */
188/* Argument : PLL No */
189/* Multiplying rate */
190/* Register data */
191/* Return value : 0: successfly set / 1: set error */
192/* Description : PLL register setting */
193/* */
194/*******************************************************************************************/
195static uint32
196EnablePLL(uint32 pllno, uint8 clk_mul, uint8 p_val)
197{
198 uint32 ucret;
199
200 if (clk_mul > 50)
201 return(UC_INVALIDPARAM);
202
203 sil_wrw_mem((void *) PLLC(pllno), (0x800000 | (p_val << 8) | (clk_mul - 1))); /* PLL Mode, P, Nr */
204 sil_wrw_mem((void *) PLLST(pllno), 0x07); /* stabilization time -> Max */
205
206 ucret = write_protected_reg(PLLE(pllno), 0x01, PROT_PLLE); /* PLL Start */
207
208 if (ucret != UC_SUCCESS)
209 return(ucret);
210
211 while (((sil_rew_mem((void *) PLLS(pllno))) & CLK_S_CLKSTAB) == 0) { /* Wait stabilization */
212 /* V850Drv_nop(); */
213 }
214
215 return(UC_SUCCESS);
216} /* EnablePLL */
217
218/*******************************************************************************************/
219/* Outline : Set PLL frequency */
220/* Argument : PLL select No */
221/* PLL frequency */
222/* PLL frequency */
223/* Return value : 0: successfly set / 1: set error */
224/* Description : Set PLL register from frequency */
225/* */
226/*******************************************************************************************/
227uint32
228SetPLL(uint32 pllno, uint32 mhz, uint32 *outclk)
229{
230 uint32 mul;
231
232 if (mhz < 20) {
233 return(UC_ERROR);
234 }
235 else if (mhz < 50) {
236 mul = (mhz / MAINOSC_CLOCK) * 4;
237 if (mul <= 5 && 51 <= mul)
238 return(UC_ERROR);
239 *outclk = MAINOSC_CLOCK * mul / 4;
240 return(EnablePLL(pllno, mul, PDIV4R0_025TO050));
241 }
242 else if (mhz < 100) {
243 mul = (mhz / MAINOSC_CLOCK) * 2;
244 if (mul <= 5 && 51 <= mul)
245 return(UC_ERROR);
246 *outclk = MAINOSC_CLOCK * mul / 2;
247 return(EnablePLL(pllno, mul, PDIV2R0_050TO100));
248 }
249 else if (mhz < 200) {
250 mul = (mhz / MAINOSC_CLOCK) * 1;
251 if (mul <= 5 && 51 <= mul)
252 return(UC_ERROR);
253 *outclk = MAINOSC_CLOCK * mul / 1;
254 return(EnablePLL(pllno, mul, PDIV1R0_100TO200));
255 }
256 else if (mhz < 400) {
257 mul = (mhz / MAINOSC_CLOCK) / 2;
258 if (mul <= 5 && 51 <= mul)
259 return(UC_ERROR);
260 *outclk = MAINOSC_CLOCK * mul * 2;
261 return(EnablePLL(pllno, mul, PDIV0R5_200TO400));
262 }
263 return(UC_ERROR);
264} /* SetPLL */
265
266/*******************************************************************************************/
267/* Outline : Clock switcher setting */
268/* Argument : Control reginster address */
269/* Status reginster address */
270/* Register No */
271/* Select No */
272/* Return value : 0: successfly set / 1: set error */
273/* Description : Select clock source of CKSCLK_mn */
274/* */
275/*******************************************************************************************/
276uint32
277set_clock_selection(uint32 control, uint32 status, uint8 regno, uint16 sel)
278{
279 uint32 ucret;
280
281 ucret = write_protected_reg(control, sel << 1, regno);
282 if (ucret != UC_SUCCESS) {
283 return(ucret);
284 }
285
286 /* Wait for SelectEnable */
287 while (((sil_rew_mem((void *) status)) & 0x01) == 0) {
288 V850Drv_nop();
289 }
290
291 return(UC_SUCCESS);
292} /* set_clock_selection */
Note: See TracBrowser for help on using the repository browser.