• 0
plazma33

describ external GPIOS in zynq-zybo.dts

Question

I finished booting linux on zybo with linario file system and I m trying to user the user space and kernel drivers to controle LEDs and get input information from  peripheral buttons , gyroscope, accéléromètre and a bluetooth  

So I wonder if I have to insert gpios déclarations in zynq-zybo.dts and compile a new devicetree.dtb !!

this are some screanshots from my zybo terminal : 

screenshot_20170330_235445.png

Share this post


Link to post
Share on other sites

12 answers to this question

Recommended Posts

  • 1

Hi @plazma33,

I moved your thread to a better section to get more embedded linux forum members to see your it. I believe that is the case but I have reached out to a more experienced engineer about your question.

cheers,

Jon

Edited by jpeyron

Share this post


Link to post
Share on other sites
  • 1

Hi,

you should at least upload your actual DTS file.

But it looks like there is already one AXi_GPIO (just one ?) declared in your design.

So you can find the address of the leds, let's say leds1 address is 906.

echo 906 > /sys/class/gpio/export                    ----> export to be able to use it in userspace
echo out > /sys/class/gpio/gpio906/direction    ----> give it a direction (out for a led)

echo 1 > /sys/class/gpio/gpio906/value            ----> led on
echo 0 > /sys/class/gpio/gpio906/value            ----> led off

echo 906 > /sys/class/gpio/unexport                ----> unexport the gpio when you finished

regards,

Yohan

Share this post


Link to post
Share on other sites
  • 1

Please attach your file when it is too big.

How did you have generate your DTS ? There is a good tutorial to follow to generate full dts for zybo with your hdf file from vivado.

http://www.wiki.xilinx.com/Build+Device+Tree+Blob

Did you try export/unexport method ? If you are able to see gpiochip in /sys/class/gpio, you should be able to access your gpio too.

regards,

Yohan

Share this post


Link to post
Share on other sites
  • 1

That's a really old project, I recommend using the project here: https://github.com/Digilent/ZYBO/tree/master/Projects/linux_bd

Even better, if you are building an embedded linux system, use petalinux and start with this project:

https://github.com/Digilent/petalinux-bsps/tree/master/projects/Digilent-Zybo-Linux-BD-v2015.4

That petalinux project includes a properly configured device tree for the linux_bd block diagram, and also properly configured u-boot/linux kernel/rootfs.

I recommend you use it with Petalinux 2015.4, and build your embedded linux application using it as well. Petalinux is super well documented by Xilinx, so it will help you in the future.

Another bonus to using petalinux, if you modify linux_bd, you just need to re-import your hdf into the petalinux project and it will incorporate the changes into the device tree

Share this post


Link to post
Share on other sites
  • 0

Hi @yohboy

thank you , yes I have only one GPIO ,,, I m not  working without Vivado , I think there is a relation between Vivado and DTS file but I choosed  to work only with kernel drivers  So I m looking forward to find a full DTS file and compile it so I can find all the drivers then I can controle all the peripheral leds buttons and Pmods !! 

Please I need help !!!!

 

here is my DTS file :

zynq-zybo.dts :

