samedi 29 décembre 2012

Raspberry PI mod C64



 
 On m'a refiler 2 commodores 64 pour "essayer" de les réparer et d'en faire un fonctionnel. Donc je me suis retrouvé avec 2 châssis pour une seule carte électronique, et j'ai eu l'idée en parcourant différents site web d'électronique, DIY, blog, etc ... de me faire un RPI mod C64.




Le cahier des charges de ce projet est relativement simple, utiliser un châssis + clavier de commodore 64 pour jouer à des jeux de commodore 64 mais sur une Raspberry Pi, et pour rajouter un peu plus de fun dans tout ça, pouvoir l'utiliser en tant que média center.

Voici le résultat final :

  • 2 interrupteurs, le premier pour l'alimentation électrique et le second pour changer de mode (émulateur ou media center)
  • 1 led d'état du contrôleur de clavier



et l'intérieur de la bête :



Les différentes grandes étapes du projet sont :
  • Compiler XBMC (media center) pour buildroot et l'intégrer au système de fichiers
  • Compiler Vice C64 (émulateur commodore C64) pour buildroot et l'intégrer au système de fichiers
  • Créer un programme qui contrôle le démarrage et l'arrêt du mediacenter/émulateur en fonction de la position d'un switch
  • Créer une carte contrôleur pour la gestion du clavier C64 en USB.



XBMC pour Buildroot


Histoire de ne pas ré-inventer la roue, j'ai trouvé sur github, XBMC intégré sur buildroot (une ancienne version).

Je suis reparti de ces sources et je les ai adaptées pour mon buildroot, pour vous fournir un patch à appliquer à buildroot.

# cd BUILDROOT_PATH
# patch -p1 < buildroot_raspberrypi_xbmc.patch

Que contient ce patch ?
  • Toutes les libraires nécessaires à la compilation et à l'utilisation de XBMC.
  • Le script d'initialisation pour le démarrage du binaire xbmc.
  • La modification des makefiles  pour certains utilitaires à compiler sur la machine hôte.
  • La modification du defconfig de buildroot.

Menu de configuration de buildroot :





PS : Il se peut qu'il y ai un petit problème de compilation sur un des modules. je fournirai (plus tard) un patch pour résoudre ce souci.

Une des libraires de XBMC (libcec) à besoin d'être patchée (libcec-001_fix_bool_t_modification.patch) pour une bonne compilation. Ce patch est à copier dans le dossier BUILDROOT_PATH/package/xbmc/libcec.

# ls -al package/xbmc/libcec
total 44
drwxr-xr-x  2 sinseman44 sinseman44 4096 2013-01-06 12:05 .
drwxr-xr-x 28 sinseman44 sinseman44 4096 2012-12-02 14:35 ..
-rw-r--r--  1 sinseman44 sinseman44  200 2012-12-01 15:57 Config.in
-rw-r--r--  1 sinseman44 sinseman44 1825 2013-01-06 12:03 libcec-001-fix_bool_t_modification.patch
-rw-r--r--  1 sinseman44 sinseman44  680 2012-12-06 08:42 libcec.mk

Ce patch contient les informations suivantes (modification de bool en bool_t, donc true en VC_TRUE et false en VC_FALSE) :

