source: asp3_wo_tecs/trunk/arch/arm_gcc/common/gic_kernel_impl.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 7.1 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006-2015 by Embedded and Real-Time Systems Laboratory
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 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51 * の責任を負わない.
52 *
53 * $Id: gic_kernel_impl.c 355 2015-07-25 10:26:02Z ertl-hiro $
54 */
55
56/*
57 * カーネルの割込みコントローラ依存部(GIC用)
58 */
59
60#include "kernel_impl.h"
61#include "interrupt.h"
62#include <sil.h>
63#include "arm.h"
64
65/*
66 * CPUインタフェースの操作
67 */
68
69/*
70 * CPUインタフェースの初期化
71 */
72void
73gicc_initialize(void)
74{
75 /*
76 * CPUインタフェースをディスエーブル
77 */
78 sil_wrw_mem(GICC_CTLR, GICC_CTLR_DISABLE);
79
80 /*
81 * 割込み優å…
82ˆåº¦ãƒžã‚¹ã‚¯ã‚’最低優å…
83ˆåº¦ã«è¨­å®š
84 */
85 gicc_set_priority((GIC_PRI_LEVEL - 1) << GIC_PRI_SHIFT);
86
87 /*
88 * 割込み優å…
89ˆåº¦ã®å…
90¨ãƒ“ット有効に
91 */
92 sil_wrw_mem(GICC_BPR, 0U);
93
94 /*
95 * アクティブな割込みがあれば,EOIによりクリアする
96 */
97 sil_wrw_mem(GICC_EOIR, sil_rew_mem(GICC_IAR));
98
99 /*
100 * CPUインタフェースをイネーブル
101 */
102#ifdef TOPPERS_SAFEG_SECURE
103 sil_wrw_mem(GICC_CTLR, (GICC_CTLR_FIQEN|GICC_CTLR_ENABLEGRP1
104 |GICC_CTLR_ENABLEGRP0));
105#else /* TOPPERS_SAFEG_SECURE */
106 sil_wrw_mem(GICC_CTLR, GICC_CTLR_ENABLE);
107#endif /* TOPPERS_SAFEG_SECURE */
108}
109
110/*
111 * CPUインタフェースの終了処理
112 */
113void
114gicc_terminate(void)
115{
116 sil_wrw_mem(GICC_CTLR, GICC_CTLR_DISABLE);
117}
118
119/*
120 * ディストリビュータの操作
121 */
122
123/*
124 * ディストリビュータの初期化
125 */
126void
127gicd_initialize(void)
128{
129 int i;
130
131 /*
132 * ディストリビュータをディスエーブル
133 */
134 sil_wrw_mem(GICD_CTLR, GICD_CTLR_DISABLE);
135
136#ifdef TOPPERS_SAFEG_SECURE
137 /*
138 * すべての割込みをグループ1(IRQ)に設定
139 */
140 for (i = 0; i < GIC_TNUM_INTNO / 32; i++) {
141 sil_wrw_mem(GICD_IGROUPR(i), 0xffffffffU);
142 }
143#endif /* TOPPERS_SAFEG_SECURE */
144
145 /*
146 * すべての割込みを禁止
147 */
148 for (i = 0; i < GIC_TNUM_INTNO / 32; i++) {
149 sil_wrw_mem(GICD_ICENABLER(i), 0xffffffffU);
150 }
151
152 /*
153 * すべての割込みペンディングをクリア
154 */
155 for (i = 0; i < GIC_TNUM_INTNO / 32; i++) {
156 sil_wrw_mem(GICD_ICPENDR(i), 0xffffffffU);
157 }
158
159 /*
160 * すべての割込みを最低優å…
161ˆåº¦ã«è¨­å®š
162 */
163 for (i = 0; i < GIC_TNUM_INTNO / 4; i++){
164 sil_wrw_mem(GICD_IPRIORITYR(i), 0xffffffffU);
165 }
166
167 /*
168 * すべてのå…
169±æœ‰ãƒšãƒªãƒ•ã‚§ãƒ©ãƒ«å‰²è¾¼ã¿ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’プロセッサ0に設定
170 */
171 for (i = GIC_INTNO_SPI0 / 4; i < GIC_TNUM_INTNO / 4; i++) {
172 sil_wrw_mem(GICD_ITARGETSR(i), 0x01010101U);
173 }
174
175 /*
176 * すべてのペリフェラル割込みをレベルトリガに設定
177 */
178 for (i = GIC_INTNO_PPI0 / 16; i < GIC_TNUM_INTNO / 16; i++) {
179#ifdef GIC_ARM11MOCORE
180 sil_wrw_mem(GICD_ICFGR(i), 0x55555555U);
181#else /* GIC_ARM11MOCORE */
182 sil_wrw_mem(GICD_ICFGR(i), 0x00000000U);
183#endif /* GIC_ARM11MOCORE */
184 }
185
186 /*
187 * ディストリビュータをイネーブル
188 */
189 sil_wrw_mem(GICD_CTLR, GICD_CTLR_ENABLE);
190}
191
192/*
193 * ディストリビュータの終了処理
194 */
195void
196gicd_terminate(void)
197{
198 sil_wrw_mem(GICD_CTLR, GICD_CTLR_DISABLE);
199}
200
201/*
202 * 割込み要求ラインの属性の設定
203 *
204 * ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ
205 * クしている.
206 */
207Inline void
208config_int(INTNO intno, ATR intatr, PRI intpri)
209{
210 assert(VALID_INTNO(intno));
211 assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);
212
213 /*
214 * 割込みを禁止
215 *
216 * 割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割
217 * 込み優å…
218ˆåº¦ã®è¨­å®šã‚’行うのは危険なため,割込み属性にかかわらず,
219 * 一旦マスクする.
220 */
221 disable_int(intno);
222
223 /*
224 * 割込みをコンフィギュレーション
225 */
226#ifdef TOPPERS_SAFEG_SECURE
227 gicd_config_group(intno, 1U);
228#endif /* TOPPERS_SAFEG_SECURE */
229
230 if ((intatr & TA_EDGE) != 0U) {
231#ifdef GIC_ARM11MOCORE
232 gicd_config(intno, GICD_ICFGRn_EDGE|GICD_ICFGRn_1_N);
233#else /* GIC_ARM11MOCORE */
234 gicd_config(intno, GICD_ICFGRn_EDGE);
235#endif /* GIC_ARM11MOCORE */
236 clear_int(intno);
237 }
238 else {
239#ifdef GIC_ARM11MOCORE
240 gicd_config(intno, GICD_ICFGRn_LEVEL|GICD_ICFGRn_1_N);
241#else /* GIC_ARM11MOCORE */
242 gicd_config(intno, GICD_ICFGRn_LEVEL);
243#endif /* GIC_ARM11MOCORE */
244 }
245
246 /*
247 * 割込み優å…
248ˆåº¦ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ—ロセッサを設定
249 */
250 gicd_set_priority(intno, INT_IPM(intpri));
251 gicd_set_target(intno, 1U << arm_prc_index());
252
253 /*
254 * 割込みを許可
255 */
256 if ((intatr & TA_ENAINT) != 0U) {
257 enable_int(intno);
258 }
259}
260
261/*
262 * 割込み管理機能の初期化
263 */
264void
265initialize_interrupt(void)
266{
267 uint_t i;
268 const INTINIB *p_intinib;
269
270 for (i = 0; i < tnum_cfg_intno; i++) {
271 p_intinib = &(intinib_table[i]);
272 config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri);
273 }
274}
Note: See TracBrowser for help on using the repository browser.