source: azure_iot_hub_riscv/trunk/asp_baseplatform/target/k210_gcc/target_config.c@ 453

Last change on this file since 453 was 453, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 7.4 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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2017-2019 by TOPPERS PROJECT Educational Working Group.
11 *
12 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * @(#) $Id$
42 */
43
44/*
45 * ターゲット依存モジュール(K210用)
46 */
47
48#include "kernel_impl.h"
49#include <sil.h>
50
51#include "target_syssvc.h"
52#include "target_serial.h"
53
54/*
55 * MACHINE割込みから割込みハンドラを呼び出す
56 */
57static void
58machine_interrupt(unsigned long mcause, void *p_excinf)
59{
60 uint32_t hart_id = read_csr(mhartid);
61 uint32_t int_num = sil_rew_mem((uint32_t *)(TADR_PLIC_BASE+TOFF_PLIC_CLAIM+(hart_id * NUM_PLIC_THRESHOLD)));
62 uint8_t threshold = (uint8_t)current_ithreshold();
63 void (*volatile handler)(void);
64 uint8_t priority;
65
66 if(int_num < TMAX_INTNO){
67 if((handler = (void (*volatile)(void))vector_table[int_num]) != NULL){
68 priority = current_ipriority(int_num);
69 set_ithreshold((uint32_t)priority);
70 set_csr(mie, kernel_mie);
71 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+TOFF_PLIC_CLAIM+(hart_id * NUM_PLIC_THRESHOLD)), int_num);
72 handler();
73 clear_csr(mie, KERNEL_MIE);
74 set_ithreshold((uint32_t)threshold);
75 }
76 }
77 else{
78 syslog(LOG_EMERG, "Illegal global interrupt NO = %d", int_num);
79 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+TOFF_PLIC_CLAIM+(hart_id * NUM_PLIC_THRESHOLD)), int_num);
80 }
81}
82
83/*
84 * ターゲット依存の初期化
85 */
86void
87target_initialize(void)
88{
89 extern void hardware_init_hook(void);
90 void (*volatile fp)(void) = hardware_init_hook;
91 unsigned long hart_id = read_csr(mhartid);
92 uint32_t i, off, len;
93
94 if(hart_id == 0){
95 /*
96 * hardware_init_hookへのポインタを,一旦volatile指定のあるfpに代
97 * 入してから使うのは,0との比較が最適化で削除されないようにするた
98 * めである.
99 */
100 if (fp != 0) {
101 (*fp)();
102 }
103
104 /*
105 * プロセッサ依存の初期化
106 */
107 prc_initialize();
108
109 /*
110 * バナー出力用のシリアル初期化
111 */
112 target_uart_init(SIO_PORTID);
113 }
114
115 /*
116 * 割込み関連の初期化
117 *
118 * 割込みレベルテーブルをHIに設定する.
119 * PLICに対して割込み禁止、レベルを0、スレシュホールドを0に設定する.
120 */
121 off = TOFF_PLIC_ENABLE + (hart_id * (NUM_PLIC_ENABLE / 8));
122 len = (TMAX_INTNO + 8) / 8;
123 for(i = 0 ; i < len ; i += 4){
124 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE + off + i), 0);
125 }
126
127 /*
128 * 割込みスレシュホールドを0に設定
129 */
130 off = (TOFF_PLIC_THRESHOLD + (hart_id * NUM_PLIC_THRESHOLD));
131 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+off), 0);
132
133 if(hart_id == 0){
134 /*
135 * 割込み優先度を0に設定
136 */
137 len = (TMAX_INTNO + 1) * sizeof(uint32_t);
138 for(i = 0 ; i < len ; i += sizeof(uint32_t)){
139 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE + TOFF_PLIC_PRIORITY + i), 0);
140 }
141 }
142 else{
143 for(;;){
144 Asm("wfi":::"memory");
145 }
146 }
147
148 /*
149 * MACHINE割込み設定
150 */
151 x_machine_inh(IRQ_MACHINE_EXTERNAL, (FP)machine_interrupt);
152}
153
154/*
155 * ターゲット依存の終了処理
156 */
157void
158target_exit(void)
159{
160 unsigned long hart_id = read_csr(mhartid);
161 uint32_t i, off, len;
162
163 /*
164 * プロセッサ依存の終了処理
165 */
166 prc_terminate();
167
168 /*
169 * すべての割込みをマスクする.
170 */
171 off = TOFF_PLIC_ENABLE + (hart_id * (NUM_PLIC_ENABLE / 8));
172 len = (TMAX_INTNO + 8) / 8;
173 for(i = 0 ; i < len ; i += 4){
174 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE + off + i), 0);
175 }
176
177 /*
178 * 開発環境依存の終了処理
179 */
180 while(1);
181}
182
183/*
184 * イレギュラーなPDIC割込み処理
185 */
186void
187default_plic_handler(void)
188{
189 syslog(LOG_EMERG, "\nUnregistered plic Interrupt occurs.");
190
191 target_exit();
192}
193
194/*
195 * システムログの低レベル出力のための文字出力
196 */
197void
198target_fput_log(char c)
199{
200 if (c == '\n') {
201 sio_pol_snd_chr('\r', SIO_PORTID);
202 }
203 sio_pol_snd_chr(c, SIO_PORTID);
204}
205
206/*
207 * 割込み要求ラインの属性の設定
208 *
209 * ASPカーネルでの利用を想定して,パラメータエラーはアサーションでチェッ
210 * クしている.cfg_intサービスコールを設ける場合には,エラーを返すよう
211 * にすべきであろう.
212 */
213void
214x_config_int(INTNO intno, ATR intatr, PRI intpri)
215{
216 uint32_t priority;
217
218 assert(VALID_INTNO_CFGINT(intno));
219 assert(TIRQ_NMI <= intpri && intpri <= TIRQ_LEVEL1);
220 priority = intpri - TIRQ_NMI;
221
222 /*
223 * 割込みのマスク
224 *
225 * 割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割
226 * 込み優先度の設定を行うのは危険なため,割込み属性にかかわらず,
227 * 一旦マスクする.
228 */
229 (void) x_disable_int(intno);
230
231 /*
232 * 割込み優先度の設定
233 */
234 set_ipriority(intno, priority);
235
236 /*
237 * 割込みのマスク解除(必要な場合)
238 */
239 if ((intatr & TA_ENAINT) != 0U) {
240 (void) x_enable_int(intno);
241 }
242}
243
Note: See TracBrowser for help on using the repository browser.