diff -ruN libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp output/build/libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp
--- libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp  2012-11-09 16:39:39.000000000 +0100
+++ output/build/libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp     2013-01-06 11:51:56.934356002 +0100
@@ -264,7 +264,7 @@
   if (bStartListening)
   {
     // enable passive mode
-    vc_cec_set_passive(true);
+    vc_cec_set_passive(VC_TRUE);

     // register the callback
     vc_cec_register_callback(((CECSERVICE_CALLBACK_T)rpi_cec_callback), (void*)this);
@@ -320,7 +320,7 @@
   UnregisterLogicalAddress();

   // disable passive mode
-  vc_cec_set_passive(false);
+  vc_cec_set_passive(VC_FALSE);

   if (!g_bHostInited)
   {
diff -ruN libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterMessageQueue.cpp output/build/libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterMessageQueue.cpp
--- libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterMessageQueue.cpp   2012-11-09 16:39:39.000000000 +0100
+++ output/build/libcec-600d5e54c86d494933fac1fe4a9b2826b8008280/src/lib/adapter/RPi/RPiCECAdapterMessageQueue.cpp      2013-01-06 11:50:55.090356002 +0100
@@ -182,7 +182,7 @@
   LIB_CEC->AddLog(CEC_LOG_DEBUG, "sending data: %s", strDump.c_str());
 #endif

-   int iReturn = vc_cec_send_message((uint32_t)command.destination, (uint8_t*)&payload, iLength, bIsReply);
+   int iReturn = vc_cec_send_message((uint32_t)command.destination, (uint8_t*)&payload, iLength, (bool_t)bIsReply);
 #endif

   if (iReturn != VCHIQ_SUCCESS)


L'autre patch (xbmc-001_texturepacker_raspberrypi.patch) est pour xbmc et plus précisément le fichier Configure.in et est à copier dans le dossier BUILDROOT_PATH/package/xbmc/xbmc :

# ls -al package/xbmc/xbmc
total 68
drwxr-xr-x  2 sinseman44 sinseman44 4096 2013-01-06 17:39 ./
drwxr-xr-x 28 sinseman44 sinseman44 4096 2012-12-02 14:35 ../
-rw-r--r--  1 sinseman44 sinseman44  775 2012-12-01 15:57 advancedsettings.xml
-rw-r--r--  1 sinseman44 sinseman44 2303 2012-12-05 14:19 Config.in
-rwxr-xr-x  1 sinseman44 sinseman44  662 2012-12-01 15:57 S99xbmc*
-rw-r--r--  1 sinseman44 sinseman44  787 2013-01-06 17:35 xbmc-001_texturepacker_raspberrypi.patch
-rw-r--r--  1 sinseman44 sinseman44 3657 2012-12-05 14:21 xbmc.mk

Que contient ce patch ?
Il permet de configurer le makefile correctement pour la compilation de TexturePacker (USE_TEXTUREPACKER_NATIVE_ROOT est une option renseignée dans le makefile (xbmc.mk) de xbmc présent dans le sous dossier package de buildroot).

diff -ruN output/build/xbmc-130bd4ee55688a8ae49a04256308831363d2c58f/configure.in xbmc-130bd4ee55688a8ae49a04256308831363d2c58f/configure.in
--- output/build/xbmc-130bd4ee55688a8ae49a04256308831363d2c58f/configure.in     2012-10-24 22:40:47.000000000 +0200
+++ xbmc-130bd4ee55688a8ae49a04256308831363d2c58f/configure.in  2013-01-06 15:15:14.234355994 +0100
@@ -670,7 +670,7 @@
      use_cpu=arm1176jzf-s
      use_hardcoded_tables="yes"
      use_alsa="no"
-     USE_TEXTUREPACKER_NATIVE_ROOT="$TEXTUREPACKER_NATIVE_ROOT"
+#     USE_TEXTUREPACKER_NATIVE_ROOT="$TEXTUREPACKER_NATIVE_ROOT"
      ARCH="arm"
      AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_LINUX -D_LINUX -D_ARMEL -DTARGET_RASPBERRY_PI")
      AC_DEFINE(HAS_EGLGLES, [1], [Define if supporting EGL based GLES Framebuffer])


Userland


Userland est un un jeu des librairies tierces (présent dans le patch de XBMC) nécessaires à l'utilisation de la raspberry pi (VideoCore, OMXplayer, etc ...) et notamment pour XBMC. Anciennement, ces librairies étaient téléchargées, pré-compilées, et installées sur le système de fichiers. Maintenant, elles sont cross-compilées depuis buildroot.

Le fichier Config.in :

config BR2_PACKAGE_USERLAND
 bool "Raspberry Pi Userland drivers"
 help
   These are the binary VideoCore drivers from Broadcom.
   https://github.com/raspberrypi/userland.git

Le makefile useland.mk :

############################################################
#
# Userland
#
############################################################
USERLAND_VERSION = 83e1597d57766a4dddcf11960289a6bd49d3d1ce
USERLAND_SITE_METHOD = git
USERLAND_SITE = https://github.com/raspberrypi/userland.git
USERLAND_INSTALL_STAGING = YES
USERLAND_INSTALL_TARGET = YES

$(eval $(cmake-package))

Le script d'initialisation S90vcfield :

#! /bin/sh
### BEGIN INIT INFO
# Provides:          vcfiled
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:    udev
# Required-Stop:     udev
# Short-Description: VideoCore file server daemon
### END INIT INFO

# Author: Luke Diamand 
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="VideoCore file server daemon"
NAME=vcfiled
VCROOT=/opt/vc
DAEMON=$VCROOT/sbin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME/$NAME
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
#. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
#. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
 # Return
 #   0 if daemon has been started
 #   1 if daemon was already running
 #   2 if daemon could not be started
 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
  || return 1
 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
  $DAEMON_ARGS \
  || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
 # Return
 #   0 if daemon has been stopped
 #   1 if daemon was already stopped
 #   2 if daemon could not be stopped
 #   other if a failure occurred
 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
 RETVAL="$?"
 [ "$RETVAL" = 2 ] && return 2
 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
 [ "$?" = 2 ] && return 2
 # Many daemons don't delete their pidfiles when they exit.
 rm -f $PIDFILE
 return "$RETVAL"
}

case "$1" in
  start)
 #[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
 echo "Starting $DESC" "$NAME"
 do_start
 case "$?" in
  0|1) echo "0" ;; #[ "$VERBOSE" != no ] && log_end_msg 0 ;;
  2) echo "1" ;; #[ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
  stop)
 #[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
 echo "Stopping $DESC" "$NAME"
 do_stop
 case "$?" in
  0|1) echo "0" ;; #[ "$VERBOSE" != no ] && log_end_msg 0 ;;
  2) echo "1" ;; #[ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
  #reload|force-reload)
 #
 # If do_reload() is not implemented then leave this commented out
 # and leave 'force-reload' as an alias for 'restart'.
 #
 #log_daemon_msg "Reloading $DESC" "$NAME"
 #do_reload
 #log_end_msg $?
 #;;
  restart|force-reload)
 #
 # If the "reload" option is implemented then remove the
 # 'force-reload' alias
 #
 #log_daemon_msg "Restarting $DESC" "$NAME"
 echo "Restarting $DESC" "$NAME"
 do_stop
 case "$?" in
   0|1)
  do_start
  case "$?" in
   0) echo "0" ;; #log_end_msg 0 ;;
   1) echo "1" ;; #log_end_msg 1 ;; # Old process is still running
   *) echo "1" ;; #log_end_msg 1 ;; # Failed to start
  esac
  ;;
   *)
    # Failed to stop
  echo "1" #log_end_msg 1
  ;;
 esac
 ;;
  *)
 #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
 exit 3
 ;;
