PlayStation 2 Linux
Display 200 cubes

SUMMARY

パッチ適用済kernelのPlayStation 2 Linuxで動作するキューブを約200個表示するプログラムです。 パッドでカメラの位置と角度を調整でき、SELECTで加算表示モードにできます。 ただし、PS2らしいことは何もやっておらず、 PS2の性能も出していませんから、本パッチの動作テスト以上の意味はありません。

cube200.jpg cube200add.jpg

実行画面

ioctl()でDMAを発行した版と、Ver0.2以降のパッチを用いてI/Oポートを直接制御してDMAを発行した版があります。

Ver0.2 kernelパッチではデータキャッシュフラッシュとして、 PS2IOC_DMA_CACHE_WBACK_INV, PS2IOC_FLUSH_CACHE_ALLの2種類をサポートしており、それぞれ /dev/ps2genioに対してioctl()をすることで実行できますので、 以下のようにキャッシュのフラッシュとDMA転送を記述することができます。


/* DMAに先だって、キャッシュをフラッシュ */
struct ps2_genio_ioctl_wback_inv flushparam;

flushparam.addr = PS2_RESERVE_MEMORY_START;
flushparam.len  = PS2_RESERVE_MEMORY_SIZE;
ioctl( fdgenio, PS2IOC_DMA_CACHE_WBACK_INV, &flushparam );
//ioctl( fdgenio, PS2IOC_FLUSH_CACHE_ALL, 0 );
   A<- こちらだとキャッシュの内容をすべてフラッシュ

/* DMA転送開始 VPU1 */
*(unsigned int *)(genio_p+0x10009030-PS2_DEV_GENIO_OFFSET) =
    vpu_ptr_adr - (unsigned int)dmamem_p + PS2_RESERVE_MEMORY_START;
*(unsigned int *)(genio_p+0x10009020-PS2_DEV_GENIO_OFFSET) = 0;
*(unsigned int *)(genio_p+0x10009000-PS2_DEV_GENIO_OFFSET) = 0x0145;

/* DMA転送開始 GS */
*(unsigned int *)(genio_p+0x1000a030-PS2_DEV_GENIO_OFFSET) =
    gs_ptr_adr - (unsigned int)dmamem_p + PS2_RESERVE_MEMORY_START;
*(unsigned int *)(genio_p+0x1000a020-PS2_DEV_GENIO_OFFSET) = 0;
*(unsigned int *)(genio_p+0x1000a000-PS2_DEV_GENIO_OFFSET) = 0x0105;

以下のようなコードで初期化しておく必要があります。


int fdgenio = -1;
char *genio_p = MAP_FAILED;
int fddmamem;
char *dmamem_p;

fdgenio = open( PS2_DEV_GENIO, O_RDWR );
genio_p = mmap( 0, 0x4000000,
           PROT_READ | PROT_WRITE, MAP_PRIVATE, fdgenio, 0 );
fddmamem = open( PS2_DEV_MEM, O_RDWR );
dmamem_p = mmap( 0, PS2_RESERVE_MEMORY_SIZE,
           PROT_READ | PROT_WRITE, MAP_PRIVATE, fddmamem, 0 );

本格的に扱うためにはそれなりの仕組みが必要ですが、 以下のようにすることでDMAの終了待ちは実現できます。


while (*(unsigned int *)(genio_p+0x10009000-PS2_DEV_GENIO_OFFSET) & 0x0100)
        usleep( 1000 );
while (*(unsigned int *)(genio_p+0x1000a000-PS2_DEV_GENIO_OFFSET) & 0x0100)
        usleep( 1000 );

PROGRAM DOWNLOAD

上記のプログラムは、ソースを公開しませんので再利用は難しいと思いますが、再配布等は自由です。
cuben, cubedemoに同等のソースが含まれています。