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.

[参考译文] CCS/AM4376:在 U-boot 将内核和 DTB 加载到新硬件上的 RAM 后、无法执行 Linux 内核

Guru**** 2815875 points

Other Parts Discussed in Thread: AM4376

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/949242/ccs-am4376-unable-to-execute-linux-kernel-after-u-boot-load-kernel-and-dtb-to-ram-on-new-hardware

器件型号:AM4376

工具/软件:Code Composer Studio

尊敬的所有人:

我们面临以下问题:

我们使用的是 AM4376以及 TI 提供的 Linux 内核和 U-boot

2.在旧板上,我们成功地从 SD 卡运行 Linux 发行版(U-boot+Linux 内核+根文件系统及应用程序)。

3.我们设计了新的板保持 布局(处理器到 RAM,SD 卡)。 没有改变。 即使引脚映射相同、DTS 也保持不变。

4.当我们在新电路板上插入相同的 SD 卡时,它卡在“正在启动内核……” "消息、无法执行 start_kernel()函数

从 u-boot 到 Start_kernel()函数的流程

我们可以在其中添加一些调试消息吗?

指导我解决此问题。

请找到新旧板的附加控制台日志。

此致、

d patile2e.ti.com/.../log_2800_old-board_2900_.txte2e.ti.com/.../log_2800_new-board_2900_.txt

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

    您好、Patil、
    我有一些问题可以帮助我们理解这个问题:
    1.与原工作板相比,新板的硬件是否有变化?
    2.在如下所示的附加日志文件中,我们是否知道电路板上的 SPL 如何加载 u-boot dtb 文件?
    为供您参考、TI 封装中的 u-boot.img 是嵌入 u-boot.bin 和多个 DTB 文件(即 AM437X-gp-evm.dTB;AM437x-SK-evm.dtb...)的 FIT 图像。
    在引导期间、SPL 解析 u-boot.img fit 映像、并加载 u-boot.bin、这是与基于 board_ID 的引导板匹配的 DTB 文件。
    >>>
    这些选项中没有匹配的 DT:
    AM437x-gp-evm
    AM437x-SK-EVM
    am43x-epos-evm
    AM437x-idk-EVM
    <<<

    最棒的
    -香港

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

    你(们)好

    很抱歉耽误你的回答。

    硬件更改与 功率部分的电容器和电阻器相关。

    我们使用的是 u-boot.img。uboot 通过 EEPROM 获知板 ID、但在我们的情况下它是空白的。

    从新的电路板日志中、我们得知 start_kernel 函数未执行。

    uboot 加载内核和 start_kernel 函数执行之间的过程是什么?

    我们如何验证该过程?

    此致、

    Dhananjay Patil

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

    您好、Patil、

    [引用 user="DPatil"]

    uboot 加载内核和 start_kernel 函数执行之间的过程是什么?

    我们如何验证该过程?

    [/报价]

    我在这个 e2e 线程中有一个有关 u-boot 加载内核启动过程的注释。
    e2e.ti.com/.../3520128
    它位于 AM335x 上、但 AM43xx 也采用相同的过程。
    如果您在电路板上具有 JTAG 访问权限、我们能否运行一个简单的测试:
    -停止@u-boot 提示符
    -在0x82000000、0x80008000处设置两个(HW)断点
    -运行"boot"@u-boot 提示符
    -如果按第一个 bkpt @0x82000000、=> u-boot 加载 zImage ok。 您可以检查 DDR @0x82000000
    -如果按第二个 bkpt @0x80008000、=>内核解压缩正常。 内核已准备好运行。

    最棒的

    -香港

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

    您好、Hong、

    感谢您的宝贵答复。

    我使用 uboot 进行检查并在 arch/arm/lib/bootm.c 中进行更改

    我收到的消息与代码中提到的消息相同,但它停留在“正在启动内核……” "

    我还将介绍您的文档。 我们可以使用 Code Composer Studio 进行相同的调试吗?

    我还使用 CONFIG_LL 选项启用并编译了 Linux 内核、但未收到任何低级消息。

    我们将 AM4376的 UART5用于控制台。 U-boot 还会在同一控制台上打印消息。 我的配置中是否有任何缺失点?

    此致、

    d 比例

     

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

    您好、Patil、

    [引用 user="DPatil)]我还会浏览您的文档。 我们可以使用 Code Composer Studio 进行相同的调试吗?

    是的、任何 JTAG 调试器都可以工作
    -停止@u-boot 提示符
    -将 JTAG "连接"到运行板、其中"连接"对运行目标不具有侵扰性、或者不会发生 SOC 复位。
    -在0x82000000、0x80008000处设置两个(HW)断点
    -运行"boot"@u-boot 提示符
    -如果按第一个 bkpt @0x82000000、=> u-boot 加载 zImage ok。 您可以根据需要通过 JTAG 检查 DDR @0x82000000
    -如果按第二个 bkpt @0x80008000、=>内核解压缩正常。 内核已准备好运行。

    [引用 USER="DPatil)] 我们将 AM4376的 UART5用于控制台。 U-boot 还会在同一控制台上打印消息。 我的配置中是否有任何缺失点?

    您可以按如下所示检查@u-boot 提示符、其中 ttyO0是 AM437x GP EVM 上的 UART0
    =>打印控制台
    console=ttyO0、115200n8

    最棒的

    -香港

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

    您好、Hong、

    感谢您的宝贵答复。

    我检查了 Code Composer Studio 中与 JTAG 相关的步骤。

    0x82000000处的断点被命中

    断点0x80008000命中

    随附文档中提到了步骤。 请仔细阅读、如果有任何问题、请告知我。

    我有以下问题:

    1.如何将 Linux 内核从解压缩调试为 start_kernel 函数?

    2.如何在 Linux 内核中启用低级日志和早期日志,以便从内核执行中验证进程?

      我尝试了、但没有获得任何 success.please 参考附加的内核配置。 我们的控制台位于 AM4376的 UART5上。

    3.当控制从 uboot 转移到 内核执行时,我们是否需要监控任何硬件信号?

    此致、

    Dhananjay Patil

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

    您好,Hong,

    由于某些技术问题,我无法在同一封邮件中附加文件。请在附件中找到所述文件

    e2e.ti.com/.../Attachments.rar

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

    您好、Patil、
    感谢您运行测试。 我查看了附件中的 JTAG 调试屏幕截图。
    -第一个 bkpt @0x82000000被命中、=> u-boot 加载 zImage ok;
    它“应该”与内核代码中的“arch/arm/boot/compressed/head.S”匹配
    -第二个 bkpt @0x80008000被命中、=>内核解压缩正常;
    它“应该”与内核代码中的“arch/arm/kernel/head.S”匹配,并且最初 MMU 关闭。

    内核锁定的一些调试选项:
    a:如果要使用 JTAG 调试内核锁定、内核需要使用"CONFIG_DEBUG_INFO=y"进行构建、以便在 ELF 文件中内置调试符号信息。
    内核构建中的"vmlinux"是要由 JTAG 调试器加载的 ELF 文件。
    - b.在内核启动过程中启用 EARLY_printk。
    应该注意的是、在 UART 被初始化之前、EARLY_printk 不会向 UART 打印任何内容。
    打印输出最初存储在缓冲区中、并在 UART 工作后转储。

    我们能否运行一个简单的测试:
    -在第二个 bkpt @0x80008000命中后、从 JTAG 调试器中输入"GO"以运行代码
    -几分钟后中断通过 JTAG 调试器运行的代码
    -捕获屏幕快照(理想情况下为1/。 使用嵌入的调试符号信息构建的 vmlinux、然后是2/。 加载 JTAG 调试器)
    =>这将使我们了解内核锁定发生的位置。

    最棒的

    -香港

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

    您好、Hong、

    感谢你的答复。

    我使用 CONFIG_DEBUG_INFO=y 重新编译内核

    我通过 JTAG 加载 vmlinux。 并进行一些测试。

    请浏览包含测试所需屏幕截图的附件。

    此致、

    Dhananjay Patil

    e2e.ti.com/.../testresult2.rar

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

    您好、Patil、
    我查看了您在附件中上传的屏幕截图。
    从第一个(bkpt @0x82000000)和第二个(bkpt @0x80008000)屏幕快照、
    反汇编代码看起来有效,“应该”与“arch/arm/boot/compressed/head.S”和“arch/arm/kernel/head.S”匹配。
    您可以将它们与您的内核代码进行比较、因为我无法访问它们。
    =>内核加载和解压缩正常运行、内核开始运行...

    在第三个屏幕截图中、在通过 JTAG 调试器加载"vmlinux"符号的调试版本后、
    我们能否捕获1/的 JTAG 并发视图。 代码视图;2/。 ARM 寄存器视图;3/。 呼叫流程视图...
    =>这将使我们了解内核锁定发生的位置。
    最棒的
    -香港

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

    您好、Hong、

    感谢您的支持。

    当内核在一段时间后停止时、请找到附加的 JTAG 捕获。

    此致、

    Dhananjay Patil

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

    您好、Patil、
    感谢您运行测试并捕获 JTAG 屏幕截图。
    它看起来像内核加载、解压缩运行正常。 以及内核在运行一段时间后锁定。
    一些用于进一步调试内核启动问题的选项:
    -使用 JTAG 调试触发锁定的内容/方式
    -将您的内核设备树最小化以使内核正常运行,然后添加"已删除"的设备节点。

    最棒的

    -香港

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

    您好、Hong、

    当控制从 u-boot 转移到 Linux 内核时、我们是否需要监控任何硬件信号?

    此致、

    Dhananjay Patil

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

    您好、Patil、

    要监控的硬件信号取决于您的系统/硬件设计。

    最棒的

    -香港

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

    您好、Hong、

    感谢您的支持。

    您能否提及一些信号(例如复位、不同的 RAM 信号...)以便我们最终验证?

    此致、

    Dhananjay Patil

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

    您好、Patil、

    所有基本硬件配置(如复位、DDR... 如您所述)是在启动内核之前在 SPL/u-boot 中设置的。
    内核中的其余硬件外设设置取决于用户的内核器件树配置。

    最棒的

    -香港

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

    您好、Hong、

    感谢您的支持。

    更新很少。

    1。 我在 start_kernel 函数(init/main.c)中放置了断点。 这个断点已命中。

    但是在串行控制台上、我们看不到任何消息、例如 Linux 命令行参数、在物理0x0 CPU 上引导 Linux

     我们检查变量 boot_command_line。 它显示了正确的引导命令行参数。

    我们将串行端口5用作控制台。

    为什么这些消息不在串行端口上打印?

    此致、

    Patil

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

    您好、Patil、
    不从串行终端转储 printk 的原因之一很可能是因为内核锁定发生在您的情况下的内核启动的早期阶段。 为了便于您参考内核控制台端口设置、我在文件"/include/configs/am335x_evm.h (适用于 AM335x 电路板)的下面列出了一个示例、
    其中控制台端口根据 u-boot 环境变量定义中的电路板类型进行设置。

    "init_console="\
    "如果测试$board_name = A335_ICE;然后"\
    "setenv 控制台 ttyO3、115200n8;"\
    "否则"\
    "setenv 控制台 ttyO0、115200n8;"\
    "fi;\0"\ 

    最棒的

    -香港

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

    您好、Hong、

    能够使用 JTAG 读取内核日志

    我们收到以下紧急消息

    正在初始化 cgroup 子系统 IO          4!     正在初始化 cgroup 子系统内存  z      4"     
    正在初始化 cgroup Subsys 设备  9     4 "    正在初始化 cgroup Subsys recrucer  r     8 %     
    正在初始化 cgroup 子系统 perf_event   (     0       
    正在初始化 cgroup 子系统 PID        8'     
    CPU:测试写入缓冲区一致性:OK IA     L:     
    为0x80008200-0x80008260 v 设置静态标识映射      (      devtmpfs:已初始  化 h      X G     
    VFP 支持 V0 3:实施者41架构3第30部分变体9版本4 1      P @    
    未处理故障(&U):0xc6f1a9ac 处的不精确外部中止(0x1406)               
    &PgD = c0004000         0     "[c6f1a9ac]*PgD=86e0041e (坏)          8 '     
    内部错误:1406 [#1]抢占 ARM 7D     $      链接模块  :>     P >    CPU:0 PID:1 Comm:swapper 未被污染4 41-441-gf9f6f0db2d #28         D 3.     
    硬件名称:通用 AM43 (平展器件树)_      @-     
    任务:dc460000 ti:dc45a000任务 ti:dc45a000  Y      0       
    PC 位于_enable_sysc+0x70/0x230       0       
    LR 位于_enable_sysc+0x60/0x230"h     t c     
    PC:[ ]   LR:[ ]    
    PSR:20000053
    SP:dc45be30  
    IP:dc45be30  
    fp:dc45be5c `      <+     
    R10:00000000  
    R9:c0755600  
    R8:00000077        L:     
    R7:c079da8c  
    R6:c079a1c0  
    R5:00000020  
    r4:c079d3d8 t      L:     
    r3:00000000  
    R2:00000000  
    r1:c079df50  
    R0:c079a1c0  g     T B     
    标志:  FIQ 上的 nzCv IRQ 关闭 模式 SVC_32 ISA ARM 段无 1      D 1     
    控制:10c53c7d 表:80004059 DAC:00000051          D 2.     
    进程交换器(pid:1、栈限制= 0xdc45a208)  #     4!     
    堆栈:(0xdc45be30至0xdc45c000)          ` M     
    BE20:                                    c0029f84 c00534b8 dc45be5c 00000000  )      ` M     
    be40:c002bd00 c079d3d8 00000000 c07d6e50 dc45be84 dc45be60 c002282c c0022460  D      ` M     
    be60:dc45be84 dc45be70 c079d3d8 00000002 c079d424 dc4f0600 dc45beb4 dc45be88          ` M     
    be80:c0760434 c0022690 dcf5c1c0 c079d3d8 c07992f8 00000011 dc4f0600 c079d3d8   M     ` M     
    bea0:c07992f8 c0797320 dc45becc dc45beb8 c0760cf4 c0760374 c0797320 c0760c78  g     ` M     
    Bec0:dc45bf4c dc45bed0 c0009754 c0760c84 dc45bef4 dc45bee0 c004e110 c02c2dec          ` M     
    bee0:dcfff400 c05ad0c8 dc45bf4c dc45bef8 c004e420 c075560c dc45bf34 c06bfa20          ` M     
    bf00:c06bf3c8 c06e9518 00000001 00000000 c07535e4 c0719964 00000000  0$     ` M     
    bf20:00000000 c07d68c0 c07d68c0 c079177c c078681c 00000077 c0755600 00000002   Y     ` M     
    bf40:dc45bf94 dc45bf50 c0755e78 c00096c8 00000001 00000000 c0755600          ` M     
    bf60:fff7eb57 c07535e4 6b1f6f1d c07d68c0 c05783f8 00000000 00000000 00000000 3        ` M     
    bf80:00000000 00000000 dc45bfansc45bf98 c0578410 c0755d4c 00000000 c05783f8          ` M     
    bfa0:00000000 dc45bfb0 c000fb8 c0578404 00000000 00000000 00000000 00000000 00000000  v5     ` M     
    bfc0:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000   I     ` M     
    bfe0:00000000 00000000 00000000 00000000 00000013 00000000 e2d6f6a6 575f66fd                   
    回扫: HT     T C     
    [ ](_enable_sysc)从[ ](_enable+0x1a8/0x2dc) |     4美元      
    r6:c07d6e50
    R5:00000000
    r4:c079d3d8*      T D     
    [ ](_enable)从[ ](_setup part 14+0xCC/0x404)*     @ 0      
    R7:dc4f0600
    R6:c079d424
    R5:00000002
    r4:c079d3d8       d R     
    [ ](_setup 第14部分)从[ ](_omap_hwmod_setup_All+0x7c/0x98)         4美元      
    R6:c0797320
    R5:c07992f8
    r4:c079d3d8i      d T     
    [ ](__omap_hwmod_setup_all)从[ ](do_one _initcall+0x98/0x1e0)       (        
    r5:c0760c78
    r4:c0797320nd     d d S     
    [ ](多个_initcall)、来自[ ](kernel_init_freeable +0x138/0x1cc)        \ i      
    R10:00000002
    R9:c0755600
    R8:00000077
    R7:c078681c
    R6:c079177c
    R5:c07d68c0  f               R4:c07d68c0       ` M     
    [ ](kernel_init_freable)从[ ](kernel_init+0x18/0xf4)          \ i      
    R10:00000000
    R9:00000000
    R8:00000000
    R7:00000000
    R6:00000000
    r5:c05783f8   P              r4:c07d68c0 ~     X F     
    [ ](kernel_init)、来自[ ](RET_FANK_F叉+0x14/0x3c) !       (        
    R5:c05783f8
    R4:00000000       H 5    代码:e1a06000 e3150020 0a00001A e5943070 (e3012001)           4美元     
    --[结束线迹6dc74c091ba8bb25 ]---        
    <+    内核严重错误-未同步:致命异常        D 4.     
    --[结束内核紧急状态-未同步:致命异常

     


    从上面的消息中、我了解到从_omap_hwmod_setup_all 函数调用的_enable_sysc 函数发生紧急情况。

    1. OMAP hwmode 有何不同?

    2.如何设置这些模式?

    此致、

    Patil

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

    您好、Wong、

    我们解决了这个问题。

    由于某些硬件问题、内核无法读取 RTCC 寄存器并导致内核严重错误。

    修复硬件后、内核能够引导。

    感谢您的支持。

    此致、

    Patil

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

    您好、Patil、
    很高兴知道您修复了内核启动问题。
    请单击已解决的问题。
    最棒的
    -香港