Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Dónde poder conseguir la placa, cómo construirla tu mismo, reparaciones, modificaciones, proyectos derivados

Moderador: jepalza

Avatar de Usuario
DaCarSoft
Veroboard
Mensajes: 8
Registrado: 30 Ago 2018, 12:33

Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por DaCarSoft » 01 Sep 2018, 22:54

Hola a todos.

Creo que los que tenemos la placa "UnAmiga" sabemos que la gracia está en que se pueda usar el core "importante" o "principal" de la placa: el core de Amiga (mil gracias a Jepalza por hacerlo posible y publicarlo), pero era un gran "fastidio" para los que "cacharreamos" mucho (como yo) el problema de NO poder cambiar fácilmente entre uno y otro de los cores que se han portado a nuestra FPGA.

Esto para mí era algo MUY tedioso, pues para probar cada core nuevo o actualizado, siempre necesitaba el USB Blaster... un ordenador con el que grabar el core con el Quartus instalado... el tiempo necesario para realizar conexiones del cable, etc, etc, etc... teniendo en cuenta también que no me gustaba que la FPGA "sufra" desgaste si regrabamos muchos cores a menudo, en lo que yo llamo "memoria no volátil" de la placa, que tal vez convendría "reservar" para alargar su vida útil (aunque igual yo soy un poco catastrofista y paranóico :P )

Como sabemos, la ventaja de otras placas FPGA, como el ZX-Uno, ZX-Dos, etc. es que SÍ tienen la capacidad de almacenar cores y seleccionarlos mediante un menú que se presenta en pantalla desde el arranque de cada placa, de una manera muy sencilla para el usuario, pero... nuestra querida y barata placa "china" no tiene esa capacidad, como ya sabemos... por eso se me ocurrió intentar confeccionar un "invento", que muchos calificarán de excesivo, que consiste en usar una Raspberry conectada a la FPGA "sólo para esto" es decir: para cambiar de core... pero fue la solución que se me ocurrió por estar al alcance de mis conocimientos, y que además fuese barata, pequeña y cómoda (sobretodo si usamos una Pi Zero alimentada desde el add-on principal de Antonio Villena), y podrá tener futuras mejoras a medida que se nos vayan ocurriendo... tal vez incluso conectarla a otras placas FPGA distintas a la del "UnAmiga" que carezcan de "multicore" o dotar de internet a dispositivos mediante la compartición del internet WiFi con la FPGA desde la Raspberry Pi.

