source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/powerpc32/mpc860t/mpc860_sil.h@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 12.7 KB
RevLine 
[26]1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2001-2004 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: mpc860_sil.h,v 1.2 2004/10/07 17:10:56 honda Exp $
53 */
54
55#include <sil.h>
56
57/*
58 * MPC860内
59蔵の制御レジスタへのアクセス・ユーティリティ
60 *
61 * powerpc.hに記述するのがエレガントだが、sil.hとのインクルードの
62 * 順番の関係で独立したファイルとする。
63 * t_config.hを直接インクルードしたときにsil.hよりå…
64ˆã«powerpc.hが
65 * インクルードされる可能性がある。
66 *
67 * コンパイラの型チェック機能を有効にするため、ポインタ型は
68 * VB *、VH *、VW *を用いている。
69 *
70 */
71
72#ifndef _MPC860_SIL_H_
73#define _MPC860_SIL_H_
74
75#ifndef _MACRO_ONLY
76
77/*
78 * SILと同等のアクセス関数(型チェック機能付き)
79 */
80
81#ifndef SIL_DEBUG
82
83/*
84 * 8ビット単位の読出し/書込み
85 */
86Inline VB
87mpc860_reb_mem(VB *mem)
88{
89 VB reg = sil_reb_mem((VP)mem);
90 return(reg);
91}
92
93Inline void
94mpc860_wrb_mem(VB *mem, VB data)
95{
96 sil_wrb_mem((VP)mem, data);
97}
98
99/*
100 * 16ビット単位の読出し/書込み
101 */
102Inline VH
103mpc860_reh_mem(VH *mem)
104{
105 VH reg = sil_reh_mem((VP)mem);
106 return(reg);
107}
108
109Inline void
110mpc860_wrh_mem(VH *mem, VH data)
111{
112 sil_wrh_mem((VP)mem, data);
113}
114
115/*
116 * 32ビット単位の読出し/書込み
117 */
118Inline VW
119mpc860_rew_mem(VW *mem)
120{
121 VW reg = sil_rew_mem((VP)mem);
122 return(reg);
123}
124
125Inline void
126mpc860_wrw_mem(VW *mem, VW data)
127{
128 sil_wrw_mem((VP)mem, data);
129}
130
131
132
133/*
134 * ビット演算
135 */
136
137/*
138 * 8ビットレジスタのAND演算
139 */
140Inline void
141mpc860_andb_mem(VB *mem, VB data)
142{
143 VB reg = mpc860_reb_mem((VP)mem);
144 reg &= data;
145 mpc860_wrb_mem(mem, reg);
146}
147
148/*
149 * 8ビットレジスタのOR演算
150 */
151Inline void
152mpc860_orb_mem(VB *mem, VB data)
153{
154 VB reg = mpc860_reb_mem(mem);
155 reg |= data;
156 mpc860_wrb_mem(mem, reg);
157}
158
159
160/*
161 * 16ビットレジスタのAND演算
162 */
163Inline void
164mpc860_andh_mem(VH *mem, VH data)
165{
166 VH reg = mpc860_reh_mem(mem);
167 reg &= data;
168 mpc860_wrh_mem(mem, reg);
169}
170
171/*
172 * 16ビットレジスタのOR演算
173 */
174Inline void
175mpc860_orh_mem(VH *mem, VH data)
176{
177 VH reg = mpc860_reh_mem(mem);
178 reg |= data;
179 mpc860_wrh_mem(mem, reg);
180}
181
182/*
183 * 32ビットレジスタのAND演算
184 */
185Inline void
186mpc860_andw_mem(VW *mem, VW data)
187{
188 VW reg = mpc860_rew_mem(mem);
189 reg &= data;
190 mpc860_wrw_mem(mem, reg);
191}
192
193/*
194 * 32ビットレジスタのOR演算
195 */
196Inline void
197mpc860_orw_mem(VW *mem, VW data)
198{
199 VW reg = mpc860_rew_mem(mem);
200 reg |= data;
201 mpc860_wrw_mem(mem, reg);
202}
203
204#else /* SIL_DEBUG */
205
206extern UW sil_log_id;
207extern BOOL sil_debug_on;
208
209/*
210 * SILのログ出力を割り当てるログ重要度の定義
211 * (user.txtの「4.4 ログ情
212報の重要度」参ç…
213§ï¼‰
214 */
215#ifndef LOG_SIL
216#define LOG_SIL LOG_EMERG
217#endif /* LOG_SIL */
218
219
220/*
221 * 8ビット単位の読出し
222 */
223#define mpc860_reb_mem(mem) mpc860_reb_mem_deb(#mem, mem)
224
225Inline VB
226mpc860_reb_mem_deb(char *str, VB *mem)
227{
228 BOOL sil_debug_tmp, is_end_of_line;
229 SYSUTIM sysutim;
230 VB reg;
231 ER err;
232 SIL_PRE_LOC;
233
234 sil_debug_tmp = sil_debug_on;
235 if (sil_debug_on) {
236 SIL_LOC_INT();
237 sil_debug_on = FALSE;
238 ++sil_log_id;
239 SIL_UNL_INT();
240 err = vxget_tim(&sysutim);
241 if (err != E_OK) {
242 sysutim = 0;
243 }
244 SIL_LOC_INT();
245 }
246
247 reg = sil_reb_mem((VP)mem);
248
249 if (sil_debug_tmp) {
250 sil_debug_on = TRUE;
251 SIL_UNL_INT();
252 is_end_of_line = (reg == '\n') || (reg == '\r');
253 if (!is_end_of_line) {
254 syslog(LOG_SIL,
255 "%d time:%08d read VB %s(0x%08x) data=0x%02x(%c)",
256 sil_log_id, (UW)sysutim, str,
257 (UW)mem, (UW)(UB)reg, (UW)(UB)reg);
258 } else {
259 syslog(LOG_SIL,
260 "%d time:%08d read VB %s(0x%08x) data=0x%02x(%s)",
261 sil_log_id, (UW)sysutim, str,
262 (UW)mem, (UW)(UB)reg,
263 (reg == '\n') ? "\\n" : "\\r");
264 }
265 }
266
267 return(reg);
268}
269
270
271/*
272 * 8ビット単位の書き込み
273 */
274#define mpc860_wrb_mem(mem, data) mpc860_wrb_mem_deb(#mem, mem, data)
275
276Inline void
277mpc860_wrb_mem_deb(char *str, VB *mem, VB data)
278{
279 BOOL sil_debug_tmp, is_end_of_line;
280 SYSUTIM sysutim;
281 ER err;
282 SIL_PRE_LOC;
283
284 sil_debug_tmp = sil_debug_on;
285 if (sil_debug_on) {
286 SIL_LOC_INT();
287 sil_debug_on = FALSE;
288 ++sil_log_id;
289 SIL_UNL_INT();
290 err = vxget_tim(&sysutim);
291 if (err != E_OK) {
292 sysutim = 0;
293 }
294 SIL_LOC_INT();
295 }
296
297 sil_wrb_mem((VP)mem, data);
298
299 if (sil_debug_tmp) {
300 sil_debug_on = TRUE;
301 SIL_UNL_INT();
302 is_end_of_line = (data == '\n') || (data == '\r');
303 if (!is_end_of_line) {
304 syslog(LOG_SIL,
305 "%d time:%08d write VB %s(0x%08x) data=0x%02x(%c)",
306 sil_log_id, (UW)sysutim, str,
307 (UW)mem, (UW)(UB)data, (UW)(UB)data);
308 } else {
309 syslog(LOG_SIL,
310 "%d time:%08d write VB %s(0x%08x) data=0x%02x(%s)",
311 sil_log_id, (UW)sysutim, str,
312 (UW)mem, (UW)(UB)data,
313 (data == '\n') ? "\\n" : "\\r");
314 }
315 }
316}
317
318/*
319 * 16ビット単位の読出し
320 */
321#define mpc860_reh_mem(mem) mpc860_reh_mem_deb(#mem, mem)
322
323Inline VH
324mpc860_reh_mem_deb(char *str, VH *mem)
325{
326 BOOL sil_debug_tmp;
327 SYSUTIM sysutim;
328 VH reg;
329 ER err;
330 SIL_PRE_LOC;
331
332 sil_debug_tmp = sil_debug_on;
333 if (sil_debug_on) {
334 SIL_LOC_INT();
335 sil_debug_on = FALSE;
336 ++sil_log_id;
337 SIL_UNL_INT();
338 err = vxget_tim(&sysutim);
339 if (err != E_OK) {
340 sysutim = 0;
341 }
342 SIL_LOC_INT();
343 }
344
345 reg = sil_reh_mem((VP)mem);
346
347 if (sil_debug_tmp) {
348 sil_debug_on = TRUE;
349 SIL_UNL_INT();
350 syslog(LOG_SIL,
351 "%d time:%08d read VH %s(0x%08x) data=0x%04x",
352 sil_log_id, (UW)sysutim, str,
353 (UW)mem, (UW)(UH)reg);
354 }
355
356 return(reg);
357}
358
359/*
360 * 16ビット単位の書き込み
361 */
362#define mpc860_wrh_mem(mem, data) mpc860_wrh_mem_deb(#mem, mem, data)
363
364Inline void
365mpc860_wrh_mem_deb(char *str, VH *mem, VH data)
366{
367 BOOL sil_debug_tmp;
368 SYSUTIM sysutim;
369 ER err;
370 SIL_PRE_LOC;
371
372 sil_debug_tmp = sil_debug_on;
373 if (sil_debug_on) {
374 SIL_LOC_INT();
375 sil_debug_on = FALSE;
376 ++sil_log_id;
377 SIL_UNL_INT();
378 err = vxget_tim(&sysutim);
379 if (err != E_OK) {
380 sysutim = 0;
381 }
382 SIL_LOC_INT();
383 }
384
385 sil_wrh_mem((VP)mem, data);
386
387 if (sil_debug_tmp) {
388 sil_debug_on = TRUE;
389 SIL_UNL_INT();
390 syslog(LOG_SIL,
391 "%d time:%08d write VH %s(0x%08x) data=0x%04x",
392 sil_log_id, (UW)sysutim, str,
393 (UW)mem, (UW)(UH)data);
394 }
395}
396
397
398/*
399 * 32ビット単位の読出し
400 */
401#define mpc860_rew_mem(mem) mpc860_rew_mem_deb(#mem, mem)
402
403Inline VW
404mpc860_rew_mem_deb(char *str, VW *mem)
405{
406 BOOL sil_debug_tmp;
407 SYSUTIM sysutim;
408 VW reg;
409 ER err;
410 SIL_PRE_LOC;
411
412 sil_debug_tmp = sil_debug_on;
413 if (sil_debug_on) {
414 SIL_LOC_INT();
415 sil_debug_on = FALSE;
416 ++sil_log_id;
417 SIL_UNL_INT();
418 err = vxget_tim(&sysutim);
419 if (err != E_OK) {
420 sysutim = 0;
421 }
422 SIL_LOC_INT();
423 }
424
425 reg = sil_rew_mem((VP)mem);
426
427 if (sil_debug_tmp) {
428 sil_debug_on = TRUE;
429 SIL_UNL_INT();
430 syslog(LOG_SIL,
431 "%d time:%08d read VW %s(0x%08x) data=0x%08x",
432 sil_log_id, (UW)sysutim, str,
433 (UW)mem, (UW)reg);
434 }
435
436 return(reg);
437}
438
439
440/*
441 * 32ビット単位の書き込み
442 */
443#define mpc860_wrw_mem(mem, data) mpc860_wrw_mem_deb(#mem, mem, data)
444
445Inline void
446mpc860_wrw_mem_deb(char *str, VW *mem, VW data)
447{
448 BOOL sil_debug_tmp;
449 SYSUTIM sysutim;
450 ER err;
451 SIL_PRE_LOC;
452
453 sil_debug_tmp = sil_debug_on;
454 if (sil_debug_on) {
455 SIL_LOC_INT();
456 sil_debug_on = FALSE;
457 ++sil_log_id;
458 SIL_UNL_INT();
459 err = vxget_tim(&sysutim);
460 if (err != E_OK) {
461 sysutim = 0;
462 }
463 SIL_LOC_INT();
464 }
465
466 sil_wrw_mem((VP)mem, data);
467
468 if (sil_debug_tmp) {
469 sil_debug_on = TRUE;
470 SIL_UNL_INT();
471 syslog(LOG_SIL,
472 "%d time:%08d write VW %s(0x%08x) data=0x%08x",
473 sil_log_id, (UW)sysutim, str,
474 (UW)mem, (UW)data);
475 }
476}
477
478
479/*
480 * ビット演算
481 */
482
483/*
484 * 8ビットレジスタのAND演算
485 */
486#define mpc860_andb_mem(mem, data) \
487 if (sil_debug_on) { \
488 syslog(LOG_SIL, "%s & 0x%02x", \
489 #mem, (UW)(UB)data); \
490 } \
491 mpc860_andb_mem_deb(mem, data)
492
493Inline void
494mpc860_andb_mem_deb(VB *mem, VB data)
495{
496 VB reg = mpc860_reb_mem((VP)mem);
497 reg &= data;
498 mpc860_wrb_mem(mem, reg);
499}
500
501/*
502 * 8ビットレジスタのOR演算
503 */
504#define mpc860_orb_mem(mem, data) \
505 if (sil_debug_on) { \
506 syslog(LOG_SIL, "%s | 0x%02x", \
507 #mem, (UW)(UB)data); \
508 } \
509 mpc860_orb_mem_deb(mem, data)
510
511Inline void
512mpc860_orb_mem_deb(VB *mem, VB data)
513{
514 VB reg = mpc860_reb_mem(mem);
515 reg |= data;
516 mpc860_wrb_mem(mem, reg);
517}
518
519
520/*
521 * 16ビットレジスタのAND演算
522 */
523#define mpc860_andh_mem(mem, data) \
524 if (sil_debug_on) { \
525 syslog(LOG_SIL, "%s & 0x%04x", \
526 #mem, (UW)(UH)data); \
527 } \
528 mpc860_andh_mem_deb(mem, data)
529
530Inline void
531mpc860_andh_mem_deb(VH *mem, VH data)
532{
533 VH reg = mpc860_reh_mem(mem);
534 reg &= data;
535 mpc860_wrh_mem(mem, reg);
536}
537
538/*
539 * 16ビットレジスタのOR演算
540 */
541#define mpc860_orh_mem(mem, data) \
542 if (sil_debug_on) { \
543 syslog(LOG_SIL, "%s | 0x%04x", \
544 #mem, (UW)(UH)data); \
545 } \
546 mpc860_orh_mem_deb(mem, data)
547
548Inline void
549mpc860_orh_mem_deb(VH *mem, VH data)
550{
551 VH reg = mpc860_reh_mem(mem);
552 reg |= data;
553 mpc860_wrh_mem(mem, reg);
554}
555
556/*
557 * 32ビットレジスタのAND演算
558 */
559#define mpc860_andw_mem(mem, data) \
560 if (sil_debug_on) { \
561 syslog(LOG_SIL, "%s & 0x%08x", \
562 #mem, (UW)data); \
563 } \
564 mpc860_andw_mem_deb(mem, data)
565
566Inline void
567mpc860_andw_mem_deb(VW *mem, VW data)
568{
569 VW reg = mpc860_rew_mem(mem);
570 reg &= data;
571 mpc860_wrw_mem(mem, reg);
572}
573
574/*
575 * 32ビットレジスタのOR演算
576 */
577#define mpc860_orw_mem(mem, data) \
578 if (sil_debug_on) { \
579 syslog(LOG_SIL, "%s | 0x%08x", \
580 #mem, (UW)data); \
581 } \
582 mpc860_orw_mem_deb(mem, data)
583
584Inline void
585mpc860_orw_mem_deb(VW *mem, VW data)
586{
587 VW reg = mpc860_rew_mem(mem);
588 reg |= data;
589 mpc860_wrw_mem(mem, reg);
590}
591
592
593#endif /* SIL_DEBUG */
594
595/*
596 * CPコマンドが発行可能になるまで待
597つ
598 */
599Inline void
600mpc860_wait_ready_CP_command(void)
601{
602 UH cpcr;
603 do {
604 cpcr = mpc860_reh_mem(CPCR);
605 } while(cpcr & CPCR_FLG);
606}
607
608
609/*
610 * CPコマンドを発行する
611 * 引数
612 *  UW opcode:コマンド種別
613 *  UW ch_num:チャネル番号(デバイス番号)
614 */
615Inline void
616mpc860_CP_command(UW opcode, UW ch_num)
617{
618 UH cpcr;
619
620 /* 他のCPコマンド終了待
621ち */
622 mpc860_wait_ready_CP_command();
623
624 /* CPコマンド発行 */
625 cpcr = (UH)((opcode << 8) | (ch_num << 4) | CPCR_FLG);
626 mpc860_wrh_mem(CPCR, cpcr);
627
628 /* CPコマンド終了待
629ち */
630 mpc860_wait_ready_CP_command();
631
632}
633
634
635
636#endif /* _MACRO_ONLY */
637#endif /* _MPC860_SIL_H_ */
638/* end of file */
Note: See TracBrowser for help on using the repository browser.