Recompiler Retroarch pour une vieille tablette Android

Et voici la suite du précédent article pour redonner un coup de jeune à mon Acer Iconia A500.

Retroarch était le 2ème programme de ma liste à destination de la tablette, voyons ce que nous pouvons faire.

Retroarch

Retroarch est un multi-émulateur (si vous me permettez le néologisme) qui permet de télécharger de nombreux “coeurs” permettant d’émuler un grand nombre de consoles ou d’ordinateurs.

Il y a donc 2 composants principaux :

  • l’interface
  • les coeurs des différents émulateurs

L’interface fut une bonne surprise elle fonctionne directement sur la tablette. Il suffit de télécharger l’apk 32 bits sur le site de retroarch.

Cependant mauvaise surprise : les coeurs plantent lorsqu’on les lance après téléchargement depuis l’interface.

Compiler un coeur retroarch

Les instructions pour recompiler un coeur android indiquent comment démarrer en téléchargeant les sources :

git clone https://github.com/libretro/libretro-super.git
cd libretro-super
./libretro-fetch.sh

Ces commandes effectuent le téléchargement des sources principales puis de celles des différents coeurs d’émulation.

Les sources ont globalement la même structure : un sous-répertoire libretro-<nomDuCoeur> qui contient lui-même (parfois dans une sous-arborescence) un répertoire jni.

Le script libretro-build-android-mk.sh permet de lancer la compilation d’un des coeurs, par exemple, pour recompiler le coeur gameboy gambatte (Attention a bien avoir défini les chemins des SDK et NDK android, les chemins sont ici ceux de mon environnement) :

export ANDROID_NDK_ROOT=/Users/gerben/Library/Android/sdk/ndk/21.3.6528147
export ANDROID_SDK_ROOT=/Users/gerben/Library/Android/sdk
export PATH=$ANDROID_NDK_ROOT:$PATH
./libretro-build-android-mk.sh gambatte

Mais si vous essayez d’utiliser le coeur compilé par ce script (trouvable dans le chemin libretro-gambatte/libgambatte/libretro/libs/armeabi-v7a/libretro.so) sur votre tablette, même résultat : un crash immédiat.

Désactiver les instructions NEON

Comme dans l’article précédent, le problème se situe dans les spécificités du coeur Cortex A9 du Tegra 2 et l’utilisation des instructions NEON. Ces instructions étant activées par défaut pour les builds NDK, il faut ajouter des instructions de configuration pour les désactiver.

Dans le cas du coeur gambatte (mais c’est pareil pour les autres coeurs), il faut modifier le fichier Android.mk situé dans le sous-répertoire jni (libretro-gambatte/libgambatte/libretro/jni) et ajouter parmi les variables LOCAL_ARM_NEON := false, ce qui donne :

CAL_PATH := $(call my-dir)

ROOT_DIR     := $(LOCAL_PATH)/../../..
CORE_DIR     := $(ROOT_DIR)/libgambatte/src
LIBRETRO_DIR := $(ROOT_DIR)/libgambatte/libretro

HAVE_NETWORK := 1

include $(ROOT_DIR)/Makefile.common

COREFLAGS := -DINLINE=inline -DHAVE_STDINT_H -DHAVE_INTTYPES_H -D__LIBRETRO__ -DVIDEO_RGB565 -Wno-c++11-narrowing

ifeq ($(HAVE_NETWORK),1)
  COREFLAGS += -DHAVE_NETWORK
endif

include $(CLEAR_VARS)
LOCAL_MODULE    := retro
LOCAL_SRC_FILES := $(SOURCES_CXX) $(SOURCES_C)
LOCAL_CXXFLAGS  := $(COREFLAGS) $(INCFLAGS)
LOCAL_CFLAGS    := $(INCFLAGS)
LOCAL_LDFLAGS   := -Wl,-version-script=$(LIBRETRO_DIR)/link.T
LOCAL_ARM_NEON := false
include $(BUILD_SHARED_LIBRARY)

(notez l’avant dernière ligne qui contient la modification)

Et si tout s’est bien passé, vous avez désormais un nouveau coeur à installer dans votre retroarch (dans l’interface : Load Core -> Install or Restore a Core, enjoy !! :)

Retroarch on Acer Iconia A500

Recompiler ScummVM pour une vieille tablette Android

Je n’aime pas me débarasser de mon ancien matériel s’il fonctionne encore. Cependant, après quelques années, les mises à jour se font de plus en plus rare et parfois, même l’offre logicielle devient inaccessible.

J’ai un cas concret à l’esprit : ma tablette Android Acer Iconia A500.

Acer Iconia A500

Elle m’a rendu de nombreux services (ainsi qu’aux enfants pour voir des dessins animés en voiture :)), mais n’est désormais plus maintenue et il est devenu difficile de trouver des logiciels qui tournent dessus. L’heure de la reconversion est donc arrivée.

J’avais d’abord pensé à extraire l’écran pour l’utiliser avec un Raspberry Pi, mais au final, elle fonctionne encore, à quoi bon la désosser ?

