PDA

Ver la versión completa : Tutorial de instalación/configuración/programación con Devkitarm para Linux



Puck2099
10/09/2005, 00:56
Bueno, aprovechando que estoy aburrido desde hace 5 horas, mientras uno de mis PCs se compila un Gentoo Linux desde cero, voy a hacer un mini tutorial donde intentaré explicar cómo instalar y configurar el devkitarm, bajo linux, para empezar a programar vuestros proyectos para la GP32.

1 - INSTALACIÓN

El primer paso sería descargar los programas necesarios. En este caso necesitamos:
Devkitarm (http://sourceforge.net/projects/devkitpro) . En este tutorial hablo de la versión r14, pero supongo que con las posteriores será igual.
Librerias de Game Park (www.gp32wip.com/tutoriales/gamepark_sdk.zip). Al parecer hay varias versiones, os adjunto las mias que está comprobado que funcionan bien.
Una vez descargados los archivos, habrá que descomprimirlos de la manera habitual (si alguien tiene dudas acerca de cómo se hace que me lo diga). Da igual la ruta donde los dejéis, pero yo recomendaría meter las librerías de GP colgando del directorio raiz del devkitarm.

Bueno, pues ya está instalado, sencillo, ¿no?

2 - CONFIGURACIÓN DEL PROYECTO

Ahora vamos a probar que funciona correctamente. Para ello voy a compilar uno de los ejemplos que vienen con el SDK Oficial, en concreto el 014 (el referente al sonido) para comprobar que funcionan las librerías gráficas y de sonido.

Aunque el ejemplo viene con SDK, os lo he puesto para descargar aquí (www.gp32wip.com/tutoriales/ex014.zip) .

Bien, descomprimimos el ejemplo donde queramos y, muy importante, copiamos el archivo gpstart.c (que está en nuestras librerías de Game Park) en la carpeta donde hayamos descomprimido el ejemplo.

3 - CONFIGURACIÓN DEL MAKEFILE

Ahora habrá que hacer un Makefile para compilar el juego. Cada uno puede currarse uno o usar el que adjunto aquí (www.gp32wip.com/tutoriales/Makefile) . Importante, cosas a modificar:
En la primera línea, donde pone PROG = sonido. Ahí sustituiremos sonido por el nombre que queramos que tenga el ejecutable.
Línea 3, donde pone DEVKIT = /home/puck/devkit15/devkitARM. Ahí sustituiremos la ruta de mi devkitarm por la que resulte de descomprimir el vuestro.
Si, como os aconsejé, habéis descomprimido las librerías de Game Park colgando del directorio devkitARM no habría que hacer más, sino tendréis que modificar las líneas 13 y 15 con vuestras rutas correspondientes.
Para finalizar con el Makefile, en la línea 17 están los CFLAGS que uso yo para mis proyectos. Esto son parámetros que se le pasan al compilador para optimizar el código y/o marcarle opciones de compilación, los mios funcionan bien, pero seguro que no son todo lo óptimos que pudieran llegar a ser. Más abajo están comentados los CFLAGS que me pasó Franxis (gracias, monstruo :D ), seguramente esos sean mejores, pero también son mucho más restrictivos a la hora de programar (o usas un código 100% estandard o te empezarán a dar warnings y errores a mansalva), así que ya es cosa vuestra elegir los CFLAGS que más se ajusten a vuestras necesidades.

Otra cosa a tener en cuenta con mi Makefile es que éste compila TODOS los archivos que encuentre en el directorio del juego. A mi me viene bien así y me ahorra estar editándolo con cada archivo que quiera compilar, pero nuevamente es cuestión de gustos, si no queréis volver a tocar el Makefile, dejadlo así ;)

4 - COMPILACIÓN

Bueno, ya para finalizar, no tenéis más que abrir un terminal, ir al directorio del ejemplo y escribir "make" (sin las comillas), a los pocos segundos tendréis un fichero con extensión .fxe listo para copiarlo a la SMC.