/dts-v1/;
/ {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "xlnx,zynq-7000";
    model = "Xilinx Zynq";
    aliases {
        ethernet0 = &ps7_ethernet_0;
        serial0 = &ps7_uart_1;
        spi0 = &ps7_qspi_0;
    } ;
    chosen {
        bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait";
        linux,stdout-path = "/amba@0/serial@e0001000";
    } ;
    cpus {
        #address-cells = <1>;
        #size-cells = <0>;
        ps7_cortexa9_0: cpu@0 {
            bus-handle = <&ps7_axi_interconnect_0>;
            clock-latency = <1000>;
            clocks = <&clkc 2>;
            compatible = "arm,cortex-a9";
            device_type = "cpu";
            interrupt-handle = <&ps7_scugic_0>;
            operating-points = <666667 1000000 333334 1000000 222223 1000000>;
            reg = <0x0>;
        } ;
        ps7_cortexa9_1: cpu@1 {
            bus-handle = <&ps7_axi_interconnect_0>;
            clocks = <&clkc 2>;
            compatible = "arm,cortex-a9";
            device_type = "cpu";
            interrupt-handle = <&ps7_scugic_0>;
            reg = <0x1>;
        } ;
    } ;
    pmu {
        compatible = "arm,cortex-a9-pmu";
        interrupt-parent = <&ps7_scugic_0>;
        interrupts = <0 5 4>, <0 6 4>;
        reg = <0xf8891000 0x1000>, <0xf8893000 0x1000>;
        reg-names = "cpu0", "cpu1";
    } ;
    ps7_ddr_0: memory@0 {
        device_type = "memory";
        reg = <0x0 0x20000000>;
    } ;
    ps7_axi_interconnect_0: amba@0 {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "xlnx,ps7-axi-interconnect-1.00.a", "simple-bus";
        ranges ;
        ps7_afi_0: ps7-afi@f8008000 {
            compatible = "xlnx,ps7-afi-1.00.a";
            reg = <0xf8008000 0x1000>;
        } ;
        ps7_afi_1: ps7-afi@f8009000 {
            compatible = "xlnx,ps7-afi-1.00.a";
            reg = <0xf8009000 0x1000>;
        } ;
        ps7_afi_2: ps7-afi@f800a000 {
            compatible = "xlnx,ps7-afi-1.00.a";
            reg = <0xf800a000 0x1000>;
        } ;
        ps7_afi_3: ps7-afi@f800b000 {
            compatible = "xlnx,ps7-afi-1.00.a";
            reg = <0xf800b000 0x1000>;
        } ;
        ps7_ddrc_0: ps7-ddrc@f8006000 {
            compatible = "xlnx,zynq-ddrc-1.0";
            reg = <0xf8006000 0x1000>;
            xlnx,has-ecc = <0x0>;
        } ;
        ps7_dev_cfg_0: ps7-dev-cfg@f8007000 {
            clock-names = "ref_clk", "fclk0", "fclk1", "fclk2", "fclk3";
            clocks = <&clkc 12>, <&clkc 15>, <&clkc 16>, <&clkc 17>, <&clkc 18>;
            compatible = "xlnx,zynq-devcfg-1.0";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 8 4>;
            reg = <0xf8007000 0x100>;
        } ;
        ps7_dma_s: ps7-dma@f8003000 {
            #dma-cells = <1>;
            #dma-channels = <8>;
            #dma-requests = <4>;
            clock-names = "apb_pclk";
            clocks = <&clkc 27>;
            compatible = "arm,primecell", "arm,pl330";
            interrupt-names = "abort", "dma0", "dma1", "dma2", "dma3",
                "dma4", "dma5", "dma6", "dma7";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 13 4>, <0 14 4>, <0 15 4>, <0 16 4>, <0 17 4>, <0 40 4>, <0 41 4>, <0 42 4>, <0 43 4>;
            reg = <0xf8003000 0x1000>;
        } ;
        ps7_ethernet_0: ps7-ethernet@e000b000 {
            #address-cells = <1>;
            #size-cells = <0>;
            clock-names = "ref_clk", "aper_clk";
            clocks = <&clkc 13>, <&clkc 30>;
            compatible = "xlnx,ps7-ethernet-1.00.a";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 22 4>;
            phy-handle = <&phy0>;
            phy-mode = "rgmii-id";
            reg = <0xe000b000 0x1000>;
            xlnx,eth-mode = <0x1>;
            xlnx,has-mdio = <0x1>;
            xlnx,ptp-enet-clock = <108333336>;
            mdio {
                #address-cells = <1>;
                #size-cells = <0>;
                phy0: phy@1 {
                    compatible = "realtek,RTL8211E";
                    device_type = "ethernet-phy";
                    reg = <1>;
                } ;
            } ;
        } ;
        ps7_globaltimer_0: ps7-globaltimer@f8f00200 {
            clocks = <&clkc 4>;
            compatible = "arm,cortex-a9-global-timer";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <1 11 0x301>;
            reg = <0xf8f00200 0x100>;
        } ;
        ps7_gpio_0: ps7-gpio@e000a000 {
            #gpio-cells = <2>;
            clocks = <&clkc 42>;
            compatible = "xlnx,zynq-gpio-1.0";
            emio-gpio-width = <64>;
            gpio-controller ;
            gpio-mask-high = <0xc0000>;
            gpio-mask-low = <0xfe81>;
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 20 4>;
            reg = <0xe000a000 0x1000>;
        } ;
        ps7_iop_bus_config_0: ps7-iop-bus-config@e0200000 {
            compatible = "xlnx,ps7-iop-bus-config-1.00.a";
            reg = <0xe0200000 0x1000>;
        } ;
        ps7_ocmc_0: ps7-ocmc@f800c000 {
            compatible = "xlnx,zynq-ocmc-1.0";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 3 4>;
            reg = <0xf800c000 0x1000>;
        } ;
        ps7_pl310_0: ps7-pl310@f8f02000 {
            arm,data-latency = <3 2 2>;
            arm,tag-latency = <2 2 2>;
            cache-level = <2>;
            cache-unified ;
            compatible = "arm,pl310-cache";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 2 4>;
            reg = <0xf8f02000 0x1000>;
        } ;
        ps7_qspi_0: ps7-qspi@e000d000 {
            clock-names = "ref_clk", "pclk";
            clocks = <&clkc 10>, <&clkc 43>;
            compatible = "xlnx,zynq-qspi-1.0";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 19 4>;
            is-dual = <0>;
            num-cs = <1>;
            reg = <0xe000d000 0x1000>;
            xlnx,fb-clk = <0x1>;
            xlnx,qspi-mode = <0x0>;
            #address-cells = <1>;
            #size-cells = <0>;
            flash@0 {
                compatible = "n25q128";
                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 0x400000>;
                };
                partition@qspi-linux {
                    label = "qspi-linux";
                    reg = <0x400000 0x500000>;
                };
                partition@qspi-device-tree {
                    label = "qspi-device-tree";
                    reg = <0x900000 0x20000>;
                };
                partition@qspi-user {
                    label = "qspi-user";
                    reg = <0x920000 0x6E0000>;
                };
            };

        } ;
        ps7_qspi_linear_0: ps7-qspi-linear@fc000000 {
            clock-names = "ref_clk", "aper_clk";
            clocks = <&clkc 10>, <&clkc 43>;
            compatible = "xlnx,ps7-qspi-linear-1.00.a";
            reg = <0xfc000000 0x1000000>;
        } ;
        ps7_scugic_0: ps7-scugic@f8f01000 {
            #address-cells = <2>;
            #interrupt-cells = <3>;
            #size-cells = <1>;
            compatible = "arm,cortex-a9-gic", "arm,gic";
            interrupt-controller ;
            num_cpus = <2>;
            num_interrupts = <96>;
            reg = <0xf8f01000 0x1000>, <0xf8f00100 0x100>;
        } ;
        ps7_scutimer_0: ps7-scutimer@f8f00600 {
            clocks = <&clkc 4>;
            compatible = "arm,cortex-a9-twd-timer";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <1 13 0x301>;
            reg = <0xf8f00600 0x20>;
        } ;
        ps7_scuwdt_0: ps7-scuwdt@f8f00620 {
            clocks = <&clkc 4>;
            compatible = "xlnx,ps7-scuwdt-1.00.a";
            device_type = "watchdog";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <1 14 0x301>;
            reg = <0xf8f00620 0xe0>;
        } ;
        ps7_sd_0: ps7-sdio@e0100000 {
            clock-frequency = <50000000>;
            clock-names = "clk_xin", "clk_ahb";
            clocks = <&clkc 21>, <&clkc 32>;
            compatible = "arasan,sdhci-8.9a";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 24 4>;
            reg = <0xe0100000 0x1000>;
            xlnx,has-cd = <0x1>;
            xlnx,has-power = <0x0>;
            xlnx,has-wp = <0x1>;
        } ;
        ps7_slcr_0: ps7-slcr@f8000000 {
            #address-cells = <1>;
            #size-cells = <1>;
            compatible = "xlnx,zynq-slcr", "syscon";
            ranges ;
            reg = <0xf8000000 0x1000>;
            clkc: clkc@100 {
                #clock-cells = <1>;
                clock-output-names = "armpll", "ddrpll", "iopll", "cpu_6or4x", "cpu_3or2x",
                    "cpu_2x", "cpu_1x", "ddr2x", "ddr3x", "dci",
                    "lqspi", "smc", "pcap", "gem0", "gem1",
                    "fclk0", "fclk1", "fclk2", "fclk3", "can0",
                    "can1", "sdio0", "sdio1", "uart0", "uart1",
                    "spi0", "spi1", "dma", "usb0_aper", "usb1_aper",
                    "gem0_aper", "gem1_aper", "sdio0_aper", "sdio1_aper", "spi0_aper",
                    "spi1_aper", "can0_aper", "can1_aper", "i2c0_aper", "i2c1_aper",
                    "uart0_aper", "uart1_aper", "gpio_aper", "lqspi_aper", "smc_aper",
                    "swdt", "dbg_trc", "dbg_apb";
                compatible = "xlnx,ps7-clkc";
                fclk-enable = <0xf>;
                ps-clk-frequency = <50000000>;
                reg = <0x100 0x100>;
            } ;
        } ;
        ps7_ttc_0: ps7-ttc@f8001000 {
            clocks = <&clkc 6>;
            compatible = "cdns,ttc";
            interrupt-names = "ttc0", "ttc1", "ttc2";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 10 4>, <0 11 4>, <0 12 4>;
            reg = <0xf8001000 0x1000>;
        } ;
        ps7_uart_1: serial@e0001000 {
            clock-names = "uart_clk", "pclk";
            clocks = <&clkc 24>, <&clkc 41>;
            compatible = "xlnx,xuartps", "cdns,uart-r1p8";
            current-speed = <115200>;
            device_type = "serial";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 50 4>;
            port-number = <0>;
            reg = <0xe0001000 0x1000>;
            xlnx,has-modem = <0x0>;
        } ;
        ps7_usb_0: ps7-usb@e0002000 {
            clocks = <&clkc 28>;
            compatible = "xlnx,ps7-usb-1.00.a", "xlnx,zynq-usb-1.00.a";
            dr_mode = "host";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 21 4>;
            phy_type = "ulpi";
            reg = <0xe0002000 0x1000>;
            xlnx,usb-reset = "MIO 46";
        } ;
        ps7_xadc: ps7-xadc@f8007100 {
            clocks = <&clkc 12>;
            compatible = "xlnx,zynq-xadc-1.00.a";
            interrupt-parent = <&ps7_scugic_0>;
            interrupts = <0 7 4>;
            reg = <0xf8007100 0x20>;
        } ;
    } ;
} ;

