1

我正在寻找使用设备树支持修改树莓派的 GPIO 驱动程序。首先有2个文件:

  1. 我在 /arc/arm/boot/dts/bcm2835.dts 中读取了设备树文件

对于 gpio,存在以下部分:

gpio:gpio {

                   compatible = "brcm,bcm2835-gpio";
                   reg = <0x7e200000 0xb4>;
                   /*
                    * The GPIO IP block is designed for 3 banks of GPIOs.
                     * Each bank has a GPIO interrupt for itself.
                     * There is an overall "any bank" interrupt.
                     * In order, these are GIC interrupts 17, 18, 19, 20.
                     * Since the BCM2835 only has 2 banks, the 2nd bank
                     * interrupt output appears to be mirrored onto the
                     * 3rd bank's interrupt signal.
                     * So, a bank0 interrupt shows up on 17, 20, and
                     * a bank1 interrupt shows up on 18, 19, 20!
                     */
                    interrupts = <2 17>, <2 18>, <2 19>, <2 20>;
                    gpio-controller;
                    #gpio-cells = <2>;
                    interrupt-controller;
                    #interrupt-cells = <2>;
            };

从互联网上的参考资料 reg = 0x7e200000 可以理解,但是 0xb4 是什么。

  1. 我在 /arch/arm/boot/dts/bcm2835-rpi-b.dts 中读取了设备树文件

对于 gpio,存在以下部分:

/ {
    compatible = "raspberrypi,model-b", "brcm,bcm2835";
    model = "Raspberry Pi Model B";

    memory {
            reg = <0 0x10000000>;
    };

    leds {
            compatible = "gpio-leds";

            act {
                    label = "ACT";
                    gpios = <&gpio 16 1>;
                    default-state = "keep";
                    linux,default-trigger = "heartbeat";
            };
    };
};

&gpio {
    pinctrl-names = "default";
    pinctrl-0 = <&alt0 &alt3>;

    alt0: alt0 {
            brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 14 15 40 45>;
            brcm,function = <4>; /* alt0 */
    };

    alt3: alt3 {
            brcm,pins = <48 49 50 51 52 53>;
            brcm,function = <7>; /* alt3 */
    };
};

那么,我应该使用哪个 dts 文件,以及如何读取和解释这些键值对,例如:什么是 pinctrl。以及这种方法如何影响我的代码。

我知道我在这里问了很多东西,但这是新的并且看起来很有趣,我想使用这种方法修改我的驱动程序。请帮忙。

PS:我已经使用标准的udev支持制作了一个驱动程序。所以动态设备节点的创建是被管理的。我没有使用平台模型。

4

1 回答 1

4

1. 从网上的参考资料 reg = 0x7e200000 理解为 0xb4 是什么。 注册 = <0x7e200000 0xb4>

这里0xb4指的是寄存器的长度。“reg : 为设备设置的寄存器的地址和长度”

您可以查看此 pdf 以获得更好的信息 http://events.linuxfoundation.org/sites/events/files/slides/petazzoni-device-tree-dummies.pdf

2. 那么,我应该使用哪一个 dts 文件,以及如何读取和解释那些键值对,

我将把问题分成两部分。读取键值对:

每个设备树条目都会有一个关联的绑定文件,描述您如何读取键值对。例如http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/arm/bcm/brcm,bcm11351-cpu-method.txt。您可以获得相应的详细信息。

关于我应该使用哪些 dts 文件:

现在,如果您注意到 bcm2835.dtsi。不是 dts 文件,而是 dtsi 文件。 http://lxr.free-electrons.com/source/arch/arm/boot/dts/bcm2835.dtsi

dtsi 文件可以包含到其他 dts 或 dtsi 文件中,就像我们包含其他库(如 conio.h)一样。或我们的 C 代码中的 stdio.h。

这里 bcm2835-rpi-b.dts 是一个 dts 文件,如果你注意到这里的文件http://lxr.free-electrons.com/source/arch/arm/boot/dts/bcm2835-rpi-b.dts

它包括以下内容:

/包括/“bcm2835.dtsi”

这意味着 bcm2835.dtsi 中的所有 dt 条目都被导入到 bcm2835-rpi-b.dts 中。您可以选择保留节点原样或修改 rpi-b-dts 中的属性,但 dts 文件中的最终条目将反映在 dtb 中。

3. 例如:什么是 pinctrl。以及这种方法如何影响我的代码。

Pinctrl 是内核中提供的用于访问 PIN 的框架,这里是 gpio。您可能可以查看使用的文档https://www.kernel.org/doc/Documentation/pinctrl.txt

于 2014-10-26T18:08:45.530 回答