Comprobad que funciona, tiene que salir un texto en pantalla y sonar una musiquilla. No os preocupéis si la música petardea, no es problema de vuestro compilador sino del ejemplo y/o librerías.

Espero que os sea de ayuda este tutorial, para cualquier duda, estaré encantado de echaros una mano :)

Puck2099
10/09/2005, 01:22
Pego el código del Makefile por si alguien quiere echarle un vistazo:


PROG = sonido

DEVKIT = /home/puck/devkit15/devkitARM

PREFIX := $(DEVKIT)/bin/arm-elf-
CC := $(PREFIX)gcc
CXX := $(PREFIX)g++
LD := $(PREFIX)gcc
AS := $(PREFIX)as
AR := $(PREFIX)ar
OBJCOPY := $(PREFIX)objcopy

GPLIBS := -L$(DEVKIT)/arm-elf/lib/ -L$(DEVKIT)/gamepark_sdk/lib/

INCLUDES := -I$(DEVKIT)/arm-elf/include -I$(DEVKIT)/gamepark_sdk/include/

CFLAGS = -Wall -mcpu=arm9 -mno-thumb-interwork -O2 -g $(INCLUDES)

#CFLAGS := -W -Wall -Wno-sign-compare -Wno-unused -Wpointer-arith -Wbad-function-cast -Wcast-align \
#-Waggregate-return -Wshadow -Wstrict-prototypes \
#-mcpu=arm920 -mtune=arm920t -O -fstrict-aliasing -fexpensive-optimizations \
#-falign-functions -fweb -frename-registers \
#-fomit-frame-pointer -ffast-math -finline -finline-functions -finline-limit=200 -fno-builtin -fno-common \
#-fno-exceptions -ffreestanding -fshort-enums \
#-mapcs-32 -mstructure-size-boundary=8 -mno-thumb-interwork \
#$(INCLUDES) -DLITTLE_ENDIAN -DGP32 -DLSB_FIRST \
#-DSIGNED_SAMPLES -DACORN -DINLINE="static __inline" -DUSE_GP_MEM
# -ansi -pedantic \

OBJS = \
$(addsuffix .o, $(basename $(wildcard *.c))) \
$(addsuffix .o, $(basename $(wildcard *.S))) \
$(addsuffix .o, $(basename $(wildcard *.s))) \
$(addsuffix .o, $(basename $(wildcard *.cpp))) \
$(BINOBJS)

all: $(PROG).gxb
$(DEVKIT)/bin/b2fxec $(PROG).gxb $(PROG).fxe


$(PROG).gxb: $(PROG).elf
$(OBJCOPY) -O binary $(PROG).elf $(PROG).gxb

$(PROG).elf: $(OBJS)
$(LD) -s -specs=gp32_gpsdk.specs $(OBJS) $(LIBS) -o $(PROG).elf $(GPLIBS) -lgpgraphic -lgpmem -lgpos -lgpstdlib -lgpstdio -lgpsound -lgpfont -lgpg_ex01 -lm

%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $<

%.o: %.cpp
$(CXX) $(CFLAGS) -o $@ -c $<

%.o: %.s
$(CC) $(CFLAGS) -o $@ -c $<

%.o: %.S
$(CC) $(CFLAGS) -o $@ -c $<

%.a:
$(AR) -r $@ $^

clean:
rm -rf $(OBJS) crt0.o $(PROG).fxe $(PROG).elf $(PROG).bin *.map *~

Ozius
10/09/2005, 07:30
gracias puck
llevo una temporada sin linux pero en breve me volvere a pasar y vendra bien para configurarlo todo rapidamente

the_goulin
10/09/2005, 09:42
Se agradece Puck ^_^ lo probare

Gracias,
The_Goulin

^MiSaTo^
10/09/2005, 12:19
Millones de gracias Puck, esto me va a venir muy bien para ponerme con mi siguiente juego :) (a partir del 21)

PD: cada día te quiero más xDDDDDD

nazca
10/09/2005, 21:35
Muchas gracias. :)