Share this post


Link to post
Share on other sites
  • 0

HI @yohboy

thank you for the link you shared , but I have problems generation DTS file with SDK  , I m using the zybo-base-system-deseign provided in Digilent website ,  i will be soo happy if I can find a ready to implement DTS or DTB related to the zybo-base-system deseign..

 

Share this post


Link to post
Share on other sites
  • 0

To answer the question you messaged me:

I'd still recommend petalinux. I'd rather teach someone to use nails and lumber than help them build a house of cards ;)

Here is what you should do:

I will be referencing the petalinux 2015.4 RG heavily, so you should download it from here https://www.xilinx.com/support/documentation/sw_manuals/petalinux2015_4/ug1144-petalinux-tools-reference-guide.pdf

  1. Install Vivado 2015.4 on your linux system. Be sure to include Xilinx SDK.
  2. Follow the instructions in the petalinux RG to install the needed library dependencies and then install petalinux 2015.4. FYI, you should NOT run the petalinux installer as root, and you should install the petalinux tools into a directory that is owned by your user (not root). I usually use /home/user/work/plnx/install/.
  3. Open the zybo linux_bd project in vivado 2015.4. Add the needed IP cores to control your LEDs, sensors, accelerometer, gyro, etc.
  4. Build the project, then export the hardware (be sure to include the bitstream).
  5. Open a command line, setup petalinux working environment (pg 15. of RG) and cd to Digilent-Zybo-Linux-BD-v2015.4 in the petalinux-bsps repo.
  6. Import the hardware configuration (.hdf) by following pg. 25  of RG.
  7. Now you need to make the necessary changs to the device tree. The device tree is found in this folder: ./subsystems/linux/configs/device-tree. Notice that all the dtsi files are automatically generated and included from the system-top.dts file. You should NOT modify any of the dtsi files, and only make changes to system-top.dts. Good news is that the device tree will automatically contain nodes for any I2C, SPI, and GPIO cores you added to your design (you can see them in pl.dtsi). You may need to modify any SPI or I2C nodes to add child nodes for the sensors you are using. Your LEDs or any other GPIO (including the onboard leds/sws/btns) should not need any changes. We can help with this if you provide the names of the sensors.
  8. I don't know what type of bluetooth solution you are using, but you will need to enable bluetooth support and the driver for the specific device in the kernel by using petalinux config -c kernel. You will also need to add driver support for any sensors you are using. 

