[psp]Es incompatible SDL con PSP_MODULE_INFO...

Hola expongo mi problema.

1ª parte:
Tengo hechos hombrew 1.50 y me compilan bien con SDL, ademas me rulan en la psp (firmware 3.71 con 1.50 kernel)
Pero en mi main.c no le pongo la linea PSP_MODULE... por que si se la pongo me da error al compilar.
Cuando le paso el hombrew compilado(sin errores y sin linea PSP_MODULE..) a la PSP me funciona bien.
Es necesario poner esa linea? en mi caso asi me funciona.

2ª parte:
Ahora ese mismo hombrew le cambio en makefile, los cambio para compilar para 3.71.
Me compila bien sin errores.
Pero sigo sin ponerle en el main.c lo de la linea PSP_MODULE...., por que si la pongo me da error al compilar.
En este caso cuando paso el hombrew compilado (sin errores y sin linea PSP_MODULE...) a la PSP (firmware 3.71 con kernel 3.71) me sale la imagen "preview" pero cuando le doy a la X, me sale pantalla negra y luego el error:
imposible iniciar juego(800200D9)

Alguien me puede ayudar para poder compilar los hombrew con SDL para 3.x?

Muchas gracias de antemano y perdonad mi pesadez.
Para pasar el homwbrew a 3.XX se necesitan un par de cosas.

1.- Hacer que la aplicación ejecute en modo usuario
2.- Quitar todas las llamadas a funciones de kernel
3.- Compilar como prx en vez de como elf

Cuando incluyes la llamada a "sdl-config --libs" en el Makefile, se añade -lSDLmain a los flags de linkado.

$ /usr/local/pspdev/psp/bin/sdl-config --libs
-L/usr/local/pspdev/psp/lib -lSDLmain -lSDL -lm -L/usr/local/pspdev/psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpspaudio -lc -lpspuser -lpsputility -lpspkernel


El tema esta que -lSDLmain sustituye el main de tu programa por un main que viene con sdl, y este despues de cargar llama al main de tu programa, el trozo de codigo en cuestion que se inserta entre medias es este:

http://svn.ps2dev.org/filedetails.php?repname=psp&path=%2Ftrunk%2FSDL%2Fsrc%2Fmain%2Fpsp%2FSDL_psp_main.c&rev=0&sc=0

Si cambias la linea del Makefile que llama a sdl-config, y añades las flags manualmente, quitando el -lSDLmain, entonces usara el main de tu programa y tu PSP_MODULE....
trulox..muchas graciassss.
A ver, si me aclaro.

yo tengo este makefile:

TARGET = xxxxx
PSPSDK = $(shell psp-config --pspsdk-path)
PSPBIN = $(shell psp-config --psp-prefix)/bin
SDL_CONFIG = $(PSPBIN)/sdl-config
OBJS = main.o

DEFAULT_CFLAGS = $(shell $(SDL_CONFIG) --cflags)

MORE_CFLAGS = -G0 -O2 -DPSP

CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS)
CXXFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) -fno-exceptions -fno-rtti

LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm $(shell $(SDL_CONFIG) --libs)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = xxxxx
PSP_EBOOT_ICON = ./imagenes/iconoinicio.png
PSP_EBOOT_PIC1 = ./imagenes/background.png

include $(PSPSDK)/lib/build.mak


y este main.c

#include
#include
#include
#include
#include
#include
#include

#ifdef PSP
#include
#include
#include
#include
#endif

#define printf pspDebugScreenPrintf


int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}

SDL_Event event;
SDL_Surface *screen = NULL;
SDL_Surface *fondo= NULL;
SDL_Rect origenn,destino;

int x_ant,y_ant,w_ant,h_ant;

int main(int argc, char *argv[]){

int done = 0;

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {printf ("NOse puedo Inicializar SDL: %s\n", SDL_GetError());exit (1);}
..etccc.etcccc

SI no te importa que cambios necesitaria?
MOdificamelo por favor ( no sé si pido mucho, pero te lo agradeceria un monton)
muchas gracias por tu ayuda desinteresada.
En el makefile añades lo siguiente, para compilar como prx

BUILD_PRX = 1
PSP_FW_VERSION = 371


Para quitar el trozo de codigo del SDLmain, necesitas saber la ruta donde esta instalado, lo ves ejecutando "sdl-config --libs" y "sdl-config --cflags"

En mi caso esta en /usr/local/pspdev/psp/

Te quedaria algo asi:
TARGET = xxxxx
PSPSDK = $(shell psp-config --pspsdk-path)
PSPBIN = $(shell psp-config --psp-prefix)/bin
SDL_CONFIG = $(PSPBIN)/sdl-config
OBJS = main.o

BUILD_PRX = 1
PSP_FW_VERSION = 371

SDL_INSTALL_PATH=/usr/local/pspdev/psp

#DEFAULT_CFLAGS = $(shell $(SDL_CONFIG) --cflags)

DEFAULT_CFLAGS = -I$(SDL_INSTALL_PATH)/include/SDL

MORE_CFLAGS = -G0 -O2 -DPSP

CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS)
CXXFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) -fno-exceptions -fno-rtti

#LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm $(shell $(SDL_CONFIG) --libs)

LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm -L$(SDL_INSTALL_PATH)/lib -lSDL -lm -L$(SDL_INSTALL_PATH)/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpspaudio -lc -lpspuser -lpsputility -lpspkernel

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = xxxxx
PSP_EBOOT_ICON = ./imagenes/iconoinicio.png
PSP_EBOOT_PIC1 = ./imagenes/background.png

include $(PSPSDK)/lib/build.mak


Ponemos el código en modo usuario, y asignamos el tamaño del heap
PSP_MODULE_INFO("My Homebrew", 0, 1, 0);
PSP_HEAP_SIZE_KB(20480);


Quedaria algo asi:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_image.h>

#ifdef PSP
#include <pspkernel.h>
#include <pspctrl.h>
#include <pspdebug.h>
#include <pspgu.h>
#endif

#define printf pspDebugScreenPrintf

PSP_MODULE_INFO("My Homebrew", 0, 1, 0);
PSP_HEAP_SIZE_KB(20480);

int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}

SDL_Event event;
SDL_Surface *screen = NULL;
SDL_Surface *fondo= NULL;
SDL_Rect origenn,destino;

int x_ant,y_ant,w_ant,h_ant;

int main(int argc, char *argv[]){

int done = 0;

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {printf ("NOse puedo Inicializar SDL: %s\n", SDL_GetError());exit (1);}
..etccc.etcccc



Ten en cuenta que las rutas de los includes y de enlazado que he puesto son de mi instalación, así que tendrás que ver si coinciden con las tuyas y si no cambiarlas.

Por ultimo lo compilas y pruebas a ver si arranca con kernel 3.XX claro. Si te sale error 0x8002013C, es que tu código tiene llamadas a funciones de kernel y las tienes que quitar.

Puedes usar el siguiente comando para intentar buscarlas:
prxtool -f tu_fichero.prx
Ante todo esto muy agradecido por tu ayuda y te doy mil gracias.
He implementado lo que me has dicho.
Pero me da error al compilar.

esto me arroja estos dos comandos:

psp@Upsp:/usr/local/pspdev/psp/bin$ ./sdl-config --libs
-L/usr/local/pspdev/psp/lib -lSDLmain -lSDL -lm -lGL -lpspvfpu -L/usr/local/pspdev/psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -lpspirkeyb -lpsppower
psp@Upsp:/usr/local/pspdev/psp/bin$ ./sdl-config --cflags
-I/usr/local/pspdev/psp/include/SDL -Dmain=SDL_main
------------------------------------------------------------------------------
makefile:
TARGET = xxxxx
PSPSDK = $(shell psp-config --pspsdk-path)
PSPBIN = $(shell psp-config --psp-prefix)/bin
SDL_CONFIG = $(PSPBIN)/sdl-config
OBJS = main.o

BUILD_PRX = 1
PSP_FW_VERSION = 371

SDL_INSTALL_PATH=/usr/local/pspdev/psp

#DEFAULT_CFLAGS = $(shell $(SDL_CONFIG) --cflags)

DEFAULT_CFLAGS = -I$(SDL_INSTALL_PATH)/include/SDL

MORE_CFLAGS = -G0 -O2 -DPSP

CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS)
CXXFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) -fno-exceptions -fno-rtti

#LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm $(shell $(SDL_CONFIG) --libs)

LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm -L$(SDL_INSTALL_PATH)/lib -lSDL -lm -lGL -lpspvfpu -L$(SDL_INSTALL_PATH)/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -lpspirkeyb -lpsppower


EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = xxxxx
PSP_EBOOT_ICON = ./imagenes/iconoinicio.png
PSP_EBOOT_PIC1 = ./imagenes/background.png

include $(PSPSDK)/lib/build.mak
--------------------------------------------
main.c:
#include
#include
#include
#include
#include
#include
#include

#ifdef PSP
#include
#include
#include
#include
#endif

#define printf pspDebugScreenPrintf

PSP_MODULE_INFO("My Homebrew", 0, 1, 0);
PSP_HEAP_SIZE_KB(20480);

int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}

SDL_Event event;
SDL_Surface *screen = NULL;
SDL_Surface *fondo= NULL;
SDL_Rect origenn,destino;

int x_ant,y_ant,w_ant,h_ant;

