BCM2835 gpio设备树覆盆子pi

时间:2014-10-18 10:56:51

标签: linux-kernel raspberry-pi linux-device-driver gpio device-tree

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

  1. 我在/arc/arm/boot/dts/bcm2835.dts中阅读了设备树文件
  2. 并且对于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中读取设备树文件
    2. 并且对于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支持制作了一个驱动程序。因此,管理动态设备节点创建。 我没有使用平台模型。

1 个答案:

答案 0 :(得分:3)

1。 从互联网上的参考资料中可以理解reg = 0x7e200000但是什么是0xb4。 reg =&lt; 0x7e200000 0xb4&gt;

这里0xb4指的是寄存器的长度。 &#34; reg:为设备设置的寄存器的地址和长度&#34;

您可以查看此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

它包括以下内容:

/ include /&#34; bcm2835.dtsi&#34;

这意味着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