工具与软件:
在我们的定制电路板上、某些 GPIO 用作输出、而其他 GPIO 不用作输出(在 Linux 中)。 不工作意味着可以使用 gpioset 将它们设置为低/高、但输出不会驱动为低或高、它是浮动的。 当我使用调试器直接写入寄存器时、情况也是如此。 注意:受影响的 GPIO 可以成功配置并用作输入。 我可以读取值和上拉/下拉开关。 此问题似乎仅与输出驱动器有关。
当我在 uboot 中停止该器件并在此背景下访问 IO (通过调试器或存储器命令)时、输出按预期工作。 当我引导至 Linux 时、受影响的输出会停止工作。 其他继续工作。
我看不到使用 SoC 使用的 GPIO 单元的关系、我们在 GPIO0和 GPIO1上具有工作输出、而且我们也没有在这两个单元上工作输出。
我利用调试器检查了寄存器、 uboot 和 Linux 环境中的内容是相同的。 据我了解、内容是正确的。
可以使用的示例 GPIO0_66 (组4、位2) 不会 在 Linux 中工作:
- PADCONFIG67:0x00010007
- GPIO_DIR45:0xFFFFFFF3 (位2 = 0 ->输出)
- OUT_DATA45:0x0000000C (位2 = 1 ->驱动至高电平)
我可以使用 gpioset 2 66=x 在 Linux 中设置输出、并且我看到寄存器内容也相应地发生了变化。 因此、对 GPIO 单元的访问似乎是正确的。 当我测量输出时、它始终处于悬空状态。
显然、Linux 配置的某种方式会使某些 GPIO (或其输出驱动程序)停止工作。
您是否有什么想法可以解释这种行为? SOC 中是否有其他单位/设置可能影响 GPIO 输出功能?