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.

[参考译文] AM5708:内核启动时 GPIO 状态发生变化

Guru**** 2923960 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/664122/am5708-gpio-state-changes-at-kernel-start

器件型号:AM5708
Thread 中讨论的其他器件:SysConfig

您好!

我们在设计中注意到以下情况:

我们在 U-Boot (或 MLO)中将 GPMC_A7 (0x145C CTRL_CORE_PAD_GPMC_A7)多路复用为模式14、并将输出驱动为低电平。 通过示波器、我们可以看到这种情况正如预期的那样发生。

在 Linux 中、我们不会在任何 DTS 或任何驱动程序中使用此引脚(不是我们知道的引脚)。 但在 Linux 启动期间、该引脚会返回三态或输入。

我们明确地不对 Linux 中的任何引脚使用任何器件树引脚多路复用、因为存在 GPIO 毛刺错误勘误表(更改 IO 设置时可能会发生 i869 IO 毛刺脉冲)  

我们希望它保持 U-Boot 编程的值、并且找不到在 Linux 期间更改它的原因。

使用的组件:
U-boot ti-sdk-2016.06
Linux:TI-SDK_03.03.00.04

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

    请在这两个点上提供寄存器 CTRL_CORE_PAD_GPMC_A7/0x4A00345C 的值:

    1.在 u-boot 提示符下、使用"MD"命令获取值
    2.在用户空间提示符中,使用"devmem2"命令获取值

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Pavel、
    在 U-Boot 中(使用示波器测量:线路按我预期的那样为低电平):
    => MD 0x4A00345C 1.
    4a00345c:0000000e …
    =>

    root@device:~# devmem2 0x4A00345C
    /dev/mem 已打开。
    映射到地址 bb6f89000的内存。
    在地址0x4A00345C (0xb6f8945c)上读取:0x0000000E

    看起来是相同的

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

    因此、在 Linux 内核 DTS 文件中不会覆盖 CTRL_CORE_PAD_GPMC_A7寄存器值、因为它会将其值与 u-boot 保持一致。

    根据我的理解、您拥有:
    1.在 u-boot 级中设置正确的值、然后按预期将 K1引脚输出设为低电平
    2.在内核启动阶段,您有 K1引脚、三态或输入,这对您来说是意外的。 请阐明如何在内核启动期间验证此引脚是输入还是三态?
    3.内核启动完成后,K1引脚输出是否按预期为低电平?

    还请在 u-boot 和内核中转储 GPIO1寄存器、并比较寄存器值以了解差异。

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

    您好、Pavel、

    正确:

    1、引脚 K1的输出如预期的那样为低电平

    U-boot 代码:

    无符号引脚= 29;//GPIO1 29 (0*32 + 29)

    GPIO_REQUEST (引脚、"引脚");

    GPIO_DIRECT_OUTPUT (引脚、0);  //强制为低电平

    2.在内核启动期间(我使用范围进行验证),我看到以下内容:

       -我们将 K1连接到另一个模块的输入上一个10K 上拉电阻(至3V3)。
       -在 u-boot 到内核的启动转换过程中,内核开始启动后,我们会看到电平从0.0V ->~2、3V 跳转。
       -我们的假设是,此时该引脚不再驱动为低电平

    3.内核启动完成后,K1输出仍然为~2,3V (在内核/用户空间中,我们不再使用该引脚)。 我们希望该寄存器的 U-Boot 设置就足够了。

    GPIO 寄存器(0x4AE1 0000)转储:

    U-Boot:  

    => MD 0x4AE10000 1
    4ae10000:50602001。 `P

    内核空间:

    root@器件:~# devmem2 0x4AE10000

    /dev/mem 已打开。
    映射到地址 bb6fa1000的内存。
    在地址0x4AE10000 (0xb6fa1000):0x50602001处读取

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、只有第一个字节有点短:
    我猜到了相关的寄存器、如果您想转储其他寄存器、请告诉我

    U-Boot:
    //CSysConfig (偏移0010)
    => MD 0x4AE10010 1.
    4ae10010:00000000 …
    //SYSSTATUS (偏移114)
    => MD 0x4AE10114 1.
    4ae10114:00000001 …

    内核:
    //CSysConfig (偏移0010)
    devmem2 0x4AE10010
    /dev/mem 已打开。
    映射到地址 bb6fc3000的内存。
    在地址0x4AE10010 (bb6fc3010)处读取:0x0000001D
    //SYSSTATUS (偏移114)
    devmem2 0x4AE10114
    /dev/mem 已打开。
    映射到地址 bb6f20000的内存。
    在地址0x4AE10114 (bb6f20114)处读取:0x00000001
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Stef、

    我需要的是:

    GPIO_CTRL/0x4AE10130
    GPIO_OE/0x4AE10134
    GPIO_DATAOUT/0x4AE1013C

    这3个寄存器在 GPIO 内核驱动程序中设置:

    linux-4.9.59/drivers/gpio/GPIO-omap.c

    此外、检查是否已对位 GPIO_SysConfig[1] SOFTRESET 中的 GPIO 模块执行软件复位、这在以下文件和函数中完成:

    linux-4.9.59/arch/arm/mach-omap2/omap_hwmod.c

    static int _set_softreset (struct omap_hwmod *oh、u32 *v)



    此致、
    帕维尔

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

    U-Boot 寄存器

    GPIO_CTRL/0x4AE10130
    GPIO_OE/0x4AE10134
    GPIO_DATAOUT/0x4AE1013C
    GPIO_SysConfig/0x4AE10010

    => MD 0x4AE10130 1.
    4ae10130:00000002…
    => MD 0x4AE10134 1.
    4ae10134:dfffffffff
    => MD 0x4AE1013C 1.
    4ae1013c:00000000…
    => MD 0x4AE10010 1.
    4ae10010:00000000…

    Linux 寄存器:  

    devmem2 0x4AE10010
    /dev/mem 已打开。
    映射到地址 bb6f8a000的内存。
    在地址0x4AE10010 (bb6f8a010)处读取:0x0000001D

    devmem2 0x4AE10130
    /dev/mem 已打开。
    映射到地址 bb6f8a000的内存。
    在地址0x4AE10130 (bb6f8a130)上读取:0x00000002

    devmem2 0x4AE10134
    /dev/mem 已打开。
    映射到地址 bb6fbf000的内存。
    在地址0x4AE10134 (bb6fbf134):0xFF7FFFFF 处读取

    devmem2 0x4AE1013C
    /dev/mem 已打开。
    映射到地址 bb6f2f000的内存。
    在地址0x4AE1013C (bb6f2f13c):0x00800000处读取

    为 (重新映射的地址)执行软件复位:

    [0.345014] SB:--软复位:0xdf0bfeb4.

    [0.345533] SB:-- SoftReset:0xdf0bfeec

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

    [引用 USER="Stef boerrigter"]GPIO_OE/0x4AE10134
    GPIO_DATAOUT/0x4AE1013C[/报价]

    [引用 USER="Stef boerrigter"]=>MD 0x4AE10134 1.
    4ae10134:dfffffffff
    => MD 0x4AE1013C 1.
    4ae1013c:00000000 ...[/quot]

    [引用 user="Stef boerrigter"]

    devmem2 0x4AE10134
    /dev/mem 已打开。
    映射到地址 bb6fbf000的内存。
    在地址0x4AE10134 (bb6fbf134):0xFF7FFFFF 处读取

    devmem2 0x4AE1013C
    /dev/mem 已打开。
    映射到地址 bb6f2f000的内存。
    在地址0x4AE1013C (bb6f2f13c):0x00800000处读取

    [/报价]

    似乎 Linux 内核覆盖 u-boot GPIO1寄存器设置、内核将 GPIO1_23设置为输出并将此输出设置为高电平(1)。

    您是否在定制板中使用 GPIO1_23引脚? 跟踪 Linux 内核 GPIO 驱动程序并检查为什么设置 GPIO1_23。

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它的 nog 1_23是问题(即背光启用、在内核(devicetree)中完成)
    它的1_29是问题(在 U-Boot 中设置为 Output_low)在内核中,我们不做任何事情(显式)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在上一篇文章中的意思是:

    您在内核中对 GPIO1_23进行编程、从而覆盖 GPIO1_29 uboot 设置。

    请共享您的所有内核(devicetree) GPIO1_23设置、我将查看一下。

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Linux GPIO 1_23:
    DTS LCD 背光启用:

    LCD_BL:背光{
    兼容="PWM 背光";
    ENABLE-GPIO =<&GPIO1 23 GPIO_ACTIVE_HIGH_>;
    电源=<&VDD_3V3>;
    PWM-names ="背光";
    PWM =<&ehrpwm2 0 50000 0>;
    亮度等级=<0 2 38 74 110 146 182 218 255>;
    default-brightse-level =<8>;
    };

    这是否也会重置组1上的所有其他 GPIO?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Stef boerrigter"]Linux GPIO 1_23:
    DTS LCD 背光启用:

    LCD_BL:背光{
    兼容="PWM 背光";
    ENABLE-GPIO =<&GPIO1 23 GPIO_ACTIVE_HIGH_>;
    电源=<&VDD_3V3>;
    PWM-names ="背光";
    PWM =<&ehrpwm2 0 50000 0>;
    亮度等级=<0 2 38 74 110 146 182 218 255>;
    default-brightse-level =<8>;
    };

    这是否也会重置组1上的所有其他 GPIO?[/QUERT]

    这就是您在 Linux kenel 和 DTS 文件中针对 GPIO1_23引脚所做的一切、对吧?

    您的 GPIO1_23内核设置看起来正确、我认为这些设置不会覆盖 GPIO1_29 uboot 设置。 但我们可以验证这一点。 请删除这些 GPIO1_23内核/DTS 设置并再次检查 GPIO1_29内核寄存器设置。 有什么区别吗?

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从 devicetree 中删除显示节点后、我看到一个差异(因此 GPIO1_23被删除):

    devmem2 0x4AE10010
    /dev/mem 已打开。
    映射到地址 bb6ffa000的内存。
    在地址0x4AE10010 (0xb6ffa010)处读取:0x0000001D
    devmem2 0x4AE10130
    /dev/mem 已打开。
    映射到地址 bb6f8f000的内存。
    在地址0x4AE10130 (bb6f8f130)上读取:0x00000002
    devmem2 0x4AE10134
    /dev/mem 已打开。
    映射到地址 bbb6fb6000的内存。
    在地址0x4AE10134 (bb6fb6134):0xFFFFFFFF 处读取
    devmem2 0x4AE1013C
    /dev/mem 已打开。
    映射到地址 bb6f64000的内存。
    在地址0x4AE1013C (0xb6f6413c)上读取:0x00000000
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Stef、

    好的、您可以恢复 GPIO1_23内核/DTS 设置、它们不会影响 GPIO1_29 uboot 设置。

    问题是 Linux 内核在内核加载时自动复位(软复位) GPIO1模块(以及其他 GPIO 模块)。 您应该删除以下文件中的'SYSC_SHAS_SOFTRESET'标志:

    linux-kernel/arch/arm/mach-omap2/omap_hwmod_7xx_data.c

    静态结构 omap_hwmod_class_sysconfig dra7xx_gpio_sysc ={
    .rev_fs= 0x0000、
    .sysc_fs= 0x0010、
    .syss_off= 0x0114、
    .sysc_flags=(SYSC_HWAS_AUTOIDLE | SYSC_HW_ENAWAKEUP |
    SYSC_FAS_SIDLEMODE | SYSC_FAS_SOFTRESET |
    SYSS_has 复位状态)、
    .idlemodes=(sidle_force | sidle_no | sidle_smart|
    sidle_smart_wKUP)、
    .sysc_fields=&omap_hwmod_sysc_type1、
    };

    有关更多信息、请参阅以下 e2e 线程:

    e2e.ti.com/.../519202
    e2e.ti.com/.../291377

    如果这不起作用、您还可以添加标志'HWMOD_INIT_NO_RESET'、请在下面的 e2e 中查看详细信息:

    e2e.ti.com/.../2052522

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

    删除 SYSC_has _SOFTRESET 确实成功了!

    感谢你的帮助
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这也解释了为什么我们在 AM3上没有看到这种情况(因为这是 DRA7xx 特有的)。