====== 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 [[wiki:linux_pour_zynq_de_xilinx:installation_buildroot_vagrant|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 ? * ~/microzed_spidev \\ build .config Makefile * build \\ buildroot-config * buildroot-config\\ conf conf.o .depend lxdialog zconf.hash.c zconf.lex.c zconf.tab.o $ make O=../microzed_spidev/ menuconfig $ make O=../microzed_spidev/ Quels sont les résultats ? * ~/microzed_spidev \\ build .config .config.cmd host images Makefile staging target ===== 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 ? * ~/microzed_spidev/images \\ 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 : [[wiki:linux_pour_zynq_de_xilinx:installation_buildroot#installation_sur_la_carte_sd|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.