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.

[参考译文] PROCESSOR-SDK-AM335X:内核在引导初期挂起

Guru**** 657930 points
Other Parts Discussed in Thread: TIDA-01568
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1130904/processor-sdk-am335x-kernel-hangs-early-in-boot

器件型号:PROCESSOR-SDK-AM335X
主题中讨论的其他器件:TIDA-01568

我在推出新的定制目标板时遇到了巨大的困难。  我一直在努力解决 MLO 和 u-boot、但它们现在正在运行。 使用 SDK 8.02。

我的目标没有 RTC、因此 必须删除对 RTC 寄存器的访问(使用 define 和 DTS)。 在不运行时对 RTC 寄存器的任何访问都会导致中止中断。

我希望内核有类似的问题、但我无法找到解决方案或验证情况是否如此。

U-boot 将运行到"正在启动内核..."

在上述内容之前、它似乎还正确读取了内核跟踪49xxxxx 字节读取(与内核 zImage 大小匹配)。

“正在启动内核...”之后没有消息

我已将 JTAG 与 Code Composer Studio 连接、并将断点放置在已命中的0x82000000和也已命中的0x8010000处。

它继续在0xC0F002E0处进行编码(似乎是 _mmap_switched)。 几条指令后、它崩溃。

除了未使用 RTC 外、我们没有用于电源的 TPS 芯片。 也可能是这样、但如果是这样、我希望内核输出一些内容。

我无法加载内核中的符号、因此我一直在使用 Disassembly 和映射文件来确定它的位置。

