[PSP] Modulos, incognitas

No se si es que soy la persona mas tonta sobre la faz de la tierra o que pasa.

Aver lo que quiero es trabajar con el wifi en modo adhoc pero esque para empezar nada me funciona ni lo mas basico.

Por lo visto hay 20000 formas de iniciarlo o eso creo:

sceNetAdhocInit( void ); ( no me funciona )
pspSdkLoadInetModules(); ( segun el resultado da correcto pero al seguir por ejemplo con crear un objeto pdp ya nada )

Luego Por otra parte hay la forma de cargar modulos:

pspSdkLoadStartModule(const char *filename, int mpid); ( no me va )
sceKernelLoadModule(const char *path, int flags, SceKernelLMOption *option); + sceKernelLoadModuleByID(SceUID fid, int flags, SceKernelLMOption *option); + sceKernelStartModule(SceUID modid, SceSize argsize, void *argp, int *status, SceKernelSMOption *option);
( tampoco me carga , de hecho si no recuerdo mal ya solo en la carga da un error con cualquier prx que intente cargar de la flash: me da este error SCE_KERNEL_ERROR_LIBRARY_NOT_YET_LINKED = 0x8002013a )

por que no me funciona nada ¿? incognita , por que hay programas que si no pensaria que todas las librerias esas estan para hacer bonito

Andoba probe ejemplos que pusiste por ai pero nada
Alguien de verdad puede poner algo o explicar algo , no logro nada
Para cargar un módulo puedes provar esto [360º] :
SceUID load_module(const char *path, int flags, int type)
{
   SceKernelLMOption option;
   SceUID mpid;

   /* If the type is 0, then load the module in the kernel partition, otherwise load it
      in the user partition. */
   if (type == 0) {
      mpid = 1;
   } else {
      mpid = 2;
   }

   memset(&option, 0, sizeof(option));
   option.size = sizeof(option);
   option.mpidtext = mpid;
   option.mpiddata = mpid;
   option.position = 0;
   option.access = 1;

   return sceKernelLoadModule(path, flags, type > 0 ? &option : NULL);
}

int main(){
SceUID modid;
   
   SceModule *mod;
   
   int ret;
pspDebugScreenInit();
modid = load_module("ms0:/mymodule.prx", 0, 0);
    mod = sceKernelFindModuleByUID(modid);     
    if(mod != NULL){
    printf("\n\n\n Loading recovery mode...");
   ret = sceKernelStartModule(modid, 0, NULL, &fd, NULL);
   sceKernelExitDeleteThread(0);
    }


Saludos [360º]
Eso ya lo utilice que es lo que viene en los ejemplos y tambien lo copio eso o parecido Andoba pero gracias de toas

he visto esto:
/* WARNING: This sample currently crashes, due to a bug in the PSP's kernel.  We're working on a fix. */

#include <pspuser.h>
#include <pspdebug.h>
#include <pspsdk.h>
#include <string.h>

/* Define the module info section, note the 0x1000 flag to enable start in kernel mode */
PSP_MODULE_INFO("SDKTEST", 0x1000, 1, 1);

PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);

/* Define printf, just to make typing easier */
#define printf   pspDebugScreenPrintf

/* List of modules to load - type is 0 if the module belongs to the kernel, 1 if it's a user module. */
struct module_list {
   int         type;
   const char *path;
} module_list[] = {
   { 0, "flash0:/kd/ifhandle.prx" },
   { 1, "flash0:/kd/pspnet.prx" }
};
const int module_count = sizeof(module_list) / sizeof(module_list[0]);

SceUID load_module(const char *path, int flags, int type);


void MyExceptionHandler(PspDebugRegBlock *regs)
{
   printf("\n\n");
   pspDebugDumpException(regs);
}

/* This function is called by the startup code before main() is called.  Since
   it runs in kernel mode we can access kernel-only features. */
__attribute__((constructor))
void KernelSetup(void)
{
   pspDebugScreenInit();
   pspDebugInstallKprintfHandler(NULL);
   pspDebugInstallErrorHandler(MyExceptionHandler);

   /* Very important - patch the module manager so that we can load modules from user mode. */
   pspSdkInstallNoDeviceCheckPatch();
}

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
   sceKernelExitGame();
   return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp)
{
   int cbid;

   cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
   sceKernelRegisterExitCallback(cbid);

   sceKernelSleepThreadCB();

   return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
   int thid = 0;

   /* Note the use of THREAD_ATTR_USER to ensure the callback thread is in user mode */
   thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, PSP_THREAD_ATTR_USER, NULL);
   if(thid >= 0)
   {
      sceKernelStartThread(thid, 0, 0);
   }

   return thid;
}

SceUID load_module(const char *path, int flags, int type)
{
   SceKernelLMOption option;
   SceUID mpid;

   /* If the type is 0, then load the module in the kernel partition, otherwise load it
      in the user partition. */
   if (type == 0) {
      mpid = 1;
   } else {
      mpid = 2;
   }

   memset(&option, 0, sizeof(option));
   option.size = sizeof(option);
   option.mpidtext = mpid;
   option.mpiddata = mpid;
   option.position = 0;
   option.access = 1;

   return sceKernelLoadModule(path, flags, &option);
}

