如何在Linux内核3.17上编辑BeagleBone Black的pinmux?

时间:2015-01-11 21:48:20

标签: linux-device-driver beagleboneblack gpio device-tree

我可以看一眼/sys/kernel/debug/pinctrl/44e10800.pinmux/pins并查看我感兴趣的图钉:

pin 38 (44e10898.0) 00000037 pinctrl-single 

这相当于GPIO[2]4P8.10

我使用Fedora 21,内核3.17.7-300.fc21.armv7hl

我想将多路复用器更改为0x27。总之,这会将引脚配置为具​​有内部下拉电阻(之前,它是上拉电阻)。

所需的输出是:

pin 38 (44e10898.0) 00000027 pinctrl-single 

可以做些什么?

注意:没有/sys/devices/bone_capemgr.*,因为这不在Angstrom上。典型的DTO方法通过修改开普管理器来导出更改。这不是一个选择。

编辑:经过tad思路的探索,我做到了: dtc -I dtb -O dts -o ~/am335x-boneblack.dts /boot/dtb-3.17.7-300.fc21.armv7hl/am335x-boneblack.dtb。我编辑了这个文件:

...
    pinmux@44e10800 {
        ...

        example { 
            pinctrl-single,pins = <0x898 0x27>;
        };
    };
...

然后,我使用dtc再次编译它,将其粘贴在/boot/dtb-3.17.7-300.fc21.armv7hl/中,然后重新启动。然而,没有任何改变。发生了什么?

编辑:

正如Charles Steinkuehler所指出的那样,0x800需要从偏移中减去,并且&#34;&#34;某些东西&#34;需要参考&#34;示例&#34;。

如果我将0x098 0x27添加到user_leds_s0的条目中,则会观察到所需的行为:

...
    user_leds_s0 {
        pinctrl-single,pins = <0x54 0x7 0x58 0x17 0x5c 0x7 0x60 0x170 0x098 0x27>;
        linux,phandle = <0x3f>;
        phandle = <0x3f>;
    };
...

现在,这一切都很好,让我到达我需要去的地方。但是,该引脚实际上并不是user_led。它应该属于某种单独的领域。那么,什么是&#34;什么&#34;我需要做的是#34;示例&#34;领域或类似的工作?

2 个答案:

答案 0 :(得分:3)

我相信海角管理员的东西还没有被移植到3.8内核之外。不确定是否计划,但同时,您可以编辑平面设备树。我找到的最简单的方法(我仍然在寻找最好的方法)是抓住存储库

https://github.com/RobertCNelson/dtb-rebuilder

在src / arm目录中,编辑am335x-bone-common-pinmux.dtsi文件。在其中,您可以搜索&#34; P8_10_default_pin:&#34;。本节告诉pinmux使用0x37作为其默认设置。将其更改为0x27并保存。

现在,通过运行make来构建新的已编译设备树(.dtb)文件。在ubuntu上,&#34; make install&#34;将所有文件放在正确的位置。我不确定Fedora会去哪里,但在/ boot /中挖掘应该会很有趣。在ubuntu上,正确的位置是

/boot/dtbs/`uname -r`/

就我而言,我正在运行3.14.26-ti-r43。重新启动(并导出引脚)后,上述更改将启用接收器上的下拉,打开状态(值)读为0。

root@arm:~# grep 898 /sys/kernel/debug/pinctrl/44e10800.pinmux/pins
pin 38 (44e10898.0) 00000027 pinctrl-single 

root@arm:~# echo 36 > /sys/class/gpio/export
root@arm:~# cat /sys/class/gpio/gpio36/value 
0

我确信有更优雅的方式来实现这个目标,但这对我有用。

答案 1 :(得分:1)

如果您正在使用Robert Nelson的内核(或来自BeagleBoard的内核),则pinmux应受pinmux辅助驱动程序的控制,该驱动程序允许将pinmux寄存器的运行时设置为各种预定义值。查找文件/sys/devices/ocp./P8_10_pinmux./state。如果存在,您可以通过以下方式将引脚更改为输入:

# echo gpio_pd > /sys/devices/ocp.*/P8_10_pinmux.*/state

...或者,如果您正在运行RCN的Debian版本之一,或者安装了我的通用叠加层,您可以:

$ config-pin P8.10 in-

可以在此处找到覆盖(对于3.8.13内核)和config-pin实用程序(对于具有类似pinmux-helper设备树条目的任何内核):https://github.com/cdsteinkuehler/beaglebone-universal-io