source: azure_iot_hub_riscv/trunk/asp_baseplatform/target/k210_gcc/target_config.h@ 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-chdr;charset=UTF-8
File size: 13.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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2010 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 * カーネルのターゲット依存部のインクルードファイル.kernel_impl.hの
48 * ターゲット依存部の位置付けとなる.
49 */
50
51#ifndef TOPPERS_TARGET_CONFIG_H
52#define TOPPERS_TARGET_CONFIG_H
53
54/*
55 * ターゲットシステムのハードウェア資源の定義
56 */
57#include "kendryte-k210.h"
58
59/*
60 * ターゲット定義のオブジェクト属性
61 */
62#define TARGET_INHATR TA_NONKERNEL /* カーネル管理外の割込み */
63
64/*
65 * エラーチェック方法の指定
66 */
67#define CHECK_STKSZ_ALIGN 8 /* スタックサイズのアライン単位 */
68#define CHECK_FUNC_ALIGN 2 /* 関数のアライン単位 */
69#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
70#define CHECK_STACK_ALIGN 8 /* スタック領域のアライン単位 */
71#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
72#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
73#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
74#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
75
76/*
77 * トレースログに関する設定
78 */
79#ifdef TOPPERS_ENABLE_TRACE
80#include "logtrace/trace_config.h"
81#endif /* TOPPERS_ENABLE_TRACE */
82
83/*
84 * デフォルトの非タスクコンテキスト用のスタック領域の定義
85 */
86#define DEFAULT_ISTKSZ 0x4000U
87//#define DEFAULT_ISTK (void *)(RAM_BASE_ADDR + RAM_SIZE - DEFAULT_ISTKSZ * 2)
88
89
90#ifndef TOPPERS_MACRO_ONLY
91
92/*
93 * 割込み番号の範囲の判定
94 */
95#define VALID_INTNO(intno) ((1 <= (intno)) && ((intno) <= TMAX_INTNO))
96#define VALID_INTNO_CREISR(intno) VALID_INTNO(intno)
97#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
98#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
99
100/*
101 * PLIC THRESHOLD(ハードウェアの割込み優先度マスク,内部表現)の現在値の読出し
102 */
103Inline uint32_t
104current_ithreshold(void)
105{
106 uint32_t hard_id = read_csr(mhartid);
107 uint32_t off = TOFF_PLIC_THRESHOLD + (hard_id * NUM_PLIC_THRESHOLD);
108 return sil_rew_mem((uint32_t *)(TADR_PLIC_BASE+off));
109}
110
111/*
112 * PLIC THRESHOLD(ハードウェアの割込み優先度マスク,内部表現)の現在値の設定
113 */
114Inline void
115set_ithreshold(uint32_t threshold)
116{
117 uint32_t hard_id = read_csr(mhartid);
118 uint32_t off = TOFF_PLIC_THRESHOLD + (hard_id * NUM_PLIC_THRESHOLD);
119 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+off), threshold);
120}
121
122/*
123 * PLIC 割込み優先度(ハードウェアの割込み優先度マスク,内部表現)の現在値の読出し
124 */
125Inline uint32_t
126current_ipriority(INTNO intno)
127{
128 uint32_t off = TOFF_PLIC_PRIORITY + (intno * sizeof(uint32_t));
129 return sil_rew_mem((uint32_t *)(TADR_PLIC_BASE+off));
130}
131
132/*
133 * PLIC 割込み優先度(ハードウェアの割込み優先度マスク,内部表現)の現在値の設定
134 */
135Inline void
136set_ipriority(INTNO intno, uint32_t priority)
137{
138 uint32_t off = TOFF_PLIC_PRIORITY + (intno * sizeof(uint32_t));
139 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+off), (uint32_t)priority);
140}
141
142/*
143 * PLIC割込みハンドラテーブル
144 */
145extern const FP vector_table[];
146
147/*
148 * 割込み属性が設定されているかを判別するための変数(kernel_cfg.c)
149 */
150extern const uint32_t bitpat_cfgint[];
151
152/*
153 * 割込み要求禁止フラグのセット
154 *
155 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
156 * フラグをセットしようとした場合には,falseを返す.
157 */
158Inline bool_t
159x_disable_int(INTNO intno)
160{
161 unsigned long hart_id = read_csr(mhartid);
162 uint32_t bitpat = 1 << (intno & 0x1f);
163 uint32_t bitpno = intno >> 5;
164 uint32_t off = TOFF_PLIC_ENABLE + (hart_id * NUM_PLIC_ENABLE) + ((intno / 32) * 4);
165
166 if ((bitpat_cfgint[bitpno] & bitpat) == 0U) {
167 return(false);
168 }
169 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+off),
170 (sil_rew_mem((uint32_t *)(TADR_PLIC_BASE+off)) & ~(1 << (intno % 32))));
171 return(true);
172}
173
174
175#define t_disable_int(intno) x_disable_int(intno)
176#define i_disable_int(intno) x_disable_int(intno)
177
178/*
179 * 割込み要求禁止フラグのクリア
180 *
181 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
182 * フラグをクリアしようとした場合には,falseを返す.
183 */
184Inline bool_t
185x_enable_int(INTNO intno)
186{
187 unsigned long hart_id = read_csr(mhartid);
188 uint32_t bitpat = 1 << (intno & 0x1f);
189 uint32_t bitpno = intno >> 5;
190 uint32_t off = TOFF_PLIC_ENABLE + (hart_id * (NUM_PLIC_ENABLE / 8)) + ((intno / 32) * 4);
191
192 if ((bitpat_cfgint[bitpno] & bitpat) == 0U) {
193 return(false);
194 }
195
196 sil_wrw_mem((uint32_t *)(TADR_PLIC_BASE+off),
197 (sil_rew_mem((uint32_t *)(TADR_PLIC_BASE+off)) | (1 << (intno % 32))));
198 return(true);
199}
200
201#define t_enable_int(intno) x_enable_int(intno)
202#define i_enable_int(intno) x_enable_int(intno)
203
204/*
205 * 割込み要求のクリア
206 */
207Inline void
208x_clear_int(INTNO intno)
209{
210}
211
212#define t_clear_int(intno) x_clear_int(intno)
213#define i_clear_int(intno) x_clear_int(intno)
214
215/*
216 * 割込み要求のチェック
217 */
218Inline bool_t
219x_probe_int(INTNO intno)
220{
221 unsigned long hart_id = read_csr(mhartid);
222 uint32_t off = TOFF_PLIC_ENABLE + (hart_id * NUM_PLIC_ENABLE) + (intno >> 3);
223
224 return((sil_reb_mem((uint8_t *)(TADR_PLIC_BASE+off)) & (1 << (intno & 7))) != 0);
225}
226
227#define t_probe_int(intno) x_probe_int(intno)
228#define i_probe_int(intno) x_probe_int(intno)
229
230/*
231 * 割込みハンドラの設定
232 *
233 * ベクトル番号inhnoの割込みハンドラの出入口処理の番地をint_entryに設
234 * 定する.
235 */
236Inline void
237x_define_inh(INHNO inhno, FP int_entry)
238{
239}
240
241
242/*
243 * 割込み要求ラインの属性の設定
244 *
245 * DVE-68K/40のIRCでは,割込み要求ラインの割込み優先度にNMIを指定する
246 * ことができため,-7を与えるとNMIに設定されることとする(ターゲット定
247 * 義の拡張).
248 */
249extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
250
251/*
252 * 割込みハンドラの入口で必要なIRC操作
253 *
254 * エッジトリガの場合には,割込み要求をクリアする.エッジトリガかレベ
255 * ルトリガかが設定できる場合も,現在の設定値を見ずにクリアしている.
256 * レベルトリガの場合もクリア処理をして差し支えないが,最適化で消える
257 * ことを期待して,クリアしないこととしている.
258 */
259Inline void
260i_begin_int(INTNO intno)
261{
262}
263
264/*
265 * 割込みハンドラの出口で必要なIRC操作
266 *
267 * K210では必要なIRC操作はない.
268 */
269Inline void
270i_end_int(INTNO intno)
271{
272}
273
274/*
275 * 割込みハンドラの出入口処理の生成
276 */
277
278/*
279 * 割込みハンドラの出入口処理のラベルを作るマクロ
280 */
281#define INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno
282
283/*
284 * LOG_INH_ENTERがマクロ定義されている場合に,CALL_LOG_INH_ENTERを,
285 * inhno_numをパラメータとしてlog_inh_enterを呼び出すアセンブリ言語コー
286 * ドにマクロ定義する.
287 */
288#ifdef LOG_INH_ENTER
289
290#define CALL_LOG_INH_ENTER(inhno_num) \
291" li a0," #inhno_num " \n" /* inhno_numをパラメータに */ \
292" jal _kernel_log_inh_enter \n" /* log_inh_enterを呼び出す */
293
294#else /* LOG_INH_ENTER */
295#define CALL_LOG_INH_ENTER(inhno_num)
296#endif /* LOG_INH_ENTER */
297
298#ifdef LOG_INH_LEAVE
299
300/*
301 * CALL_LOG_INH_LEAVEを,inhno_numをパラメータとしてlog_inh_leaveを呼
302 * び出すアセンブリ言語コードにマクロ定義する.
303 */
304#define CALL_LOG_INH_LEAVE(inhno_num) \
305" li a0," #inhno_num " \n" /* inhno_numをパラメータに */ \
306" jal _kernel_log_inh_leave \n" /* log_inh_leaveを呼び出す */
307
308/*
309 * LOG_INH_LEAVEがマクロ定義されている場合の割込みハンドラの出入口処理.
310 * 割込みハンドラをサブルーチンコールし,戻ってきたら,トレースログの
311 * 取得後,呼び出し先に分岐する.
312 */
313#define INTHDR_ENTRY(inhno, inhno_num, inthdr) \
314extern void _kernel_##inthdr##_##inhno(void); \
315asm(".text \n" \
316"_kernel_" #inthdr "_" #inhno ": \n" \
317" addi sp, sp, -32 \n" /* 保存領域を確保 */ \
318" sd ra, 24(sp) \n" /* return addressをセーブ */ \
319 CALL_LOG_INH_ENTER(inhno_num) \
320" jal " #inthdr " \n" /* 割込みハンドラを呼び出す */ \
321 CALL_LOG_INH_LEAVE(inhno_num) \
322" ld ra, 24(sp) \n" /* return addressをリストア */ \
323" addi sp, sp, 32 \n" /* 保存領域を開放 */ \
324" ret \n");/* リターン */
325
326
327#elif defined(LOG_INH_ENTER)
328
329/*
330 * LOG_INH_LEAVEがマクロ定義されていなくてLOG_INH_ENTERが定義されている
331 * 場合の割込みハンドラの出入口処理.log_inh_enterを実行後、
332 * ハンドラを呼び出し、呼び出し先に分岐する.
333 */
334#define INTHDR_ENTRY(inhno, inhno_num, inthdr) \
335extern void _kernel_##inthdr##_##inhno(void); \
336asm(".text \n" \
337"_kernel_" #inthdr "_" #inhno ": \n" \
338" addi sp, sp, -32 \n" /* 保存領域を確保 */ \
339" sd ra, 24(sp) \n" /* return addressをセーブ */ \
340 CALL_LOG_INH_ENTER(inhno_num) \
341" jal " #inthdr " \n" /* 割込みハンドラへ分岐 */ \
342" ld ra, 24(sp) \n" /* return addressをリストア */ \
343" addi sp, sp, 32 \n" /* 保存領域を開放 */ \
344" ret \n");/* リターン */
345
346#else
347
348/*
349 * LOG_INH_ENTER/LOG_INH_LEAVEがマクロ定義されていない場合、raを保持したまま
350 * ハンドラにジャンプする.
351 */
352#define INTHDR_ENTRY(inhno, inhno_num, inthdr) \
353extern void _kernel_##inthdr##_##inhno(void); \
354asm(".text \n" \
355"_kernel_" #inthdr "_" #inhno ": \n" \
356" j " #inthdr " \n"); /* 割込みハンドラへ分岐 */ \
357
358#endif /* LOG_INH_LEAVE */
359
360#endif /* TOPPERS_MACRO_ONLY */
361
362#ifndef TOPPERS_MACRO_ONLY
363
364/*
365 * ターゲットシステム依存の初期化
366 */
367extern void target_initialize(void);
368
369/*
370 * ターゲットシステムの終了
371 *
372 * システムを終了する時に使う.
373 */
374extern void target_exit(void) NoReturn;
375
376/*
377 * イレギュラーなPDIC割込み処理
378 */
379extern void default_plic_handler(void);
380
381#endif /* TOPPERS_MACRO_ONLY */
382
383/*
384 * 微少時間待ちのための定義(本来はSILのターゲット依存部)
385 */
386#define SIL_DLY_TIM1 1
387#define SIL_DLY_TIM2 5
388
389/*
390 * プロセッサ依存モジュール(RISC-V用)
391 */
392#include "riscv_gcc/prc_config.h"
393
394#endif /* TOPPERS_TARGET_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.