Anuncios Google

[C]Ayuda con SceKernelLoadExec(); y la estructura param[C]

Hola a todos, antes que nada gracias por leer mi cuestión.

Bien, hace tiempo que no programaba en C para psp, entonces recorde un code viejo que dejé botado en lo más profundo de mis carpetas, y recorde que la función sceKernelLoadExec();, necesitaba de una estructura, que debería contener ciertos datos(en la documentación del pspsdk vienen los parametros necesarios), entonces, ya hise la estructura, mande a correr el Eboot, compile(ningún error ni ningún warning), y pues, a la hora de la ejecución, nada, se queda pillado, no hace nada, no se traba pero tampoco hace nada, creo que no debo decir más chorreadas o si no los aburriré xD, bien, les dejo mi code(también mi makefile):

Code:

#include <pspkernel.h>
#include <psploadexec.h>
#include <psploadexec_kernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <string.h>
 
#define printf pspDebugScreenPrintf
 
PSP_MODULE_INFO("Ejecutador de Ebot",1,0,0);
PSP_MAIN_THREAD_ATTR(0);
 
/* Llamada de salida */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;
 
          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);
 
          sceKernelSleepThreadCB();
 
          return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
          int thid = 0;
 
          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }
 
          return thid;		  
}
 
void Correr_PBP(char*ruta){
 
	struct SceKernelLoadExecParam juego;
 
	char*path=ruta;
 
	juego.argp=path;
	juego.args=strlen(ruta)+1;
	juego.key="game";
	juego.size=sizeof(juego);
 
	sceKernelLoadExec(juego.argp,&juego);
 }
 
int main(){
	pspDebugScreenInit();
	SetupCallbacks();
	printf("Presiona X para ejecutar el Eboot");
	SceCtrlData pad;
 
	while(1){
			sceCtrlReadBufferPositive(&pad,1);
			if(pad.Buttons & PSP_CTRL_CROSS){ pspDebugScreenClear(); printf("Ejecutando..."); Correr_PBP("ms0:/PSP/GAME/CLAW/EBOOT.PBP");  }
	}
 
	sceKernelSleepThread();
	return 0;
}

Makefile:

TARGET = EBT
OBJS = main.o 
 
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
 
LIBDIR =
LIBS = -lpspgu -lpng -lz -lm
LDFLAGS =
 
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = EBT
 
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak 

La estructura la he creado yo guiandome de la documentación, posiblemente tenga errores(o si no es eso será algo con la función o mi CF), leí que se tiene que poner el PSP en MODO KERNEL para que la función vaya correctamente(en la documentación lo dice), de mi parte no hay más que decir, espero y me ayuden.

PD: Sí, ya investigé en google, también mencionaban la función sceKernelLoadExecVSHMs2();, pero la estructura que se debía hacer me pareció más complicada, así que decidí primero a probar está.

PD2: También he intentado pasarle como 2 argumento a la función NULL en vez de la estructura, pero el resultado es el mismo.

Saludos a todos.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de klozz

