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と記述したままかもしれませんが、ご自由にご使用ください。