osEPiStartDma.htm
8.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<HTML>
<HEAD>
<TITLE>osEPiStartDma(3P)</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.03j">
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#C0C0C0" LINK="#0000EE" VLINK="#800040" ALINK="#FF0080" BACKGROUND="bg.gif">
<P>
<B><FONT COLOR=#FF0000>名称</FONT></B><FONT COLOR=#FF0000> </P>
<BR>
</FONT>
<UL>
<LI><FONT FACE="Century">osEPiStartDma, osEPiWriteIo, osEPiReadIo,
</FONT>:<FONT FACE="Century"> PI</FONT>マネージャを使った拡張型パラレルインタフェース<FONT FACE="Century">(EPI)</FONT>。</P>
</UL>
<P>
<B><FONT COLOR=#FF0000>概要</FONT></B><FONT COLOR=#FF0000> </P></FONT>
<P>
<FONT COLOR=#008080 FACE="Century">#include <ultra64.h>
<BR>
</P><BR>
</FONT>
<UL>
<LI><FONT COLOR=#008080 FACE="Century">s32 osEPiStartDma(OSPiHandle
*pihandle, OSIoMesg *mb, s32 direction);<BR>
</P><BR>
s32 osEPiWriteIo(OSPiHandle *pihandle, u32 devAddr, u32 data);
<BR>
</P><BR>
s32 osEPiReadIo(OSPiHandle *pihandle, u32 devAddr, u32 *data);
<BR>
</P></FONT>
</UL>
<P>
<B><FONT COLOR=#FF0000>詳細</FONT></B> </P><BR>
<UL>
<LI>拡張型パラレルインターフェース<FONT FACE="Century">(EPI)</FONT>は、<FONT FACE="Century">RDRAM</FONT>と大容量記憶デバイス(<FONT FACE="Century">BSD</FONT>)との間のデータ転送を行います。<FONT FACE="Century">BSD</FONT>とは<FONT FACE="Century">ROM</FONT>、<FONT FACE="Century">Drive
ROM</FONT>、<FONT FACE="Century">64DD</FONT>、その他が考えられます。<FONT FACE="Century">EPI</FONT>は、多くのデバイスが<FONT FACE="Century">PI</FONT>ドメインを共有する事をサポートし、これらデバイス間を動的に切り換えるように設計されております。
<BR>
</P><BR>
上述の関数は、<FONT FACE="Century">PI</FONT>バスを<FONT FACE="Century">PI</FONT>マネージャを用いて管理し、<FONT FACE="Century">PI</FONT>がデバッグ、プリント、ロギング、プロファイリングのような単純なペリフェラル<FONT FACE="Century">I/O</FONT>に共有される時、同期及び独立性をサポートします。<FONT FACE="Century">EPI</FONT>ルーチンを使用するには<FONT FACE="Century">PI</FONT>マネージャのシステムスレッドを初期化する必要があります。関数の詳細については<I><FONT FACE="Century">osPiStartDma</FONT></I><FONT FACE="Century">
(3P)</FONT>を参照して下さい。<BR>
</P><BR>
<FONT FACE="Century">OSPiHandle</FONT>のデータ構造体は、<FONT FACE="Century">EPI</FONT>ルーチンが個々の<FONT FACE="Century">PI</FONT>デバイスを参照する為のハンドラとして機能します。<FONT FACE="Century">
OSPiHandle</FONT>構造体はデバイスの初期化ルーチンにより割当て及び初期化され、個々の<FONT FACE="Century">PI</FONT>デバイスの属性をセーブするために使用されます。
<BR>
</P><BR>
<I><FONT FACE="Century">direction</FONT></I>の値<I><FONT FACE="Century">
</FONT></I><FONT FACE="Century">(OS_READ or OS_WRITE)</FONT>に基づき<FONT FACE="Century">,<I>
osEPiStartDma</I></FONT>は<FONT FACE="Century">RDRAM</FONT>と<FONT FACE="Century">PI</FONT>デバイスアドレス空間との間の<FONT FACE="Century">DMA</FONT>転送を、<FONT FACE="Century">I/O</FONT>メッセージブロック要求<FONT FACE="Century">mb</FONT>を<FONT FACE="Century">PI</FONT>マネージャに送ることでセットアップします。呼び出し側は、リクエストブロック内の様々のパラメーター<FONT FACE="Century">(</FONT>デバイスアドレス<I><FONT FACE="Century">devAddr</FONT></I><FONT FACE="Century">,
RDRAM</FONT>アドレス<I><FONT FACE="Century">dramAddr, </FONT></I>転送量、そして<FONT FACE="Century">PI</FONT>マネージャから<FONT FACE="Century">I/O</FONT>処理の終了通知を受け取る為のメッセージキュー<I><FONT FACE="Century">hdr.retQueue</FONT></I><FONT FACE="Century">)</FONT>の指定を行います。もし優先要求<I><FONT FACE="Century">hdr.pri</FONT></I><FONT FACE="Century">
</FONT>が<FONT FACE="Century">OS_MESG_PRI_HIGH (</FONT>デフォルトは<FONT FACE="Century">
OS_MESG_PRI_NORMAL)</FONT>の場合、<I><FONT FACE="Century">osEPiStartDma</FONT></I>は<FONT FACE="Century">PI</FONT>マネージャのコマンドキューの前方にメッセージを押し込みます。それ以外の場合は、メッセージはキューの最後に付け加えられることになります。もし<FONT FACE="Century">PI</FONT>マネージャが立ち上がっていなければ<I><FONT FACE="Century">osEPiStartDma</FONT></I>は<FONT FACE="Century">-1</FONT>を返します。そうでなければ、<I><FONT FACE="Century">
osSendMesg</FONT></I><FONT FACE="Century">(3P) </FONT>もしくは<FONT FACE="Century">
<I>osJamMesg</I>(3P)</FONT>のどちらかのステータスが返ります。転送量は最大<FONT FACE="Century">16</FONT>メガバイトで<FONT FACE="Century">2</FONT>の倍数でになります。<FONT FACE="Century">PI</FONT>デバイスのアドレス<I><FONT FACE="Century">devAddr</FONT></I>は2バイトのアラインメントを行う必要があります。<FONT FACE="Century">RDRAM</FONT>の仮想アドレス<I><FONT FACE="Century">dramAddr</FONT></I>は<FONT FACE="Century">8</FONT>バイトのアラインメントが必要ですが、<FONT FACE="Century">
DMA</FONT>を<FONT FACE="Century">OS_READ</FONT>で動かすためにはさらに厳しく<FONT FACE="Century">16</FONT>バイトのアラインメントを行う事をお薦めします。転送がキャッシュラインの整数倍でない場合に起こり得る問題については<I><FONT FACE="Century">OS_DCACHE_ROUNDUP_ADDR
</FONT></I><FONT FACE="Century">(3P)</FONT>を参照してください。
<BR>
</P><BR>
<I><FONT FACE="Century">osEPiWriteIo</FONT></I>ルーチンは<FONT FACE="Century">PI</FONT>デバイスアドレス<I><FONT FACE="Century">devAddr</FONT></I>に<FONT FACE="Century">32bit
IO Write</FONT>を行います。同様に<I><FONT FACE="Century">osEPiReadIo</FONT></I>は<FONT FACE="Century">PI</FONT>デバイスアドレス<I><FONT FACE="Century">devAddr</FONT></I>から<FONT FACE="Century">32bit
IO Read</FONT>を行い、その値を<I><FONT FACE="Century">data</FONT></I>に格納します。
<BR>
</P>
</UL>
<P>
<B><FONT COLOR=#FF0000>注意</FONT></B> </P><BR>
<UL>
<LI><FONT FACE="Century">PI</FONT>へのアクセスには高レベル関数(<I><FONT FACE="Century">osEPiWriteIo</FONT></I><FONT FACE="Century">,
<I>osEPiReadIo</I>, and<I> osEPiStartDma</I></FONT>等)を使用する事を強くお薦めします。高・低レベルの<FONT FACE="Century">PI</FONT>関数が入り交じっている場合には注意が必要です。<FONT FACE="Century">PI</FONT>は1度に1つの<FONT FACE="Century">I/O</FONT>しかサポートすることができない為、適切な同期がなければ<FONT FACE="Century">PI</FONT>にエラーが生じる可能性があります。<FONT FACE="Century">
osEPiStartDma, osEPiWriteIo, osEPiReadIo,</FONT>はいずれも、与えられた<FONT FACE="Century">pihndle</FONT>で指定された<FONT FACE="Century">PI</FONT>バスの設定と、その関数がコールされた時点での実際の<FONT FACE="Century">PI</FONT>バスの設定が異なっていた場合、<FONT FACE="Century">PI</FONT>バスを再設定します。毎回<FONT FACE="Century">osCartRomInit</FONT>を呼ぶ必要はありません。
<BR>
</P>
</UL>
<P>
<B><FONT COLOR=#FF0000>例</FONT></B><FONT COLOR=#FF0000> </P>
<BR>
</FONT>
<UL>
<LI><FONT COLOR=#008080 FACE="Century">void romCopy(const char
*src, const char *dest, const int len)</FONT><FONT COLOR=#008080>
</P></FONT>
</UL>
<P>
<FONT COLOR=#008080>{ </P><BR>
</FONT>
<UL>
<LI><FONT COLOR=#008080 FACE="Century">OSIoMesg dmaIoMesgBuf;</FONT><FONT COLOR=#008080>
</P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">OSMesgQueue dmaMessageQ;</FONT><FONT COLOR=#008080>
</P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">OSMesg dummyMesg;<BR>
</P><BR>
osInvalDCache((void *)dest, (s32) len);</FONT><FONT COLOR=#008080>
</P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">dmaIoMesgBuf.hdr.pri
= OS_MESG_PRI_NORMAL;</FONT><FONT COLOR=#008080> </P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">dmaIoMesgBuf.hdr.retQueue
= &dmaMessageQ;</FONT><FONT COLOR=#008080> </P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">dmaIoMesgBuf.dramAddr
= dest;</FONT><FONT COLOR=#008080> </P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">dmaIoMesgBuf.devAddr
= (u32)src;</FONT><FONT COLOR=#008080> </P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">dmaIoMesgBuf.size =
len;</FONT><FONT COLOR=#008080> </P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">osEPiStartDma(carthandle,
&dmaIoMesgBuf, OS_READ);</FONT><FONT COLOR=#008080> </P><BR>
</FONT><FONT COLOR=#008080 FACE="Century">(void) osRecvMesg(&dmaMessageQ,
&dummyMesg, OS_MESG_BLOCK);</FONT><FONT COLOR=#008080> </P></FONT>
</UL>
<P>
<FONT COLOR=#008080>}<BR>
</P></FONT>
<P>
<B><FONT COLOR=#FF0000>参照</FONT></B> </P><BR>
<UL>
<LI><A HREF="osPiRawStartDma.htm" ><I>osPiRawStartDma</I> (3P)</A><FONT FACE="Century">,
</FONT><A HREF="osPiStartDma.htm" ><I>osPiStartDma</I> (3P)</A><FONT FACE="Century">,
</FONT><A HREF="osEPiRawStartDma.htm"><I>osEPiRawStartDma</I> (3P),</A><I><FONT FACE="Century">
</FONT><A HREF="osCartRomInit.htm"><I>osCartRomInit </I></A><A HREF="osCartRomInit.htm">(3P)</A></I><FONT FACE="Century">,
</FONT><A HREF="osSendMesg.htm" >osSendMesg (3P)</A><FONT FACE="Century">,<I>
<A HREF="osJamMesg.htm" ><I>osJamMesg (3P)</I></A></P></I></FONT>
</UL>
<P>
</BODY>
</HTML>