PlayStation 2 Linux
kernel patch for fast DMA direct access
and direct I/O control
SUMMARY
PS2 Linux上でDMAを使うためには制限があります。
これはDMA問題の解決と直接I/O制御デバイスを追加するためのパッチです。
本パッチは、オリジナルカーネルとドライバ呼び出しI/Fの互換性を損なわずに、以下の変更を行います。
HOW TO USE
ps2linux-patch-0.3-20020425.gzを以下のようにあてます。
cd /usr/src/linux
gzip -dc ps2linux-patch-0.3-20020425.gz
| patch -p1
後は普通にカーネルをコンパイルして新しいカーネルで再起動します。
無事にブートできたら、I/Oをマッピングするための/dev/ps2genioデバイスを作成します。
mknod /dev/ps2genio c 240 96
以上でインストールは終了です。
プログラムでの使用方法としては、GS(GIF)への転送は、以下のようなlibps2dev内の関数呼び出しのかわりに、
ps2_dma_start( fdgs, NULL, datapointer );
次のように記述することができます。
struct ps2_packet dma_gs;
dma_gs.ptr = datapointer;
dma_gs.len = 16;
ioctl( fdgs, PS2IOC_SEND_TTE1, & dma_gs );
または
ioctl( fdgs, PS2IOC_SENDA_TTE1, & dma_gs );
(lenはデータに関係なく、16とする必要があります)
同様に、VPU1への転送は次のように行うことができます。
struct ps2_packet dma_vpu1;
dma_vpu1.ptr = datapointer;
dma_vpu1.len = 16;
ioctl( ps2_vpu_fd(vpu1), PS2IOC_SEND_TTE1,
& dma_vpu1 )
または
ioctl( ps2_vpu_fd(vpu1), PS2IOC_SENDA_TTE1,
& dma_vpu1 )
(lenはデータに関係なく、16とする必要があります)
但し、libps2dev内の関数使用時とは異なりこれらは直接ハードウエアのDMAを動作させるため、dmaref等のアドレス値はすべて仮想アドレスではなく、物理アドレスが必要です。また本転送方法は必ずtte=1になっていることに注意しておく必要があります。(GSへの転送時も)
仮想アドレスから物理アドレスへの変換方法としては、/dev/ps2memをmmap()した後のアドレスを覚えておき、引き算してオフセットを求めた後、本パッチの適用後に/usr/include/linux/ps2/dev.hで定義されるPS2_RESERVE_MEMORY_STARTを加算することをお勧めします。
後は、テストプログラムを参考にすれば使い方はわかると思いますが、
いくつか注意点を挙げておきます。
PROGRAM DOWNLOAD
上記のプログラムは、著作権を放棄しています。 GPLと記述したままかもしれませんが、ご自由にご使用ください。