Raspberry Pi - SPI 设备树更改

Raspberry Pi - SPI device tree changes

我试图在 Raspberry Pi 3 上移动 SPI 总线。我想将它从 GPIO 7-11 移动到 GPIO 引脚 22-26。文件 "bcm2708_common.dtsi" 包含 spi0 总线的节点:

spi0: spi@7e204000 {
    compatible = "brcm,bcm2835-spi";
    reg = <0x7e204000 0x1000>;
    interrupts = <2 22>;
    clocks = <&clk_core>;
    #address-cells = <1>;
    #size-cells = <0>;
    status = "disabled";
    /* the dma channels */
    dmas = <&dma 6>, <&dma 7>;
    dma-names = "tx", "rx";
    /* the chipselects used - <0> means native GPIO
     * add more gpios if necessary as <&gpio 6 1>
     * (but do not forget to make them output!)
     */
    cs-gpios = <0>, <0>;
};

spi配置在顶层dts文件"bcm2710-rpi-3-b.dts":

&gpio {
    spi0_pins: spi0_pins {
        brcm,pins = <7 8 9 10 11>;
        brcm,function = <4>; /* alt0 */
    };
};

&spi0 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi0_pins>;
    cs-gpios = <0 0>;

    spidev@0{
        compatible = "spidev";
        reg = <0>;  /* CE0 */
        #address-cells = <1>;
        #size-cells = <0>;
        spi-max-frequency = <500000>;
    };

    spidev@1{
        compatible = "spidev";
        reg = <1>;  /* CE1 */
        #address-cells = <1>;
        #size-cells = <0>;
        spi-max-frequency = <500000>;
    };
};

重新配置 spi 引脚是否像将 gpio 条目更改为此一样简单,还是我需要做更多的事情?

&gpio {
    spi0_pins: spi0_pins {
        brcm,pins = <22 23 24 25 26>;
        brcm,function = <4>; /* alt0 */
    };
};

没有。您不能只更改 DTSI 中的 pin 编号并让它更改。

长答案: brcm,pins字段只是供驱动程序参考的信息,如果硬件不支持你写在那里的管脚,你就不能让它工作。在 Rpi 3b 上,引脚 7、8、9、10、11 支持作为 SPI,即它们可以作为 SPI 多路复用(字段 brcm,function 告诉在哪种多路复用模式下设置引脚)。

现在,如果您搜索 BCM2835 ARM peripheral,您会在第 152 页找到以下内容:

The BCM2835 devices has only one SPI interface of this type. It is referred to in all the documentation as SPI0. It has two additional mini SPI interfaces (SPI1 and SPI2). The specifiation of those can be found under 2.3 Universal SPI Master (2x).

因此,Rpi 上的 SoC 本身不支持任何其他引脚上的其他 spi。

现在是上面引用的第二句

It has two additional mini SPI interfaces (SPI1 and SPI2). The specifiation of those > can be found under 2.3 Universal SPI Master (2x).

如果你深入研究 bcm283x.dtsi,你会发现这两个 mini spis 都被命名为 SPI1 和 SPI2。为它们分配的 gpio 引脚为 spi1_gpio16spi2_gpio40 使用引脚:

spi1_gpio16: spi1_gpio16 {
brcm,pins = <16 17 18 19 20 21>;
brcm,function = <BCM2835_FSEL_ALT4>;
};
spi2_gpio40: spi2_gpio40 {
brcm,pins = <40 41 42 43 44 45>;
brcm,function = <BCM2835_FSEL_ALT4>;
};

所以又不是您要使用的引脚。

如果你真的处于修复状态并且不能使用其他任何东西,你可以使用 bit banging spi