Así que, por fín!!!!!! puedo publicar un Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi, es decir, un módulo desde el que enviar y arrancar distintos cores en la "FPGA UnAmiga" a través de un menú visible y controlable desde la propia UnAmiga en funcionamiento, o desde "fuera" mediante conexión por SSH. Para ello, sólo necesitaremos una Raspberry Pi (por consumo y tamaño lo mejor es una Raspberry Pi "Zero" (sin WiFi) o "Zero W" (con WiFi) que conectaremos por medio de ciertos cables a la FPGA y obviamente una tarjeta de memoria insertada, en la que almacenar el sistema operativo, los scripts y los cores que permiten que todo funcione...

Para entender como trabaja el add-on, primero es importante saber que la placa del UnAmiga tiene dos memorias: una en la que se puede almacenar un core de manera permanente (no volátil) para ser rescatado al arrancar... y otra, (con la que trabaja la FPGA) que es la memoria volátil en la que el módulo que me he "inventado" inyectará directamente los cores SIN SOBREESCRIBIR el core fijo que hayamos grabado con Quartus y USB Blaster. De esta forma, mediante Raspberry Pi, son grabados más rápido en la FPGA que si grabásemos un core "fijo" manteniendo intacto dicho core "no volátil" que permitiría volver a conectar y ver el menú de uso que la Raspberry Pi muestra, simplemente por medio de un Reset completo de la FPGA para volver a arrancar el core "persistente", perdiendo eso sí, el core grabado desde Raspberry.

Comento esto porque, tal vez lo ideal es tener siempre un mismo core principal grabado en la memoria "permanente" de la placa (el core de Amiga, por ejemplo) para que una vez arrancado y funcionando nos permita acceder si lo necesitamos al menú que la Raspberry Pi muestra contínuamente a través de UART usando un programa de terminal. Este core "fijo" podemos grabarlo como siempre hemos hecho hasta ahora, con el Quartus, el ordenador, el USB Blaster del chino, etc. y para acceder al menú de cambio de core y extras, una vez arrancado el core de Amiga, podríamos abrir una aplicación que conecte por UART (puerto serie) como por ejemplo "NComm", si la tenemos configurada.




¿CÓMO FUNCIONA EL INVENTO?

La Raspberry Pi incorpora un sistema operativo "mínimo" y de arranque súper rápido (tarda sólo unos pocos segundos, os gustará eso, de verdad) que va con todo lo necesario, para que en cada arranque muestre un menú de "lanzamiento" de core que puede ser visto a través de una aplicación de Terminal (VT100, VT220) instalada y accesible en el core "fijo" por el que la FPGA arranque (de momento sólo he probado y configurado un programa llamado NComm para el core de Amiga, aunque debe poderse hacer también desde el core de PC-XT).

También podemos ver el menú conectando por SSH si hemos configurando previamente la WiFi, de forma que podríamos manejar el menú de cambio de cores desde un ordenador o incluso una App que lo permita en un teléfono móvil, usando así el gestor de cores sin cables, desde vuestro teléfono móvil o PC, desde el "exterior" de la FPGA.

He dejado preinstalados unos drivers que deberían funcionar directamente, tras configurar desde el menú vuestra WiFi, si tenéis un adaptador USB WiFi compatible con Raspberry Pi o la WiFi integrada de la Raspberry Pi Zero W o Raspberry Pi 3, y así conectar a internet automáticamente y de forma transparente nuestra Raspberry tras cada arranque ¿¿¿Para qué???? Pues además de para poder controlarla por SSH para DESCARGAR un core desde el REPOSITORIO DE CORES que he habilitado, que se actualizará cuando haya "novedades", o cuando haya actualizaciones de los cores anteriores, etc. de manera que podríamos instalarlos y usarlos sin necesidad de extraer la MicroSD de la Raspberry si la hemos dejado "condenada" en el interior de la carcasa de nuestro UnAmiga, simplemente bajándolo hasta nuestra SD por medio del menú que veréis en pantalla. Es fácil, lo entenderéis al verlo.

Dicho menú permite también cambiar el nombre del core a guardar tras ser descargado, cambiar de nombre cores ya almacenados en la SD e incluso borrarlos si estamos seguros de que ya no nos sirven (no no no..., no he puesto una pesada pregunta de confirmación de si estáis seguros de querer borrarlos, jajaja, si los borráis por accidente siempre los podreis volver a descargar).

También es posible cambiar de core "a ciegas" conectando un teclado USB a la Raspberry, pulsando el número de core en el teclado y después "Enter".

Aprovecharemos el cable JTAG plano incluído con el USB Blaster chino que usaremos en los últimos pines del puerto de expansión de una Raspberry de 40 pines (para usarlo en Raspberrys con conector anterior GPIO de menos pines, sólo habría que comentar y descomentar un par de líneas del script que controla la grabación del core, ya que lo dejé preparado, pero serán necesarios cables Dupont para realizar las conexiones, pues veo muy forzado intentar aprovechar el mismo cable JTAG del chino y tener que cortar pines en la Raspberry para que "encaje" y no haya problemas de entradas de voltajes indebidos por pines inadecuados)

Para resumir y aclarar: Necesitaremos dos cables Dupont, para conectar las señales TX y RX de UART/Serie entre Raspberry y FPGA, un cable de alimentación conectado a la Raspberry y al add-on que lleva el lector de MicroSD y VGA, y el cable JTAG que nos venía con el USB Blaster junto con la FPGA china.

Tendremos que soldar el cable de alimentación (+5V) en un punto del add-on principal de Antonio Villena cercano al borde exterior y el lector de tarjeta MicroSD, para poder alimentar la Raspberry desde la propia FPGA, apagándola o encendiéndola junto con el UnAmiga mediante el interruptor que incorpora la placa china.

La sujeción al interior de la carcasa del UnAmiga o a la FPGA va ya en el "arte" de cada uno... en mi caso doblé una tuerca del conector VGA para acoplar la Raspberry Pi Zero W a mi manera "encima", tal y como se ve en las fotos más abajo.

Adjunto programa NComm preconfigurado, en ADF arrancable, preparado para conectar con la Raspberry.

Ya que la pantalla del menú del MultiCore se tenía que ver irremediablemente por UART, y esto es siempre problemático, es necesario refrescar la pantalla (para poder verla) mediante "trucos", incorporados a la configuración del módem del programa "NComm" que adjunto más abajo. Esto sucede cuando arranca la Raspberry ántes de la apertura del programa de Terminal.

De todo esto, tal vez lo que aclare de verdad vuestras dudas son las fotos que pongo aquí en este post.

Recordad que puede haber errores (no he podido probarlo todo demasiado ni con varios puntos de acceso WiFi) pero si algo surge debería ser fácil de solucionar.

En mi caso, como veréis en las fotos, soldé un conector "acodado" a la Raspberry Pi Zero W (la que más os recomiendo) por temas de espacio, para no elevar más la altura del "conjunto".




NOTAS IMPORTANTES (leed bien por favor):

La imagen SD viene preconfigurada y con algunos cores grabados en la parte FAT32 compatible con Windows para copiar archivos en ella si queréis. PERO CUIDADO porque como veréis AL ARRANCAR LANZA AUTOMÁTICAMENTE un core, el de Amiga AGA V5 a la FPGA, esto lo configuré para quién no tuviera una FPGA con un core ya grabado, o la tenga con un core que no quieran eliminar (por ejemplo el "TS-Conf" que no puede ser grabado desde SOF). ESTE CORE SE ENCUENTRA EN LA CARPETA DE LA SD (FAT32):
UnAmiga/COREBOOT/coreboot.svf
Si renombráis ese archivo (coreboot.svf) o BORRÁIS el archivo o la carpeta entera EL MULTICORE NO ENVIARÁ EL CORE DE AMIGA de forma automática y simplemente presentará el menú quedando a la espera de vuestras órdenes cuando lo necesitéis.

NO DEJÉIS MENOS DE UN CORE GRABADO EN LA MICROSD, cuando tenga un rato más, incluiré en el código lo necesario para evitar errores con esto, pero de momento, no dejéis vacío el MultiCore, por que... es para grabar cores!!!!

El GNU/Linux grabado en la SD del MultiCore, NO SE CORROMPERÁ por apagar y encender en cualquier momento vuestra FPGA, el sistema operativo carga todo en la RAM de la Raspberry, de forma que no toca la SD excepto para leer lo necesario al arrancar, leer cores para enviarlos por JTAG o cuando configuramos la WiFi (tras configurarla sí que grabará en la SD los cambios, es uno de los pocos momentos en que debéis procurar que no se os corte la alimentación o apaguéis nada).

Sólo podéis tener UNA ÚNICA WiFi configurada, es decir, se borra la anterior al configurar una nueva, ya que si se configuraban más había problemas con la conexión automática que debía hacer al arrancar, así que la WiFi que configuréis será la que se guarde como única válida en vuestro MultiCore. La Raspberry conectará automáticamente y de forma invisible a vuestra WiFi tras ser configurada la primera vez, de forma automática, en cada arranque, en principio se configura por DHCP, con IP dinámica, con el comando de terminal "ifconfig" se verá la IP adquirida.

Hay un bug en el menú mostrado por UART (Terminal) por el que hay que salir DOS veces del menú para ir al shell de comandos de GNU/Linux (esto es para los más atrevidos). Aún no he encontrado el motivo exacto, pero creo que es debido a un "respawn" necesario para que se inicie de forma automática la sesión en TTYS0 o TTYAMA0 (TTYs serie de GNU/Linux).

La imagen de la SD de GNU/Linux realmente ocupa 4GB aunque las particiones son menores (1GB en total entre las dos necesarias). Debería haber podido reducir la imagen, pero no tenía ni los programas a mano ni una tarjeta MicroSD de 1GB para probarlo, así que podríais grabar la imagen haciendo un corte de los datos sobrantes de la partición al volcar la imagen a una tarjeta menor, debería funcionar por ejemplo con el programa para Windows "USB Image Tool" en http://www.alexpage.de/download/usbit/usbit.zip
Debéis ir a "Options" > Marcando la casilla "Truncate oversize images in device mode".

(Y sí, digo GNU/Linux para que Richard Stallman no se enfade mucho conmigo :-P)

Para configurar NCOMM en el S.O. de Amiga, sólo debéis cambiar los parámetros de velocidad a 115200 baudios, en pantalla (Screen) 4 colores para evitar "lags" o retardos, y en los parámetros del módem eliminad TODO dejando sólo los tiempos de espera a "0" y lo siguiente en la primera casilla (inicialización del módem):
./openocd/multicore.sh \e\n

Esto anterior es el "truco" para que se refresque la pantalla del menú de cores al entrar desde "fuera" por UART y se pueda ver.




COMANDOS DE TERMINAL IMPORTANTES (si salimos del menú del MultiCore):

Usuario root sin clave

Usuario tc clave: piCore

Copiar archivos por SSH:
scp archivo_a_subir.zip tc@192.168.X.XX:/home/tc/xxnombrexdirectorioxx/

Iniciar sesión por SSH:
ssh-keygen -R 192.168.X.XX
ssh -oHostKeyAlgorithms=+ssh-dss tc@192.168.X.XX

(pulsando cursor arriba en el shell veréis que he dejado en el historial algunos que os podrían hacer falta)

tce-load -i nano.tcz (cargar en memoria el editor "nano" y sus dependencias, aunque el editor tiene algunos bugs cuando las líneas de un script son más largas que lo que cabe en pantalla, por lo que recomiendo usarlo con cuidado)

sudo nano /home/tc/openocd/openocd.cfg # Configuración de OpenOCD, el programa que permite enviar cores a la FPGA

sudo nano /home/tc/openocd/multicore.sh # Script del menú del MultiCore, contiene la dirección del repositorio a usar y todo lo que hace que funcione el menú, de forma compatible con VT100/VT220





CONEXIONES:

En mi caso, veréis en las fotos que usé un "pequeño prolongador" rojo y azul que me encontré por casa para no tener que doblar o cortar pines en la Raspberry Pi para que el conector JTAG encaje sin tropezar, tal vez otra opción sería soldar sólo los pines necesarios o usar cables Dupont.

*Cable alimentación Raspberry Pi +5V en pin GPIO 4

Equivalencia de pines entre JTAG y Raspberry Pi:

(modificable en /home/tc/openocd/multicore.sh)

R PI JTAG
--------------------------------
PIN PIN

21 ---- tck (1)
16 ---- tms (5)
12 ---- tdi (9)
20 ---- tdo (3)
39 ---- gnd (10)
--------------------------------
--------------------------------
UART FPGA

8 (tx) ---- M7 (rx)
10 (rx) --- M8 (tx)
--------------------------------




FOTOS:
#JTAG FPGA.png
Pines conector JTAG FPGA
#JTAG FPGA.png (5.39 KiB) Visto 18262 veces
#RPi-GPIO-40.PNG
Pines Raspberry Pi 40pin GPIO (B+,2,3, Zero, Zero W)
#RPi-GPIO-40.PNG (291.52 KiB) Visto 18262 veces
#RPi-JTAG-FPGA.PNG
JTAG sobre GPIO Raspberry Pi 40pin
#RPi-JTAG-FPGA.PNG (2.05 MiB) Visto 18262 veces
03_5V-ADDON-FPGA-1.jpg
Soldadura en hat de Antonio Villena
03_5V-ADDON-FPGA-1.jpg (2.38 MiB) Visto 18262 veces
04_ADDON-UnAmiga-Tornillo-VGA-RPiZero.jpg
Detalle de tuerca doblada para sujetar R Pi
04_ADDON-UnAmiga-Tornillo-VGA-RPiZero.jpg (2.27 MiB) Visto 18262 veces
05_RPiZeroW-JTAG-FPGA.jpg
Detalle conector JTAG FPGA
05_RPiZeroW-JTAG-FPGA.jpg (2.67 MiB) Visto 18262 veces
06_RPiZeroW-JTAG-GPIO.jpg
Detalle conector JTAG Raspberry Pi
06_RPiZeroW-JTAG-GPIO.jpg (2.28 MiB) Visto 18262 veces
07_FPGA-RPiZeroW-UART-5V.jpg
Detalle conector UART Raspberry y FPGA
07_FPGA-RPiZeroW-UART-5V.jpg (2.76 MiB) Visto 18262 veces
08_RPiZeroW-UART-Dupont.jpg
Detalle conector UART Raspberry y FPGA (2)
08_RPiZeroW-UART-Dupont.jpg (3.2 MiB) Visto 18262 veces
09_Terminal-Multicore-0.jpg
Configuración baudios NComm
09_Terminal-Multicore-0.jpg (2.45 MiB) Visto 18262 veces
10_Terminal-Modem-MultiCore-1.jpg
Configuración módem NComm (1)
10_Terminal-Modem-MultiCore-1.jpg (2.62 MiB) Visto 18262 veces
11_Terminal-Modem-MultiCore-2.jpg
Configuración módem NComm (2)
11_Terminal-Modem-MultiCore-2.jpg (2.67 MiB) Visto 18262 veces
12_Terminal-MultiCore-3.jpg
Guardar configuración NComm
12_Terminal-MultiCore-3.jpg (2.69 MiB) Visto 18262 veces
13_MultiCore-Menu-1.jpg
Pantallazo menú MultiCore (1)
13_MultiCore-Menu-1.jpg (3.4 MiB) Visto 18262 veces
14_MultiCore-Menu-2.jpg
Pantallazo menú MultiCore (2)
14_MultiCore-Menu-2.jpg (2.54 MiB) Visto 18262 veces

UPS!!!! No sé por qué las fotos salen giradas!!!!! :o



ENLACE A LOS ARCHIVOS DE IMÁGENES DE TARJETAS SD

https://mega.nz/#F!LlkjxR5b!RY-XTCtAtmdEBMZojvu5tw

Encontraréis un ADF con NComm preconfigurado que tiene autoarranque.
La imagen para SD de Raspberry Pi.
Una imagen de SD de la recopilación de Estrayk con NComm configurado.

Avatar de Usuario
jepalza
Spartan 3
Mensajes: 226
Registrado: 14 Ago 2018, 18:51

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por jepalza » 02 Sep 2018, 10:55

Menuda currada que te has metido!!! Por documentación y fotos que no sea. Bravo! :o

Avatar de Usuario
DaCarSoft
Veroboard
Mensajes: 8
Registrado: 30 Ago 2018, 12:33

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por DaCarSoft » 02 Sep 2018, 13:51

Gracias hombre, la verdad es que me ha llevado un tiempo, pero nada comparado con lo tuyo... Sin tu trabajo y hallazgo de la placa “china” no estaríamos aquí.

A ver si entre todos los que podamos colaborar hacemos de este proyecto algo aún más “chulo”.

:)

