Пример #1
0
void button_callback(int curr, int last, void *arg)
{
	if((curr & TRIGGER) == TRIGGER)
	{
		sceKernelSetEventFlag(g_eventflag, START_MENU);
	}
}
Пример #2
0
s32 sceUmdModuleStart(s32 argc, void *argp)
{   
    s32 intrState;

	(void)argc;
	(void)argp;
    
    memset(&g_mediaMan, 0, sizeof g_mediaMan);
    
    // TODO: Check assignment order; might be :DMU
    g_umdFileSystem[0] = 'U';
    g_umdFileSystem[1] = 'M';
    g_umdFileSystem[2] = 'D';
    g_umdFileSystem[3] = ':';
      
    g_eventId = sceKernelCreateEventFlag("SceMediaManUser", SCE_KERNEL_EA_MULTI | 0x1, 0, NULL);
    if (g_eventId < 0) 
        return SCE_KERNEL_NO_RESIDENT;
    
    g_isAssigned = SCE_UMD_DEVICE_NOT_ASSIGNED;
    intrState = sceKernelCpuSuspendIntr();
        
    g_driveState |= SCE_UMD_MEDIA_OUT;
    sceKernelSetEventFlag(g_eventId, 1);
        
    sceKernelCpuResumeIntr(intrState);
    return SCE_KERNEL_RESIDENT;
}
Пример #3
0
static int waitTestFunc(SceSize argSize, void* argPointer) {
	sceKernelDelayThread(1000);
	SCHED_LOG(C, 2);
	schedulingResult = sceKernelSetEventFlag(*(int*) argPointer, 0xFFFFFFFF);
	SCHED_LOG(D, 2);
	return 0;
}
Пример #4
0
// Read out the interrupt state and clear it 
static int intr_handler(void *arg) {
	u32 stat;
	stat = _lw(0xBE500040);
	_sw(stat, 0xBE500044);
	sceKernelDisableIntr(PSP_HPREMOTE_INT);
	sceKernelSetEventFlag(g_eventflag, EVENT_SIO);
	return -1;
}
Пример #5
0
//Subroutine sceUmd_982272FE - Address 0x00000444
void sceUmdSetDriveStatus(s32 state)
{
    s32 intrState;
    
    intrState = sceKernelCpuSuspendIntr();
    
    g_driveState |= state;
    sceKernelSetEventFlag(g_eventId, state);
    
    sceKernelCpuResumeIntr(intrState);
}
Пример #6
0
static void PutCharDebug(unsigned short *data, unsigned int type)
{
	int total = 0;

	if((type & 0xFF00) == 0)
	{
		if((type == '\n') || (type == '\r') || (type >= 32))
		{
			total = add_char((unsigned char) type);
		}
	}

	/* If we receive end of string or the buffer is full signal */
	if((type == 0x201) || (total == KPRINTF_BUF_SIZE))
	{
		/* Set event flag */
		sceKernelSetEventFlag(g_eventflag, KPRINTF_EVENT);
	}
}
Пример #7
0
int interruptHandler(int a0 __attribute__((unused)), int SceMediaEngineRpcWait)
{
	sceKernelSetEventFlag(SceMediaEngineRpcWait, 1);
	return -1;
}
Пример #8
0
int main(int argc, char *argv[])
{
    SceCtrlData pad;
    int result;
    int oldButtons = 0;

    pspDebugScreenInit();
    if (argc > 0) {
        printf("Bootpath: %s\n", argv[0]);
    }

    printf("Triangle - Exit\n");
    printf("Square - Set lower 16-bits\n");
    printf("Circle - Clear lower 16-bits\n");
    printf("Cross - Delay + refer status\n");
    printf("R-Trigger - Cancel event flag\n\n");
    printf("L-Trigger - Delete event flag\n\n");

    SetupCallbacks();

    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);

    evid = sceKernelCreateEventFlag("test_ef", PSP_EVENT_WAITMULTIPLE, INITIAL_PATTERN, 0);
    //evid = sceKernelCreateEventFlag("test_ef", 0, INITIAL_PATTERN, 0);
    printf("EVID: %08x pattern %08x\n", evid, INITIAL_PATTERN);
    if (evid >= 0)
    {
        createStartThread("and", and_thread);
        createStartThread("or", or_thread);
        createStartThread("clear", clear_thread);

#if 0
        // testing context switch timing
        sceKernelSetEventFlag(evid, 0x0000FFFF);
        //int buf[64]; for(;;) sceCtrlReadLatch(buf); // sceCtrlReadLatch does not context switch
        for(;;) sceKernelDelayThread(0); // does not wait forever
#else
        while(!done)
        {
            sceCtrlReadBufferPositive(&pad, 1); // context switch in here
            int buttonDown = (oldButtons ^ pad.Buttons) & pad.Buttons;

            if (buttonDown & PSP_CTRL_SQUARE)
            {
                result = sceKernelSetEventFlag(evid, 0x0000FFFF);
                printf("\nsceKernelSetEventFlag result %08x\n", result);
                printSceKernelEventFlagInfo(evid);
            }

            if (buttonDown & PSP_CTRL_CIRCLE)
            {
                //result = sceKernelClearEventFlag(evid, 0x0000FFFF); // bits to clear - bad
                result = sceKernelClearEventFlag(evid, 0xFFFF0000); // bits to keep - ok
                printf("\nsceKernelClearEventFlag result %08x\n", result);
                printSceKernelEventFlagInfo(evid);
            }

            if (buttonDown & PSP_CTRL_CROSS)
            {
                printf("\nsceKernelDelayThreadCB ...\n");
                sceKernelDelayThreadCB(1000);
                printSceKernelEventFlagInfo(evid);
            }

            if (buttonDown & PSP_CTRL_RTRIGGER)
            {
                //result = sceKernelCancelEventFlag(evid, newPattern, addr);
                result = sceKernelCancelEventFlag(evid, INITIAL_PATTERN, 0);
                printf("sceKernelCancelEventFlag result %08x\n", result);
                printSceKernelEventFlagInfo(evid);
            }

            if (buttonDown & PSP_CTRL_LTRIGGER)
            {
                //result = sceKernelCancelEventFlag(evid, newPattern, addr);
                result = sceKernelDeleteEventFlag(evid);
                printf("sceKernelDeleteEventFlag result %08x\n", result);
                evid = 0;
            }

            if (buttonDown & PSP_CTRL_TRIANGLE)
                done = 1;

            oldButtons = pad.Buttons;
            //sceKernelDelayThread(0); // ok, not infinite :)
        }
#endif
    }
    else
    {
        printf("sceKernelCreateEventFlag failed %08x\n", evid);
        sceKernelSleepThreadCB();
    }

    sceKernelExitGame();
    return 0;
}
Пример #9
0
int main(int argc, char **argv) {
	SceUID flag = sceKernelCreateEventFlag("wait1", 0, 0xFFFFFFFF, NULL);
	SceKernelEventFlagInfo flaginfo;

	// Something weird is happening: first time status is garbled?
	sceKernelReferEventFlagStatus(flag, &flaginfo);

	WAIT_TEST_SIMPLE("And 0x00000000", flag, 0, PSP_EVENT_WAITAND, 1);
	WAIT_TEST_SIMPLE("Or 0x00000000", flag, 0, PSP_EVENT_WAITOR, 1);
	WAIT_TEST_SIMPLE("Clear 0x00000000", flag, 0, PSP_EVENT_WAITCLEAR, 1);
	WAIT_TEST_SIMPLE("Wrong (0x04) 0x00000000", flag, 0, 0x04, 1);
	WAIT_TEST_SIMPLE("Wrong (0xFF) 0x00000000", flag, 0, 0xFF, 1);

	WAIT_TEST_SIMPLE("And 0x00000001", flag, 1, PSP_EVENT_WAITAND, 1);
	WAIT_TEST_SIMPLE("Or 0x00000001", flag, 1, PSP_EVENT_WAITOR, 1);
	WAIT_TEST_SIMPLE("Clear 0x00000001", flag, 1, PSP_EVENT_WAITCLEAR, 1);
	WAIT_TEST_SIMPLE("Wrong (0x02) 0x00000001", flag, 1, 0x02, 1);
	WAIT_TEST_SIMPLE("Wrong (0x04) 0x00000001", flag, 1, 0x04, 1);
	WAIT_TEST_SIMPLE("Wrong (0x08) 0x00000001", flag, 1, 0x08, 1);
	WAIT_TEST_SIMPLE("Wrong (0x40) 0x00000001", flag, 1, 0x40, 1);
	WAIT_TEST_SIMPLE("Wrong (0x80) 0x00000001", flag, 1, 0x80, 1);
	WAIT_TEST_SIMPLE("Wrong (0xFF) 0x00000001", flag, 1, 0xFF, 1);

	sceKernelSetEventFlag(flag, 0xFFFFFFFF);
	WAIT_TEST_SIMPLE("Clear/Or 0x00000000", flag, 0, PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITOR, 1);

	sceKernelSetEventFlag(flag, 0xFFFFFFFF);
	WAIT_TEST_SIMPLE("Clear/Or 0x00000001", flag, 1, PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITOR, 1);

	sceKernelSetEventFlag(flag, 0xFFFFFFFF);
	WAIT_TEST_SIMPLE("Clear/Or 0x00000001 (no out bits)", flag, 1, PSP_EVENT_WAITCLEAR | PSP_EVENT_WAITOR, 0);

	sceKernelSetEventFlag(flag, 0xFFFFFFFF);
	WAIT_TEST_SIMPLE_TIMEOUT("0xFFFFFFFF & 0x00000000", flag, 0x00000000, PSP_EVENT_WAITAND, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("0xFFFFFFFF & 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("0xFFFFFFFF | 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR, 500);
	sceKernelClearEventFlag(flag, 0x0000FFFF);
	WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF & 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF | 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF & 0xFFFFFFFF with clear", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND | PSP_EVENT_WAITCLEAR, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF | 0xFFFFFFFF with clear", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, 500);
	sceKernelClearEventFlag(flag, 0x0000FFFF);
	WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF & 0xFFFFFFFF with clear all", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND | PSP_EVENT_WAITCLEARALL, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("0x0000FFFF | 0xFFFFFFFF with clear all", flag, 0xFFFFFFFF, PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEARALL, 500);
	sceKernelClearEventFlag(flag, 0x00000000);
	WAIT_TEST_SIMPLE_TIMEOUT("0x00000000 & 0xFFFFFFFF", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 500);
	WAIT_TEST_SIMPLE_TIMEOUT("Zero timeout", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 0);
	WAIT_TEST_SIMPLE_TIMEOUT("5ms timeout", flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, 5);

	// Set off thread.
	schedulingLogPos = 0;
	schedulingPlacement = 1;
	SCHED_LOG(A, 1);
	SceUInt timeout = 5000;
	SceUID thread = sceKernelCreateThread("waitTest", (void *)&waitTestFunc, 0x12, 0x10000, 0, NULL);
	sceKernelStartThread(thread, sizeof(flag), &flag);
	SCHED_LOG(B, 1);
	int result = sceKernelWaitEventFlag(flag, 0xFFFFFFFF, PSP_EVENT_WAITAND, NULL, &timeout);
	SCHED_LOG(E, 1);
	printf("Wait timeout: %s (thread=%08X, main=%08X, remaining=%d)\n", schedulingLog, schedulingResult, result, (timeout + 5) / 1000);

	sceKernelDeleteEventFlag(flag);

	SceUID deleteThread = CREATE_SIMPLE_THREAD(deleteMeFunc);
	flag = sceKernelCreateEventFlag("wait1", 0, 0x00000000, NULL);
	sceKernelStartThread(deleteThread, sizeof(int), &flag);
	sceKernelDelayThread(500);
	sceKernelDeleteEventFlag(flag);

	WAIT_TEST_SIMPLE("NULL", 0, 0, PSP_EVENT_WAITAND, 0);
	WAIT_TEST_SIMPLE("Invalid", 0xDEADBEEF, 0, PSP_EVENT_WAITAND, 0);
	WAIT_TEST_SIMPLE("Deleted", flag, 0, PSP_EVENT_WAITAND, 0);

	BASIC_SCHED_TEST("NULL",
		result = sceKernelWaitEventFlag(0, 0xFFFFFFFF, PSP_EVENT_WAITAND, NULL, NULL);
	);