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/processor-SDK-AM335X:内核4.4有时会在引导@时钟源:jiffies 时挂起

Guru**** 2607825 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581584/linux-processor-sdk-am335x-kernel-4-4-will-sometimes-hang-on-boot-clocksource-jiffies

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

您好!

目前、我们有几个基于 AM335x EVM 的电路板、现在我们将了解如何使用较新的内核(4.4)。 我们注意到、可能每20分之一左右、内核会在启动时挂起、始终处于同一位置。

以下是它挂起的位置(在时钟源:jiffies):

[0.000000]在物理 CPU 上引导 Linux 0x0
[0.000000] Linux 版本4.4.4.12-svn100 (dev@aaa)(gcc 版本4.8.3 (GCC))#3 Tue 2月14 15:17:47 PST 2017
[0.000000] CPU:ARMv7处理器[413fc082]版本2 (ARMv7),CR=10c3870.4d] CPU
: PIPT/VIPT 非混叠数据高速缓存、VIPT 别名指令高速缓存
[0.000000]机器模型:TI AM335x
[...]
[0.112165] CPU:测试写入缓冲区一致性:OK
[0.113980]为0x80008200 - 0x80008258
[0.122119] devtmpfs 设置静态标识映射:已初始
化[0.172404] VFP 支持 v0.3:Mentor 800041架构3第30部分版本 C 版本3
[0.237777] OMAP-hwss:gmod: _WAIT_TARGET_DISABLE FAILED
^^^在挂起时显示的最后一个条

目[0.296301]时钟源:Jiffies:MASK:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:19112604462750000 ns
^^^此行不再显示

[0.299314] pinctrl 内核:已初始化 pinctrl 子系统
[0.394]注册的 pinct subsystem [ 0.362750000ns ]
预分配256 KiB 池、用于原子相干分配
[0.331495] GPIO 第20行(DDR VTT 使能)硬木输出/高
电平[...] 

我们从未在 TISDK6的3.2内核中遇到过此问题、因此我们想知道是否有人以前看到过此问题。