int main(int argc, char *argv[]){

int done = 0;

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
printf ("NOse puedo Inicializar SDL: %s\n", SDL_GetError());exit (1);
}

}
------------------------------------------------
compilacion erronea:
psp@Upsp:~/proyectos/3.71/jose$ make
psp-gcc -I. -I/usr/local/pspdev/psp/sdk/include -I/usr/local/pspdev/psp/include/SDL -G0 -O2 -DPSP -D_PSP_FW_VERSION=371 -L. -L/usr/local/pspdev/psp/sdk/lib -specs=/usr/local/pspdev/psp/sdk/lib/prxspecs -Wl,-q,-T/usr/local/pspdev/psp/sdk/lib/linkfile.prx main.o /usr/local/pspdev/psp/sdk/lib/prxexports.o -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm -L/usr/local/pspdev/psp/lib -lSDL -lm -lGL -lpspvfpu -L/usr/local/pspdev/psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -lpspirkeyb -lpsppower -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -o xxxxx.elf
/usr/local/pspdev/psp/lib/libGL.a(pspgl_dlist.o): En la funci�n `now':
/home/psp/download/psplibraries/build/pspgl/pspgl_internal.h:300: referencia a `sceRtcGetCurrentTick' sin definir
/usr/local/pspdev/psp/lib/libGL.a(pspgl_vidmem.o): En la funci�n `now':
/home/psp/download/psplibraries/build/pspgl/pspgl_internal.h:300: referencia a `sceRtcGetCurrentTick' sin definir
collect2: ld devolvió el estado de salida 1
make: *** [xxxxx.elf] Error 1


si le quito al main.c
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
printf ("NOse puedo Inicializar SDL: %s\n", SDL_GetError());exit (1);
y solo le dejo:
printf ("NOse puedo Inicializar SDL: %s\n", SDL_GetError());exit
me compila bien.

Por favor ayudame.
Un saludo y muchas gracias.
Cualquier "referencia sin resolver" o "unresolved symbol" al compilar se produce porque hay funciones que estas usando de las que no encuentra la librería.

1.- O por que no tienes la librería.
2.- Por que se te olvido linkar contra la librería en cuestión.

En este caso te falta enlazar con la librería psprtc, o eso parece.

Añade "-lpsprtc" a tus flags de linkado (vamos a LIBS=)

De todas formas usas realmente las funciones de SDL_gfx?
Muchas graciassss.
Ya me compiló y funcionando ok en la psp.
Mil gracias de nuevooo.

lo unico una cosa, yo tengo un bucle en el main.c:


int main(int argc, char *argv[]){

int done = 0;
etcc...etccc...
//mas cosas
//muchas mas cosas

//aqui empieza el bucle
while (done == 0) {

while (coloca < 10){
colocar();
}
printf("sale: ");

sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_HOME) {done = 1; printf("\nPULSADA Home\n");}

}
printf("\nTodo ha salido bien.\n");
SDL_Quit();
sceKernelExitGame();
exit(0);
return 0;
}

cuando sale de la funcion coloca (o sea, coloca vale 10) ...se me queda pillao el juego y le tocaria poner sale..sale..sale.sale asi hasta que le de la tecla home.

muchas graciassss.
Hombre así no veo nada raro... ¿solo te pasa desde que cambiaste el código para firmware 3.XX?

Si es así y en la función colocar() tienes algún malloc, asegurate de que pusiste la linea PSP_HEAP_SIZE_KB(20480); como te dije.

De todas formas para estos casos, te recomiendo que uses psplinkusb + psp-gdb para debugear el código y que puedas ver que esta haciendo y si hay algún "segmentation fault" ver donde se produce.
Perodna tio.
Fue despieste mio.
me faltaba la linea de:
SetupCallbacks();
soy un zokete.
Muchas graciasss, por tu explendida ayudaa, estoy muy contento.

Nota.- Os seguiré molestando a los maestross

donde encuentro psplinkusb + psp-gdb ?
Es que yo uso el Shell 3.81, y me va como el culo. se me para la conexion cada 2x3
edelpuerto escribió:Perodna tio.
Fue despieste mio.
me faltaba la linea de:
SetupCallbacks();
soy un zokete.
Muchas graciasss, por tu explendida ayudaa, estoy muy contento.

Nota.- Os seguiré molestando a los maestross

donde encuentro psplinkusb + psp-gdb ?
Es que yo uso el Shell 3.81, y me va como el culo. se me para la conexion cada 2x3


Me alegro de que te funcione todo bien :)

Sobre el psplinkusb y psp-gdb, ambos estan en el svn de ps2dev.org.

