source: atk2-sc3-1.4.0-ntisr/arch/v850_gcc/rh850_f1l.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: 10.4 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_f1l.c 164 2015-06-03 01:22:29Z t_ishikawa $
60 */
61#include "kernel_impl.h"
62#include "rh850_f1l.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[19] = {
80 PROTCMD0, PROTCMD1, CLMA0PCMD, CLMA1PCMD, CLMA2PCMD, PROTCMDCLMA,
81 JPPCMD0, PPCMD0, PPCMD1, PPCMD2, PPCMD8,
82 PPCMD9, PPCMD10, PPCMD11, PPCMD12, PPCMD18, PPCMD20,
83 PROTCMDCVM, FLMDPCMD
84 };
85 const uint32 s_reg[19] = {
86 PROTS0, PROTS1, CLMA0PS, CLMA1PS, CLMA2PS, PROTSCLMA,
87 JPPROTS0, PPROTS0, PPROTS1, PPROTS2, PPROTS8,
88 PPROTS9, PPROTS10, PPROTS11, PPROTS12, PPROTS18, PPROTS20,
89 PROTSCVM, FLMDPS
90 };
91 SIL_PRE_LOC;
92
93 if (regno > 19) {
94 return(UC_INVALIDPARAM);
95 }
96
97 SIL_LOC_INT();
98 sil_wrw_mem((void *) cmd_reg[regno], 0xA5);
99
100 sil_wrw_mem((void *) addr, data);
101 sil_wrw_mem((void *) addr, ~data);
102 sil_wrw_mem((void *) addr, data);
103 SIL_UNL_INT();
104
105 wk = sil_rew_mem((void *) s_reg[regno]);
106 wk &= 0x01;
107
108 return((wk == 0) ? UC_SUCCESS : UC_PROTREGERROR);
109} /* write_protected_reg */
110
111
112/*******************************************************************************************/
113/* Outline : Sub Oscillator enable */
114/* Argument : - */
115/* Return value : 0: successfly set / 1: set error */
116/* Description : Sub Oscillator register setting */
117/* */
118/*******************************************************************************************/
119uint32
120EnableSubOSC(void)
121{
122 /* stop SubOSC */
123 if (write_protected_reg(SOSCE, 0x00, PNO_CtrlProt0) != UC_SUCCESS) {
124 return(UC_ERROR);
125 }
126
127 /* Wait inactive */
128 while (((sil_rew_mem((void *) SOSCS)) & CLK_S_CLKEN) != 0) {
129 }
130
131 /* start SubOSC */
132 if (write_protected_reg(SOSCE, 0x01, PNO_CtrlProt0) != UC_SUCCESS) return(UC_ERROR);
133
134 /* Wait stabilization */
135 while (((sil_rew_mem((void *) SOSCS)) & CLK_S_CLKEN) == 0) {
136 }
137
138 return(UC_SUCCESS);
139} /* EnableSubOSC */
140
141/*******************************************************************************************/
142/* Outline : Main Oscillator enable */
143/* Argument : Main Cscillator frequency(Hz) */
144/* Return value : 0: successfly set / 1: set error */
145/* Description : Main Oscillator register setting */
146/* */
147/*******************************************************************************************/
148uint32
149EnableMainOSC(uint32 clk_in)
150{
151 uint8 ampsel;
152
153 /* stop MainOSC */
154 if (write_protected_reg(MOSCE, 0x02, PNO_CtrlProt0) != UC_SUCCESS) {
155 return(UC_ERROR);
156 }
157
158 if (clk_in == CLK_MHz(8)) {
159 ampsel = 0x03;
160 }
161 else if (CLK_MHz(8) < clk_in && clk_in <= CLK_MHz(16)) {
162 ampsel = 0x02;
163 }
164 else if (CLK_MHz(16) < clk_in && clk_in <= CLK_MHz(20)) {
165 ampsel = 0x01;
166 }
167 else if (CLK_MHz(20) < clk_in && clk_in <= CLK_MHz(24)) {
168 ampsel = 0x00;
169 }
170 else {
171 return(UC_INVALIDPARAM);
172 }
173
174 /* Wait inactive */
175 while (((sil_rew_mem((void *) MOSCS)) & CLK_S_CLKEN) != 0) {
176 }
177
178 sil_wrw_mem((void *) MOSCC, 0x00 | ampsel); /* Normal stabilization time mode */
179 sil_wrw_mem((void *) MOSCST, 0x00FF); /* stabilization time -> Max */
180
181 /* MainOSC start */
182 if (write_protected_reg(MOSCE, 0x01, PNO_CtrlProt0) != UC_SUCCESS) {
183 return(UC_ERROR);
184 }
185
186 /* Wait stabilization */
187 while (((sil_rew_mem((void *) MOSCS)) & CLK_S_CLKEN) == 0) {
188 }
189
190 return(UC_SUCCESS);
191} /* EnableMainOSC */
192
193/*******************************************************************************************/
194/* Outline : PLL enable */
195/* Argument : none */
196/* Return value : 0: successfly set / 1: set error */
197/* Description : PLL register setting */
198/* */
199/*******************************************************************************************/
200uint32
201EnablePLL(void)
202{
203 /* stop PLL */
204 if (write_protected_reg(PLLE, 0x02, PNO_CtrlProt1) != UC_SUCCESS) {
205 return(UC_ERROR);
206 }
207
208 sil_wrw_mem((void *) PLLC, (PLLC_OUTBSEL << 16) | ((PLLC_mr - 1) << 11) | ((PLLC_par >> 1) << 8) | (PLLC_nr - 1));
209
210 /* start PLL */
211 if (write_protected_reg(PLLE, 0x01, PNO_CtrlProt1) != UC_SUCCESS) {
212 return(UC_ERROR);
213 }
214
215 /* Wait stabilization */
216 while (((sil_rew_mem((void *) PLLS)) & CLK_S_CLKEN) == 0) {
217 }
218
219 return(UC_SUCCESS);
220} /* EnablePLL */
221
222/*******************************************************************************************/
223/* Outline : Clock switcher setting */
224/* Argument : Selector Control reginster address */
225/* Selector Status reginster address */
226/* Register No */
227/* Select No */
228/* Divider Control reginster address */
229/* Divider Status reginster address */
230/* divider */
231/* Return value : 0: successfly set / 1: set error */
232/* Description : Select clock source of CKSCLK_mn */
233/* */
234/*******************************************************************************************/
235uint32
236SetClockSelection(uint32 s_control, uint32 s_status, uint8 regno, uint16 sel,
237 uint32 d_control, uint32 d_status, uint8 divider)
238{
239 /* Set Selector */
240 if (write_protected_reg(s_control, sel, regno) != UC_SUCCESS) {
241 return(UC_ERROR);
242 }
243
244 /* Set Divider */
245 if (d_control != 0) {
246 if (write_protected_reg(d_control, divider, regno) != UC_SUCCESS) {
247 return(UC_ERROR);
248 }
249 }
250
251 /* Wait untile enable */
252 while (sil_rew_mem((void *) s_control) != sil_rew_mem((void *) s_status)) {
253 }
254
255 if (d_control != 0) {
256 while (sil_rew_mem((void *) d_control) != sil_rew_mem((void *) d_status)) {
257 }
258 }
259
260 return(UC_SUCCESS);
261}
Note: See TracBrowser for help on using the repository browser.