OSDN Git Service

First commitment for the BlackTank LPC1769.
[blacktank/blacktank.git] / kernel / include / sil.h
1 /*
2  *  TOPPERS Software
3  *      Toyohashi Open Platform for Embedded Real-Time Systems
4  * 
5  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6  *                              Toyohashi Univ. of Technology, JAPAN
7  *  Copyright (C) 2004-2008 by Embedded and Real-Time Systems Laboratory
8  *              Graduate School of Information Science, Nagoya Univ., JAPAN
9  * 
10  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15  *      スコード中に含まれていること.
16  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19  *      の無保証規定を掲載すること.
20  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22  *      と.
23  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
25  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26  *        報告すること.
27  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31  *      免責すること.
32  * 
33  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37  *  の責任を負わない.
38  * 
39  *  @(#) $Id: sil.h 1844 2010-07-11 12:59:26Z ertl-hiro $
40  */
41
42 /*
43  *              システムインタフェースレイヤ
44  *
45  *  システムインタフェースレイヤのサービスコールの定義・宣言とマクロな
46  *  どの定義を含むヘッダファイル.
47  *
48  *  アセンブリ言語のソースファイルからこのファイルをインクルードする時
49  *  は,TOPPERS_MACRO_ONLYを定義しておくことで,マクロ定義以外の記述を
50  *  除くことができる.
51  *
52  *  このファイルをインクルードする前にインクルードしておくべきファイル
53  *  はない.
54  */
55
56 #ifndef TOPPERS_SIL_H
57 #define TOPPERS_SIL_H
58
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62
63 /*
64  *      TOPPERS共通のデータ型・定数・マクロ
65  */
66 #include <t_stddef.h>
67
68 /*
69  *  ターゲット依存部
70  */
71 #include "target_sil.h"
72
73 #ifndef TOPPERS_MACRO_ONLY
74
75 /*
76  *  全割込みロック状態の制御
77  *
78  *  SIL_PRE_LOC,SIL_LOC_INT(),SIL_UNL_INT()は,ターゲット依存部で用
79  *  意する.デフォルトの定義は用意していない.
80  */
81
82 /*
83  *  微少時間待ち
84  */
85 extern void     sil_dly_nse(ulong_t dlytim) throw();
86
87 /*
88  *  エンディアンの反転
89  */
90 #ifndef TOPPERS_SIL_REV_ENDIAN_UINT16
91 #define TOPPERS_SIL_REV_ENDIAN_UINT16(data) \
92                                 ((((data) & 0xff) << 8) | (((data) >> 8) & 0xff))
93 #endif /* TOPPERS_SIL_REV_ENDIAN_UINT16 */
94
95 #ifndef TOPPERS_SIL_REV_ENDIAN_UINT32
96 #define TOPPERS_SIL_REV_ENDIAN_UINT32(data) \
97                                 ((((data) & 0xff) << 24) | (((data) & 0xff00) << 8) \
98                                         | (((data) >> 8) & 0xff00) | (((data) >> 24) & 0xff))
99 #endif /* TOPPERS_SIL_REV_ENDIAN_UINT32 */
100
101 /*
102  *  メモリ空間アクセス関数
103  */
104 #ifndef TOPPERS_OMIT_SIL_ACCESS
105
106 /*
107  *  8ビット単位の読出し/書込み
108  */
109 #ifdef UINT8_MAX
110
111 Inline uint8_t
112 sil_reb_mem(void *mem)
113 {
114         uint8_t data;
115
116         data = *((volatile uint8_t *) mem);
117         return(data);
118 }
119
120 Inline void
121 sil_wrb_mem(void *mem, uint8_t data)
122 {
123         *((volatile uint8_t *) mem) = data;
124 }
125
126 #endif /* UINT8_MAX */
127
128 /*
129  *  16ビット単位の読出し/書込み
130  */
131
132 Inline uint16_t
133 sil_reh_mem(void *mem)
134 {
135         uint16_t        data;
136
137         data = *((volatile uint16_t *) mem);
138         return(data);
139 }
140
141 Inline void
142 sil_wrh_mem(void *mem, uint16_t data)
143 {
144         *((volatile uint16_t *) mem) = data;
145 }
146
147 #ifdef SIL_ENDIAN_BIG                   /* ビッグエンディアンプロセッサ */
148
149 #define sil_reh_bem(mem)                sil_reh_mem(mem)
150 #define sil_wrh_bem(mem, data)  sil_wrh_mem(mem, data)
151
152 #ifndef TOPPERS_OMIT_SIL_REH_LEM
153
154 Inline uint16_t
155 sil_reh_lem(void *mem)
156 {
157         uint16_t        data;
158
159         data = *((volatile uint16_t *) mem);
160         return(TOPPERS_SIL_REV_ENDIAN_UINT16(data));
161 }
162
163 #endif /* TOPPERS_OMIT_SIL_REH_LEM */
164 #ifndef TOPPERS_OMIT_SIL_WRH_LEM
165
166 Inline void
167 sil_wrh_lem(void *mem, uint16_t data)
168 {
169         *((volatile uint16_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT16(data);
170 }
171
172 #endif /* TOPPERS_OMIT_SIL_WRH_LEM */
173 #else /* SIL_ENDIAN_BIG */
174 #ifdef SIL_ENDIAN_LITTLE                /* リトルエンディアンプロセッサ */
175
176 #define sil_reh_lem(mem)                sil_reh_mem(mem)
177 #define sil_wrh_lem(mem, data)  sil_wrh_mem(mem, data)
178
179 #ifndef TOPPERS_OMIT_SIL_REH_BEM
180
181 Inline uint16_t
182 sil_reh_bem(void *mem)
183 {
184         uint16_t        data;
185
186         data = *((volatile uint16_t *) mem);
187         return(TOPPERS_SIL_REV_ENDIAN_UINT16(data));
188 }
189
190 #endif /* TOPPERS_OMIT_SIL_REH_BEM */
191 #ifndef TOPPERS_OMIT_SIL_WRH_BEM
192
193 Inline void
194 sil_wrh_bem(void *mem, uint16_t data)
195 {
196         *((volatile uint16_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT16(data);
197 }
198
199 #endif /* TOPPERS_OMIT_SIL_WRH_BEM */
200 #else /* SIL_ENDIAN_LITTLE */
201
202 #error Neither SIL_ENDIAN_BIG nor SIL_ENDIAN_LITTLE is defined.
203
204 #endif /* SIL_ENDIAN_LITTLE */
205 #endif /* SIL_ENDIAN_BIG */
206
207 /*
208  *  32ビット単位の読出し/書込み
209  */
210
211 Inline uint32_t
212 sil_rew_mem(void *mem)
213 {
214         uint32_t        data;
215
216         data = *((volatile uint32_t *) mem);
217         return(data);
218 }
219
220 Inline void
221 sil_wrw_mem(void *mem, uint32_t data)
222 {
223         *((volatile uint32_t *) mem) = data;
224 }
225
226 #ifdef SIL_ENDIAN_BIG                   /* ビッグエンディアンプロセッサ */
227
228 #define sil_rew_bem(mem)                sil_rew_mem(mem)
229 #define sil_wrw_bem(mem, data)  sil_wrw_mem(mem, data)
230
231 #ifndef TOPPERS_OMIT_SIL_REW_LEM
232
233 Inline uint32_t
234 sil_rew_lem(void *mem)
235 {
236         uint32_t        data;
237
238         data = *((volatile uint32_t *) mem);
239         return(TOPPERS_SIL_REV_ENDIAN_UINT32(data));
240 }
241
242 #endif /* TOPPERS_OMIT_SIL_REW_LEM */
243 #ifndef TOPPERS_OMIT_SIL_WRW_LEM
244
245 Inline void
246 sil_wrw_lem(void *mem, uint32_t data)
247 {
248         *((volatile uint32_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT32(data);
249 }
250
251 #endif /* TOPPERS_OMIT_SIL_WRW_LEM */
252 #else /* SIL_ENDIAN_BIG */              /* リトルエンディアンプロセッサ */
253
254 #define sil_rew_lem(mem)                sil_rew_mem(mem)
255 #define sil_wrw_lem(mem, data)  sil_wrw_mem(mem, data)
256
257 #ifndef TOPPERS_OMIT_SIL_REW_BEM
258
259 Inline uint32_t
260 sil_rew_bem(void *mem)
261 {
262         uint32_t        data;
263
264         data = *((volatile uint32_t *) mem);
265         return(TOPPERS_SIL_REV_ENDIAN_UINT32(data));
266 }
267
268 #endif /* TOPPERS_OMIT_SIL_REW_BEM */
269 #ifndef TOPPERS_OMIT_SIL_WRW_BEM
270
271 Inline void
272 sil_wrw_bem(void *mem, uint32_t data)
273 {
274         *((volatile uint32_t *) mem) = TOPPERS_SIL_REV_ENDIAN_UINT32(data);
275 }
276
277 #endif /* TOPPERS_OMIT_SIL_WRW_BEM */
278 #endif /* SIL_ENDIAN_BIG */
279 #endif /* TOPPERS_OMIT_SIL_ACCESS */
280
281 #endif /* TOPPERS_MACRO_ONLY */
282
283 #ifdef __cplusplus
284 }
285 #endif
286
287 #endif /* TOPPERS_SIL_H */