如何在Linux内核3.17上为BeagleBone Black编辑PinMux?

7
我可以查看/sys/kernel/debug/pinctrl/44e10800.pinmux/pins并找到我感兴趣的引脚:
pin 38 (44e10898.0) 00000037 pinctrl-single 

这对应于GPIO[2]4,或者P8.10

我正在使用带有内核3.17.7-300.fc21.armv7hl的Fedora 21。

我想将mux更改为0x27。换句话说,这将配置引脚具有内部下拉电阻器(之前是上拉)。

期望的输出将是:

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

有什么可以做的吗?

注意:Angstrom系统中没有 /sys/devices/bone_capemgr.*,因此典型的DTO方法通过修改cape管理器来导出更改是不可行的。

编辑:在跟随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,并且 "something" 需要引用 "example"。如果我为 user_leds_s0 的条目添加 0x098 0x27,则会观察到所需的行为。
...
    user_leds_s0 {
        pinctrl-single,pins = <0x54 0x7 0x58 0x17 0x5c 0x7 0x60 0x170 0x098 0x27>;
        linux,phandle = <0x3f>;
        phandle = <0x3f>;
    };
...

现在,这一切都很好,并且能够帮助我实现目标。然而,该引脚并不是真正的用户 LED 引脚。它应该在某种分离的字段中。那么,我需要做些什么才能让 "示例" 字段或类似字段起作用?


据我所知,叠加层的概念已被移除。您需要操作原始的 .dts 文件才能完成任务。顺便提一下,这与根文件系统的类型无关(在您的情况下是 Angstrom)。这完全取决于内核版本。 - raghav3276
请原谅我的无知;如果我找到了Fedora使用的dts文件,你能详细解释一下需要什么吗? - ToBeReplaced
你编辑了“example”引脚定义还是添加了它?如果你添加了它,我看到两个问题。首先,某个地方需要引用“example”引脚配置,否则它将没有效果。其次,你的pinmux寄存器偏移量比我预期的偏移量多0x800(即:0x898 pinmux寄存器偏移量在设备树中变成了0x098,因为AM335x pinmux驱动程序会为你添加0x800)。如果这是你编辑的条目,我对于你特定内核的设备树命名约定不熟悉。 - Charles Steinkuehler
我添加了“example”引脚定义。修改现有定义是否更好?哪一个?我试图通过将0x98 0x27添加到其中一个定义中,或将“example”重命名为“pinmux_P8_07_default_pin”,但都无法使其正常工作。反编译的dtb看起来与https://github.com/torvalds/linux/blob/bfe01a5ba2490f299e1d2d5508cbbbadd897bbe9/arch/arm/boot/dts/am335x-boneblack.dts在包含之后是相同的。值得注意的是,我没有看到任何地方出现“0x98”,因此我不知道它是如何首先设置为“0x37”的。 - ToBeReplaced
2个回答

3
我认为披风经理的东西没有移植到3.8内核之后。不确定是否计划这样做,但同时,您可以改为编辑平面设备树。我找到的最简单的方法(我仍在寻找最佳方法)是获取https://github.com/RobertCNelson/dtb-rebuilder上的存储库。
在src / arm目录中,编辑am335x-bone-common-pinmux.dtsi文件。在其中,您可以搜索“P8_10_default_pin:”。此部分告诉pinmux使用0x37作为其默认设置。将其更改为0x27并保存。
现在,通过运行make来构建新的已编译设备树(.dtb)文件。在Ubuntu上,“make install”将所有文件放置在正确的位置。我不确定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

我相信有更优雅的方法来实现目标,但这个方法对我有效。


提供的仓库和方法只适用于3.14版本。另一方面,它很有帮助,因为我看到了/boot/dtbs/$(uname -r)/中的.dtb文件。看起来我需要修改特定内核的.dts(i)文件,但我似乎无法弄清楚最后一步:https://github.com/torvalds/linux/blob/bfe01a5ba2490f299e1d2d5508cbbbadd897bbe9/arch/arm/boot/dts/am335x-bone-common.dtsi。有任何想法如何编辑该文件中的P8.10(或其他bone文件之一)吗? - ToBeReplaced
仓库中还有一个3.19的分支,你也可以看一下。我猜这些文件并没有实质性的不同,尤其是对于你所关注的引脚来说,它似乎没有任何特别棘手的用途。至少,你可以看一下makefile在做什么,并在主线内核源代码树中复制它。如果我有机会,我会下载一个Fedora镜像并稍微探索一下。 - tad
我已经发布了悬赏,但我仍在寻找更完整的答案。我使用 dtc 获取了 am335x-boneblack.dts 文件,并在 pinmux @44e10800 标头下添加了一个新组,它看起来像是 example { pinctrl-single,pins = <0x898 0x27>;}; ,但似乎没有被识别。 - ToBeReplaced

1
如果您正在使用Robert Nelson的内核(或来自BeagleBoard的内核),则引脚复用应由pinmux-helper驱动程序控制,该驱动程序允许将引脚复用寄存器在运行时设置为各种预定义值。查找文件/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


这对我的内核不起作用。正如原问题中所述,内核是由Fedora提供的“3.17.7-300.fc21.armv7hl”。 - ToBeReplaced

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接