esac


Vice 2.3 C64 pour Buildroot


voici le patch à appliquer à buildroot pour insérer l'émulateur aux autres outils.

# cd BUILDROOT_PATH
# patch -p1 < buildroot_raspberrypi_vice_c64.patch

Que contient ce patch ?
  • Le nouveau package (Config.in et vice.mk)
  • La modification du defconfig de buildroot.



Utilitaire framebuffer : fbset


je rajoute également un script d'initialisation (S89fbmodes) nécessaire pour l'utilisation de l'émulateur (à inserer dans le dossier /etc/init.d), pour la création du fichier fb.modes dans le dossier /etc, qui, nativement, n'est pas présent sur le système de base.

Pour ceci, il est nécessaire de cocher dans le menuconfig de buildroot l'utilitaire fbset


fb.modes est un fichier contenant tous les modes vidéos possibles.

#!/bin/sh
#
# fb.modes ..
#

FB_MODE_PATH="/etc/fb.modes"

case "$1" in
  start)
    echo "Initialisation of fb.modes for Vice C64 emulator ..."
    if [ ! -f "${FB_MODE_PATH}" ]; then
        /usr/sbin/fbset -s > "${FB_MODE_PATH}"
    fi
    ;;
  stop)
     ;;
  restart|reload)
     "$0" stop
     "$0" start
     ;;
  *)
     echo "Usage: $0 {start|stop|restart}"
     exit 1
esac

exit $?

le plus simple est de mettre ce script d'initialisation dans le dossier BUILDROOT_PATH/board/raspberrypi, puis de modifier le script post-build.sh (dans ce même dossier) qui l’insérera dans le système de fichiers à la compilation.

