From fc708bddb6504585064a1c2b112d751b066750ea Mon Sep 17 00:00:00 2001 From: smea Date: Wed, 12 Mar 2014 15:59:26 +0100 Subject: [PATCH] GPU : GPU_Reset --- libctru/include/ctr/GPU.h | 1 + libctru/source/GPU.c | 125 ++++++++++++++++++++- libctru/source/gpuResetSequence.c | 175 ++++++++++++++++++++++++++++++ 3 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 libctru/source/gpuResetSequence.c diff --git a/libctru/include/ctr/GPU.h b/libctru/include/ctr/GPU.h index 511b9a5..97a8483 100644 --- a/libctru/include/ctr/GPU.h +++ b/libctru/include/ctr/GPU.h @@ -2,6 +2,7 @@ #define GPU_H void GPU_Init(Handle *gsphandle); +void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize); void GPUCMD_SetBuffer(u32* adr, u32 size, u32 offset); void GPUCMD_Run(u32* gxbuf); diff --git a/libctru/source/GPU.c b/libctru/source/GPU.c index 3a51e68..74483b3 100644 --- a/libctru/source/GPU.c +++ b/libctru/source/GPU.c @@ -63,13 +63,134 @@ void GPUCMD_AddSingleParam(u32 cmd, u32 param) void GPUCMD_Finalize() { - u32 cmd[2]; - GPUCMD_AddSingleParam(0x000F0111, 0x00000001); GPUCMD_AddSingleParam(0x000F0110, 0x00000001); GPUCMD_AddSingleParam(0x000F0010, 0x12345678); } +extern u32 gpuResetSequence[]; +extern u32 gpuResetSequenceLength; + +void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize) +{ + int i; + static u32 param[0x80]; + static u32 zero[0x80]; + memset(zero, 0x00, 0x80*4); + + GPUCMD_SetBuffer(gpuBuf, gpuBufSize, 0); + + GPUCMD_AddSingleParam(0x000D0080, 0x00011000); + + for(i=0x1;i<0xC;i++)GPUCMD_AddSingleParam(0x000F0080+i, 0x00000000); + GPUCMD_AddSingleParam(0x000F008C, 0x00FF0000); + GPUCMD_AddSingleParam(0x000F008D, 0x00000000); + GPUCMD_AddSingleParam(0x000F008E, 0x00000000); + + for(i=0x0;i<0xF;i++)GPUCMD_AddSingleParam(0x000F0090+i, 0x00000000); + + GPUCMD_AddSingleParam(0x00010245, 0x00000001); + GPUCMD_AddSingleParam(0x00010244, 0x00000000); + GPUCMD_AddSingleParam(0x00080289, 0x80000000); + GPUCMD_AddSingleParam(0x000B0229, 0x00000000); + + GPUCMD_AddSingleParam(0x000F0252, 0x00000000); + GPUCMD_AddSingleParam(0x000F0251, 0x00000000); + GPUCMD_AddSingleParam(0x000F0254, 0x00000000); + GPUCMD_AddSingleParam(0x00010253, 0x00000000); + + GPUCMD_AddSingleParam(0x000F0242, 0x00000000); + GPUCMD_AddSingleParam(0x000F024A, 0x00000000); + + GPUCMD_AddSingleParam(0x0005025E, 0x00000000); + + GPUCMD_Add(0x800F0101, zero, 0x00000007); + + GPUCMD_AddSingleParam(0x000F011F, 0x00010140); + GPUCMD_AddSingleParam(0x000F0100, 0x00E40100); + GPUCMD_AddSingleParam(0x000F0101, 0x01010000); + GPUCMD_AddSingleParam(0x000F0107, 0x00001F40); + GPUCMD_AddSingleParam(0x000F0105, 0xFF00FF10); + + GPUCMD_AddSingleParam(0x00010061, 0x00000003); + GPUCMD_AddSingleParam(0x00010062, 0x00000000); + + GPUCMD_AddSingleParam(0x000F0065, 0x00000000); + GPUCMD_AddSingleParam(0x000F0066, 0x00000000); + GPUCMD_AddSingleParam(0x000F0067, 0x00000000); + + GPUCMD_AddSingleParam(0x00010118, 0x00000000); + GPUCMD_AddSingleParam(0x000F011B, 0x00000000); + + GPUCMD_AddSingleParam(0x0007006A, 0x00FFFFFF); + + GPUCMD_AddSingleParam(0x000F0102, 0x00000003); + + GPUCMD_AddSingleParam(0x00080126, 0x03000000); + + GPUCMD_Add(0x800F0040, zero, 0x00000010); + + param[0x0]=0x1F1F1F1F; + param[0x1]=0x1F1F1F1F; + param[0x2]=0x1F1F1F1F; + param[0x3]=0x1F1F1F1F; + param[0x4]=0x1F1F1F1F; + param[0x5]=0x1F1F1F1F; + param[0x6]=0x1F1F1F1F; + GPUCMD_Add(0x800F0050, param, 0x00000007); + + GPUCMD_AddSingleParam(0x000F0058, 0x00000100); + GPUCMD_AddSingleParam(0x000F004C, 0x00000001); + GPUCMD_AddSingleParam(0x000F006F, 0x00000000); + + GPUCMD_AddSingleParam(0x00020060, 0x00000000); + GPUCMD_AddSingleParam(0x000C0069, 0x00020000); + + GPUCMD_AddSingleParam(0x000F0113, 0x0000000F); + GPUCMD_AddSingleParam(0x000F0112, 0x0000000F); + GPUCMD_AddSingleParam(0x000F0114, 0x00000003); + GPUCMD_AddSingleParam(0x000F0115, 0x00000003); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000000); + + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000100); + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000200); + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000300); + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000400); + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000500); + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F01C5, 0x00000600); + for(i=0;i<32;i++)GPUCMD_Add(0x800F01C8, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F0290, 0x80000000); + for(i=0;i<48;i++)GPUCMD_Add(0x800F0291, zero, 0x00000008); + GPUCMD_AddSingleParam(0x000F02CB, 0x00000000); + for(i=0;i<4;i++)GPUCMD_Add(0x000F02CC, zero, 0x00000080); + GPUCMD_AddSingleParam(0x000F029B, 0x00000200); + + for(i=0;i<28;i++)GPUCMD_Add(0x000F029C, zero, 0x00000080); + + GPUCMD_AddSingleParam(0x000F02BF, 0x00000000); + GPUCMD_AddSingleParam(0x000F02B1, 0x00000000); + GPUCMD_AddSingleParam(0x000F02B2, 0x00000000); + GPUCMD_AddSingleParam(0x000F02B3, 0x00000000); + GPUCMD_AddSingleParam(0x000F02B4, 0x00000000); + + param[0x0]=0xFFFFFFFF; + param[0x1]=0xFFFFFFFF; + GPUCMD_Add(0x800F028B, param, 0x00000002); + + GPUCMD_Add(0x800F0205, zero, 0x00000024); + + for(i=0;i +#include +#include +#include + +u32 gpuResetSequence[]= + {0x000F01D4, 0x00000001, + 0x000F00AE, 0xFEFCF8F0, + 0x000F004D, 0x00BF0000, + 0x000F004E, 0x00000000, + 0x000F004F, 0x00000000, + 0x000F0050, 0x1F1F1F1F, + 0x000F0051, 0x1F1F1F1F, + 0x000F0052, 0x1F1F1F1F, + 0x000F0053, 0x1F1F1F1F, + 0x000F0054, 0x1F1F1F1F, + 0x000F0055, 0x1F1F1F1F, + 0x000F0056, 0x1F1F1F1F, + 0x000F0047, 0x00000000, + 0x000F0048, 0x00000000, + 0x000F0049, 0x00000000, + 0x000F004A, 0x00000000, + 0x000F004B, 0x00000000, + 0x000F006D, 0x00000001, + 0x00020080, 0x00001000, + 0x000F008B, 0x00000000, + 0x000F008F, 0x00000000, + 0x000F00A8, 0x00000009, + 0x000F00A9, 0x00000000, + 0x000F00AA, 0x00000000, + 0x000F00AB, 0x00000000, + 0x000F00AC, 0x01C00301, + 0x000F00AD, 0xE0C08000, + 0x000F00C0, 0x0EEE0EEE, + 0x000F00C1, 0x00000000, + 0x000F00C2, 0x00000000, + 0x000F00C3, 0x00000000, + 0x000F00C4, 0x00000000, + 0x000F00C8, 0x0FFF0FFF, + 0x000F00C9, 0x00000000, + 0x000F00CA, 0x00000000, + 0x000F00CB, 0x00000000, + 0x000F00CC, 0x00000000, + 0x000F00D0, 0x0FFF0FFF, + 0x000F00D1, 0x00000000, + 0x000F00D2, 0x00000000, + 0x000F00D3, 0x00000000, + 0x000F00D4, 0x00000000, + 0x000F00D8, 0x0FFF0FFF, + 0x000F00D9, 0x00000000, + 0x000F00DA, 0x00000000, + 0x000F00DB, 0x00000000, + 0x000F00DC, 0x00000000, + 0x000F00F0, 0x0FFF0FFF, + 0x000F00F1, 0x00000000, + 0x000F00F2, 0x00000000, + 0x000F00F3, 0x00000000, + 0x000F00F4, 0x00000000, + 0x000F00F8, 0x0FFF0FFF, + 0x000F00F9, 0x00000000, + 0x000F00FA, 0x00000000, + 0x000F00FB, 0x00000000, + 0x000F00FC, 0x00000000, + 0x000F00E0, 0x00000000, + 0x000F00E1, 0x00000000, + 0x000F00E4, 0x00003C00, + 0x000F00E5, 0x00003C00, + 0x000F00FD, 0x00000000, + 0x000F0120, 0x00000000, + 0x000F0121, 0x00000000, + 0x000F0122, 0x00000100, + 0x00070126, 0x00000A00, + 0x000D0100, 0x00E40100, + 0x000F0104, 0x00000010, + 0x000F0130, 0x00003C00, + 0x000F0140, 0x00000000, + 0x000F0141, 0x00000000, + 0x000F0142, 0x0CC330CC, + 0x000F0143, 0x00000000, + 0x000F0144, 0x00000000, + 0x000F0145, 0x00003C00, + 0x000F0146, 0x00000000, + 0x000F0147, 0x00000800, + 0x000F0149, 0x00000001, + 0x000F014A, 0x00000000, + 0x000F014B, 0x0003F000, + 0x000F0150, 0x00000000, + 0x000F0151, 0x00000000, + 0x000F0152, 0x00000000, + 0x000F0153, 0x00000000, + 0x000F0154, 0x00000000, + 0x000F0155, 0x00003C00, + 0x000F0156, 0x00000000, + 0x000F0157, 0x00000800, + 0x000F0159, 0x00000001, + 0x000F015A, 0x00000000, + 0x000F015B, 0x0003F000, + 0x000F0160, 0x00000000, + 0x000F0161, 0x00000000, + 0x000F0162, 0x00000000, + 0x000F0163, 0x00000000, + 0x000F0164, 0x00000000, + 0x000F0165, 0x00003C00, + 0x000F0166, 0x00000000, + 0x000F0167, 0x00000800, + 0x000F0169, 0x00000001, + 0x000F016A, 0x00000000, + 0x000F016B, 0x0003F000, + 0x000F0170, 0x00000000, + 0x000F0171, 0x00000000, + 0x000F0172, 0x00000000, + 0x000F0173, 0x00000000, + 0x000F0174, 0x00000000, + 0x000F0175, 0x00003C00, + 0x000F0176, 0x00000000, + 0x000F0177, 0x00000800, + 0x000F0179, 0x00000001, + 0x000F017A, 0x00000000, + 0x000F017B, 0x0003F000, + 0x000F0180, 0x00000000, + 0x000F0181, 0x00000000, + 0x000F0182, 0x00000000, + 0x000F0183, 0x00000000, + 0x000F0184, 0x00000000, + 0x000F0185, 0x00003C00, + 0x000F0186, 0x00000000, + 0x000F0187, 0x00000800, + 0x000F0189, 0x00000001, + 0x000F018A, 0x00000000, + 0x000F018B, 0x0003F000, + 0x000F0190, 0x00000000, + 0x000F0191, 0x00000000, + 0x000F0192, 0x00000000, + 0x000F0193, 0x00000000, + 0x000F0194, 0x00000000, + 0x000F0195, 0x00003C00, + 0x000F0196, 0x00000000, + 0x000F0197, 0x00000800, + 0x000F0199, 0x00000001, + 0x000F019A, 0x00000000, + 0x000F019B, 0x0003F000, + 0x000F01A0, 0x00000000, + 0x000F01A1, 0x00000000, + 0x000F01A2, 0x00000000, + 0x000F01A3, 0x00000000, + 0x000F01A4, 0x00000000, + 0x000F01A5, 0x00003C00, + 0x000F01A6, 0x00000000, + 0x000F01A7, 0x00000800, + 0x000F01A9, 0x00000001, + 0x000F01AA, 0x00000000, + 0x000F01AB, 0x0003F000, + 0x000F01B0, 0x00000000, + 0x000F01B1, 0x00000000, + 0x000F01B2, 0x00000000, + 0x000F01B3, 0x00000000, + 0x000F01B4, 0x00000000, + 0x000F01B5, 0x00003C00, + 0x000F01B6, 0x00000000, + 0x000F01B7, 0x00000800, + 0x000F01B9, 0x00000001, + 0x000F01BA, 0x00000000, + 0x000F01BB, 0x0003F000, + 0x000F01C0, 0x00A0280A, + 0x000F01C2, 0x00000000, + 0x000F01C3, 0x88000400, + 0x000F01C4, 0xFFFFFFFF, + 0x000F01C6, 0x00000001, + 0x000F01D0, 0x02222222, + 0x000F01D1, 0x00000000, + 0x000F01D2, 0x00000000, + 0x000F01D9, 0x00000000, + 0x0008025E, 0x00000000}; + +u32 gpuResetSequenceLength=sizeof(gpuResetSequence)/8;