Logiciels Libres et Systèmes Embarqués


5.10. Pilote de l'interface CompactFlash

Nous allons voir dans cette section comment mettre en place le pilote du SystemACE (interface CompactFlash). Précisons toutefois que ce pilote n'a pas été testé de manière soutenue.

J'ai récupérer le pilote dans les sources du noyau Linux porté par MontaVista :

bash# cp MVL/drivers/block/xilinx_sysace drivers/block/
bash# mkdir arch/ppc/platforms/xilinx_ocp
bash# cp MVL/xbasic_types.h arch/ppc/platforms/xilinx_ocp
bash# cp MVL/xstatus.h arch/ppc/platforms/xilinx_ocp
bash# cp MVL/xio.h arch/ppc/platforms/xilinx_ocp

Il faut ensuite modifier le fichier drivers/block/Makefile pour qu'il prenne en compte ce pilote :

  subdir-$(CONFIG_PARIDE) += paride

+ mod-subdirs			 += xilinx_sysace
+ subdir-$(CONFIG_XILINX_SYSACE) += xilinx_sysace
+ obj-$(CONFIG_XILINX_SYSACE)	 += xilinx_sysace/xilinx_sysace.o

Il faut alors modifier le fichier arch/ppc/config.in pour que le menu de configuration affiche les options du nouveau pilote :

+ if [ "$CONFIG_VIRTEX" = "y" ]; then
+   tristate 'Xilinx SystemACE support' CONFIG_XILINX_SYSACE
+   if [ "$CONFIG_XILINX_SYSACE" != "n" ]; then
+     hex 'SysACE registers base address (C_BASEADDR)' \
+         XPAR_SYSACE_0_BASEADDR 0x81800000
+     hex 'SysACE registers high address (C_HIGHADDR)' \
+         XPAR_SYSACE_0_HIGHADDR 0x8180FFFF
+     int '    SysACE interrupt' XPAR_INTC_0_SYSACE_0_VEC_ID 3
+     bool '    SysACE 16 bits mode' XPAR_XSYSACE_16BIT_MODE
+   fi
+ fi

  tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD

Le pilote utilise arch/ppc/platforms/xilinx_ocp/xparameters.h, qui contient traditionnellement les paramètres de l'architecture créée avec EDK. Je préfère que ces paramètres apparaissent dans le menu de configuration, mais il faut quand même remplir au minimum ce fichier avec :

#define XPAR_SYSACE_0_DEVICE_ID    0
#define XPAR_XSYSACE_NUM_INSTANCES 1

#define XPAR_OPB_SYSACE_0_BASEADDR  XPAR_SYSACE_0_BASEADDR
#define XPAR_OPB_SYSACE_0_DEVICE_ID XPAR_SYSACE_0_DEVICE_ID

Pour que ces modifications soient prises en compte, il faut modifier le fichier drivers/block/xilinx_sysace/adapter.c de la manière suivante :

  #include <xbasic_types.h>
  #include "xsysace.h"
+ #include "xparameters.h"

Le noyau Linux porté MontaVista référence les IRQ dans l'ordre [31:0] alors que le pilote du contrôleur d'interruptions les utilise dans l'autre sens. On doit alors modifier drivers/block/xilinx_sysace/adapter.c de la manière suivante :

- #define XSA_IRQ (31 - XPAR_INTC_0_SYSACE_0_VEC_ID)
+ #define XSA_IRQ (XPAR_INTC_0_SYSACE_0_VEC_ID)

Enfin, le pilote du SystemACE utilise inutilement certains symboles qu'il faut définir dans le fichier drivers/block/xilinx_sysace/adapter.c :

unsigned int XAssertStatus;
EXPORT_SYMBOL(XAssertStatus);

void XAssert(char *File, int Line)
{
}
EXPORT_SYMBOL(XAssert);