Avatar de Usuario
Lenko
Veroboard
Mensajes: 3
Registrado: 17 Ago 2018, 18:29

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por Lenko » 02 Sep 2018, 18:06

¡¡Espectacular!!

Uto
PLA
Mensajes: 20
Registrado: 25 Ago 2018, 12:01

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por Uto » 04 Sep 2018, 16:23

Un currazo, ¡enhorabuena!

Avatar de Usuario
DaCarSoft
Veroboard
Mensajes: 8
Registrado: 30 Ago 2018, 12:33

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por DaCarSoft » 05 Sep 2018, 00:00

Gracias Lenko!!!

Gracias Uto!!!

Para aquellos que lo hayan ido probando, ya nos contaréis qué tal os va, o si habéis tenido alguna dificultad, por si hubiese que corregir algo ;)

Hark0
Veroboard
Mensajes: 7
Registrado: 17 Ago 2018, 10:34

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por Hark0 » 05 Sep 2018, 08:21

Pedazo de post, bravo!

Acerca de las fotos, pasalas a PNG... y eliminaras la info EXIF... info que va incrustada en los jpeg. ;-)

Avatar de Usuario
DaCarSoft
Veroboard
Mensajes: 8
Registrado: 30 Ago 2018, 12:33

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por DaCarSoft » 08 Sep 2018, 22:50

