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