int main(void)
{
   int i;

   SetupCallbacks();

   printf("Loadmodule sample program.\n\n");

   /* Try loading and starting the network modules. */
   for (i = 0; i < module_count; i++) {
      SceUID modid;
      int res, status;

      modid = load_module(module_list[i].path, 0, module_list[i].type);
      if (modid < 0) {
         printf("sceKernelLoadModule('%s') failed with %x\n", module_list[i].path, modid);
         break;
      }

      res = sceKernelStartModule(modid, 0, NULL, &status, NULL);
      if (res < 0) {
         printf("sceKernelStartModule('%s') failed with %x\n", module_list[i].path, res);
         break;
      }

      printf("Load and start '%s' - Success\n", module_list[i].path);
   }

   printf("\nAll done!\n");

   sceKernelSleepThread();
   return 0;
}


pero esto no tira deja la psp colgada. El propio codigo lo dice pero como seria para que tirase correctamente sin que quede colgada ?
Hola kYp. No sé si ya habrás arreglado el código, pero visto que no hay respuestas, este sería un código que por lo menos tira.

/* WARNING: This sample currently crashes, due to a bug in the PSP's kernel.  We're working on a fix. */

#include <pspuser.h>
#include <pspdebug.h>
#include <pspsdk.h>
#include <string.h>

/* Define the module info section, note the 0x1000 flag to enable start in kernel mode */
PSP_MODULE_INFO("SDKTEST", 0x1000, 1, 1);

PSP_MAIN_THREAD_ATTR(0);

/* Define printf, just to make typing easier */
#define printf   pspDebugScreenPrintf

/* List of modules to load - type is 0 if the module belongs to the kernel, 1 if it's a user module. */
struct module_list {
   int         type;
   const char *path;
} module_list[] = {
   { 0, "flash0:/kd/ifhandle.prx" },
   { 1, "flash0:/kd/pspnet.prx" }
};
const int module_count = sizeof(module_list) / sizeof(module_list[0]);

SceUID load_module(const char *path, int flags, int type);


void MyExceptionHandler(PspDebugRegBlock *regs)
{
        printf("\n\n");
   pspDebugDumpException(regs);
}

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
   sceKernelExitGame();
   return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp)
{
   int cbid;

   cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
   sceKernelRegisterExitCallback(cbid);

   sceKernelSleepThreadCB();

   return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
   int thid = 0;

   /* Note the use of THREAD_ATTR_USER to ensure the callback thread is in user mode */
   thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, PSP_THREAD_ATTR_USER, NULL);
   if(thid >= 0)
   {
      sceKernelStartThread(thid, 0, 0);
   }

   return thid;
}

SceUID load_module(const char *path, int flags, int type)
{
   SceKernelLMOption option;
   SceUID mpid;

   /* If the type is 0, then load the module in the kernel partition, otherwise load it
      in the user partition. */
   if (type == 0) {
      mpid = 1;
   } else {
      mpid = 2;
   }

   memset(&option, 0, sizeof(option));
   option.size = sizeof(option);
   option.mpidtext = mpid;
   option.mpiddata = mpid;
   option.position = 0;
   option.access = 1;

   return sceKernelLoadModule(path, flags, &option);
}

int main(void)
{
   int i;

   SetupCallbacks();

   pspDebugInstallKprintfHandler(NULL);
   pspDebugInstallErrorHandler(MyExceptionHandler);

   // Very important - patch the module manager so that we can load modules from user mode.
   pspSdkInstallNoDeviceCheckPatch();

   pspDebugScreenInit();

   printf("Loadmodule sample program.\n\n");

   /* Try loading and starting the network modules. */
   for (i = 0; i < module_count; i++) {
      SceUID modid;
      int res, status;

      modid = load_module(module_list[i].path, 0, module_list[i].type);
      if (modid < 0) {
         printf("sceKernelLoadModule('%s') failed with %x\n", module_list[i].path, modid);
         break;
      }

      res = sceKernelStartModule(modid, 0, NULL, &status, NULL);
      if (res < 0) {
         printf("sceKernelStartModule('%s') failed with %x\n", module_list[i].path, res);
         break;
      }

      printf("Load and start '%s' - Success\n", module_list[i].path);
   }

   printf("\nAll done!\n");

   sceKernelSleepThread();
   return 0;
}

He cambiado un par de cosas.

Por un lado, la aplicación se debería ejecutar en modo kernel, y así lo indicas en la información que se guarda del módulo con "PSP_MODULE_INFO("SDKTEST", 0x1000, 1, 1);" pero después declaras el hilo como de usuario con "PSP_THREAD_ATTR_USER", lo cual debes cambiar por 0, para indicar que el hilo correrá en modo kernel.

Por otro lado, parece que el uso de la función "KernelSetup" con el modificador "__attribute__((constructor))", que es el que indica que se ejecute antes del propio main, parece dar algún tipo de problema, así que basicamente la cuestión es ejecutar las instrucciones de esa función al principio del main.

Con esos cambios debería funcionarte.

Por otro lado, y por si te sirve de ayuda, el Makefile que he usado para compilar es este.

TARGET = SDKTEST
OBJS = main.o

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS =
LIBS = -lpspwlan

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = sdktest

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Saludos.
3 respuestas