int InitME(volatile struct me_struct *mei, int devkitVersion) { unsigned int k1; k1 = pspSdkSetK1(0); if (mei == 0) { pspSdkSetK1(k1); return -1; } // initialize the MediaEngine Instance mei->start = 0; mei->done = 1; mei->func = 0; mei->param = 0; mei->result = 0; mei->precache_len = 0; mei->precache_addr = 0; mei->postcache_len = 0; mei->postcache_addr = 0; mei->signals = 0; mei->init = 1; // start the MediaEngine memcpy((void *)0xbfc00040, me_stub, (int)(me_stub_end - me_stub)); _sw((unsigned int)me_loop, 0xbfc00600); // k0 _sw((unsigned int)mei, 0xbfc00604); // a0 sceKernelDcacheWritebackAll(); if (devkitVersion < 0x03070110) { sceSysregMeResetEnable(); sceSysregMeBusClockEnable(); sceSysregMeResetDisable(); } else { sceSysregMeResetEnable371(); sceSysregMeBusClockEnable371(); sceSysregMeResetDisable371(); } //Find SceMeRpc and disable it(causes indefinate wait when handling events, like suspend) PspSysEventHandler *handlers = sceKernelReferSysEventHandler(); while (handlers != NULL){ if (strcmp(handlers->name, "SceMeRpc") == 0){ handler = handlers; sceKernelUnregisterSysEventHandler(handler); break; } handlers = handlers->next; } pspSdkSetK1(k1); return 0; }
int InitME(volatile struct me_struct *mei, int devkitVersion) { unsigned int k1; k1 = pspSdkSetK1(0); if (mei == 0) { pspSdkSetK1(k1); return -1; } // initialize the MediaEngine Instance mei->start = 0; mei->done = 1; mei->func = 0; mei->param = 0; mei->result = 0; mei->precache_len = 0; mei->precache_addr = 0; mei->postcache_len = 0; mei->postcache_addr = 0; mei->signals = 0; mei->init = 1; // start the MediaEngine memcpy((void *)0xbfc00040, me_stub, (int)(me_stub_end - me_stub)); _sw((unsigned int)me_loop, 0xbfc00600); // k0 _sw((unsigned int)mei, 0xbfc00604); // a0 sceKernelDcacheWritebackAll(); if (devkitVersion < 0x03070110) { sceSysregMeResetEnable(); sceSysregMeBusClockEnable(); sceSysregMeResetDisable(); } else { sceSysregMeResetEnable371(); sceSysregMeBusClockEnable371(); sceSysregMeResetDisable371(); } pspSdkSetK1(k1); return 0; }