PSP_MODULE_INFO("Ejecutador

 

PSP_MODULE_INFO("Ejecutador de Eboot", 1, 0, 0); <-- Esa parte esta mal igual moikop te lo explica abajo de mi coment ;DPSP_MAIN_THREAD_ATTR(0);

PSP_MODULE_INFO("Ejecutador de Eboot", 0, 1, 0); <--Seria Así.
Recuerda que sceKernelLoadExec(); Utiliza privilegios del kernel asi que tienes que poner en la cabecera que sea tipo kernel 

[fuera de todo]PSP_MODULE_INFO("Ejecutador de Eboot", 0x1000, 0, 0); <-- es usado cuando se elaboran plugins ya que es modo VSH

Saludos

 


TEAM MEX Homebrew y desarrollo PSP

Metal TrooperV.Pre-Alpha (15%)Lua , 10% C .

Ubunshell VProof. (45%)C

RPG Magues (35%)Lua , 5% C


Android development for Xperia X8 ^^ mis roms en XDA-Developers ya que en Scenebeta no las publican xD

Xperience  | MIUI Pikachu | Semc debrand engine | Froyexp | Xperience walkman mod | Android 4.0.4 CN9 Crema de nieve

-- KLOZZ

Imagen de moikop

Problema en PSP_MODULE_INFO, no en el código...

Has pensado que a lo mejor el problema no esta en el código en sí, sino que esta en las declaraciones iniiales?

PSP_MODULE_INFO("Ejecutador de Ebot",1,0,0);

Ese 1 que es?? te recuerdo que PSP_MODULE_INFO es:

PSP_MODULE_INFO("Nombre Modulo/HB", Modo, Version, SubVersion);

Modo: Modo User ( 0 ), Modo VSH (No recuerdo) o Modo Kernel (0x1000). 1 no es un valor posible (y posiblemente el compilador lo interprete como "modo user").
Aparte de que declaras primero un modo *inexistente* (1 no es un valor posible), despues en el PSP_MAIN_THREAD_ATTR pones modo kernel... pobre compilador.. 

Y creo recordar que para ejecutar la función sceKernelLoadExcec se necesitan privilegios del Modo VSH o Kernel. Prueba a ponerlo en modo VSH o Kernel y prueba de nuevo:

//Modo User sería así:
PSP_MODULE_INFO("Module name", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
 
//Pero prueba con el modo VSH o Kernel...
 
//Modo VSH:
 
PSP_MODULE_INFO("Module name", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
 
//Modo Kernel
PSP_MODULE_INFO("Module name", 0x1000, 1, 0);
PSP_MAIN_THREAD_ATTR(0);

Una ves cambiado (o corregido mejor dicho) el modo, prueba en vez de todo ese pedazo de código que has hecho, con la clásica función:

sceKernelLoadExcec("Ruta COMPLETA del PBP", NULL);

Un saludo ;)


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de dj51_Shura

Aquí hay otra función

que sin PSP y sin SDK no puedo probar, es sceKernelLoadExecVSHMs1() y está documentada en el módulo de Interface to the LoadExec for Kernel library, en http://psp.jim.sh/pspsdk-doc/group__LoadExecKernel.html.

El uso ya te lo dicen, el primer parámetro es el path del PBP y el segundo NULL (...).

Desde un plugin, creo recordar que ejecuté un PBP con esa función, pero no me hagas mucho caso,...

Ojalá que te funcione :)


http://www.mhypnok.blogspot.com/

Gracias a Dark_AleX, Total_Noob, VirtuousFlame, Coldbird, Codestation...

Imagen de barney77

Ninguna función que le ponga

Ninguna función que le ponga NULL sirve(es más, no se para que te dice la docu que pongas NULL si en ninguna servirá).
Y con las del VSH me dice que no se puede iniciar el juego..

Imagen de sting18

Como que te falto leer un

Como que te falto leer un poco o un mucho mas xD.

void Correr_PBP(){
 
	struct SceKernelLoadExecVSHParam param;
	int apitype = 0x141;
	char *program = "ms0:/PSP/GAME/DarkWii/EBOOT.PBP";//aqui lo que quieras cargar
 
	memset(¶m, 0, sizeof(param));
	param.size = sizeof(param);
	param.args = strlen(program)+1;
	param.argp = program;
	param.key = "game";
 
	sctrlKernelLoadExecVSHWithApitype(apitype, program, ¶m);
} 

Si ya leiste creo que ya sabes que significa todo ,si no la verdad no tengo tiempo para explicarte espero entiendas saludos.

Edito: a la hora de correr solo usa Correr_PBP(); sin nada dentro de los parentecis.


Imagen de barney77

Si, todo lo entiendo, solo

Si, todo lo entiendo, solo que no me acuerdo muy bien pero creo que esa función no me sirvió, pero deja prueba y te digo.

Muchas gracias stingo.

 

EDITO: Como lo sospecahba sting, la estructura al parecer está mal, marca varios errores, investigando ahí una funcion que me sirve y lleva esa estrucutra, deja armo la estructura y si tengo un problema te aviso vale?

 

EDITO2: He echo este:

#include <pspkernel.h>
#include <psploadexec.h>
#include <psploadexec_kernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <string.h>
 
#define printf pspDebugScreenPrintf
 
PSP_MODULE_INFO("Ejecutador de Ebot",1,0,0);
PSP_MAIN_THREAD_ATTR(0);
 
/* Llamada de salida */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;
 
          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);
 
          sceKernelSleepThreadCB();
 
          return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
          int thid = 0;
 
          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }
 
          return thid;		  
}
 
void Correr_PBP(){
 
	struct SceKernelLoadExecVSHParam param;
 
	char*program="ms0:/PSP/GAME/CLAW/EBOOT.PBP";
 
	memset(¶m,0,sizeof(param));
	param.size=sizeof(param);
	param.args=strlen(program)+1;
	param.argp=program;
	param.key="game";
 
	sceKernelLoadExecVSHMs2(program,¶m);
} 
 
 
int main(){
	pspDebugScreenInit();
	SetupCallbacks();
	printf("Presiona X para ejecutar el Eboot");
	SceCtrlData pad;
 
	while(1){
			sceCtrlReadBufferPositive(&pad,1);
			if(pad.Buttons & PSP_CTRL_CROSS){ pspDebugScreenClear(); printf("Ejecutando..."); Correr_PBP();  }
	}
 
	sceKernelSleepThread();
	return 0;
}
 
	return 0;
}

Y me marca que "es imposible iniciar el juego", que puedo hacer sting?, llevo investigando ya mucho tiempo sobre como correr un Eboot en C y no puedo, nada de nada..

No sé

si tiene que ver pero...

el

#include <psploadexec.h> no debe ir :/
Imagen de barney77

Pues podría decirse, no lo

Pues podría decirse, no lo estoy usando, pero, sting, la forma que me has dejado arriba es como tú ejecutas eboots?, esque a mi me marca errorres muchos en esta linea:

