This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM3352:sysfs 无法访问 GPIO#39

Guru**** 2614265 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/658200/linux-am3352-gpio-s-not-accessible-to-sysfs

器件型号:AM3352

工具/软件:Linux

您好!  

我在端口0上使用 GPIO 时遇到一些问题。 一旦端口0上的任何 GPIO 被传递到 pinctrl-0、我就无法从/sys/class/gpio.控制端口0上的任何 GPIO 引脚 我可以导出该引脚、但将其设置为输出并更改该值不起作用。  

需要澄清的是、在端口0上声明单个 GPIO 后、端口0上的所有 GPIO 引脚都不起作用。 现在、如果我没有在器件树中声明任何 GPIO、我可以从 sysfs 控制所有 GPIO。

我在端口2和3上有 GPIO、它们在我在器件树中声明它们之后都可以工作、因此问题仅在于端口0。 我的 DTS 如下所示:

am33xx_pinmux{(am33xx_pinmux)}
//POE 控制器
i2c1_pins:pinmux_i2c1_pins{
pinctrl-single、pins =<
0x16c (PIN_INPUT | MUX_MODE3)//(F18) uart0_rtsn.I2C1_SCL
0x168 (PIN_INPUT | MUX_MODE3)//(F19) uart0_CTSN.I2C1_SDA
>;
};

GPIO3_Pins:pinmux_GPIO3_Pins{
pinctrl-single、pins =<
0x108 (PIN_INPUT | MUX_MODE7)//(J19) gmii1_col.GPIO3[0]
0x10c (PIN_INPUT | MUX_MODE7)//(J18) gmii1_crs.GPIO3[1]
0x110 (PIN_INPUT | MUX_MODE7)//(K19) gmii1_rxer.GPIO3[2]
>;
};

GPIO2_Pins:pinmux_GPIO2_Pins{
pinctrl-single、pins =<
0x88 (PIN_INPUT | MUX_MODE7)//(U17) GPMC_csn3.GPIO2[0] USB 选择
0x9C (PIN_INPUT | MUX_MODE7)//(V8) GPMC_be0n_cle。GPIO2[5]\USB_MUX_OE
>;
};

GPIO0_Pins:pinmux_GPIO0_Pins{
pinctrl-single、pins =<
0x164 (PIN_INPUT | MUX_MODE7)//(E18) eCAP0_IN_PWM0_OUT.GPIO0[7]\USB_OC
0x178 (PIN_INPUT | MUX_MODE7)//(E17) uart1_CTSN.GPIO0[12] SMAC 完成
0x17c (PIN_INPUT | MUX_MODE7)//(D19) uart1_rtsn.GPIO0[13] ASRC 完成
0x1b0 (PIN_INPUT | MUX_MODE7)//(C15) xdma_event_intr0.gpio0[19] SMAC_init
0x1b4 (PIN_INPUT| MUX_MODE7)//(B15) xdma_event_intr1.GPIO0[20] ASRC_init
0x144 (PIN_OUTPUT | MUX_MODE7)//(K18) rmii1_REFCLK.GPIO0[29] SMAC 程序
0x74 (PIN_OUTPUT | MUX_MODE7)//(W18) GPMC_WPN.GPIO0[31] ASRC 程序
//0x148 (PIN_OUTPUT | MUX_MODE7)//(P17) MDIO_DATA.GPIO0[0] MDIO BB 数据
//0x14c (PIN_OUTPUT | MUX_MODE7)//(R19) MDIO_clk.GPIO0[1] MDIO BB 时钟
>;
};
};

GPIO0{&gpio0}
pinctrl-names ="default";
pinctrl-0 =<&GPIO0_PINs>;
状态="正常";

};


GPIO2{
pinctrl-names ="default";
pinctrl-0 =<&GPIO2_PINs>;
状态="正常";

/*
USB_s{
GPIO-hog;
GPIO =<0 GPIO_ACTIVE_HIGH_>;
输出高电平;
线路名称="USB_SELECT";
};
*

};

GPIO3{&G
pinctrl-names ="default";
pinctrl-0 =<&GPIO3_PINs>;
状态="正常";
};

我可以看到、GPIO 已传递到内核、它们与端口2和3上的 GPIO 看起来相同:

根:.../pinctrl/44e10800.pinmux cat pinmux-pins | grep GPIO0
引脚29 (PIN29):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 组
引脚81 (PIN81):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 组
引脚89 (PIN89):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 组
引脚94 (PIN94):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 组
引脚95 (PIN95):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 组
引脚108 (PIN108):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 区
引脚109 (PIN109):44e07000.GPIO (未声明 GPIO)功能引脚复用_GPIO0_Pins 区

是否有人对端口0的运行方式有任何想法? 感谢你的帮助

Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在使用来自 Yocto Build 的内核、它是内核版本4.14
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David、

    [引用用户="David Taylor5"]&GPIO0{
    pinctrl-names ="default";
    pinctrl-0 =<&GPIO0_PINs>;
    状态="正常";

    };[/报价]

    这里有一个排印错误、应该是 status ="oke"。 修复该问题、然后检查您是否可以使用 devmem2或 omapconf 工具从用户空间访问(读取/写入) GPIO0寄存器(基址0x44E07000)。

    还请确保您已与以下 wiki 保持一致:

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="David Taylor5"]我正在使用 Yocto 生成的内核,它是内核版本4.14[/引用]

    AM335x 支持的最新内核版本为4.9.59、另请查看该版本。

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Pavel、

    我更正了拼写错误、感谢您指出。
    我已经尝试使用内核4.9、结果相同。

    当我使用 devmem2读取 GPIO0 reg 时、会收到未处理的故障错误消息。 我在读取 GPIO0、2和3的寄存器时得到该值、但我可以读取端口1的寄存器。 因此、如果我没有在器件树中定义端口寄存器、我可以从中读取它们。

    我已经了解了 GPIO 时钟模块控制寄存器

    根目录:~ devmem2 0x44E000AC
    /dev/mem 已打开。
    映射到地址 bb6f14000的内存。
    在地址0x44E000AC (bb6f140ac):0x00000002处读取
    根目录:~ devmem2 0x44E000B0
    /dev/mem 已打开。
    映射到地址 bb6f7e000的内存。
    在地址0x44E000B0 (bb6f7e0b0):0x00030000处读取
    根目录:~ devmem2 0x44E000B4
    /dev/mem 已打开。
    映射到地址 bbb6fb9000的内存。
    在地址0x44E000B4 (bb6fb90b4):0x00030000处读取
    根目录:~#

    因此、看起来对端口2和3的访问被阻止、并且端口1已启用。 我有点困惑、为什么 GPIO0没有时钟控制寄存器。

    我刚刚验证了在读取0x44E000B0 (0xb6f7e0b0):0x00030000之后可以切换端口2 (gpio64)上的 GPIO 0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    David、

    GPIO0时钟由 CM_WKUP_GPIO0_CLKCTRL/0x44E00408寄存器控制。

    应根据传递给状态 DTS 条目的值(确定或禁用)更新该寄存器。

    更新&GPIO0状态 DTS 条目后、请确保您已创建并使用新的 DTB 文件。 然后使用 devmem2从用户空间中检查 CM_WKUP_GPIO0_CLKCTRL 寄存器值。

    此致、
    帕维尔