Cette tablette a plusieurs avantages :

  • un grand écran offrant une très bonne lisibilité
  • un port USB Host permettant de brancher clavier, souris, clé USB …
  • un port micro HDMI permettant une sortie vidéo
  • un slot micro SD pour étendre la capacité de stockage

Une nouvelle vie, pourquoi/comment ?

Parmi les choses que j’aimerais faire tourner dessus, j’ai 2 applications dans le viseur :

  • ScummVM (abordé dans cet article)
  • Retroarch (abordé dans un futur post)

Cependant, plusieurs problèmes se posent du fait de l’obsolescence de la plateforme. En effet :

  1. La tablette est bloquée à la version Ice Cream Sandwich 4.0.3 du firmware Android
  2. Les applications utilisant le développement natif (NDK) d’Android ne supportent plus le processeur de la tablette (Tegra 2) sauf si compilé explicitement pour celui-ci.

Pour le premier point j’ai suivi un tuto en ligne pour installer Android 4.4.4 KitKat sur la tablette (Attention, il y a toujours un risque de briquer la tablette durant ce genre d’opération).

Cortex-A9, extensions Neon et VFP

ARM CPU icon Ce processeur est la 2eme génération du SoC Tegra. Il dispose d’un CPU 32 bits ARM Cortex-A9 double coeur qui ne supporte pas les extensions SIMD NEON. Ce sont justement ces extensions qui posent problème, car tous les processeurs récents supportant celles-ci, les NDKs récents les intègrent dans le binaire compilé. Il existe heureusement des solutions via la modification de flags de compilation.

ScummVM

J’étais assez frustré en constatant que les dernières versions de ScummVM plantaient au lancement, je me suis donc dit que j’allais le recompiler.

Voici les différentes étapes que j’ai appliquées.

Checkout

S’agissant d’un build android, j’ai effectué un checkout de la branche branch-2-2-1-android des sources :

git clone https://github.com/scummvm/scummvm
cd scummvm
git checkout branch-2-2-1-android

J’ai aussi téléchargé les dépendances précompilées utilisées par le code : http://sourceforge.net/projects/scummvm/files/build/3rd-android-4.tar.bz2/download

Configuration du build

En suivant les instructions du site (https://wiki.scummvm.org/index.php/Compiling_ScummVM/Android), j’ai configuré le build Android avec la commande suivante, pointant notamment vers les dépendances téléchargées :

./configure --host=android-arm-v7a --with-jpeg-prefix=/Users/gerben/src/AndroidLibs/jpeg8d-build --with-png-prefix=/Users/gerben/src/AndroidLibs/3rd-android-4-armeabi-v7a-release --with-tremor-prefix=/Users/gerben/src/AndroidLibs/3rd-android-4-armeabi-v7a-release --with-mad-prefix=/Users/gerben/src/AndroidLibs/3rd-android-4-armeabi-v7a-release

A noter : le host android-arm-v7a qui correspond à un build android ARM 32 bits.

Prise en compte des spécificités du CPU Cortex A9

La subtilité de configuration a lieu maintenant : le fichier de configuration généré permet de produire un build comportant des instructions à virgule flottante incompatibles avec le Cortex A9.

Ces extensions “Vector Floating Point” des CPUs ARM sont décrites ici : https://en.wikipedia.org/wiki/ARM_architecture#Floating-point_(VFP)

En l’occurrence, pour fonctionner avec notre CPU, il faut utiliser les instructions référencées sous le nom VFPv3-D16.

Pour les utiliser, il faut modifier le fichier config.mk généré pour modifier la ligne CXXFLAGS en remplaçant :

-mfpu=vfp

par :

-mfpu=vfpv3-d16

Il ne reste plus qu’à lancer la compilation :

make

Attendre un peu … installer le fichier .apk obtenu sur la tablette et Enjoy !!!

Secret of the Monkey Island on Acer Iconia A500

Ah … Secret of the Monkey Island … tellement de bons souvenirs :).

Voeux 2021

Juste un petit post rapide pour partager mes voeux 2021 à tous ceux qui tomberaient sur cette page. En espérant que nous pourrons tous sortir de chez nous cette année.

(et une pensée particulière à tous ceux dont j’ai croisé le chemin et avec qui je n’ai pas su garder contact : je ne vous oublie pas dans ces voeux :) )

Explorer les entrailles de Zork avec le langage Rust

Rust Language Logo Un petit post rapide pour vous fournir un lien vers le blog d'experts de **Worldline** où j'ai posté un petit article.

Le sujet principal : Trouver un “side project” pour apprendre un nouveau langage / framework / techno…

Les “sous-sujets” :

  • Le langage Rust
  • Le format de stockage des fichiers du jeu Zork

Si ça peut vous intéresser, ça se passe ici :

Learning motivation: discover Rust with Zork

Des articles ici, mais aussi ailleurs ...

Un nouveau post sur ce blog après une longue absence.

Bon, pas de choses révolutionnaires à annoncer, mais un petit lien vers le blog technique de mon employeur :

blog.worldline.tech

Et qui sait, vous y croiserez peut-être de mes articles :-)