source: atk2-sc3-1.4.0-ntisr/arch/v850_gcc/rh850_f1h.c@ 172

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

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

  • Property svn:executable set to *
File size: 11.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 *
9 * 上記著作権者
10は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21 * 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * の無保証規定を掲載すること.
24 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 * 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27 * と.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35 * 報告すること.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41 * 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43 * å…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
47 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
48 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
49 * 用する者
50に対して,AUTOSARパートナーになることを求めている.
51 *
52 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
53お
54 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
55 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
56 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
57 * の責任を負わない.
58 *
59 * $Id: rh850_f1h.c 164 2015-06-03 01:22:29Z t_ishikawa $
60 */
61#include "kernel_impl.h"
62#include "rh850_f1h.h"
63#include "Os.h"
64#include "prc_sil.h"
65
66/*******************************************************************************************/
67/* Outline : Write protected register */
68/* Argument : Register address */
69/* Register data */
70/* Register No */
71/* Return value : 0: write success / 1: write error */
72/* Description : Write protected register */
73/* */
74/*******************************************************************************************/
75static uint32
76write_protected_reg(uint32 addr, uint32 data, uint8 regno)
77{
78 uint8 wk;
79 const uint32 cmd_reg[24] = {
80 PROTCMD0,PROTCMD1,CLMA0PCMD,CLMA1PCMD,CLMA2PCMD,PROTCMDCLMA,
81 JPPCMD0,PPCMD0,PPCMD1,PPCMD2,PPCMD3,PPCMD8,
82 PPCMD9,PPCMD10,PPCMD11,PPCMD12,PPCMD13,PPCMD18,PPCMD19,PPCMD20,PPCMD21,PPCMD22,
83 PROTCMDCVM,FLMDPCMD};
84 const uint32 s_reg[24] = {
85 PROTS0,PROTS1,CLMA0PS,CLMA1PS,CLMA2PS,PROTSCLMA,
86 JPPROTS0,PPROTS0,PPROTS1,PPROTS2,PPROTS3,PPROTS8,
87 PPROTS9,PPROTS10,PPROTS11,PPROTS12,PPROTS13,PPROTS18,PPROTS19,PPROTS20,PPROTS21,PPROTS22,
88 PROTSCVM,FLMDPS};
89 SIL_PRE_LOC;
90
91 if (regno > 24) {
92 return(UC_INVALIDPARAM);
93 }
94
95 SIL_LOC_INT();
96 sil_wrw_mem((void *) cmd_reg[regno], 0xA5);
97
98 sil_wrw_mem((void *) addr, data);
99 sil_wrw_mem((void *) addr, ~data);
100 sil_wrw_mem((void *) addr, data);
101 SIL_UNL_INT();
102
103 wk = sil_rew_mem((void *) s_reg[regno]);
104 wk &= 0x01;
105
106 return((wk == 0) ? UC_SUCCESS : UC_PROTREGERROR);
107} /* write_protected_reg */
108
109
110/*******************************************************************************************/
111/* Outline : Sub Oscillator enable */
112/* Argument : - */
113/* Return value : 0: successfly set / 1: set error */
114/* Description : Sub Oscillator register setting */
115/* */
116/*******************************************************************************************/
117uint32
118EnableSubOSC(void)
119{
120 /* stop SubOSC */
121 if (write_protected_reg(SOSCE, 0x00, PNO_CtrlProt0) != UC_SUCCESS) return(UC_ERROR);
122
123 /* Wait inactive */
124 while (((sil_rew_mem((void *) SOSCS)) & CLK_S_CLKEN) != 0) {}
125
126 /* start SubOSC */
127 if (write_protected_reg(SOSCE, 0x01, PNO_CtrlProt0) != UC_SUCCESS) return(UC_ERROR);
128
129 /* Wait stabilization */
130 while (((sil_rew_mem((void *) SOSCS)) & CLK_S_CLKEN) == 0) {}
131
132 return(UC_SUCCESS);
133} /* EnableSubOSC */
134
135/*******************************************************************************************/
136/* Outline : Main Oscillator enable */
137/* Argument : Main Cscillator frequency(Hz) */
138/* Return value : 0: successfly set / 1: set error */
139/* Description : Main Oscillator register setting */
140/* */
141/*******************************************************************************************/
142uint32
143EnableMainOSC(uint32 clk_in)
144{
145 uint8 ampsel;
146
147 /* stop MainOSC */
148 if (write_protected_reg(MOSCE, 0x02, PNO_CtrlProt0) != UC_SUCCESS) return(UC_ERROR);
149
150 if (clk_in == CLK_MHz(8)) {
151 ampsel = 0x03;
152 } else if (CLK_MHz(8) < clk_in && clk_in <= CLK_MHz(16)) {
153 ampsel = 0x02;
154 } else if (CLK_MHz(16) < clk_in && clk_in <= CLK_MHz(20)) {
155 ampsel = 0x01;
156 } else if (CLK_MHz(20) < clk_in && clk_in <= CLK_MHz(24)) {
157 ampsel = 0x00;
158 } else {
159 return(UC_INVALIDPARAM);
160 }
161
162 /* Wait inactive */
163 while (((sil_rew_mem((void *) MOSCS)) & CLK_S_CLKEN) != 0) {}
164
165 sil_wrw_mem((void *) MOSCC, 0x00 | ampsel); /* Normal stabilization time mode */
166 sil_wrw_mem((void *) MOSCST, 0x00FF); /* stabilization time -> Max */
167
168 /* MainOSC start */
169 if (write_protected_reg(MOSCE, 0x01, PNO_CtrlProt0) != UC_SUCCESS) return(UC_ERROR);
170
171 /* Wait stabilization */
172 while (((sil_rew_mem((void *) MOSCS)) & CLK_S_CLKEN) == 0) {}
173
174 return(UC_SUCCESS);
175} /* EnableMainOSC */
176
177/*******************************************************************************************/
178/* Outline : PLL0 enable */
179/* Argument : none */
180/* Return value : 0: successfly set / 1: set error */
181/* Description : PLL register setting */
182/* */
183/*******************************************************************************************/
184uint32
185EnablePLL0(void)
186{
187 /* stop PLL */
188 if (write_protected_reg(PLL0E, 0x02, PNO_CtrlProt1) != UC_SUCCESS) return(UC_ERROR);
189
190 sil_wrw_mem((void*) PLL0C,
191 (PLL0C_FVV<<29) | (PLL0C_MF<<24) | (PLL0C_ADJ<<20) |
192 (PLL0C_MD<<14) | (PLL0C_SMD<<13) | (PLL0C_M<<11) |
193 (PLL0C_P<<8) | (PLL0C_N));
194
195 /* start PLL */
196 if (write_protected_reg(PLL0E, 0x01, PNO_CtrlProt1) != UC_SUCCESS) return(UC_ERROR);
197
198 /* Wait stabilization */
199 while (((sil_rew_mem((void *) PLL0S)) & CLK_S_CLKEN) == 0) {}
200
201 return(UC_SUCCESS);
202} /* EnablePLL0 */
203
204
205/*******************************************************************************************/
206/* Outline : PLL1 enable */
207/* Argument : none */
208/* Return value : 0: successfly set / 1: set error */
209/* Description : PLL register setting */
210/* */
211/*******************************************************************************************/
212uint32
213EnablePLL1(void)
214{
215 /* stop PLL */
216 if (write_protected_reg(PLL1E, 0x02, PNO_CtrlProt1) != UC_SUCCESS) return(UC_ERROR);
217
218 sil_wrw_mem((void*) PLL1C, (PLL1C_M<<11) | (PLL1C_PA<<8) | PLL1C_N);
219
220 /* start PLL */
221 if (write_protected_reg(PLL1E, 0x01, PNO_CtrlProt1) != UC_SUCCESS) return(UC_ERROR);
222
223 /* Wait stabilization */
224 while (((sil_rew_mem((void *) PLL1S)) & CLK_S_CLKEN) == 0) {}
225
226 return(UC_SUCCESS);
227} /* EnablePLL1 */
228
229/*******************************************************************************************/
230/* Outline : Clock switcher setting */
231/* Argument : Selector Control reginster address */
232/* Selector Status reginster address */
233/* Register No */
234/* Select No */
235/* Divider Control reginster address */
236/* Divider Status reginster address */
237/* divider */
238/* Return value : 0: successfly set / 1: set error */
239/* Description : Select clock source of CKSCLK_mn */
240/* */
241/*******************************************************************************************/
242uint32
243SetClockSelection(uint32 s_control, uint32 s_status, uint8 regno, uint16 sel,
244 uint32 d_control, uint32 d_status, uint8 divider)
245{
246 /* Set Selector */
247 if (write_protected_reg(s_control, sel, regno) != UC_SUCCESS) { return(UC_ERROR);}
248
249 /* Set Divider */
250 if (d_control != 0) {
251 if (write_protected_reg(d_control, divider, regno) != UC_SUCCESS) { return(UC_ERROR);}
252 }
253
254 /* Wait untile enable */
255 while (sil_rew_mem((void *) s_control) != sil_rew_mem((void *) s_status)) {};
256 if (d_control != 0) {
257 while (sil_rew_mem((void *) d_control) != sil_rew_mem((void *) d_status)) {};
258 }
259
260 return(UC_SUCCESS);
261}
262
263void
264raise_ipir(uint8 ch) {
265 if (current_cpuid() == 1) {
266 sil_wrw_mem((void*)IPIC_ADDR(ch), 2);
267 }
268 else {
269 sil_wrw_mem((void*)IPIC_ADDR(ch), 1);
270 }
271}
Note: See TracBrowser for help on using the repository browser.