工具/软件:
正如标题所示、我想确认我对如何在整个上电和操作系统加载过程中配置 GPIO 引脚状态的理解程度并更好地理解。
我 在定制载板上使用基于 TI-Processor-SDK 09.02.00.311 的 PHYTEC AM57x SoM 及其 BSP、其中相关的 GPIO 基本上只是拆分成接头进行测试、并且不会进行其他电气连接。
我知道这应该能够通过我已经为 u-boot 和 Linux 创建的自定义器件树文件来实现。 大多数情况下,一切都是行为,因为我想要除了几个引脚,和一些额外的行为特征的一堆引脚。
具体而言、我的目标是:
- 能够将特定的 GPIO 引脚配置为输出、并能够将其上电状态设置为高电平或低电平、并保持从 u-boot 到 Linux OS 负载的持续时间、然后只在我们的应用程序控制它们时更改状态。 我希望大多数引脚在加电时立即变为高电平。 只有几个信号会变为低电平。
- 能够将特定的 GPIO 配置为输入、并在每个 GPIO 上配置上拉/下拉电阻。
我已经得到了#2 工作的期望。 但是、对于#1、我看到许多引脚有不同的行为。
可能最复杂的引脚是在 Linux 期间被分配给将 PRU 用作 GPIO 的引脚。 在 U-Boot 中、我不知道如何或者是否可以配置 PRU 器件、因此我已将这些引脚配置为 GPIO、然后在操作系统引导期间、将它们分配给 PRU 并再次进行配置。 其中一些引脚在上电时电压为~2.3V、然后在 u-boot 期间快速降至 0V、还有一些引脚保持在 0V、还有一些引脚在 OS 负载期间跳转到 3.3V。
U-Boot 器件树摘录:
&dra7_pmx_core {
...
GPIO8_PINS:GPIO8_PINS{
pinctrl-single、pins =<
DRA7XX_CORE_IOPAD (0x15FC+0x2000、PIN_OUTPUT | MUX_MODE14)//(E8) vout1_D8.PR2_pru0_gpo5 — 配置为 GPIO8_8 输出
...
>;
};
};
&GPIO8{
pinctrl-names =“default";“;
pinctrl-0 =<&GPIO8_pin>;
状态=“正常“;};
Linux 器件树摘录:
&dra7_pmx_core {
...
pruss2_pins:pruss2_pins{pinctrl-single、pins =< DRA7XX_CORE_IOPAD (0x15FC+0x2000、PIN_OUTPUT | MUX_MODE13)//(E8) vout1_D8.PR2_pru0_gpo5
...
>;
};
};
&pruss2{
pinctrl-names =“default";“;
pinctrl-0 =<&pruss2_pins>;
状态=“正常“;};
以此引脚为例、操作系统启动后、我确实可以控制引脚状态以及几乎所有其他 GPIO 输出引脚。 假设没有意外的应用改变其状态、是否有办法配置初始输出引脚状态、并在整个引导过程中对其进行维护?
我看到 PIN_OUTPUT_PULLUP 是一个配置选项、但我已经明白它不能满足我的需要。
在另一种情况下、如果该引脚未分配给 PRU、而是通过 u-boot 和 Linux 保持为 GPIO 引脚、则无法控制其状态。 具体来说、这是 GPIO7_2、我的配置与上述相同、只是在 u-boot 和 Linux 器件树中保持在 MUX_MODE14 中:
&dra7_pmx_core {
GPIO7_PINS:GPIO7_PINS{pinctrl-single、pins =< DRA7XX_CORE_IOPAD (0x3790、PIN_OUTPUT | MUX_MODE14)//(AC3) mmc3_dat3.GPIO7_2 >;};
};
&GPIO7{
TI、GPIO 常开;
pinctrl-names =“default";“;
pinctrl-0 =<&GPIO7_pins>;
状态=“正常“;};
我还没有机会研究的一些事情是使用 gpio-hog、以及某些内核驱动程序可能会导致问题。
So, am I on the right track, and what else can I do to ensure output pin states stay at predefined states during boot?