Outils pour utilisateurs

Outils du site


wiki:linux_pour_zynq_de_xilinx:projet_spidev_buildroot

SPIDev avec Buildroot

Ici nous allons montrer un exemple d'utilisation de l'interface standard de Linux SPIDev. Nous allons configurer Buildroot pour qu'il prenne en charge l'interface SPI0 du processeur Zynq, une fois configurée avec Vivado et Xilinx SDK.
Pour l'installtion de Buildroot, on pourra se reporter par exemple au chapitre création de Buildroot sous environnement Vagrant.
Nous travaillons ici avec la version buildroot-2016.08.

Préparations

Nous allons créer un répertoire microzed_spidev où nous conserverons les sorties de Buildroot

$ cd ~
$ mkdir microzed_spidev

Nous allons utiliser la configuration par défaut de Buildroot adaptée à la carte microzed. D'abord, où se trouve-t-elle ?

$ ls ~/buildroot utilisation de Buildroot pour carte microzedt-2016.08/configs
...
zynq_zed_defconfig

Maintenant, créons la configuration adaptée :

$ cd ~/buildroot-2016.08
$ make O=../microzed_spidev/ zynq_microzed_defconfig
...
#
# configuration written to ../microzed_spidev//.config
#

Quels sont les résultats ?

  • <color blue> ~/microzed_spidev </color>
    <color blue>build</color> .config Makefile
    • <color blue> build </color>
      <color blue>buildroot-config</color>
      • <color blue>buildroot-config</color>
        conf conf.o .depend <color blue>lxdialog</color> zconf.hash.c zconf.lex.c zconf.tab.o
$ make O=../microzed_spidev/ menuconfig
$ make O=../microzed_spidev/

Quels sont les résultats ?

  • <color blue> ~/microzed_spidev </color>
    <color blue>build</color> .config .config.cmd <color blue>host images</color> Makefile <color cyan>staging</color> <color blue>target</color>

Modifications pour prendre en compte la configuration du processeur

copier les fichiers ps7_init_gpl.[c/h]

Afin de prendre en compte l'ensemble des périphériques configurés du processeur PS7, dans notre cas l'activation de l'interface SPI0, il est nécessaire de charger les fichiers ps7_init_gpl.[c/h] dans l'arborescence de u-boot. Ainsi , le FSBL (First Stage Boot Loader) pourra configurer correctement le processeur. Pour cela il faut dans un premier temps copier les fichiers dans le répertoire commune avec la machine virtuelle et l'hôte (si on utilise Vagrant) dans une console à part

$ cp  ~/chemin_du_projet_vivado.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.c ~/chemin_de_la_machine_virtuelle_vagrant/
$ cp  ~/chemin_du_projet_vivado.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.h ~/chemin_de_la_machine_virtuelle_vagrant/

Ensuite, dans la console de la machine virtuelle, copier ces fichiers dans le répertoire associé à une carte zynq personnalisée :

 $ cp /vagrant/ps7_init_gpl.c ~/microzed_spidev/build/uboot-xilinx-v2016.2/board/xilinx/zynq/custom_hw_platform/
 $ cp /vagrant/ps7_init_gpl.h ~/microzed_spidev/build/uboot-xilinx-v2016.2/board/xilinx/zynq/custom_hw_platform/

configurer u-boot

Cocher la case Use custom ps7_init provided by Xilinx tool du menu de configuration.

$ make O=../microzed_spidev/ uboot-menuconfig

dans le menu : → ARM archtecture –>[*] Use custom ps7_init provided by Xilinx tool

changer le device tree

Il est nécessaire de prendre en compte le périphérique SPI0 comme étant rattaché qu driver SPIDEV. Pour cela il faut modifier le fichier zynq-zed.dts fournit par défaut, ou indiquer un autre fichier dts Voici un exemple de fichier que nous appellerons zynq-zed_spi0_spidev.dts placé dans le répertoire /vagrant/ afin de ne pas le perdre en cas de nettoyage de la configuration : ++++ zynq-zed_spi0_spidev.dts |

/*
 *  Copyright (C) 2011 - 2014 Xilinx
 *  Copyright (C) 2012 National Instruments Corp.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */
/dts-v1/;
#include "zynq-7000.dtsi"
 
/ {
	model = "Zynq Zed Development Board";
	compatible = "xlnx,zynq-zed", "xlnx,zynq-7000";
 
	aliases {
		ethernet0 = &gem0;
		serial0 = &uart1;
		/*spi0 = &qspi;*/
		mmc0 = &sdhci0;
	};
 
	memory {
		device_type = "memory";
		reg = <0x0 0x20000000>;
	};
 
	chosen {
		bootargs = "";
		stdout-path = "serial0:115200n8";
	};
 
	usb_phy0: phy0 {
		compatible = "ulpi-phy";
		#phy-cells = <0>;
		reg = <0xe0002000 0x1000>;
		view-port = <0x0170>;
		drv-vbus;
	};
	regulators {
        	compatible = "simple-bus";
        	#address-cells = <1>;
        	#size-cells = <0>;
 
        	reg_dac_vdd: regulator@0 {
            	compatible = "regulator-fixed";
            	reg = <0>;
            	regulator-name = "dac_vdd";
            	regulator-min-microvolt = <10000000>;
            	regulator-max-microvolt = <10000000>;
        	};
        	reg_dac_vss: regulator@1 {
            	compatible = "regulator-fixed";
            	reg = <1>;
            	regulator-name = "dac_vss";
            	regulator-min-microvolt = <10000000>;
            	regulator-max-microvolt = <10000000>;
        	};
    	};
};
 
