3

我正在使用 beaglebone 使用 sysfs 接口从特定引脚访问数字输入。而且我可以更改输出状态,但不能更改输入:(。我所做的是,我有两个引脚 pinA 和 pinB。pinA 我使它输出,pinB 我输入。将 pinA 连接到 pinB。通过发送将 pinA 配置为输出引脚通过传入将 sysfs 和 pinB 中的方向属性作为输入。我将 PinA 的值更改为 1,它给出 1 作为输出(我使用 LED 测试)。但是当我读取 PinB 的值时,它只给出 0,即使我将 0 传递给 pinA 的值。可能是什么原因?

谢谢 :)

4

3 回答 3

9

据我了解,您遵循的步骤:

echo 7 > /sys/kernel/debug/omap_mux/gpmc_ad6
echo 38 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio38/direction
cat /sys/class/gpio/gpio38/value

我也犯了同样的错误,花了我几个小时,但答案很简单:以“echo 7”开头的第一行就是问题所在。看看复用位:

Bit 5: 1 - Input, 0 - Output

Bit 4: 1 - Pull up, 0 - Pull down

Bit 3: 1 - Pull disabled, 0 - Pull enabled

Bit 2 \

Bit 1 |- Mode

Bit 0 /

您输入的是 echo 7 --> 0 0 0111,这意味着:位 0,1 和 2 为 1,因此设置了模式。没问题。但是,您只是忘记设置它是输入还是输出。它应该是这样的:

echo 0x27 > /sys/kernel/debug/omap_mux/gpmc_ad6

你的位现在是:1 0 0111 二进制,即 0x27(十六进制)。

当你在输入时写下“cat /sys/class/gpio/gpio38/value”,你会看到一个美妙的 1 :) 我相信你会和我一样开心:)

此外,还有一件事,您对 1.8V 左右的模拟输入是正确的,但 GPIO 以 3.3v 运行。

于 2012-10-03T11:07:42.060 回答
1

几种可能的原因:

1)你设置了输入管脚的IO方向吗?

例如。echo "in" > /sys/class/gpio/gpioN/direction

2)(不太可能)您用作输入的 GPIO 引脚是否复用为 GPIO 线并且方向正确?OMAP SoC 上的大多数 GPIO 引脚都是多功能的。您的内核可能已将其设置为备用功能。

您可以通过以下方式进行检查:

cat /sys/kernel/debug/omap_mux/board/core

它会转储所有 IO 引脚的配置。输出如下所示:

OMAP4_MUX(CSI22_DY1, OMAP_PIN_INPUT | OMAP_MUX_MODE0),
/* gpio_81 */
OMAP4_MUX(CAM_SHUTTER, OMAP_PIN_OUTPUT | OMAP_MUX_MODE3),
OMAP4_MUX(CAM_STROBE, OMAP_PIN_OUTPUT | OMAP_MUX_MODE0),
/* gpio_83 */

在这种情况下,CAM_SHUTTER设置一个输出,并路由到 GPIO 模块 ( OMAP_MUX_MODE3)

[警告:这是来自我的 OMAP4 板 - 手头没有 OMAP3 数据表 - 会有相当多的相似之处]

您无法通过 sysfs 更改它 - 相反,您需要修改您的内核(或者如果内核使用它设置的配置,则可能是引导加载程序)。

在您系统的板文件中 - 我认为在您的情况下将在其中<linux_source_root>/arch/arm/mach-omap2/board-omap3beagle.c- 您会找到 MUX 表的初始化程序。您将需要电路板的原理图、内核源代码树和 SoC 数据表来获取引脚的主要功能名称(在我上面的示例中CAM_SHUTTER)和 GPIO 编号。

3)即使我将 0 传递给 pinA 的值,我也有点困惑- 我想知道你是不是这个意思?然而,这确实指出了另一件需要注意的事情——每个 IO 引脚上都有可编程的上拉或下拉。这些是使用 MUX 设置进行设置的。可以想象还有一个外部的——同样你需要确定原理图。

于 2012-08-20T10:15:40.297 回答
0

是的。内部上拉和下拉配置在与多路复用模式相同的寄存器中 - 因此您可能可以以与设置多路复用模式相同的方式进行配置。获取 AM335x TRM(对于 OMAP4,该章称为控制模块)。

在内核的术语中,查看<linux_source_root>/arch/arm/mach-omap2/mux.h定义了一堆宏的位置

作为一个使用示例,我在我的板文件中有:

/* PIC -> OMAP4 interrupt line 2 - GPIO81 */
OMAP4_MUX(CAM_SHUTTER, OMAP_MUX_MODE3 | OMAP_PIN_INPUT_PULLUP), 

OMAP4_MUX(GPMC_AD11, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN), 

根据记忆,您可以选择上拉或下拉,但不能选择两者。

于 2012-08-20T11:45:17.483 回答