memset(¶m,0,sizeof(param));

EDITO: Sting, ahora qe lo veo, el code que te he dejado es incorrecto, este es el que uso:

#include <pspkernel.h>
#include <psploadexec_kernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <string.h>
 
#define printf pspDebugScreenPrintf
 
PSP_MODULE_INFO("Ejecutador de Ebot",1,0,0);
PSP_MAIN_THREAD_ATTR(0);
 
/* Llamada de salida */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}
 
/* Llamada thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;
 
          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);
 
          sceKernelSleepThreadCB();
 
          return 0;
}
 
/* Configura llamada thread y vuelve a su thread id */
int SetupCallbacks(void) {
          int thid = 0;
 
          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }
 
          return thid;		  
}
 
void Correr_PBP(){
 
	struct SceKernelLoadExecVSHParam param;
 
	char*program="ms0:/PSP/GAME/CLAW/EBOOT.PBP";
 
	memset(&param,0,sizeof(param));
 
	param.size=sizeof(param);
	param.args=strlen(program)+1;
	param.argp=program;
	param.key="game";
 
	sceKernelLoadExecVSHMs2(program,&param);
} 
 
 
int main(){
	pspDebugScreenInit();
	SetupCallbacks();
	printf("Presiona X para ejecutar el Eboot");
	SceCtrlData pad;
 
	while(1){
			sceCtrlReadBufferPositive(&pad,1);
			if(pad.Buttons & PSP_CTRL_CROSS){ pspDebugScreenClear(); printf("Ejecutando..."); Correr_PBP();  }
	}
 
	sceKernelSleepThread();
	return 0;
}
 

Imagen de sting18

si asi le ago yo mira mi

si asi le ago yo mira mi makefile.

TARGET = Darkwii
OBJS = main.o graphics.o framebuffer.o mp3player.o
 
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
 
BUILD_PRX = 1
PSP_FW_VERSION = 371
 
LIBDIR =
#Aqui incluiremos libs necesarias
LIBS = -lpspgu -lpng -lz -lm -lmad -lpspaudiolib -lpspaudio -lpsppower -lpspumd -lpspsystemctrl_user -lpspsdk
 
LDFLAGS =
 
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = DarkWii
 
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

y mira las librerias que uso son de archivos y todo para un shell claro.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <pspsdk.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspaudio.h>
#include <pspaudiolib.h>
#include <psppower.h>
#include <pspumd.h>
#include <psprtc.h>
#include <psploadexec.h>
#include <psploadexec_kernel.h>
#include <pspiofilemgr.h>
 
#include "graphics.h"
#include "mp3player.h"
 
PSP_MODULE_INFO("Darkwii",0, 1, 0);
PSP_HEAP_SIZE_KB(20480);

espero te siva saludos dioni


Imagen de barney77

Mm.. deja veo, ahí en el

Mm.. deja veo, ahí en el makefile y la línea esa que añades despues del module, probaré.

PD: Pones el modo kernel o user?

EDITO: :/ nada no me deja nisiquiera iniciar la app :/

EDITO2: Encerio que no te da error? con la estructura que me dejaste me da millones de errores :(

EDITO3: Ya vi donde está el maldito error, es al usar las funciones VSH, ya que si uso sceKernelLoadExec(); no marca error pero no funciona...

EDITO4: Dejalo, me rindo, hasta aquí, dejalo, no funcionará...

Imagen de sting18

Ok te explico no me da error

Ok te explico no me da error porque tengo un psp sin placa maldita , el placa maldita es diferente ya que usaron otro metodo de carga de eboots no he probado ese metodo ya que no lo he visto necesario porque entre mas actualizaciones de HENs ponen compativilidad con todos los modulos del sdk asi que te recomiendo ver esto.

http://daxhordes.org/forum/viewtopic.php?f=33&t=4333

y tambien esto.

http://daxhordes.org/forum/viewtopic.php?f=33&t=4339

Si es mas dificil y mucho mas que antes pero es casi lo mismo por eso se an estado actualizando los tutos de C ya que los anteriores ya no funcionarian en placas nuevas y creo luadev no correo eboots en esas placas no he probado la verdad saludos y suerte.


Imagen de barney77

Lo malo esque mi psp no es

Lo malo esque mi psp no es placa maldita xD...

Pero, seguiré investigando y testeando cualquier cosa la comento aquí.

Imagen de sting18

Otra cosa doble 7 en el kid

Otra cosa doble 7 en el kid de programacion no vienen las librerias para hacer eso en el kid de programacion para torpes tampoco biene ,ya are un toto completo con librerias y todo solo que todavia no llego hay porque como sabes hay que empezar gateando antes de correr saludos y suerte doble 7


Imagen de barney77

Puede ser, ahora que me doy

Puede ser, ahora que me doy cuenta con la funcion que usas en tu estructura me marca un "undefined reference to", puede ser eso, pero entonces sting, que entorno me bajo?.

 

Un saludo, muchas gracias por tu atención y tu ayuda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.