$ cp -a S89fbmodes BUILDROOT_PATH/board/raspberrypi
$ cd BUILDROOT_PATH/board/raspberrypi
$ vim post-build.sh

TARGETDIR=$1
# Set root password to 'root'. Password generated with
# mkpasswd, from the 'whois' package in Debian/Ubuntu.
sed -i 's%^root::%root:8kfIfYHmcyQEE:%' $TARGETDIR/etc/shadow

# Point /bin/sh to /bin/bash
ln -T -s /bin/bash $TARGETDIR/bin/sh

# Package the /boot partition
tar -czf $TARGETDIR/../images/boot.tar.gz --exclude=Image -C $TARGETDIR/boot/ .

# add a corrected, and lightweight inittab
cp board/raspberrypi/inittab $TARGETDIR/etc/inittab

# add eth0 dhcp entry into /etc/network/interfaces
cp board/raspberrypi/interfaces $TARGETDIR/etc/network/

# make sure that ntpdate is run before sshd is started
cp board/raspberrypi/S41ntpdate $TARGETDIR/etc/init.d/
cp board/raspberrypi/S89fbmodes $TARGETDIR/etc/init.d/
chmod a+x $TARGETDIR/etc/init.d/S41ntpdate
chmod a+x $TARGETDIR/etc/init.d/S89fbmodes

Processus Controle


Les fonctions principales de ce processus (controle-0.1.tar.gz) sont le lancement d'un binaire (émulateur ou média center) en fonction de l'état de l'interrupteur et la surveillance ces processus (relance en cas de crash), écriture dans le syslog pour le debug.
  • Le thread principal se charge de lancer les applications (scripts de start/stop) grâce à la fonction system.
  • Le thread secondaire, quant à lui, surveille l'état des processus en testant la valeur de leur PID, grâce à l'appel de l'utilitaire pidof.

Voici l'organisation du système de fichiers pour le bon fonctionnement du processus controle.
  • le processus controle se trouve dans le dossier /usr/bin/
  • les scripts de lancement et d'arrêt des 2 fonctionnalités se trouve dans le dossier /usr/share/controle/scripts (S99vice et S99xbmc)
  • le script d'initialisation de controle se trouve dans /etc/init.d/

Compilation du processus


La première étape est d'enregister la chaîne de compilation croisée dans le PATH du terminal :

$ export PATH=$PATH:BUILDROOT_PATH/output/host/usr/bin

ensuite, grâce au makefile (CFLAGS et LDFLAGS doivent être modifiés avec les chemins adéquats à votre buildroot) présent dans l'archive,

CC = arm-unknown-linux-gnueabi-gcc
CFLAGS = -IBUILDROOT_PATH/output/host/usr/arm-unknown-linux-gnueabi/sysroot/usr/include -W -Wall
LDFLAGS = -LBUILDROOT_PATH/output/host/usr/arm-unknown-linux-gnueabi/sysroot/usr/lib -pthread -lrt
EXEC = controle_process
OBJS = controle_process.o

all: $(EXEC)

$(EXEC):$(OBJS)
        @$(CC) -o $(EXEC) $^ $(LDFLAGS)

%.o:%.c
        @echo [CC] $^
        @$(CC) -o $@ -c $^ $(CFLAGS)

clean:
        @echo [CLEAN]
        @rm *.o $(EXEC) -f

on peut lancer la commande make pour compiler le programme :

$ make
[CC] controle_process.c

On vérifie que le binaire est bien cross-compilé :

$ file controle_process
controle_process: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.39, not stripped

Gestion d'une IO


Voici le schéma électrique de la gestion de l'entrée de cette GPIO :



Le montage final :


Script d'initialisation de controle


Le script d'initialisation configure une IO en entrée (GPIO 17) qui sera ensuite surveillée par le processus controle, puis lance le processus en mode daemon.

#!/bin/sh
#
# Controle ..
#

GPIO_PATH="/sys/class/gpio"
GPIO_NUM="17"
GPIO_NAME="gpio${GPIO_NUM}"

export HOME=/root

