6

在 beagleboard 或 beaglebone 中有不同的模式来工作 pin。对于以前的内核,它们位于 /sys/kernel/debug/omap_mux 中。你知道最后一个内核这些文件在哪里吗?

4

6 回答 6

10

我发现 hipstercircuits 上提供的许多例子有点让人不知所措。特别是如果您只是想将引脚调整为模式 7。如果有人阅读本文时遇到同样的问题,以下链接可能会有所帮助:http ://bbbadventures.blogspot.ca/2013/06/pinmuxing.html它提供最基本的模板。

如果上面的链接中断,这里是提供的片段(为了清楚起见,做了一些调整):

/*
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/dts-v1/;
/plugin/;

/ { compatible = "ti,beaglebone", "ti,beaglebone-black";
    /* identification */
    part-number = "pinctrl-test-0";
    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            pinctrl_test: pinctrl_test_0_pins {
                pinctrl-single,pins = <
                    0x030 0x07 /* P8_12 OUTPUT | MODE7 */
                    0x034 0x07 /* P8_11 OUTPUT | MODE7 */
                    /* Add more pins here */
                >;
            };
        };
    };

    fragment@1 {
        target = <&ocp>;
        __overlay__ {
            test_helper: helper {
                compatible = "bone-pinmux-helper";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_test>;
                status = "okay";
            };
        };
    };
};

向上述代码段添加更多引脚时,您可以使用下表来确定哪些十六进制值与引脚匹配:

通过在 pinctrl-single,pins 中附加一个附加条目来设置每个引脚。格式如下所示:

[偏移] [模式]

示例:0x030 0x07

在上面链接的两个表中,偏移值请参见标题为“ADDR/OFFSET”的第三列。

我希望这有帮助 :)

编辑:我还应该提到,Martin 和 Don 提供的答案都很出色,应该有助于涵盖其余的重要细节。

于 2013-07-03T14:23:09.860 回答
9

Don Branson 的回答很好地介绍了如何读取 GPIO 引脚,但不幸的是,它没有涵盖如何更改引脚的模式,例如从 GPIO 到 SPI。这在内核 3.8.13 (?) 及更高版本中变得更加复杂。由于多种原因,内核开发人员转而使用“设备树模型”

到目前为止,关于如何使用设备树模型的细节似乎在不断变化,所以我只描述一般的过程。您首先在一个名为“设备树源”的文件中描述要与之交互的引脚。引脚及其模式使用十六进制数字指定,您必须在处理器文档中查找。

然后,您将此文件编译dtc为“设备树二进制文件”并将此二进制文件放入/lib/firmware. 最后,通过将二进制文件的名称(可以省略 .dtb 扩展名)回显到/sys/devices/bone_capemgr.*/slots.

这篇很棒的博文中列出了一个非常有用的示例:

http://hipstercircuits.com/enable-spi-with-device-tree-on-beaglebone-black-copy-paste/

当我自己了解更多有关此主题的信息时,我将尝试扩展我的答案。或者,也许有人可以提出修改建议,或者希望他们自己给出更广泛的答案?目前可用的信息似乎有点稀疏......

祝你好运!

于 2013-06-12T12:00:30.573 回答
7

我在这里找到了我需要的东西:http ://www.armhf.com/index.php/using-beaglebone-black-gpios/ 。

我正在运行内核 3.8.13。

基于此,我编写了这个脚本:

#!/bin/bash

# http://www.armhf.com/index.php/using-beaglebone-black-gpios/
# pin 9:11, gpio0[30] - 0 + 30 = 30
echo 30 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio30/direction
cat /sys/class/gpio/gpio30/value

# 1=switch open; 0=switch closed
while [ 1 ] ; do cat /sys/class/gpio/gpio30/value ; sleep .5 ; done

当引脚保持低电平时,脚本显示 0,高电平时显示 1。我根据http://www.digikey.com/us/en/techzone/microcontroller/resources/articles/protecting-inputs-in-digital-electronics.html制作了一个电路板。

图片右侧的橙色线用作开关。

我的计划是用这个和一个死打印机的门开关来做一个冰箱开关。然后我会修改脚本,以便在冰箱打开超过 10 分钟时向我发送电子邮件。

在此处输入图像描述

编辑:

做了一些研究,发现了更多关于如何设置 pinmux 的信息,特别是设备树覆盖:

好的,看了这个,学到了很多:http ://www.youtube.com/watch?v=wui_wU1AeQc

最终能够通过下面的设备树覆盖来控制 BBB 上的 pinmux 设置。fragment@1 部分对我来说仍然很神奇,所以希望在某些时候它会更有意义。尽管如此,至少我可以检测到所有引脚上的闭合开关。

一个关键部分是 Derek 项目中的图表:https ://github.com/derekmolloy/boneDeviceTree/tree/master/docs

/dts-v1/;
/plugin/;

/ {
        compatible = "ti,beaglebone", "ti,beaglebone-black";
        part-number = "mousetraps";
        version = "00A1";

        /* https://github.com/derekmolloy/boneDeviceTree/blob/master/docs/BeagleboneBlackP9HeaderTable.pdf */
        fragment@0{
                target = <&am33xx_pinmux>;
                __overlay__ {
                        mousetrap_pins: pinmux_mousetrap_pins {
                            pinctrl-single,pins = <
                                    0x070 0x2f /* P9_11 30 INPUT MODE7 none */
                                    0x074 0x2f /* P9_13 31 INPUT MODE7 none */
                                    0x040 0x2f /* P9_15 48 INPUT MODE7 none */
                                    0x15c 0x2f /* P9_17 05 INPUT MODE7 none */
                            >;
                        };
                };
        };

        fragment@1{
                target = <&ocp>;
                __overlay__ {
                        test_helper: helper {
                                compatible = "bone-pinmux-helper";
                                pinctrl-names = "default";
                                pinctrl-0 = <&mousetrap_pins>;
                                status = "okay";
                        };
                };
        };
};
于 2013-06-07T02:22:50.093 回答
3

查看这组设备树文件: https ://github.com/nomel/beaglebone/tree/master/gpio-header

它允许您动态更改 gpio 多路复用器模式。

我刚刚尝试过它们,它们似乎有效。

于 2013-09-04T09:45:26.437 回答
2

如果您尝试使用设备而不是发布产品,则编写设备树覆盖文件非常困难且特别烦人。config-pin 实用程序可以提供帮助。

它允许查询引脚并将其设置为它们允许的任何模式。你仍然需要一个设备树覆盖来允许你想要的模式,但是有一个允许一切的披风,所以你不需要担心它;它被称为海角通用。config-pin 使用连接器上的引脚号作为引脚名称。例如,要将称为 P8.11 的引脚、引脚 13、gpio45 和 gpio1_13(这是一个引脚)设置为模式 6,也称为 pr1_pru0_pru_r30_15(将引脚设置为输出,由寄存器 30 中的 pru 0 通过位 15 控制),你会这样做:

# The first line only needs to be done once; it loads the cape overlay.
config-pin overlay cape-universal
config-pin P8.11 pruout

您可以运行不带参数的 config-pin 以获取有关其他选项的信息,用于查询 pin 选项和状态。该程序还可用于设置 gpio 引脚的值(与模式相反)。

于 2015-08-11T04:11:33.467 回答
0

正如上面所问的,我将解释 fragment@n 魔法......“fragment@n”、“target”和“ overlay ”节点特定于修补现有设备树的设备树覆盖加载器。这些节点不会出现在最终合并的 DT 中,它们只是用来告诉覆盖加载器要做什么。

可以这么说,覆盖文件可以对树有多个“补丁”。每个 fragment@n 只是声明一个新补丁,“目标”指定补丁将被复制到设备树的哪个位置,“覆盖”是补丁的内容。合并内容并替换现有节点。目标可以使用实际的 DT 路径语法(由 / 分隔的节点)或此处使用的别名(&ocp 和 &am33xx_pinmux)。已经为 DT 中的重要节点设置了别名。

顶部的“兼容”、“部件号”和“版本”也特定于覆盖,通常用作过滤器来确定当前硬件是否支持覆盖。所有覆盖文件都有特定的语法直到覆盖节点,此时内部内容是普通的旧设备树语法。内核可能支持设备树,但不支持覆盖,在这种情况下,您可能必须自己将片段复制并粘贴到单个 DTS/DTB 中。DT 和 DTO 是用于嵌入式系统和驱动程序的漂亮系统,但需要习惯。

于 2017-09-27T04:01:13.543 回答