osPiReadIo.htm
3.99 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
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osPiReadIo(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osPiStartDma, osPiWriteIo, osPiReadIo, osCreatePiManager,
osPiGetCmdQueue
<P>
→ パラレルインターフェイス(PI)へのアドレス管理
<BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<P>
s32 osPiStartDma(OSIoMesg *mb, s32 priority, s32
direction, u32 devAddr, void *vAddr,
<P>
u32 nbytes, OSMesgQueue *mq);
<P>
void osCreatePiManager(OSPri pri, OSMesgQueue *cmdQ,
OSMesg *cmdBuf,
<P>
s32 cmdMsgCnt);
<P>
OSMesgQueue *osPiGetCmdQueue(void);
<P>
s32 osPiWriteIo(u32 devAddr, u32 data);
<P>
s32 osPiReadIo(u32 devAddr, u32 *data);<BR>
<P>
<B>説明<BR>
</B>
<P>
パラレルインターフェイス(PI)はRDRAMとROM, RAM, 磁気ディスクなどのメモリデバイスとの間の転送を管理しています。上記のこれらの関数はPIの“管理された”コントロールを供給します。それはパラレルインターフェイスがデバッグ、プリント、ログ、プロファイルと同様に単純な周辺機器I/Oから割り当てられているときに、同期や相互的排除の管理を行います。これらのPIルーチンはオペレーティングシステムをイニシャライズしてから使用しください。
<BR>
<P>
<A HREF="osPiStartDma.htm" >osPiStartDma</A>ルーチンはI/OメッセージブロックリクエストmbをPIマネージャに送ることによってRDRAMとPIデバイスアドレス空間の間のDMA転送をセットアップします。リクエストブロックの内容はデバイスアドレスdevAddr、RDRAMアドレスvAddr、転送量nbytes,I/Oオペレーションが完了してからPIマネージャからの通知を受け取るメッセージキューmq等の各種パラメータを指定してください。もしリクエストされた優先順位がOS_MESG_PRI_HIGHならば(デフォルトではOS_MESG_PRI_NORMALです。)、osPiStartDmaはPIマネージャのコマンドキューの先頭にメッセージを押し込みます。そうでない場合は、単純にキューの最後にメッセージを付け加えます。もしPIマネージャがまだスタートしていなければ、osPiStartDmaは-1を返します。そうでない場合は、<A HREF="osSendMesg.htm" >osSendMesg</A>(3P)か<A HREF="osJamMesg.htm" >osJamMesg</A>(3P)のどちらかのステータスを返します。nbytesの全体長は転送バイト数(最大16Mbyte)を含み、2byteの倍数でなければなりません。PIデバイスアドレスdevAddrは2byte整列にしてください。RDRAM仮想アドレスvAddrは8byte整列であればよいのですが、OS_READ
DMAオペレーションでは厳密な調整をお勧めします。完全でないキャッシュライン数が整列されていない場合の転送で起こる問題については<A HREF="OS_DCACHE_ROUNDUP_ADDR.htm" >OS_DCACHE_ROUNDUP_ADDR</A>(3P)に記述がありますので、それを参照してください。
<BR>
<P>
osCreatePiManagerはPIデバイスの同期と相互的排除をサポートするPIマネージャシステムスレッドを生成し、スタートします。コールする場合PIマネージャが実行する優先順位priと、PIマネージャがリクエストメッセージを受けるためのコマンドメッセージ待ち行列cmdQを指定してください。、cmdBufとcmdMsgCntは互いにメッセージバッファとコマンドメッセージ待ち行列によって必要とされるメッセージバッファのエントリナンバーを指定します。<A HREF="osPiGetCmdQueue.htm" >osPiGetCmdQueue</A>は単にPIマネージャのコマンド待ち行列へのポインタを返すか、もしくは、PIマネージャがスタートしていない場合はNULLを返します。
<BR>
<P>
osPiWriteIoルーチンはPIデバイスアドレスdevAddrへの32bitプログラムされたIOライトを実行します。同様に、osPiReadIoはPIデバイスアドレスdevAddrからの32bitプログラムされたIOリードを実行し、dataへ返値を返します。
<BR>
<P>
<B>注意<BR>
</B>
<P>
PIにアクセスするためには,高レベル関数(例えば, <A HREF="osCreatePiManager.htm" >osCreatePiManager</A>,
<A HREF="osPiWriteIo.htm" >osPiWriteIo</A>, <A HREF="osPiReadIo.htm" >osPiReadIo</A>,
and <A HREF="osPiStartDma.htm" >osPiStartDma</A>)をできるだけ使用してください。低レベルと高レベルのPIファンクションが混ざっているとき、十分注意してください。適切に同期をとらなければ、PIは低レベル関数または高レベル関数の内のどちらかのI/OオペレーションしかサポートできないのでPI中にエラーが発生するかもしれません。
<BR>
<P>
<B>参照<BR>
</B>
<P>
<A HREF="osPiRawStartDma.htm" >osPiRawStartDma</A>(3P), <A HREF="osSendMesg.htm" >osSendMesg</A>(3P),
<A HREF="osJamMesg.htm" >osJamMesg</A>(3P)<BR>
</BODY>
</HTML>