Melkart
10/09/2005, 22:40
Gracias Puck. He seguido el tutorial y conseguido compilar el ejemplo sin problemas. Sin embargo, me da errores al intentar compilar los ejemplos del tutorial de the_goulin. ¿Sabéis por que puede ser? En teoría, el tutorial de the_goulin también usa el SDK de Game Park.

Un saludo y muchas gracias. :brindis:

Puck2099
10/09/2005, 22:55
Gracias Puck. He seguido el tutorial y conseguido compilar el ejemplo sin problemas. Sin embargo, me da errores al intentar compilar los ejemplos del tutorial de the_goulin. ¿Sabéis por que puede ser? En teoría, el tutorial de the_goulin también usa el SDK de Game Park.

Un saludo y muchas gracias. :brindis:

Hola,

¿Puedes pasarme un enlace a los ejemplos de the_goulin para probarlos, please? Es que no los encuentro...

Saludos

Melkart
10/09/2005, 23:53
Hola,

¿Puedes pasarme un enlace a los ejemplos de the_goulin para probarlos, please? Es que no los encuentro...

Saludos

http://www.alonesoft.net/doc1.html

http://www.alonesoft.net/doc2.html

En el segundo documento esta el juego que no consigo compilar:
void GpMain (void * arg)
{

// AQUI ESCRIBIREMOS EL CODIGO
int x,ix,my,vm,vi,puntos; // heroe X , Invasor X , Misil Y , velocidad misil , velocidad invasor
int ticks;
char texto[]="LOGRASTE XXXX PUNTOS!!";
x=100;
ix=5;
my=10;
vi=1;
vm=1;
puntos=0;

InitGraphics(8);
while (TRUE)
{
while (TRUE)
{
ticks = GpTickCountGet();
GpTextOut(NULL, &gtSurface[giSurface], 50, 170, "pulsa start para empezar", 55);
GpKeyGetEx(&ExKey);
if((ExKey & GPC_VK_START))
{
break;
}
GpSurfaceFlip(&gtSurface[giSurface++]);
giSurface &= 0x01;
while (GpTickCountGet() - ticks < 20);
}
while (TRUE)
{
ticks = GpTickCountGet();

GpRectFill(NULL, &gtSurface[giSurface], 0, 0, 320, 240, 252);
GpRectFill(NULL, &gtSurface[giSurface],x,150,20,10,15); // hero
GpRectFill(NULL, &gtSurface[giSurface],ix,5,20,10,90); // enemy
GpRectFill(NULL, &gtSurface[giSurface],ix+10,my,5,5,150); // misil
GpKeyGetEx(&ExKey);
if((ExKey & GPC_VK_RIGHT))
x+=2;
if((ExKey & GPC_VK_LEFT) )
x-=2;
ix+=vi;
my+=vm;
if (my>=240)
break;
if ((my>=145 && my<=160) && (ix+5>=x && ix<=(x+15)))
{
my=5;
vi+=1;
puntos+=5;
}
if (ix>320)
ix=0;
// Flip
GpSurfaceFlip(&gtSurface[giSurface++]);
giSurface &= 0x01;
// una pequeña pausa
while (GpTickCountGet() - ticks < 20);
//while((319<<18)!=(((*(volatile unsigned *)0x14a00000))&(0x1ff<<18)));
}


while (TRUE)
{

sprintf(texto,"LOGRASTE %d PUNTOS!!",puntos);
GpTextOut(NULL, &gtSurface[giSurface], 50, 170, "GAME OVER", 55);
GpTextOut(NULL, &gtSurface[giSurface], 50, 190, texto, 55);

GpKeyGetEx(&ExKey);
if((ExKey & GPC_VK_START))
{
x=100;
ix=5;
my=10;
vi=1;
vm=1;
puntos=0;
break;
}
GpSurfaceFlip(&gtSurface[giSurface++]);
giSurface &= 0x01;
while (GpTickCountGet() - ticks < 20);
}
}
}

Un saludo.

Puck2099
11/09/2005, 00:06
Por cierto, ¿qué errores te da?