case "$1" in
        start)
        echo "configuration of gpio ..."
        if [ ! -d "${GPIO_PATH}"/"${GPIO_NAME}" ]; then
            echo "${GPIO_NUM}" > "${GPIO_PATH}"/export
        fi

        if [ -d "${GPIO_PATH}"/"${GPIO_NAME}" ]; then
            echo "in" > "${GPIO_PATH}"/"${GPIO_NAME}"/direction
        fi
        echo "Starting controle ..."
        start-stop-daemon --background -m -S -q -p /var/run/controle_process.pid --exec /usr/bin/controle_process
        ;;
        stop)
        echo "Stopping controle ..."
        start-stop-daemon -K -q -p /var/run/controle_process.pid --exec /usr/bin/controle_process
        ;;
        restart|reload)
        "$0" stop
        "$0" start
        ;;
        *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?

Scripts de lancement/d'arrêt de Vice c64 et xbmc


S99vice :

#!/bin/sh
#
# Vice C64 emulator
#

case "$1" in
  start)
    echo "Start Vice C64 emulator ..."
        /usr/bin/x64 &
     ;;
  stop)
    echo "Stop Vice C64 emulator ..."
        /usr/bin/pkill x64
     ;;
  restart|reload)
     "$0" stop
     "$0" start
     ;;
  *)
     echo "Usage: $0 {start|stop|restart}"
     exit 1
esac

exit $?

S99xbmc :

#!/bin/sh
#
# XBMC mediacenter
#

case "$1" in
  start)
    echo "Start XBMC mediacenter ..."
        /usr/lib/xbmc/xbmc.bin -standalone -fs &
     ;;
  stop)
        echo "Stop XBMC mediacenter ..."
        /usr/bin/pkill xbmc.bin
     ;;
  restart|reload)
     "$0" stop
     "$0" start
     ;;
  *)
     echo "Usage: $0 {start|stop|restart}"
     exit 1
esac

exit $?

Carte Contrôleur clavier


Le clavier du commodore 64 n'utilise qu'une broche de 20 pins pour être interfacé (1 pin pour la masse, 2 pins non connectées, 1 pin pour restorer le clavier et 16 pins pour les 64 touches). Le but de cette carte d'interface est de connecter le clavier en USB sur la raspberry pi, via une interface HID (Human Interface Device).
Le micro-contrôleur utilisé est un pic18f4550 qui gère l'USB et l'alimentation électrique de la carte est réalisé via le bus USB connecté à la raspberry pi (bus-powered). J'ai utilisé le compilateur HI-TECH picc18 sous linux et la stack USB opensource fourni par Microchip.

L'installation, l'utilisation du compilateur pic de chez HI-TECH, le flashage d'un micro pic16f/pic18f, fera l'objet d'un autre billet sur les micro-contrôleurs.

Voici le schéma de principe :


Les colonnes (PIN 5 à PIN 12) vont être reliées en entrée et positionnées à l'état haut (+5v) via une résistance de pull-up, du micro-contrôleur et les lignes (PIN 13 à PIN 20) vont être reliées en sortie.
La théorie est de placer respectivement chaque ligne à l'état bas (GND) et de vérifier quelle colonne est aussi à l'état bas pour connaitre la touche qui a été appuyée.


Voici le schéma électrique de la carte contrôleur :



Voici la datasheet du micro-contrôleur pic18F4550 :



Je me suis largement inspiré du site web waitingforfriday.com pour réaliser cette carte.

Conclusion


Point 1 :

Le clavier du commodore 64 n'a que deux touches pour la gestion des flèches de directions (BAS et DROITE, nativement et L-SHIFT + BAS = HAUT et L-SHIFT + DROITE = GAUCHE), j'ai du remapper d'autres touches pour pouvoir naviguer dans les différents menu de XBMC puisque je n'ai pas réussi à utiliser la combinaison L-SHIFT + DROITE/BAS.

sur le système de fichier de la raspberry pi :

# cd /usr/share/xbmc/system/keymaps

Supprimer toutes les configurations (fichiers XML) qui ne vous intéresse pas, pour ne garder que keyboard.xml, mouse.xml et remote.xml. Une page wiki de XMBC explique comment modifier ces fichiers de configuration.

Point 2 :

