Beaglebone gpio输入无效

时间:2012-08-19 08:02:51

标签: linux embedded-linux beagleboard gpio sysfs

我使用beaglebone使用sysfs接口从特定引脚访问数字输入。我可以改变输出状态而不是输入:(。我做的是,我有两个引脚pinA和pinB.pinA我做了输出而pinB我做了输入。将pinA连接到pinB。通过发送将pinA配置为输出引脚通过传入将sysf和pinB中的direction属性作为输入。然后我将PinA的值更改为1并将其作为输出给出1(我使用LED测试)。但是当我读取PinB的值时,它仅给出0,甚至我将0传递给pinA的值。可能是什么原因?

谢谢:)

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

几种可能的原因:

1)您是否设置了输入引脚的IO方向?

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

2)(不太可能)您用作GPIO引脚的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设置设置的。可以想象也可能是外部的 - 再次,您需要确保原理图。

答案 2 :(得分: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), 

从内存中你可以选择上拉或下拉,但不能同时选择。