Puck2099
11/09/2005, 11:30
Melkart, he estado probando a compilarlo y efectivamente, me da errores y no se puede compilar.

He conseguido subsanarlo haciendo lo siguiente:
1 - Añadir en las librerías del SDK oficial las librerías de 16 bits de Oankali de las que hace uso el ejemplo.
2 - Añadir en el #include la librería stdio.h para que haga uso de la función sin declarar sprintf.
3 - Declarar la variable entera ExKey que no está declarada.

Te adjunto aquí el gpmain.c del ejemplo corregido, para que solo tengas que copiar las librerías de Oankali y probarlo.

EDITO: Las librerías de Oankali las puedes pillar aquí (http://www.nekanium.com/gp32/downloads.htm)

Saludos

Melkart
11/09/2005, 18:58
Gracias por la ayuda Puck y perdona las molestias. Soy nuevo en esto de la programación y linux (y algo tonto), y no consigo compilarlo. Me he bajado las librerías de Oankali, las OKLibs_v2.1a.zip ¿no?, he buscado las que vienen en el ejemplo. Pero no vienen, lo más parecido que encontré se llamaba graphics16.h (en el gpmain.c se llama gpgraphics16.h).
Al intentar compilar me dice esto:

[lince@kvi primerjuego]$ make
/casa/Programacion\ GP32/devkitARM/bin/arm-elf-gcc -Wall -mcpu=arm9 -mno-thumb-
interwork -O2 -g -I/casa/Programacion\ GP32/devkitARM/arm-elf/include -I/casa/Pr
ogramacion\ GP32/devkitARM/gamepark_sdk/include/ -o gpmain.o -c gpmain.c
gpmain.c:5:25: error: gpgraphic16.h: No such file or directory
gpmain.c:6:22: error: gpfont16.h: No such file or directory
gpmain.c:22:3: warning: multi-line comment
gpmain.c:27:3: warning: multi-line comment
gpmain.c:36:18: warning: multi-line comment
gpmain.c: In function 'GpMain':
gpmain.c:64: warning: implicit declaration of function 'GpTextOut'
make: *** [gpmain.o] Error 1
[lince@kvi primerjuego]$

La distribución que tengo es una Fedora Core 2, ¿Puede ser eso un problema o no tiene nada que ver?, ¿me he equivocado de librerías?, ¿no las he puesto en su sitio?, ¿es mejor que me este quieto, deje la programación y me dedique a hacer el pino con las orejas?


Un saludo y muchas gracias.

Puck2099
11/09/2005, 21:09
Hola,

Tienes que bajarte este zip (http://www.nekanium.com/gp32/sdk/gamepark_sdk16bits.zip) .

Lo descomprimes y copias los archivos .h que te faltan (gpgraphic16.h y gpfont16.h) en el directorio gamepark_sdk/include y los archivos .a (libgpgraphic16.a y libgpfont16.a) en el directorio gamepark_sdk/lib.

Así ya tienes las librerías que te hacen falta y no debería darte más problemas.

Por otro lado, viendo lo que has copiado, no entiendo como tienes en la ruta barras / y \ mezcladas.

Prueba a copiar esas librerías y dime si se te ha solucionado el problema :)

Saludos

Melkart
12/09/2005, 00:25
Muchas gracias Puck. Ya compila perfectamente.



Por otro lado, viendo lo que has copiado, no entiendo como tienes en la ruta barras / y \ mezcladas.


Se debe a que el directorio se llama "Programacion GP32", con un espacio entre programación y GP32, por eso la barra \

Un saludo y muchas gracias.

takushi
19/12/2005, 04:40
he estado probando a ver si podia aprender ha hacer algo con la gp y no encontraba manera de compilar, al final gracias a este tuto he conseguido que me compile algo y me funcione en la gp sin problemas en mac os x [wei4] (bueno y gracias al pakete de mr spiv que tiene todo precompilado pa mac os )


a ver si termino de sacar algo en claro y hago algo pa la gp

Keiris
24/12/2005, 06:55
Realmente es muy útil.