EL psp-gdb si no recuerdo mal, se compila con el propio psptoolchain, mira a ver si tienes el comando psp-gdb donde tengas el psp-gcc, si no tendrás que bajarte de nuevo el psptoolchain y decirle que compile el gdb, no se si tenia un parámetro para hacerlo, o tenias que poner GDB=1 dentro del script o algo así, bueno, si no lo tienes y no ves como se pone me dices y te lo miro.

Para hacerte con la ultima version de psplinkusb, usa el siguiente comando:
$ svn co svn://svn.ps2dev.org/psp/trunk/psplinkusb

Y para compilarlo, entras al directorio resultado y hace make release
$ cd psplinkusb
$ make release

Eso te generara una carpeta release_oe que es la versión que necesitas para firmware 3.XX, en concreto lo que tienes que copiar a psp/game/ es la carpeta release_oe/pspslink/


También tendrás que compilar el pspsh y el usbhostfs, para el pspsh. estando en el directorio psplinkusb/
$ cd release_oe/pc/pspsh/
$ make

Para el usbhostfs, tambien desde el dir psplinkusb/ (se necesita libusb)
$ release_oe/pc/usbhostfs_pc/
$ make

Yo lo hago todo desde Linux, si usas cygwin y no te funciona el usbhostsfs_pc, creo que hay por ahi un usbhostfs_pc.exe para windows, tendrías que buscarlo.


Para debugear tu programa, al compilar añadele "-g" en las flags o si no no tendrás los símbolos de debug.

Con todo este tinglado te ahorras tener que subir cada vez los ficheros a la psp, y lo pilla todo por usb.

Bueno a lo que vamos....

Ejecutas usbhostfs_pc para "exportar" el directorio de tu aplicación en mi caso desde linux como root

# release_oe/pc/usbhostfs_pc/usbhostfs_pc /directorio/de/la/aplicacion

Luego arrancas la psp y ejecutas el "psplink oe" entonces el terminal con el usbhostfs_pc te pondrá "Conected to device"

Para manejar el psplink desde el pc ejecutas pspsh
$ release_oe/pc/pspsh/pspsh

Y desde ahí puedes lanzar comandos, por ejemplo:
host0:/> ./tufichero.prx ---> ejecuta tu aplicacion
host0:/> reset --> reincia psplink (para volver a lanzar la app)
host0:/> debug tufichero.prx --> activa el modo debug para usarlo con psp-gdb

Tiene muchos mas comandos, tienes un pdf que viene con todas las instrucciones.

Si has lanzado "debug tufichero.prx" ahora conectas con psp-gdb
$ psp-gdb tufichero.elf

Una vez dentro del psp-gdb para conectar el gdb con el debug del psplink
target remote :10001

Y ahí ya se maneja como el gdb de UNIX, si no lo conoces mucho, tendrás que mirarte una guia de gdb en internet. Pero los comandos básicos son

(gdb) c --> continuar la ejecución del programa
(gdb) n --> next, ir a la siguiente instrucción (si es una función no entra)
(gdb) s --> step, ir a la siguiente instrucción (si es una función si entra)
(gdb) bt --> backtrace, cuando se produce un cuelgue de la aplicacion
(gdb) print nombre_variable --> para ver el contenido de la variable mientras se esta ejecutando
(gdb) break nombre_de_funcion() --> crea un breakpoint al entrar a la función
(gdb) break fichero.c:54 --> crea un breakpoint cuando se ejecute la linea 54 del fichero.c
(gdb) quit --> salir

Después de hacer el "target remote :10001" lo primero que hay que hacer es poner los breakpoints si se desea, y mandar "c" para que empiece la ejecución de la aplicación en la psp.

En un poco enrevesado, pero es la manera mas fácil que conozco de hacer debug en la psp, porque debugear directamente desde el psplink sin gdb si que es un locura...

Además aunque no uses el gdb, es muy cómodo recompilar la aplicación y hacer "reset" "./aplicacion.prx" desde el pspsh para cargar la nueva version, asi te ahorras el tener que estar saliendo de la aplicación, enchufar la psp por usb, pasar los ficheros y volver a lanzar la aplicación.
holaaa Turulox!!
Ostias que maravillaa!!!
Asi da gustooo, con la manera que me has dicho da gustooo!!
Es que yo usaba el irshell, no estaba mal del todo pero cada vez que se ejecutaba la aplicacion y la terminabas se perdia la comunicacion, y tenias que conectar de nuevo, todo eso sin pasar ficheros a la psp, pero con el coñazo de tener que volver a conectar, y como yo uso un Ubuntu en un vmware (virtual) pues para luego conectar de nuevo...total casi una mierda.

Con tu metodo es muchsimo mejor, ademas que tambien puedes "debuguear" como tu bien dices, que antes no podia.

Mil gracias amigo. muy agradecido.
10 respuestas