有人能不能告诉我如何继续、或者提供任何帮助或线索、说明导致这种情况的原因?

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

    我的定制目标与 TIDA-01568中的描述相匹配。

    与 AM335x EVM 或 Beagle Bone 系列相比、硬件差异如下:

    •该板不支持内部 RTC。
    •该板不支持用于电源管理的 PMIC IC

    我已尝试修改与此列表类似的代码:

    1. U-Boot:禁用电路板检测功能并强制执行"AM335x-bonebblack"的返回值。
    2. U-Boot:禁用与 PMIC 的 I2C 通信。
    3. U-Boot:禁用 RTC 相关功能。
    4. U-Boot:在自动引导期间禁用"BOOTCOUNT_limit"配置。
    5.内核:删除 RTC 节点、PMIC 节点和设备树(DTS 文件)中的相关代码。
    6.内核:禁用"RTC 实时时钟"配置。

    无法100%确定我是否已正确完成上述所有操作

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

    尊敬的 Thomas:
    您在为客户电路板自定义 u-boot 方面的更改列表对我来说很好。
    我还将连接一个从 u-boot 加载内核到内核启动的简单切换、以供您参考。
    我正在我的同事循环使用内核进行输入。
    最棒的
    -香港

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

    将 PDF 从 u-boot 附加到 kernel.e2e.ti.com/.../5850.u_2D00_boot_5F00_kernel.pdf

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

    非常感谢您的反馈。  

    我已经按照您所附 u-boot 内核文档中的所有步骤进行了操作。 它们都成功了。

    实际上、自从我写过之后、我还弄清楚了如何获取内核符号、现在能够单步执行内核启动代码。

    将 IM 插入 REST_init()函数,我认为该线程调度将接管该函数。 但现在我不知道如何从这里继续。

    我想知道为什么我在控制台上看不到任何东西。 代码已通过数个 pr_notice ("...") 调用。

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

    应该注意的是、在 UART 被初始化之前、EARLY_printk 不会向 UART 打印任何内容。 打印输出最初存储在缓冲区中、并在 UART 工作后转储。

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

    为了便于您参考内核控制台端口设置、我在文件"/include/configs/am335x_evm.h"(对于 AM335x 电路板)的下面列出了一个示例、
    其中控制台端口根据 u-boot 环境变量定义中的电路板类型进行设置。
    init_console=if test $board_name = a335_ice;然后 setenv 控制台 ttyO3、115200n8;否则 setenv 控制台 ttyO0、115200n8;fi;

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

    感谢您提供的这些信息、我想知道为什么我没有看到任何东西。 如果它从未达到 UART 的初始化、就会产生问题。

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

    我在 u-boot env 中指定了以下内容。

    => env 打印控制台
    console=ttyO0、115200n8

    这应该是可以的、因为 uart0是控制台端口。

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

    我在重新启动之前能够找到的最后一个问题是 clkdev.c 中的 vclkdev_alloc()函数(可疑...)

    我不会从调用返回 strlcpy()。 参数似乎是可以解决的问题、但我 也认为这可能是一种合法的任务切换。

    有人能告诉我内核开始任务调度后、我可以在哪里使用调试器进入调试器。

    我仍然无法获得任何控制台输出来帮助我。

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

    尊敬的 Thomas:

    将内核移植到新电路板时、请首先在电路板 DTS 中尽可能多地禁用模块、并且仅保留 CPU 运行 Linux 内核的最小裸节点、例如 CPU 和控制台 UART。

    请以下面的电路板 DTS 为例:
    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/boot/dts/ti/k3-am625-skeleton.dts?h=ti-linux-5.10.y

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

    这是我当前的完整 DTS:

    我已尽量减少、但可能缺少所需的东西?

    /DTS-v1/;

    #include "am33xx.dtsi"
    #include

    /{
      型号="Prolon PID6000"
      兼容="prolon、pid6000""ti、am33xx"

      选择
        stdout-path = uart0
        tick-timer =&timer2
      };

      内存
        DEVICE_TYPE ="存储器"
        REG =<0x8000000000 0x10000000>/* 256 MB */
      };
    };

    am33xx_pinmux{(am33xx_pinmux)}
      JTAG_PINS_DEFAULTJTAG_PINS_DEFAULT
        pinctrl-single、pins =<
          AM33XX_IOPAD (0x9d0PIN_INPUT | MUX_MODE0)/*(C11) TMs.TMS *
          AM33XX_IOPAD (0x9d4PIN_INPUT | MUX_MODE0)/*(B11) TDI.TDI *
          AM33XX_IOPAD (0x9d8PIN_OUTPUT | MUX_MODE0)/*(A11) TDO.TDO *
          AM33XX_IOPAD (0x9DCPIN_INPUT | MUX_MODE0)/*(A12) TCK-TCK *
          AM33XX_IOPAD (0x9e0PIN_INPUT | MUX_MODE0)/*(B10) nTRST.nTRST *
          AM33XX_IOPAD (0x9e4PIN_INPUT | MUX_MODE0)/*(C14) EMU0.EMU0 *
          AM33XX_IOPAD (0x9e8PIN_INPUT | MUX_MODE0)/*(B14) EMU1.EMU1 *
        >;
      };

      COM0_console_pins_defaultCOM0_console_pins_default
        pinctrl-single、pins =<
          AM33XX_IOPAD (0x970PIN_INPUT | MUX_MODE0)/*(E15) uart0_Rxd.uart0_RxD */
          AM33XX_IOPAD (0x974PIN_OUTPUT | MUX_MODE0)/*(E16) uart0_TXD.uart0_TXD *
        >;
      };
    };

    RTC{(&R)
      STATUS ="禁用"
      ti、hwmods ="禁用";   
    };

    uart0{(&U)
      pinctrl-names ="default"
      pinctrl-0 =<&COM0_console_pins_default>
      状态="正常"
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Thomas:

    我构建了您的 DTS 文件、仍然可以使用它启动 BeagleBone Black。 因此、我不认为您的 DTS 是根本原因。 尽管"ti,hwmodes"是已弃用的属性,将被忽略。

    您是如何生成内核.config 的?

    请在 Processor SDK 内核中使用'./ti_config_fragments/defconfig_builder.sh',然后选择选项1、2、1。 然后执行'make arch=arm cross_compiler= TI_SDK_am3x_release_defconfig'来生成.config。

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

    为了生成我的 defconfig 文件、我将 AM335x-EVM_defconfig 复制到了我自己的文件中、并使用 menuconfig 删除和添加了不同的内容。 其中一个是 RTC、另一个是 PMIC。 (我已将我的目标添加到 Rules.make 中)

    我已经按照您的建议创建了一个新的.config,并使用 make arc....来构建内核。 zImage

    我将删除 ti,hwmods (搜索解决方案时只找到我的一个 atts)

    新内核正在构建、我已将其复制到我用于引导目标的 SD 卡中。

    可悲的是,同样的行为。 它在输出"正在启动内核..."后停止

    以下是引导期间的控制台输出:

    U-Boot SPL 2021.01-00001-gc59bf25a38-m脏(2022年8月31日- 11:37:30 +0200)
    尝试从 MMC1引导


    U-Boot 2021.01-00001-gc59bf25a38-m脏(2022年8月31日- 11:37:30 +0200)

    CPU:AM335X-GP 修订版1.0
    型号:Prolon PID6000
    DRAM:512 MiB
    WDT:开始服务(60s 超时)
    NAND:0 MIB
    MMC:OMAP SD/MMC:0
    正在从 FAT 加载环境... ***警告- CRC 错误,使用默认环境

    未设置。 验证第一个电子保险丝 MAC
    NET:ETH2:以太网@4a100000
    按任意键停止自动引导:0
    切换到分区#0,确定
    mmc0是当前器件
    在器件0上找到 SD/MMC
    无法加载'boot.scr'
    无法加载'uEnv.txt'
    切换到分区#0,确定
    mmc0是当前器件
    正在扫描 MMC 0:1...
    正在扫描磁盘 mmc@48060000.blk ...
    找到3个磁盘
    无 EFI 系统分区
    未定义引导顺序
    EFI 引导管理器:无法加载任何映像
    切换到分区#0,确定
    mmc0是当前器件
    在器件0上找到 SD/MMC
    4997632字节在389ms (12.3 MIB/s)内读取
    11ms 内读取的57960字节(5 MIB/s)
    ###展开的设备树 blob、88000000
    使用0x88000000处的 FDT blob 进行引导
    正在将设备树加载到8ffe000,结束8ff267... 好的

    正在启动内核...

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

    在首次尝试使用新的.config 文件后。  我使用了 menuconfig。

    删除了 OMA_32K_TIMER
    删除 了 RTC_DRV_OMAP

    (32kHz RTC 导致 MLO 和 uboot 出现问题、因此只需尝试确保不使用它)。

    仍然没有成功

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

    现在、我在我的旧目标中尝试了接近 BBB 的 SD 卡。 (新的具有不同的 IO、无 RTC 和 PMIC)。

    使用旧目标硬件时、内核会引导、但并不十分成功  

    不确定这一点是否重要、因为这是我的旧目标、我一直在从 SDK 2 -> SDK 7进行更新、没有任何问题。
    但我实际上希望这里的内核构建实际上会启动.... (是否可以是板名称?)

    [2.911198] 8<--剪切此处----
    [2.914281]未处理故障:在0xe0326000处非线性蚀刻(0x1008)上的外部中止
    [2.921975] PgD = 55ce7f33
    [2.924689][e0326000]* PgD=82809811、* Pte=4a326653、* Ppte=4a326453
    [2.931003]内部错误:1008 [#1]抢占 ARM
    [2.935900]链接模块:
    [2.938973] CPU:0 PID:54 Comm:kwork/0:3未被污染5.10.100-g7a7a3af903 #11
    [2.946486]硬件名称:通用 AM33XX (平展设备树)
    [2.952629]工作队列:事件延迟_probe_work_func
    [2.957803] PC 位于 sysc_probe +0xce8/0x1550
    [2.962096] LR 位于 OMAP-RESET_DEASSERT+0x1ac/0x318
    [2.967078] PC:[ ] LR:[ ] PSR:60000113
    [2.973368] sp:c1eb9e28 IP:00000000 FP:c0b2f23c
    [2.978612] R10:00000028 R9:00000000 R8:c0b2f6fc
    [2.983856] r7:c1977c10 r6:00000000 r5:c10df3e4 r4:c2893340
    [2.990408] r3:e0326000 r2:00000000 r1:00026000 r0:00000000
    [2.996963]标志:模式 SVC_32 ISA ARM 段无时 FIQ 上的 nZCv IRQ
    [3.004127]控制:10c5387d 表:80004019 DAC:00000051
    [3.009895]进程 kwork/0:3 (pid:54、栈限制= 0x6717c297)
    [3.016188]堆栈:(0xc1eb9e28至0xc1eba000)
    [3.020564] 9e20:00000001 00000000 c10097d0 00000000 c10df3e4 c0d73b10
    [3.028778] 9e40:c1977c10 c0d739f0 00000001 00000001 000030 c1003048 00000000 00000000
    [3.036991] 9e60:c1977c10 c10830a8 00000000 c10e3b7c c10830a8 0000000a c1e9bfa0 c0650a50
    [3.045204] 9e80:c1977c10 c10e3b74 00000000 c10e3b7c c064e924 00000000 c1977c10
    [3.053418] 9ea0:c10830a8 c064ee38 c1091bc8 00000000 00000000 c1091bf4 c1e9bfa0 c064ed38
    [3.061631] 9ec0:00000000 c1eb9ef4 c064ee38 c064cc00 00000000 c183d11c c1ab0534 c1003048
    [3.069845] 9ee0:c1977c10 00000001 c1977c54 c064e7c0 c1977c10 c1977c10 00000001 c1003048
    [3.078060] 9f00:c1977c10 c1977c10 c1091e50 c064da74 c1977c10 c1091bbc c1091bbc c064df20
    [3.086273] 9f20:c1091bf0 c1e9c600 00000000 dfa29200 00000000 c013f790 c1eb8000 c10768e0
    [3.094486] 9f40:c1e9c600 c100bf8c c1e9c614 c1eb8000 c10768e0 c100bfa0 c100bf8c c013fc4c
    [3.102701] 9f60:00000000 c1e9bf80 c1e9bf00 c1eb8000 00000000 c013fa18 c1e9c600 c186fed0
    [3.110914] 9f80:c1e9bfa0 c01445e0 00000000 c1e9bf00 c01444a0 00000000 00000000 00000000
    [3.119128] 9fa0:00000000 00000000 c0100148 00000000 00000000 00000000 00000000 00000000
    [3.127341] 9fc0:00000000 00000000 00000000 00000000 00000000 00000000 00000000
    [3.135554] 9fe0:00000000 00000000 00000000 000000000013 00000000 00000000 00000000 00000000 00000000
    [3.143786][ ](sysc_probe)、来自[ ](platform_drv_probe +0x48/0x98)
    [3.151746][ ](platform_drv_probe)、来自[ ](真的_probe + 0xf0/0x398)
    [3.159963][ ](真的_probe)、来自[ ](DRIVER_PROBLE_DEVICE_0x5c/0xb4)
    [3.168180][ ](driver_probe_device)从[ ](BUS_TO_EASE_DRV+0x84/0xd0)
    [3.176744][ ](bus_for_each _drv)从[ ](_DEVICE_ATT+0xf0/0x15c)
    [3.185046][ ](_device_attach)从[ ](BUS_PROBLE_DEVICE_0x84/0x8c)
    [3.193262][ ](bus_probe_device)、来自[ ](DERAST_PROBLE_作品+0x7c/0xa8)
    [3.202270][ ](DERAST_PROBLE_UNCK_FUNC)、来自[ ](Process_One_Work+0x1c4/0x44c)
    [3.211446][ ](Process_One_Work)、来自[ ](worker_thread+0x234/0x5cc)
    [3.219662][ ](worker_thread)、来自[ ](kthread+0x140/0x184)
    [3.227093][ ](kthread)、来自[ ](RET_FANK_F叉+0x14/0x2C)
    [ 3.234344]异常堆栈(0xc1eb9fb0至0xc1eb9ff8)
    [3.239416] 9fa0:00000000 00000000 00000000
    [3.247628] 9fc0:00000000 00000000 00000000 00000000 00000000 00000000 00000000
    [3.255840] 9fe0:00000000 00000000 00000000 000000000013 00000000
    [3.262487]代码:e3130004 1a00014c e5943014 e0833001 (e593c000)
    [3.268611]-[结束线迹1047a6c1834bb3ce ]---
    [3.302034] mmc1:地址0001处的新高速 MMC 卡
    [3.308336] mmcblk1:mmc1:0001 004G60 3.69 GiB

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

    尊敬的 Thomas:

    刚意识到需要检查的事情、我相信 AM335x SDK v8.2会在 SD 卡的第一个分区(u-boot 二进制文件所在的分区)中添加一个配置文件"extlinux"、 这使得 u-boot 可从第一个分区而不是第二个分区的引导/文件夹(即 SDK v7.x 及更早版本)加载 zImage 和电路板 DTB。

    我不确定您将 zImage 和 DTB 更新到了何处、但请检查 u-boot 日志中的文件大小、以确保加载了正确的文件。

    [引用 userid="275839" URL"~/support/processors-group/processors/f/processors-forum 1130904/processor-sdk-am335x-kernel-hang-early-in-boot/4197125#4197125"]SD/MMC,位于器件0上
    4997632字节在389ms (12.3 MIB/s)内读取
    11ms 内读取的57960字节(5 MiB/s)[/QUERP]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它是从 rootfs/boot 加载的正确 zImage 和 dtb,在 FAT 分区中,我只有 MLO 和 u-boot.img。

    除了上面的控制台输出(来自另一个目标、而不是有问题的目标)。  我在引导旧目标时出错、它使用与旧目标不匹配的新 DTB 进行引导。 也许我不应该将事情与旧目标硬件混淆。

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

    是否有人可以帮助您找到中断的地方、并检查内核在引导过程中所处的距离。 可能是应该初始化控制台并开始输出的位置。

    我非常渴望让我的目标运行。

    我只能看到问题是与之有关的

    未启用 RTC (需要更改硬件)
    没有 PMIC、但根据  TIDA-01568 (也是一个重大的硬件更改)、上电序列看起来不错

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

    我现在 测试了一种不同的方法。

    因为我假设我的新 MLO 和 u-boot 都正常。 我正在使用较旧的内核进行测试。  

    我已经获取了一个正在运行的 SDK 7内核、并在新目标上尝试了该操作。

    MLO 和 u-boot 看起来仍然正常。 所有内容都在"正在启动内核..."之后停止

    我可以看到它是正确的内核和 DTB、可以查看 u-boot 报告的大小。

    由于我对 RTC 和 PMIC 有了大量的了解,它可以是不同的 MMU 还是....???

    在控制台上输出任何内容之前停止内核的功能。

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

    在 TIDA-01568中 、我有一句话不确定:

       6.内核:禁用"RTC 实时时钟"配置。

    是否有人能确切地解释这意味着什么?