]> Chaos Git - corbenik/ctrulib.git/commitdiff
various fixes
authorsmea <smealum@gmail.com>
Sun, 19 Jan 2014 20:49:01 +0000 (21:49 +0100)
committersmea <smealum@gmail.com>
Sun, 19 Jan 2014 20:49:01 +0000 (21:49 +0100)
arm11u/Makefile
arm11u/source/costable.h [new file with mode: 0644]
arm11u/source/main.c
libctru/include/ctr/APT.h
libctru/include/ctr/svc.h
libctru/include/ctr/types.h
libctru/source/APT.c
libctru/source/svc.s

index 02d21922b49ed2464c6597901e84e40ed3f56362..656b8dbefbf179b837611da0254f3fc35be55b0a 100644 (file)
@@ -2,7 +2,7 @@ CC = arm-none-eabi-gcc
 LINK = arm-none-eabi-ld
 OBJCOPY = arm-none-eabi-objcopy
 CTRULIB = "../libctru"
-CFLAGS += -Wall -std=c99 -march=armv6 -O0 -I"$(CTRULIB)/include"
+CFLAGS += -Wall -std=c99 -march=armv6 -O3 -I"$(CTRULIB)/include"
 LDFLAGS += --script=ccd00.ld -L"$(DEVKITARM)/arm-none-eabi/lib" -L"$(CTRULIB)/lib"
 
 CFILES = $(wildcard source/*.c)
diff --git a/arm11u/source/costable.h b/arm11u/source/costable.h
new file mode 100644 (file)
index 0000000..1c9b8ec
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef COSTABLE_H
+#define COSTABLE_H
+
+s32 costable[] = {4096, 4095, 4094, 4093, 4091, 4088, 4084, 4080, 4076, 4071, 4065, 4058, 4051, 4044, 4035, 4026, 4017, 4007, 3996, 3985, 3973, 3960, 3947, 3934, 3919, 3904, 3889, 3873, 3856, 3839, 3821, 3803, 3784, 3765, 3744, 3724, 3703, 3681, 3659, 3636, 3612, 3588, 3564, 3539, 3513, 3487, 3461, 3434, 3406, 3378, 3349, 3320, 3290, 3260, 3229, 3198, 3167, 3135, 3102, 3069, 3035, 3002, 2967, 2932, 2897, 2861, 2825, 2788, 2751, 2714, 2676, 2638, 2599, 2560, 2521, 2481, 2441, 2401, 2360, 2318, 2277, 2235, 2193, 2150, 2107, 2064, 2020, 1976, 1932, 1888, 1843, 1798, 1753, 1707, 1662, 1616, 1569, 1523, 1476, 1429, 1382, 1334, 1287, 1239, 1191, 1143, 1095, 1046, 997, 949, 900, 851, 801, 752, 703, 653, 603, 554, 504, 454, 404, 354, 304, 254, 204, 153, 103, 53, 3, -46, -97, -147, -197, -247, -297, -347, -398, -448, -497, -547, -597, -647, -696, -746, -795, -844, -893, -942, -991, -1040, -1088, -1137, -1185, -1233, -1281, -1328, -1376, -1423, -1470, -1517, -1563, -1610, -1656, -1701, -1747, -1792, -1837, -1882, -1927, -1971, -2015, -2058, -2102, -2144, -2187, -2229, -2271, -2313, -2354, -2395, -2436, -2476, -2516, -2555, -2594, -2633, -2671, -2709, -2747, -2784, -2820, -2857, -2892, -2928, -2963, -2997, -3031, -3065, -3098, -3130, -3163, -3194, -3225, -3256, -3286, -3316, -3345, -3374, -3402, -3430, -3457, -3484, -3510, -3536, -3561, -3585, -3609, -3633, -3656, -3678, -3700, -3721, -3742, -3762, -3782, -3801, -3819, -3837, -3854, -3871, -3887, -3902, -3917, -3932, -3946, -3959, -3971, -3983, -3995, -4005, -4016, -4025, -4034, -4042, -4050, -4057, -4064, -4070, -4075, -4080, -4084, -4087, -4090, -4092, -4094, -4095, -4095, -4095, -4094, -4093, -4091, -4088, -4085, -4081, -4076, -4071, -4066, -4059, -4052, -4045, -4036, -4028, -4018, -4008, -3997, -3986, -3974, -3962, -3949, -3935, -3921, -3906, -3891, -3875, -3858, -3841, -3824, -3805, -3787, -3767, -3747, -3727, -3705, -3684, -3662, -3639, -3615, -3592, -3567, -3542, -3517, -3491, -3464, -3437, -3409, -3381, -3353, -3324, -3294, -3264, -3233, -3202, -3171, -3139, -3106, -3073, -3040, -3006, -2972, -2937, -2902, -2866, -2830, -2793, -2756, -2719, -2681, -2643, -2604, -2565, -2526, -2486, -2446, -2406, -2365, -2324, -2282, -2240, -2198, -2156, -2113, -2069, -2026, -1982, -1938, -1894, -1849, -1804, -1759, -1713, -1668, -1622, -1575, -1529, -1482, -1435, -1388, -1341, -1293, -1245, -1197, -1149, -1101, -1052, -1004, -955, -906, -857, -808, -758, -709, -660, -610, -560, -510, -460, -411, -360, -310, -260, -210, -160, -110, -60, -9, 40, 90, 140, 191, 241, 291, 341, 391, 441, 491, 541, 591, 640, 690, 739, 789, 838, 887, 936, 985, 1033, 1082, 1130, 1179, 1227, 1274, 1322, 1370, 1417, 1464, 1511, 1557, 1604, 1650, 1695, 1741, 1786, 1831, 1876, 1921, 1965, 2009, 2053, 2096, 2139, 2182, 2224, 2266, 2308, 2349, 2390, 2431, 2471, 2511, 2550, 2589, 2628, 2666, 2704, 2742, 2779, 2816, 2852, 2888, 2923, 2958, 2993, 3027, 3060, 3093, 3126, 3158, 3190, 3221, 3252, 3282, 3312, 3342, 3370, 3399, 3426, 3454, 3480, 3507, 3532, 3557, 3582, 3606, 3630, 3653, 3675, 3697, 3718, 3739, 3759, 3779, 3798, 3817, 3835, 3852, 3869, 3885, 3900, 3915, 3930, 3944, 3957, 3970, 3982, 3993, 4004, 4014, 4024, 4033, 4041, 4049, 4056, 4063, 4069, 4074, 4079, 4083, 4087, 4090, 4092, 4094, 4095};
+
+#endif
index 8842b97ac9337157bb02be0c7cc99b0d20f9122f..709ebfe5967b3a6e2e3a32fe414262ddba66bc0d 100644 (file)
@@ -5,13 +5,16 @@
 #include <ctr/srv.h>
 #include <ctr/APT.h>
 #include <ctr/GSP.h>
+#include <ctr/HID.h>
 #include <ctr/svc.h>
+#include "costable.h"
 
-int main()
+Handle srvHandle;
+Handle APTevents[2];
+
+void aptInit()
 {
-       Handle srvHandle, aptuHandle;
-       
-       getSrvHandle(&srvHandle);
+       Handle aptuHandle;
        
        //initialize APT stuff, escape load screen
        srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
@@ -19,9 +22,8 @@ int main()
        svc_closeHandle(aptuHandle);
        svc_sleepThread(0x50000);
        
-       Handle hmEvent;
        srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
-       APT_Initialize(aptuHandle, 0x300, &hmEvent, NULL);
+       APT_Initialize(aptuHandle, 0x300, &APTevents[0], &APTevents[1]);
        svc_closeHandle(aptuHandle);
        svc_sleepThread(0x50000);
        
@@ -29,9 +31,18 @@ int main()
        APT_Enable(aptuHandle, 0x0);
        svc_closeHandle(aptuHandle);
        svc_sleepThread(0x50000);
+}
 
+u8* gspHeap;
+u32* gxCmdBuf;
+Handle gspGpuHandle;
+
+u8 currentBuffer;
+u8* topLeftFramebuffers[2];
+
+void gspGpuInit()
+{
        //do stuff with GPU...
-       Handle gspGpuHandle;
        srv_getServiceHandle(srvHandle, &gspGpuHandle, "gsp::Gpu");
 
        GSPGPU_AcquireRight(gspGpuHandle, 0x0);
@@ -42,7 +53,6 @@ int main()
        GSPGPU_WriteHWRegs(gspGpuHandle, 0x202A04, (u8*)&regData, 4);
 
        //grab main left screen framebuffer addresses
-       u8* topLeftFramebuffers[2];
        GSPGPU_ReadHWRegs(gspGpuHandle, 0x400468, (u8*)&topLeftFramebuffers, 8);
 
        //convert PA to VA (assuming FB in VRAM)
@@ -57,45 +67,92 @@ int main()
        svc_mapMemoryBlock(gspSharedMemHandle, 0x10002000, 0x3, 0x10000000);
 
        //map GSP heap
-       u8* gspHeap;
        svc_controlMemory((u32*)&gspHeap, 0x0, 0x0, 0x2000000, 0x10003, 0x3);
 
-       int i;
-       for(i=1;i<0x600000;i++)
-       {
-               gspHeap[i]=0xFF^gspHeap[i-1];
-       }
-
        //wait until we can write stuff to it
        svc_waitSynchronization1(gspEvent, 0x55bcb0);
 
-       // //GSP shared mem : 0x2779F000
-       // //write GX command ! (to GSP shared mem, at 0x10002000)
-       u32* gxCmdBuf=(u32*)(0x10002000+0x800+threadID*0x200);
-       u32 gxCommand[0x8];
+       //GSP shared mem : 0x2779F000
+       gxCmdBuf=(u32*)(0x10002000+0x800+threadID*0x200);
 
+       currentBuffer=0;
+}
+
+void swapBuffers()
+{
+       u32 regData;
+       GSPGPU_ReadHWRegs(gspGpuHandle, 0x400478, (u8*)&regData, 4);
+       regData^=1;
+       currentBuffer=regData&1;
+       GSPGPU_WriteHWRegs(gspGpuHandle, 0x400478, (u8*)&regData, 4);
+}
+
+void copyBuffer()
+{
+       //copy topleft FB
+       u8 copiedBuffer=currentBuffer^1;
+       u8* bufAdr=&gspHeap[0x46500*copiedBuffer];
+       GSPGPU_FlushDataCache(gspGpuHandle, bufAdr, 0x46500);
        //GX RequestDma
+       u32 gxCommand[0x8];
        gxCommand[0]=0x00; //CommandID
-       gxCommand[1]=(u32)gspHeap; //source address
-       // gxCommand[2]=(u32)topLeftFramebuffers[0]; //destination address
-       gxCommand[2]=0x1F000000; //destination address
-       // gxCommand[3]=0x5DC00*2; //size
-       gxCommand[3]=0x600000; //size
+       gxCommand[1]=(u32)bufAdr; //source address
+       gxCommand[2]=(u32)topLeftFramebuffers[copiedBuffer]; //destination address
+       gxCommand[3]=0x46500; //size
        gxCommand[4]=gxCommand[5]=gxCommand[6]=gxCommand[7]=0x0;
 
        GSPGPU_submitGxCommand(gxCmdBuf, gxCommand, gspGpuHandle);
+}
 
-       // debug
-       regData=0x010000FF;
-       GSPGPU_WriteHWRegs(gspGpuHandle, 0x202A04, (u8*)&regData, 4);
+s32 pcCos(u16 v)
+{
+       return costable[v&0x1FF];
+}
 
-       svc_waitSynchronization1(hmEvent, 0xffffffffffffffff);
+void renderEffect()
+{
+       u8* bufAdr=&gspHeap[0x46500*currentBuffer];
 
-       // debug
-       regData=0x0100FFFF;
-       GSPGPU_WriteHWRegs(gspGpuHandle, 0x202A04, (u8*)&regData, 4);
+       int i, j;
+       for(i=1;i<400;i++)
+       {
+               for(j=1;j<240;j++)
+               {
+                       u32 v=(j+i*240)*3;
+                       bufAdr[v]=(pcCos(i)+4096)/32;
+                       bufAdr[v+1]=0x00;
+                       bufAdr[v+2]=0xFF*currentBuffer;
+               }
+       }
+}
 
-       while(1);
+int main()
+{
+       getSrvHandle(&srvHandle);
+       
+       aptInit();
+
+       gspGpuInit();
+
+       Handle hidHandle;
+       Handle hidMemHandle;
+       srv_getServiceHandle(srvHandle, &hidHandle, "hid:USER");
+       HIDUSER_GetInfo(hidHandle, &hidMemHandle);
+       svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
+
+       HIDUSER_Init(hidHandle);
+
+       while(1)
+       {
+               u32 PAD=((u32*)0x10000000)[7];
+               renderEffect();
+               swapBuffers();
+               copyBuffer();
+               u32 regData=PAD|0x01000000;
+               GSPGPU_WriteHWRegs(gspGpuHandle, 0x202A04, (u8*)&regData, 4);
+               svc_sleepThread(1000000000);
+       }
 
+       svc_exitProcess();
        return 0;
 }
index c1844002644d4c256a7bbd3fe82432ffd95d802c..1516bc0ba50ced29a2b4fb4c4f620ff6fe075324 100644 (file)
@@ -6,5 +6,6 @@ void APT_Initialize(Handle handle, u32 a, Handle* eventHandle1, Handle* eventHan
 Result APT_Enable(Handle handle, u32 a);
 Result APT_PrepareToJumpToHomeMenu(Handle handle);
 Result APT_JumpToHomeMenu(Handle handle, u32 a, u32 b, u32 c);
+u8 APT_InquireNotification(Handle handle, u32 appID);
 
 #endif
index cbf109e76b4fbdb2dfaf136edc2b0f3ae4ab7496..c9afe0325d41629b0d1a11f1d00aaa13769254ba 100644 (file)
@@ -8,6 +8,7 @@
        Result svc_createEvent(Handle* event, u8 resettype);
        Result svc_mapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission);
        Result svc_waitSynchronization1(Handle handle, s64 nanoseconds);
+       Result svc_waitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds);
        Result svc_closeHandle(Handle handle);
        Result svc_connectToPort(volatile Handle* out, const char* portName);
        Result svc_sendSyncRequest(Handle session);
index 5e59346abb8fd38cf3767e88ba54d8c254574ae2..b69887c87bc270b84759a0bcad50045e981bd115 100644 (file)
@@ -2,6 +2,7 @@
 #define TYPES_H
 
        #include <stdint.h>
+       #include <stdbool.h>
 
        typedef unsigned char u8;
        typedef unsigned short u16;
index 853f1b257c58fe6c2b930167340fa6df48e6d9b2..4beceb8a9692e048b44fc9a46ad5e80731b4bc88 100644 (file)
@@ -34,6 +34,15 @@ Result APT_Enable(Handle handle, u32 a)
        return svcData[1];
 }
 
+u8 APT_InquireNotification(Handle handle, u32 appID)
+{
+       u32* svcData=svc_getData();
+       svcData[0]=0xB0040; //request header code
+       svcData[1]=appID;
+       svc_sendSyncRequest(handle); //check return value...
+       return svcData[2];
+}
+
 Result APT_PrepareToJumpToHomeMenu(Handle handle)
 {
        u32* svcData=svc_getData();
index c0e821a1971515ab4132a200dc06f96998799900..eb3d6e3436efd49da7db75a54dabcd19d67fc11d 100644 (file)
@@ -62,6 +62,18 @@ svc_waitSynchronization1:
        svc 0x24
        bx lr
 
+.global svc_waitSynchronizationN
+.type svc_waitSynchronizationN, %function
+svc_waitSynchronizationN:
+       stmfd sp!, {r5}
+       mov r5, r0
+       ldr r0, [sp, #0x4]
+       ldr r4, [sp, #0x4+0x4]
+       svc 0x25
+       str r1, [r5]
+       ldmfd sp!, {r5}
+       bx lr
+
 .global svc_connectToPort
 .type svc_connectToPort, %function
 svc_connectToPort: