sábado, 30 de diciembre de 2017

STM32F407 Discovery - Emulador Game Boy

Introducción

En busca de proyectos interesantes para mi Discovery STM32F407:



Me topé con bitbox:
http://bitboxconsole.blogspot.com.ar/

 

BitBox es un proyecto DIY desarrollado inicialmente para juegos "retro" y que fue derivando en distintos usos.

El creador del proyecto lo realizó para un STM32F405, pero son muy similares al F407 que posee la discovery. 

Las principales características son:
*- Soporte para gamepad, teclado o mouse.
*- Soporte para tarjetas uSD
*- Salida de audio stereo
*- Salida VGA 640x480 @ 15bpp
Y algunas virtudes mas.

A continuación describiré el método que utilicé para poner en marcha mi STM32F407 Discovery, con bitbox, y correr algunos juegos "nativos" como así también emuladores para zx spectrum (basic!!!) o gameboy.

Nos centraremos en "bitboy" que es el port de "gnuboy" para bitbox.

Lo descripto anteriormente se realizó sobre Debian 8. Aún no lo intenté en window$.

Comenzando

Software

La descarga del toolchain y del binario de OpenOcd y el método que utilizo personalmente fue descripto en esta entrada, por lo que aquí solo recordaré de donde descargarlo sin mayores preámbulos.

Lo primero que necesitaremos será el toolchain para compilar. Así que nos dirigiremos a la siguiente página y descargaremos el acorde a nuestra distribución.

https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads


Una vez descargado descomprimimos en una ruta de nuestra preferencia. Recomiendo un directorio en donde alojar los toolchains para las distintas arquitecturas que testearemos (anotemos o recordemos la ruta donde lo descomprimimos).

Necesitaremos también de OpenOcd http://openocd.org/.

Y el binario compilado para Debian (estimo que en ubuntu debería funcionar sin problemas), lo descargamos de aquí:

https://github.com/gnu-mcu-eclipse/openocd/releases



Finalmente lo descomprimimos en una ruta de nuestro agrado.

Siguiendo, descargaremos desde GitHub el repositorio del kernel bitbox:

https://github.com/makapuf/bitbox





Aquí podremos decargarlo con "git clone" desde consola, o simplemente presionamos en el botón verde que dice "clone or download" y luego seleccionamos "download zip".

Nuevamente elegimos una ruta de nuestro agrado y descomprimimos.

Por último descargamos también desde GitHub el repositorio de bitbox:

https://github.com/makapuf/bitboy



El método de descarga es el mismo que el anterior.

Recomiendo crear en su "home" el directorio "bitbox-workspace" y dentro de este descagar bitbox y bitboy. Esta es la manera que utilicé para este tutorial.

Hardware 

ADVERTENCIA!!:
Para las conexiones siguientes se debe poseer un mínimo de conocimiento en electrónica. Además entender que un error en el conexionado o cables que se unen incorrectamente o pines que se "tocan" entre sí y no corresponden, puede ocasionar daños IRREVERSIBLES sobre la Discovery. NO me hago cargo de nada de lo que aquí se describe, al seguir los siguientes pasos se entiende que ustedes, o quién sea, entiende los riesgos que se corren.


Con respecto al hardware, debo aclarar que aún no logré que funcionara correctamente la tarjeta SD, probablemente se deba a los componentes conectados en la Discovery y que utilizan los mismos puertos que la SD y de alguna forma interfiere. Logré leer y escribir pero al momento de hacer stream (audio o video) entre la SD y bitbox, funciona unos segundos y luego se tilda.

Entonces, para poder adaptar nuestra Discovery a bitbox, sin soporte para SD y utilizar bitboy haremos lo siguiente.

Primero, si han descargado y descomprimido el kernel del bitbox y navegan un poco por las carpetas que contiene, observarán un directorio nombrado "hardware", dentro de él encontrarán los distintos esquemas eléctricos y revisiones. Les facilito una imagen de la revisión actual y el utilizado aquí.

Imagen del archivo en eagle convertido a JPG de la rev2