&clkc {
	ps-clk-frequency = <33333333>;
};
 
&gem0 {
	status = "okay";
	phy-mode = "rgmii-id";
	phy-handle = <&ethernet_phy>;
 
	ethernet_phy: ethernet-phy@0 {
		reg = <0>;
	};
};
 
&qspi {
	status = "okay";
	is-dual = <0>;
	num-cs = <1>;
	flash@0 {
		compatible = "n25q128a11";
		reg = <0x0>;
		spi-tx-bus-width = <1>;
		spi-rx-bus-width = <4>;
		spi-max-frequency = <50000000>;
		#address-cells = <1>;
		#size-cells = <1>;
		partition@qspi-fsbl-uboot {
			label = "qspi-fsbl-uboot";
			reg = <0x0 0x100000>;
		};
		partition@qspi-linux {
			label = "qspi-linux";
			reg = <0x100000 0x500000>;
		};
		partition@qspi-device-tree {
			label = "qspi-device-tree";
			reg = <0x600000 0x20000>;
		};
		partition@qspi-rootfs {
			label = "qspi-rootfs";
			reg = <0x620000 0x5E0000>;
		};
		partition@qspi-bitstream {
			label = "qspi-bitstream";
			reg = <0xC00000 0x400000>;
		};
	};
};
 
&spi0 {
        num-cs = <4>;
        is-decoded-cs = <0>;
        status = "okay";
        spidev@0 {
                compatible = "spidev";
                reg = <0>;
                spi-max-frequency = <5000000>;
                spi-cpha ;
        };
};
 
 
&sdhci0 {
	status = "okay";
};
 
&uart1 {
	status = "okay";
};
 
&usb0 {
	status = "okay";
	dr_mode = "host";
	usb-phy = <&usb_phy0>;
};

++++

configurer la prise en charge du nouveau device tree

$ make O=../microzed_spidev/ menuconfig

dans le menu → Kernel –> Device tree source —> (X) Use a custom device tree file dans le menu → Kernel –> Device Tree Source file paths —> /vagrant/zynq-zed_spi0_spidev.dts

configurer linux avec le driver //SPIDEV//

$ make O=../microzed_spidev/ linux-menuconfig

dans le menu → Device Drivers –> [*] SPI support —> <*> User mode SPI device driver support

appliquer les changements

$ make O=../microzed_spidev/

Il se peut que seul la génération uImage et le fichier dtb soit nécessaire à regénérer. Alors :

$ make O=../microzed_spidev/ linux-rebuild

mettre les fichiers sur la carte SD

Quels sont les résultats ?

  • <color blue> ~/microzed_spidev/images </color>
    boot.bin rootfs.cpio.uboot uImage
    rootfs.cpio rootfs.tar zynq-zed.dtb
    rootfs.cpio.gz u-boot.img zynq-zed_spi0_spidev.dtb

Nous devons alors copier certains de ces fichiers sur la carte SD. Pour cela, il va falloir passer par le répertoire commun entre l'hôte et la machine virutelle

$ cp ~/microzed_spidev/images/* /vagrant/

Ensuite, se référer à cette section : Installation sur la carte SD

mettre le bitstream sur la carte SD

Pour que le contenu du FPGA soit chargé dans le composant, dans notre cas le bistrean sera chargé après le lancement de linux. Cela peut se faire au chargement de u-boot, mais nous ne verrons pas cela ici.
Dans une console du système où le répertoire utilisé pour le projet avec Xilinx SDK, on copie le fichier .bit sur la carte SD

$ cp  ~/chemin_du_projet_vivado.sdk/design_1_wrapper_hw_platform_0/design_1_wrapper.bit /media/BOOT/

Une fois la carte Microzed allumée

Lorsque que vous avez installé la carte SD dans la Microzed et que vous avez une console pour communiquer avec, vous devez monter la partition où vous avez votre bitstream, puis le charge dans le FPGA :

Welcome to Buildroot
buildroot login: root
# mount -a /dev/mmcblk0p1 /tmp/
# cat /tmp/design_1_wrapper.bit > /dev/xdevcfg

Là, vérifiez que le driver spidev a bien pris en compte le périphérique spi

# ls /dev/spidev32766.0 
/dev/spidev32766.0

Vous pouvez communiquer avec le bus spi :

# echo -n 1 > /dev/spidev32766.0

Ensuite, pour vos programmes, vous pouvez utiliser l'interface ioctl pour accéder à votre périphérique SPI.

wiki/linux_pour_zynq_de_xilinx/projet_spidev_buildroot.txt · Dernière modification : 2016/11/24 13:54 de emeyer