非常感谢!

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

    供参考、4.4.12内核不是 TI 官方内核版本。 您能否分享您从何处下载源文件、以便我了解这些文件?

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

    感谢您对此进行深入研究。 我们使用了3.00.00.04 (software-dl.ti.com/.../software_manifest.htm)的内核 、因为它是当时最后一个 SDK。 但现在我们已经切换到了最新的版本(03.02.00.05)、并且4.4.3.32也发生了同样的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    让我看一下内核源代码、然后我将返回我的反馈。

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

    Yordan、您好!

    很好、感谢您的帮助! 遗憾的是、它在任何内容写入控制台之前挂起(在 uboot 打印"启动内核"之后)、并且没有可用的内核转储、因此这就是我目前为止可以提供的所有信息。

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

    我认为问题不在时钟源中
    [0.296301]时钟源:Jiffies:MASK:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:19112604462750000 ns
    在正常启动的器件上可以看到这完全相同的行、即下面是我的 BBB、运行内核4.4.19:
    [0.169660]时钟源:Jiffies:MASK:0xFFFFFFFF max_cycles:0xFFFFFFFF、max_idle_ns:19112604462750000 ns

    您的系统实际上挂起:
    [0.331495] GPIO 线路20 (DDR VTT 使能)硬启动输出/高电平

    它来自 drivers/GPIO/gpioib.c、GPIO_hogd ():
    /*将 GPIO 标记为"硬点"、以便稍后识别和删除*/
    SET_BIT (flag_is 和 hdc->flags);

    PR_INFO ("GPIO 行%d (%s)作为%s%s%s\n"、
    DESC_TO_GPIO (DESC)、名称、
    (Dflags&GPIOD_flags_bit_DIR_OUT)? "输出":"输入"、
    (Dflags&GPIOD_flags_bit_DIR_OUT)?
    (Dflags&GPIOD_flags_bit_DIR_VAL)? “/高”:“/低”:“);
    您案例中的行名为"DDR VTT enable"。 您能否发布 DTS 文件和完整的引导日志(uboot 输出和内核输出直到其挂起)?

    此问题是否仅在一个板上或在多个板上重现? 您是否查看了原理图、尤其是 DDR 连接(确保严格遵循 DM 导线)(?) 我不排除硬件问题..

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

    Yordan、您好!

    有趣的是,我曾以为当我们看不到正在打印的时钟源 Jiffies 线时,这就是那个区域。 我们将研究如何确定 DDR 线路的范围、并在 uboot 中检查寄存器以及在成功引导至 Linux 后检查这些寄存器。 但是、由于电路板能够使用内核3.2正常启动、我们认为它与硬件无关。

    这一问题发生在多个电路板上、它是随机的(即仅发生~1/20引导)、但始终位于同一位置。

    附件是我们的引导日志和 DTS 文件。

    e2e.ti.com/.../4150.boot.txte2e.ti.com/.../6505.am335x_2D00_dev.dts.txt

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

    在对 DDR_VTT_EN 行进行范围界定后、我们注意到、电压短暂降至0V。 在较旧的内核中、没有发生这种情况。
    现在、我们想知道在加载内核加载/器件树时、是否重新初始化整个 GPIO 集。
    因此、在我们对该引脚进行多路复用之前、是否有任何方法阻止该引脚重新初始化(因为它已经在 u-boot 中正确初始化)?

    我们还添加了以下引脚多路复用:

    am33xx_pinmux{(am33xx_pinmux)}
    pinctrl-names ="default";
    pinctrl-0 =<&DDR_VTT_Pin &HW_id_Pins &rst_button_Pin &LED_GPIO_Pins &HW_REBOOT_PINs>;

    DDR_VTT_Pin:DDR_VTT_Pin{
    pinctrl-single、pins =<
    0x1B4 (PIN_OUTPUT 上拉| MUX_MODE7)/* xdma_event_intr1.gpio0_20 */
    >;
    };

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

    [引用]因此、在我们对该引脚进行多路复用之前、是否有任何方法阻止该引脚重新初始化(因为它已经在 u-boot 中正确初始化)?[/引用]

    如果您已在 u-boot 中正确设置此引脚(与 DDR 关联)、请尝试从内核侧删除它。 通常、DDR 配置在 u-boot 中只完成一次、您不应在 Linux 内核中执行任何 DDR 初始化。

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

    Yordan、您好!

    遗憾的是、我们尝试在 Linux 中将其排除(即仅使用 uboot 配置它)、但它不起作用。 我们会看到 DDR_VTT_EN 压降、系统会在该点挂起。 这就是我们最终使用 GPIO-hog 来确保它始终运行的方式。 首先、我们无法确定是什么导致 GPIO 引脚复位、因此您对我们可以在哪里尝试防止这种重新初始化有什么建议吗?

    谢谢!

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

    您好!  

    让我在 BBB 上测试它。

    此致、  

    Yordan

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

    Yordan、您好!

    谢谢、您能测试它吗?

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

    是的、我使用以下配置对其进行了测试:

    内核部分:
    AM335x-bone-common.dtsi:
    am33xx_pinmux{(am33xx_pinmux)}
    pinctrl-names ="default";
    pinctrl-0 =<&GPIO0_PINs>;


    GPIO0_Pins:GPIO0_Pins{
    pinctrl-single、pins =<
    0x1b4 (PIN_OUTPLUG_PULLUP | MUX_MODE7)/* xdma_event_int1.clkout2 *//之前的 mode3
    >;
    };
    };

    U-boot 部件:

    MUX.c:

    +静态结构 MODULE_PIN_mux GPIO0_20_PIN_mux[]={
    + {offset (xdma_event_intr1)、(mode (7)| pullup_EN)}、
    + {-1}、
    +};

    + void enable_GPIO0_20_pin_mux (void)
    +{
    + CONFIG_MODULE_PIN_mux (GPIO0_20_PIN_mux);+
    +}

    void enable_board_pin_mux (void)

    /*执行特定于电路板的多路复用器。 *
    if (board_is_Bone ()){
    /* BeagleBone pinmux */
    CONFIG_MODULE_PIN_mux (mii1_PIN_mux);
    CONFIG_MODULE_PIN_mux (mmc0_PIN_mux);
    + CONFIG_MODULE_PIN_mux (GPIO0_20_PIN_mux);

    Board.c:

    void set_UART_mux_conf (void)

    /*添加 GPIO*/
    + ENABLE_GPIO0_20_PIN_mux ();//此处添加的目的是确保在调试控制台启用 GPIO ... (MLO 级)。

    我在示波器上获得了一致的 GPIO0_20高电平。 内核和 u-boot 之间无信号压降。

    当您设计电路板时、您是否严格遵循了 AM335x 数据手册第7.2.3.3.1节 DDR3接口原理图中给出的建议? 尤其是 VTT 终端部件..

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

    您实际上能否发布原理图的相关部分?

    编辑:还发布完整的引导日志。  

    此致、
    Yordan

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

    Yordan、您好!

    感谢您提供您的扩散、正如它向我们指出的、我们现在正在验证您的扩散。

    我们的 uboot 最初仅将其设置为 PULLUDEN、而不是 PULLUP_EN。 因此、我们认为发生的情况是、GPIO 在从 uboot 切换到 Linux 时临时设置为输入、下拉电阻导致了电击。 我想知道、如果您仅在 uboot 中设置 PULLUUDEN、您是否会看到类似的情况? 现在、我们需要确定它在 Linux 代码中的第一个初始化输入位置。 现在、我们已将其设置为 PULLUP_EN、不再看到黑色。

    很抱歉、我认为我已经包含了引导日志。 我将在此处添加它以供参考、但我们将使用该线路上的 PULLUP_EN 进行测试、以查看它是否解决了问题。

    e2e.ti.com/.../5228.boot.txt

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

    您好!

    [引用]我想知道、如果您只在 uboot 中设置 PULLUUDEN、您是否可以看到类似的内容? [/报价]

    正如预期的那样、只有 PULLEDEN 设置如下所示:

    静态结构 MODULE_PIN_mux GPIO0_20_PIN_mux[]={

        {offset (xdma_event_intr1)、(mode (7)| PULLUDEN)}、    

        {-1}、

    };

    u-boot 中未设置内部上拉电阻:

    => MD 0x44E109b4

    44e109b4:00000007 00000030 00000028 00000030...0.........(0...    

    如您所见 、conf_xdma_event_intr1等于0x7、这意味着 MUXMODE7 (GPIO0_20)、PULLUD 被启用、下拉被选中(位4 = 0x0)...  

    在示波器上、GPIO0_20在 u-boot 期间为低电平、当内核接管时变为高电平。  

    此致、  
    Yordan

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

    Yordan、您好!

    太棒了、非常感谢您的观看。 在我们的 uboot 中、我们还手动将其设置为 board.c 中的输出高电平:

           GPIO_REQUEST (GPIO_DDR_VTT_EN、"DDR_VTT_en");
           GPIO_DIRECTION 输出(GPIO_DDR_VTT_EN、1);

    这确实会将其设置为输出高电平。 因此、在 uboot 中、整个序列为高电平、然后在内核加载时再次下降、在器件树引脚配置被采用时、再次为高电平。

    现在、我们想确定引脚在驱动程序中的重新连接位置(我们认为它正在重新连接为输入、然后使用器件树设置)。 您是否能够帮助提供一些关于您关注哪些方面的线索? 我们希望 Linux 在可能的情况下完全不接触引脚。

    谢谢!