如何通过设备树配置uio_dmem_genirq驱动程序 [英] How should a uio_dmem_genirq driver be configured via the device tree

查看:712
本文介绍了如何通过设备树配置uio_dmem_genirq驱动程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

uio_pdrv_genirq 驱动程序,但其

The uio_dmem_genirq driver is backwards compatible with the uio_pdrv_genirq driver but with the addition that it dynamically allocates continuous memory. How do the device tree entries have to be defined to load the dmem driver? The working configuration for the pdrv version consists of the following device tree entry:

spw0@7aa00000 {
  compatible = "generic-uio";
  reg = <0x7aa00000 0x10000>;
  interrupts = <0x0 0x1D 0x4>;
  interrupt-parent = <0x3>;
  clocks = <0x1>;
};

,然后将bootargs更改为console=ttyPS0,115200 root=/dev/mmcblk0p1 rw rootwait earlyprintk uio_pdrv_genirq.of_id=generic-uio.

and changing the bootargs to console=ttyPS0,115200 root=/dev/mmcblk0p1 rw rootwait earlyprintk uio_pdrv_genirq.of_id=generic-uio.

我目前 dmem 版本的配置如下所示,但是尽管已将uio驱动程序编译到内核中,但仍未加载uio驱动程序.这是/lib/modules/4.4.0-xilinx/modules.builtin

My current configuration for the dmem version looks as follows, but does not load the uio driver despite it being compiled into the kernel. This is the output of /lib/modules/4.4.0-xilinx/modules.builtin

kernel/drivers/uio/uio.ko
kernel/drivers/uio/uio_pdrv_genirq.ko
kernel/drivers/uio/uio_dmem_genirq.ko

用于尝试配置驱动程序的两种不同样式是:

The two different styles used to try and configure the drivers are:

spw0@7aa00000 {
  compatible = "generic-uio";
  reg = <0x7aa00000 0x10000>;
  uio,number-of-dynamic-regions = <1>;
  uio,dynamic-regions-sizes = <0x4000>;
  interrupts = <0x0 0x1D 0x4>;
  interrupt-parent = <0x3>;
  clocks = <0x1>;
};

spw1@7aa00000 {
  compatible = "generic-uio";
  num_dynamic_regions = <2>;
  dynamic_region_sizes = <0x8000>;
  interrupts = <0x0 0x1E 0x4>;
  interrupt-parent = <0x3>;
  clocks = <0x1>;
};

bootargs更新为console=ttyPS0,115200 root=/dev/mmcblk0p1 rw rootwait earlyprintk uio_dmem_genirq.of_id=generic-uio.

And the bootargs are updated to console=ttyPS0,115200 root=/dev/mmcblk0p1 rw rootwait earlyprintk uio_dmem_genirq.of_id=generic-uio.

推荐答案

这是对我有用的设备树文件.它可能在这里或那里有一个怪异的配置,如果您必须进行某些更改,将不胜感激.

This is a device tree files that works for me. It may have a weird configuration here or there and would appreciate feedback if you have had to change something.

/dts-v1/;