Lo que a priori recomiendo, es que realicen solo las conexiones hacia monitor VGA.
Se puede observar que posee un DAC R2R conectado al puerto E (PE0-14) por cada canal RGB construído con resistencias. En la construcción que realicé, utilicé valores comerciales al 5% de tolerancia disponibles en la mayoría de las casas de electrónica.

DAC Hi-Tech by T'T :)


RGB0, RGB5, RGB10 = 8K2
RGB1, RGB6, RGB11 = 4K7
RGB2, RGB7, RGB12 = 2K2
RGB3, RGB8, RGB13 = 1K
RGB4, RGB9, RGB14 = 560 Ohm

Por supuesto que no es lo mismo que los valores originales al 1%, pero la calidad de imagen es mas que aceptable, al menos para los ensayos iniciales.

Los puertos utilizados para los distintos canales (para los que no están muy familizarizados con los esquemas) son:

Canal B (blue): PE0 a PE4 (RGB0 a RGB4)
Canal G (green): PE5 a PE9 (RGB5 a RGB9)
Canal R (red): PE10 a PE14 (RGB10 a RGB14)

Además, como pueden observar en la imagen, las puertos PA0 y PA1 corresponden al sincronismo vertical y al sincronismo horizontal respectivamente, hacia VGA.

En la misma imagen pueden notar a X1 que corresponde a un DB15 para VGA con la correspondencia de pines y conexiones.

Una vez realizadas las conexiones anteriores, están en condiciones de descargar el firmware para los primeros ensayos.



DAC conectado a la Discovery


En marcha.

Para los primeros ensayos NO compilaremos. Utilizaremos los .bin que las descargas poseen.

El autor del proyecto a creado una especie de "bootloader" el cual será lo primero que grabaremos en nuestra placa.

Dicho "Bootloader" permite el arranque del sistema desde la Flash o desde la SD solo presionando un botón, el llamado "user button" en el esquema.

No obstante para ls primeros ensayos no necesitamos de dicho botón. Así que comencemos grabando el 1st_boot.

Una vez que nuestra placa está conectada a la PC nos situaremos en el directorio de  openocd/bin.
 en mi caso:

~/openocd/gnu-mcu-eclipse/0.10.0-5-20171110-1117/bin$

Una vez allí tipearemos lo siguiente (cada quien con su ruta, reemplazar "usuario" por tu nombre en la sesión linux).

~/openocd/gnu-mcu-eclipse/0.10.0-5-20171110-1117/bin$ ./openocd -f ../scripts/board/stm32f4discovery.cfg -c "program /home/usuario/bitbox-workspace/bitbox-master/1st_boot/1st_boot_rev25.bin reset exit 0x08000000" 

Esto graba 1st_boot en la direccón de flash 0x08000000.

Una vez grabado lo anterior pasaremos a grabar a bitboy tal cual como lo descargamos y descomprimimos en bitbox-workspace.
Nuevamente la ruta de cada uno dentro de "bitbox-workspace"

~/openocd/gnu-mcu-eclipse/0.10.0-5-20171110-1117/bin$ ./openocd -f ../scripts/board/stm32f4discovery.cfg -c "program /home/usuario/bitbox-workspace/bitboy-master/bitboy.bin reset exit 0x08004000" 

Ahora notarán que grabamos en la flash a partir de 0x08004000 que es en donde 1st_boot busca lanzar si no se a presionado el user button.

Luego del comando anterior deberían observar en el monitor conectado algo así:




Muy bueno, no ?

Finalizando

Llegados aquí para continuar necesitamos habilitar la conexión USB para conectar un teclado, mouse o gamepad.

En la próxima entrada no solo comentaré como conecté el teclado y el gamepad, sino que explicaré como compilar y agregar juegos... con sonido también.

Los dejo con unos screenshoot de Mega Man y Super Mario Land:






Mi desarrollo para bitbox muy preliminar...

https://youtu.be/FjvIlrv5xZU

 T'T
 



No hay comentarios.:

Publicar un comentario