Si... Gracias! las pasaré a PNG o corregiré... En un iPhone las fotos desde el post se ven correctamente :-P

El caso es que también debo publicarlo en inglés.

Ya tengo tarea!!!

benitoss
PLA
Mensajes: 43
Registrado: 07 Oct 2018, 04:53

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por benitoss » 10 Oct 2018, 18:31

DacarSoft, menuda currada. Estoy asombrado !!!
Solo tengo una pregunta, cuanto tarda en flashear la FPGA? igual que con el USB Blaster ?
Tengo entendido que usando los GPIO de la Raspberry tarda algo mas pero me gustaria confirmarlo

Gracias

Avatar de Usuario
DaCarSoft
Veroboard
Mensajes: 8
Registrado: 30 Ago 2018, 12:33

Re: Módulo "add-on" multicore para UnAmiga basado en Raspberry Pi

Mensaje por DaCarSoft » 14 Oct 2018, 21:14

Una vez arrancada la Raspberry Pi, tarda unos 5 o 6 segundos en flashear un core y enviar la orden para reiniciar la FPGA. La Raspberry una vez arrancada queda permanentemente encendida a la espera de órdenes hasta que la placa UnAmiga es apagada por el interruptor. Por lo que el tiempo de arranque de la Raspberry (unos 14 segundos) sólo es necesario "soportarlo" al encender la FPGA por el interruptor, es decir, una vez por sesión de uso si no necesitas apagar y volver a encender.

Responder

Volver a “Hardware”