J'en ai profiter pour rajouter le client de téléchargement sur newsgroup : SABnzbd (voir précédent billet) et suite à une charge réseau importante, je me suis rendu compte que la raspberry pi plantait. Pour remédier à ce problème.

dans buildroot, on va rajouter un fichier sysctl.conf. Le paramètre vm.min_free_kbytes permet de forcer le manager de mémoire virtuelle à garder un minimum de mémoire libre (Ko). par défault, il était à 1Ko, je le passe à 8Ko.

# cd BUILDROOT_PATH/board/raspberrypi/
# touch sysctl.conf
# echo "vm.min_free_kbytes=8192" > sysctl.conf

Ce fichier va être copié à la compilation sur le système de fichiers

# vim post-build.sh
TARGETDIR=$1
# Set root password to 'root'. Password generated with
# mkpasswd, from the 'whois' package in Debian/Ubuntu.
sed -i 's%^root::%root:8kfIfYHmcyQEE:%' $TARGETDIR/etc/shadow

# Point /bin/sh to /bin/bash
ln -T -s /bin/bash $TARGETDIR/bin/sh

# Package the /boot partition
tar -czf $TARGETDIR/../images/boot.tar.gz --exclude=Image -C $TARGETDIR/boot/ .

# add a corrected, and lightweight inittab
cp board/raspberrypi/inittab $TARGETDIR/etc/inittab

# add eth0 dhcp entry into /etc/network/interfaces
cp board/raspberrypi/interfaces $TARGETDIR/etc/network/

# copy raspberrypi special conf
cp board/raspberrypi/sysctl.conf $TARGETDIR/etc/sysctl.conf

# make sure that ntpdate is run before sshd is started
cp board/raspberrypi/S41ntpdate $TARGETDIR/etc/init.d/
cp board/raspberrypi/S89fbmodes $TARGETDIR/etc/init.d/
chmod a+x $TARGETDIR/etc/init.d/S41ntpdate
chmod a+x $TARGETDIR/etc/init.d/S89fbmodes

On va ensuite modifier le script d'initialisation de controle pour qu'au démarrage, la carte prenne en compte ce nouveau paramètre. (A noter que sur ce script l'export du paramètre TZ permet de mettre à jour l'heure française).

# vim S95controle
#!/bin/sh
#
# Controle ..
#

GPIO_PATH="/sys/class/gpio"
GPIO_NUM="17"
GPIO_NAME="gpio${GPIO_NUM}"

export HOME=/root
export TZ=MET-1METDST

case "$1" in
        start)
                echo "configuration des parametres de la carte"
                /sbin/sysctl -p /etc/sysctl.conf

                echo "configuration of gpio ..."
                if [ ! -d "${GPIO_PATH}"/"${GPIO_NAME}" ]; then
                        echo "${GPIO_NUM}" > "${GPIO_PATH}"/export
                fi

                if [ -d "${GPIO_PATH}"/"${GPIO_NAME}" ]; then
                        echo "in" > "${GPIO_PATH}"/"${GPIO_NAME}"/direction
                fi
                echo "Starting controle ..."
                echo "HOME = ${HOME}"
                start-stop-daemon --background -m -S -q -p /var/run/controle_process.pid --exec /usr/bin/controle_process
                #/bin/sh -c "/usr/bin/controle_process &"
                ;;
        stop)
                echo "Stopping controle ..."
                start-stop-daemon -K -q -p /var/run/controle_process.pid --exec /usr/bin/controle_process
                #/bin/sh -c "killall controle_process"
                ;;
        restart|reload)
                "$0" stop
                "$0" start
                ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
esac

exit $?

Une modification du fichier cmdline.txt présent sur la partition de boot pour y rajouter de nouveaux paramètres. Voici la ligne complète du fichier cmdline.txt

sdhci-bcm2708.enable_llm=1 sdhci-bcm2708.sync_after_dma=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait

Point 3 :

Je n'ai pas réussi à lancer l'émulateur C64 en mode plein écran, malgré mon fichier fb.modes bien configuré avec les paramètres correspondants à ma TV. Je continue à investiguer sur la librairie SDL utilisée par l'émulateur.


Voici quelques photos du montage de ce projet.







Aucun commentaire:

Enregistrer un commentaire