source: atk2-sc3-1.4.0-ntisr/arch/v850_gcc/v850e2_fx4.c

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

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