KINGx - Das inoffizielle PlayStation Forum & News Portal
Plugin problem beim Boot - Druckversion

+- KINGx - Das inoffizielle PlayStation Forum & News Portal (http://www.kingx.de/forum)
+-- Forum:    PS Vita / PSP (/forumdisplay.php?fid=1)
+--- Forum: Homebrew (/forumdisplay.php?fid=8)
+---- Forum: Development (/forumdisplay.php?fid=34)
+---- Thema: Plugin problem beim Boot (/showthread.php?tid=22545)


Plugin problem beim Boot - dx3m - 22.08.2010 19:08

Hey leute,

Kleine frage. Ich hab ein Plugin geschrieben und via sceCtrlPeekBufferPositive die CTRL angesprochen. Das ganze hab ich in einen seperaten Thread und dort läuft eine while schleife..

Mein Problem ist das die PSP booted und dann hängen bleibt und erst wieder etwas macht wenn ich die taste die ich definiert habe gedrückt wird!

Edit: Hab was vergessen.. Es sollte so sein das die PSP verwendbar ist und wenn dann diese bestimmte taste gedrückt wird die funktion macht!

Hoffe ihr könnt mir helfen Smile


RE: Plugin problem beim Boot - anmabagima - 23.08.2010 07:50

Hi,

so ganz ohne Code-Beispiel ist das schwer zu sagen was du falsch machst...meine Vermutung ist, dass dein Code etwa so aussieht:

PHP-Code:
while (1){
sceCtrlReadBufferPositive(&pad1);
if (
pad.Button &ampPSP_CTRL_CROSS) {
...
mach irgendwas
break;
}


Das oft gemachte Problem ist, dass diese Schleife die PSP komplett blockiert das in dem Kooperativen-Thread-Modell kein anderer Thread mehr an die Reihe kommt. Um das sicherzustellen muss der laufende Thread immer kurz in den "Schlafmodus" versetzt werden. Das geht über:

PHP-Code:
sceKernelDelayThread(10000); 


Der Code sollte also so aussehen:

PHP-Code:
while (1){
sceCtrlReadBufferPositive(&pad1);
if (
pad.Button &ampPSP_CTRL_CROSS) {
...
mach irgendwas
break;
}
sceKernelDelayThread(10000);




RE: Plugin problem beim Boot - dx3m - 23.08.2010 20:50

Ja ich hab die While schleife durchlaufen lassen :/

Hier der falsche code der die PSP aufhängen lässt:

Code:
int main_thread(SceSize args, void *argp)
{
    sceKernelDelayThread(3*1000*1000);
    SceCtrlData pad;
    while(1)
    {
        sceCtrlPeekBufferPositive(&pad, 1);
        if((pad.Buttons & PSP_CTRL_LTRIGGER) && (pad.Buttons & PSP_CTRL_START))
        {
            //Command!
        }
    }
    return 0;
}


Ich danke dir nochmal Smile


RE: Plugin problem beim Boot - HacKmaN - 24.08.2010 11:37

Es gibt noch 2 Möglichkeiten die viel, viel, viel einfacher sind.
1. Du kannst vshCtrlReadBufferPositive hooken

Code:
int (* vshCtrlReadBufferPositive_Real) (SceCtrlData *pad, int count) = NULL;
int vshCtrlReadBufferPositive_Patch(SceCtrlData *pad, int count)
{
    int ret = vshCtrlReadBufferPositive_Real(pad, count);
    if(pad->Buttons & (PSP_CTRL_START | PSP_CTRL_RTRIGGER))
    {
        // mach irgendwas
    };
    
    return ret;
};

// bla bla bla
u32 addr = 0;
addr = sctrlHENFindFunction("sceVshBridge_Driver", "sceVshBridge", 0xC6395C03);
if(addr <= 0)
   // Fehler, nicht weiter machen

vshCtrlReadBufferPositive_Real = (void *)addr;
sctrlHENPatchSyscall(addr, vshCtrlReadBufferPositive_Patch);


2. Du kannst mit sceCtrlRegisterButtonCallback nen Callback aktivieren. Die Funktion wird aber nicht vom pspsdk hinzugefügt, deshalb musst du sie selber linken:

Code:
int (* sceCtrlRegisterButtonCallback) (int no, unsigned int mask, void(*) (int, int, void *), void *arg) = NULL;

int callback_func(int *a0, int *a1, void *a2)
{
    // mach irgendwas
};

// bla bla bla
sceCtrlRegisterButtonCallback = (void *)sctrlHENFindFunction("sceController_Service", "sceCtrl_driver", 0x5c56c779);

// bla bla bla
sceCtrlRegisterButtonCallback(0, PSP_CTRL_LTRIGGER | PSP_CTRL_START, (void *)callback_func, NULL);
// ich weiß nicht ob die Funktion so einfach mit mehreren Tasten funktioniert... sollte sie aber (falls sie einfach die Variable in der die Tasten sind per bitweißem AND prüft)


Beispiel warum es funktionieren sollte:
In einer SceCtrlData->Buttons Variable sind die Tasten PSP_CTRL_LTRIGGER, PSP_CTRL_RTRIGGER, PSP_CTRL_CROSS und PSP_CTRL_START:

Code:
0000 0000 0000 0001 0000 0000 // LTRIGGER
| 0000 0000 0000 0010 0000 0000 // RTRIGGER
| 0000 0000 0100 0000 0000 0000 // CROSS
| 0000 0000 0000 0000 0000 1000 // START
-----------------------------------------------
  0000 0000 0100 0011 0000 1000


Die Bit-Maske mit der geprüft wird (LTRIGGER und START):

Code:
0000 0000 0000 0001 0000 0000 // LTRIGGER
| 0000 0000 0000 0000 0000 1000 // START
-----------------------------------------------
  0000 0000 0000 0001 0000 1000


Jetzt wird geprüft (mit bitweißem AND):

Code:
0000 0000 0100 0011 0000 1000
& 0000 0000 0000 0001 0000 1000
----------------------------------
  0000 0000 0000 0001 0000 1000


-> Test erfolgreich, da Ergebnis gleich Test-Maske