At this point I would recommend testing that your system boots. Also, if possible, I would recommend testing some of your devices using their sysfs interfaces from the command line (if they have them). To build and boot do the following:

  1. Follow pages 27-29 of the RG to build your petalinux project, generate uImage, and generate BOOT.bin.
  2. Copy BOOT.bin and uImage to a microSD card and boot the ZYBO
  3. Boot the ZYBO and you should eventually get a command line interface over UART

If you get this far you are in great shape. The next step is really cool. You will need to design your custom application, and you can use Xilinx SDK to do this. Follow page 82 of the RG for instructions on how to do this. The best part is that you will be able to cross compile the application directly from XSDK, and also be able to step through your code from XSDK as it is executing on the Zybo in Linux! This will make your application development much easier. Once your program is working, you can deploy it to petalinux by following pg. 67 of the RG. Last, if you want the application to run automatically on boot, follow page 79.

If you run into issues we are here to help

Share this post


Link to post
Share on other sites
  • 0

I generate a bitstream and exported the heardware to SDK , and I m stack in this step "import the hardware configuration (.hdf) by following pg. 25  of RG. for petalinux"

there are 3 .hdf files in my project and I tried them all , but it's always the same error  :

(Failed to locate the Vivado export to SDK directory, please make sure the directory directory exists!
Configures the project or the specified component with menuconfig.)

I m sure I imported the hardware in a good way ( see picture 1) 

picture (2,3,4) resume the  my attempts using petalinuc-configure command with thoes 3 repositories containing .hdf files1.thumb.png.06463cbabc38cd512341e0134e568053.png2.thumb.png.09dfb9309a1f60dc373bdf86966b1787.png3.thumb.png.b214410e1c698022fdba32837329b69b.png4.thumb.png.53a82b8e3e748e1d95e6e11120124852.png

Share this post


Link to post
Share on other sites
  • 0

Sorry for the delay, I was on holiday last week. 

I think the problem you are running into is just that you should not have a space between --get-hw-description= and the file path. So it should be (assuming I typed your file path correctly):

petalinux-config --get-hw-description=/home/firas33/Desktop/ZYBO-master/Projects/linux_bd/sdk/linux_bd_wrapper_hw_platform_0/

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now