/ {
    #address-cells = <0x1>;
    #size-cells = <0x1>;
    compatible = "xlnx,zynq-7000";
    model = "uart0";

    chosen {
        bootargs = "console=ttyPS0,115200 earlyprintk";
    };

    aliases {
        serial0 = "/amba/serial@e0000000";
        ethernet0 = "/amba/ethernet@e000b000";
        spi0 = "/amba/spi@e000d000";
    };

    memory {
        device_type = "memory";
        reg = <0x0 0x40000000>;
    };

    reserved-memory {
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;

        spw_dma@3E000000 {
            reg = <0x3E000000 0x2000000>;
        };
    };

    cpus {
        #address-cells = <0x1>;
        #size-cells = <0x0>;

        cpu@0 {
            compatible = "arm,cortex-a9";
            device_type = "cpu";
            reg = <0x0>;
            clocks = <0x1 0x3>;
            clock-latency = <0x3e8>;
            cpu0-supply = <0x2>;
            operating-points = <0xa2c2a 0xf4240 0x51615 0xf4240>;
        };

        cpu@1 {
            compatible = "arm,cortex-a9";
            device_type = "cpu";
            reg = <0x1>;
            clocks = <0x1 0x3>;
        };
    };

    pmu {
        compatible = "arm,cortex-a9-pmu";
        interrupts = <0x0 0x5 0x4 0x0 0x6 0x4>;
        interrupt-parent = <0x3>;
        reg = <0xf8891000 0x1000 0xf8893000 0x1000>;
    };

    fixedregulator@0 {
        compatible = "regulator-fixed";
        regulator-name = "VCCPINT";
        regulator-min-microvolt = <0xf4240>;
        regulator-max-microvolt = <0xf4240>;
        regulator-boot-on;
        regulator-always-on;
        linux,phandle = <0x2>;
        phandle = <0x2>;
    };

    amba {
        compatible = "simple-bus";
        #address-cells = <0x1>;
        #size-cells = <0x1>;
        interrupt-parent = <0x3>;
        ranges;

        spw0@7aa00000 {
          compatible = "generic-uio";
          reg = <0x7aa00000 0x10000>;
          uio,number-of-dynamic-regions = <1>;
          uio,dynamic-regions-sizes = <0x4000>;
          interrupts = <0x0 0x1D 0x0>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw1@7aa00000 {
          compatible = "generic-uio";
          uio,number-of-dynamic-regions = <2>;
          uio,dynamic-regions-sizes = <0x8000>;
          interrupts = <0x0 0x1E 0x0>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw2@7aa00000 {
          compatible = "generic-uio";
          reg = <0x3d000000 0x10000>;
          interrupts = <0x0 0x1F 0x0>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw3@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x20 0x0>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw4@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x21 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw5@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x22 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw6@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x23 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw7@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x24 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw8@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x34 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw9@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x35 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw10@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x36 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw11@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x37 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw12@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x38 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw13@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x39 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw14@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x3A 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        spw15@7aa00000 {
          compatible = "generic-uio";
          interrupts = <0x0 0x3B 0x4>;
          interrupt-parent = <0x3>;
          clocks = <0x1>;
      };

        adc@f8007100 {
            compatible = "xlnx,zynq-xadc-1.00.a";
            reg = <0xf8007100 0x20>;
            interrupts = <0x0 0x7 0x4>;
            interrupt-parent = <0x3>;
            clocks = <0x1 0xc>;
        };

        can@e0008000 {
            compatible = "xlnx,zynq-can-1.0";
            status = "disabled";
            clocks = <0x1 0x13 0x1 0x24>;
            clock-names = "can_clk", "pclk";
            reg = <0xe0008000 0x1000>;
            interrupts = <0x0 0x1c 0x4>;
            interrupt-parent = <0x3>;
            tx-fifo-depth = <0x40>;
            rx-fifo-depth = <0x40>;
        };

        can@e0009000 {
            compatible = "xlnx,zynq-can-1.0";
            status = "disabled";
            clocks = <0x1 0x14 0x1 0x25>;
            clock-names = "can_clk", "pclk";
            reg = <0xe0009000 0x1000>;
            interrupts = <0x0 0x33 0x4>;
            interrupt-parent = <0x3>;
            tx-fifo-depth = <0x40>;
            rx-fifo-depth = <0x40>;
        };

        gpio@e000a000 {
            compatible = "xlnx,zynq-gpio-1.0";
            #gpio-cells = <0x2>;
            clocks = <0x1 0x2a>;
            gpio-controller;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x14 0x4>;
            reg = <0xe000a000 0x1000>;
            emio-gpio-width = <0x40>;
            gpio-mask-high = <0x0>;
            gpio-mask-low = <0x5600>;
        };

        i2c@e0004000 {
            compatible = "cdns,i2c-r1p10";
            status = "okay";
            clocks = <0x1 0x26>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x19 0x4>;
            reg = <0xe0004000 0x1000>;
            #address-cells = <0x1>;
            #size-cells = <0x0>;
            clock-frequency = <0x61a80>;
        };

        i2c@e0005000 {
            compatible = "cdns,i2c-r1p10";
            status = "okay";
            clocks = <0x1 0x27>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x30 0x4>;
            reg = <0xe0005000 0x1000>;
            #address-cells = <0x1>;
            #size-cells = <0x0>;
            clock-frequency = <0x61a80>;
        };

        interrupt-controller@f8f01000 {
            compatible = "arm,cortex-a9-gic";
            #interrupt-cells = <0x3>;
            interrupt-controller;
            reg = <0xf8f01000 0x1000 0xf8f00100 0x100>;
            num_cpus = <0x2>;
            num_interrupts = <0x60>;
            linux,phandle = <0x3>;
            phandle = <0x3>;
        };

        cache-controller@f8f02000 {
            compatible = "arm,pl310-cache";
            reg = <0xf8f02000 0x1000>;
            interrupts = <0x0 0x2 0x4>;
            arm,data-latency = <0x3 0x2 0x2>;
            arm,tag-latency = <0x2 0x2 0x2>;
            cache-unified;
            cache-level = <0x2>;
        };

        memory-controller@f8006000 {
            compatible = "xlnx,zynq-ddrc-a05";
            reg = <0xf8006000 0x1000>;
        };

        ocmc@f800c000 {
            compatible = "xlnx,zynq-ocmc-1.0";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x3 0x4>;
            reg = <0xf800c000 0x1000>;
        };

        serial@e0000000 {
            compatible = "xlnx,xuartps", "cdns,uart-r1p8";
            status = "okay";
            clocks = <0x1 0x17 0x1 0x28>;
            clock-names = "uart_clk", "pclk";
            reg = <0xe0000000 0x1000>;
            interrupts = <0x0 0x1b 0x4>;
            current-speed = <0x1c200>;
            device_type = "serial";
            port-number = <0x0>;
        };

        serial@e0001000 {
            compatible = "xlnx,xuartps", "cdns,uart-r1p8";
            status = "disabled";
            clocks = <0x1 0x18 0x1 0x29>;
            clock-names = "uart_clk", "pclk";
            reg = <0xe0001000 0x1000>;
            interrupts = <0x0 0x32 0x4>;
        };

        spi@e0006000 {
            compatible = "xlnx,zynq-spi-r1p6";
            reg = <0xe0006000 0x1000>;
            status = "okay";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x1a 0x4>;
            clocks = <0x1 0x19 0x1 0x22>;
            clock-names = "ref_clk", "pclk";
            #address-cells = <0x1>;
            #size-cells = <0x0>;
            is-decoded-cs = <0x0>;
            num-cs = <0x3>;
        };

        spi@e0007000 {
            compatible = "xlnx,zynq-spi-r1p6";
            reg = <0xe0007000 0x1000>;
            status = "okay";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x31 0x4>;
            clocks = <0x1 0x1a 0x1 0x23>;
            clock-names = "ref_clk", "pclk";
            #address-cells = <0x1>;
            #size-cells = <0x0>;
            is-decoded-cs = <0x0>;
            num-cs = <0x3>;
        };

        spi@e000d000 {
            clock-names = "ref_clk", "pclk";
            clocks = <0x1 0xa 0x1 0x2b>;
            compatible = "xlnx,zynq-qspi-1.0";
            status = "okay";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x13 0x4>;
            reg = <0xe000d000 0x1000>;
            #address-cells = <0x1>;
            #size-cells = <0x0>;
            is-dual = <0x0>;
            num-cs = <0x1>;

            flash@0 {
                compatible = "micron,n25q128";
                reg = <0x0>;
                #address-cells = <0x1>;
                #size-cells = <0x1>;
                spi-max-frequency = <0x2faf080>;

                partition@0x00000000 {
                    label = "boot";
                    reg = <0x0 0x500000>;
                };

                partition@0x00500000 {
                    label = "bootenv";
                    reg = <0x500000 0x20000>;
                };

                partition@0x00520000 {
                    label = "kernel";
                    reg = <0x520000 0xa80000>;
                };

                partition@0x00fa0000 {
                    label = "spare";
                    reg = <0xfa0000 0x0>;
                };
            };
        };

        memory-controller@e000e000 {
            #address-cells = <0x1>;
            #size-cells = <0x1>;
            status = "disabled";
            clock-names = "memclk", "aclk";
            clocks = <0x1 0xb 0x1 0x2c>;
            compatible = "arm,pl353-smc-r2p1";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x12 0x4>;
            ranges;
            reg = <0xe000e000 0x1000>;

            flash@e1000000 {
                status = "disabled";
                compatible = "arm,pl353-nand-r2p1";
                reg = <0xe1000000 0x1000000>;
                #address-cells = <0x1>;
                #size-cells = <0x1>;
            };

            flash@e2000000 {
                status = "disabled";
                compatible = "cfi-flash";
                reg = <0xe2000000 0x2000000>;
                #address-cells = <0x1>;
                #size-cells = <0x1>;
            };
        };

        ethernet@e000b000 {
            compatible = "cdns,gem";
            reg = <0xe000b000 0x1000>;
            status = "okay";
            interrupts = <0x0 0x16 0x4>;
            clocks = <0x1 0x1e 0x1 0x1e 0x1 0xd>;
            clock-names = "pclk", "hclk", "tx_clk";
            #address-cells = <0x1>;
            #size-cells = <0x0>;
            phy-mode = "rgmii-id";
            xlnx,ptp-enet-clock = <0x69f6bcb>;
            local-mac-address = [00 0a 35 00 1e 53];
        };

        ethernet@e000c000 {
            compatible = "cdns,gem";
            reg = <0xe000c000 0x1000>;
            status = "disabled";
            interrupts = <0x0 0x2d 0x4>;
            clocks = <0x1 0x1f 0x1 0x1f 0x1 0xe>;
            clock-names = "pclk", "hclk", "tx_clk";
            #address-cells = <0x1>;
            #size-cells = <0x0>;
        };

        sdhci@e0100000 {
            compatible = "arasan,sdhci-8.9a";
            status = "okay";
            clock-names = "clk_xin", "clk_ahb";
            clocks = <0x1 0x15 0x1 0x20>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x18 0x4>;
            reg = <0xe0100000 0x1000>;
            xlnx,has-cd = <0x1>;
            xlnx,has-power = <0x0>;
            xlnx,has-wp = <0x1>;
        };

        sdhci@e0101000 {
            compatible = "arasan,sdhci-8.9a";
            status = "okay";
            clock-names = "clk_xin", "clk_ahb";
            clocks = <0x1 0x16 0x1 0x21>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x2f 0x4>;
            reg = <0xe0101000 0x1000>;
            xlnx,has-cd = <0x1>;
            xlnx,has-power = <0x0>;
            xlnx,has-wp = <0x1>;
        };

        slcr@f8000000 {
            #address-cells = <0x1>;
            #size-cells = <0x1>;
            compatible = "xlnx,zynq-slcr", "syscon", "simple-bus";
            reg = <0xf8000000 0x1000>;
            ranges;
            linux,phandle = <0x4>;
            phandle = <0x4>;

            clkc@100 {
                #clock-cells = <0x1>;
                compatible = "xlnx,ps7-clkc";
                fclk-enable = <0x3>;
                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";
                reg = <0x100 0x100>;
                ps-clk-frequency = <0x1fca055>;
                linux,phandle = <0x1>;
                phandle = <0x1>;
            };

            pinctrl@700 {
                compatible = "xlnx,pinctrl-zynq";
                reg = <0x700 0x200>;
                syscon = <0x4>;
            };
        };

        dmac@f8003000 {
            compatible = "arm,pl330", "arm,primecell";
            reg = <0xf8003000 0x1000>;
            interrupt-parent = <0x3>;
            interrupt-names = "abort", "dma0", "dma1", "dma2", "dma3", "dma4", "dma5", "dma6", "dma7";
            interrupts = <0x0 0xd 0x4 0x0 0xe 0x4 0x0 0xf 0x4 0x0 0x10 0x4 0x0 0x11 0x4 0x0 0x28 0x4 0x0 0x29 0x4 0x0 0x2a 0x4 0x0 0x2b 0x4>;
            #dma-cells = <0x1>;
            #dma-channels = <0x8>;
            #dma-requests = <0x4>;
            clocks = <0x1 0x1b>;
            clock-names = "apb_pclk";
        };

        devcfg@f8007000 {
            clock-names = "ref_clk", "fclk0", "fclk1", "fclk2", "fclk3";
            clocks = <0x1 0xc 0x1 0xf 0x1 0x10 0x1 0x11 0x1 0x12>;
            compatible = "xlnx,zynq-devcfg-1.0";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x8 0x4>;
            reg = <0xf8007000 0x100>;
            syscon = <0x4>;
        };

        timer@f8f00200 {
            compatible = "arm,cortex-a9-global-timer";
            reg = <0xf8f00200 0x20>;
            interrupts = <0x1 0xb 0x301>;
            interrupt-parent = <0x3>;
            clocks = <0x1 0x4>;
        };

        timer@f8001000 {
            interrupt-parent = <0x3>;
            interrupts = <0x0 0xa 0x4 0x0 0xb 0x4 0x0 0xc 0x4>;
            compatible = "cdns,ttc";
            clocks = <0x1 0x6>;
            reg = <0xf8001000 0x1000>;
        };

        timer@f8002000 {
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x25 0x4 0x0 0x26 0x4 0x0 0x27 0x4>;
            compatible = "cdns,ttc";
            clocks = <0x1 0x6>;
            reg = <0xf8002000 0x1000>;
        };

        timer@f8f00600 {
            interrupt-parent = <0x3>;
            interrupts = <0x1 0xd 0x301>;
            compatible = "arm,cortex-a9-twd-timer";
            reg = <0xf8f00600 0x20>;
            clocks = <0x1 0x4>;
        };

        usb@e0002000 {
            compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
            status = "okay";
            clocks = <0x1 0x1c>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x15 0x4>;
            reg = <0xe0002000 0x1000>;
            phy_type = "ulpi";
            dr_mode = "host";
        };

        usb@e0003000 {
            compatible = "xlnx,zynq-usb-2.20a", "chipidea,usb2";
            status = "disabled";
            clocks = <0x1 0x1d>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x2c 0x4>;
            reg = <0xe0003000 0x1000>;
            phy_type = "ulpi";
        };

        watchdog@f8005000 {
            clocks = <0x1 0x2d>;
            compatible = "cdns,wdt-r1p2";
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x9 0x1>;
            reg = <0xf8005000 0x1000>;
            reset-on-timeout;
            timeout-sec = <0x2>;
        };
    };
};

此外,必须添加以下文件才能将uio驱动程序编译到内核enable-uio.cfg

In addition, the following file has to be added to compile the uio driver into the kernel enable-uio.cfg

CONFIG_UIO=y
CONFIG_UIO_PDRV_GENIRQ=y
CONFIG_UIO_DMEM_GENIRQ=y

内核bootargs必须包含最后一部分

The kernel bootargs have to include the last part

bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p1 rw rootwait earlyprintk uio_pdrv_genirq.of_id=generic-uio

注意:我的配置引用了uio_dmem_genirq,但似乎没有用.我的解决方法是使用reserved-memory条目,但我没有明确验证

Note: my configuration references uio_dmem_genirq but it did not seem to work. My workaround was to use the reserved-memory entry but I did not explicitly verify it

这篇关于如何通过设备树配置uio_dmem_genirq驱动程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