Table des matières
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 = <ðernet_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.