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/AM3352:当 SPI NOR 添加为 MTD 块设备时、重新引导失败

Guru**** 2589300 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/638556/linux-am3352-reboot-fails-when-spi-nor-is-added-as-mtd-block-device

器件型号:AM3352

工具/软件:Linux

我正在工作的板从 SPI NOR 引导。 在 U-Boot 中、电路板复位正常。 在 Linux 内核中、只要它不加载 SPI 或 MTD 块器件、它就可以正常复位。 换言之、如果我没有将 mtdparts 传递到内核命令行参数、则电路板将复位。 在我添加 mtdparts 后、它会在重新引导时挂起、就在末尾 我在 Linux 内核4.1.18和4.9.41上都观察到了这种情况。  也许 Linux 驱动程序设置的 U-Boot 无法正确复位? 在该注释中、当您从 Linux 执行软复位时、执行是否会跳回到 ROM 引导? 我假设必须是这样、因为您不能假设 SPL 仍在 SRAM 中。 如果是这种情况、ROM 引导可能甚至无法访问 SPI、也无法正确访问 SPI。 有什么关于如何进行调试的想法吗? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chris:

    您使用的是 AM335x TI 电路板还是定制电路板?

    您是否使用 AM335x TI PSDK v4.01?

    您能否提供您所观察到的问题的完整控制台日志? 还提供添加 mtdparts 的确切步骤。

    [引用 user="Chris Karaplies">在该注释中、当您从 Linux 执行软复位时、执行是否会跳回到 ROM 引导? [/报价]

    是的、当软件复位被启动时、系统从 ROM 代码执行开始。

    有关调试非引导板的信息、请参阅以下 wiki 页面:

    此致、
    帕维尔

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

    您好、Pavel、

    该板是定制板、但我们使用 EVM 作为基线。 PSDK 是最新版本-尽管我们在较旧版本上也看到了相同的行为。 我应该澄清一点、实际上不是导致问题的 mtdparts。 它在器件树中添加 SPI NOR。 在 DT 中执行以下操作时、电路板无法正确复位。

    spi0{(&S)
      pinctrl-names ="default";
      pinctrl-0 =<&spi0_pins_default>;
      状态="正常";

      NOR@0、0{
       #address-cells =<1>;
       大小单元格=<1>;
       兼容="micron、n25q256a"、"JEDEC、SPI-NOR ";
       SPI-max-frequency =<48000000>;
       reg =<0>;
      };
    };

    如果我移除 NOR@0、0节点、它会重新引导正常。 重启失败后的控制台输出如下:

    root@AM335x-EVM:~# reboot

    初始化:正在发送 processStopping factory-test...done.t 11月11日:
    正在停止 telnet 守护程序。
    正在停止系统消息总线:dbus。
    hwclock:不能打开'/dev/misc/rtc:没有这样的文件或目录
    停止 syslogd/klogd:停止 syslogd (pid 777)
    已停止 klogd (pid 780)
    完成
    正在停止 thttpd。
    正在停止 statd:完成
    ALSA:正在存储混频器设置...
    /usr/sbin/alsactl:save_state:1590:找不到声卡...
    正在停止 rpcbind 守护程序...
    完成。
    正在解算网络接口... ifdown:未配置接口 usb0
    完成。
    正在禁用散热区...
    /etc/rc6.d/K98thermal-zone-init:第13行:/sys/class/thermal/thermal_zone */mode:没有这样的文件或目录
    发送所有数据将处理术语信号...
    发送所有数据将处理 kill 信号...
    正在卸载远程文件系统...
    正在禁用交换...
    正在卸载本地文件系统...
    [154.475861] EXT4-FS (mmcblk0p1):已重新安装。 opts:data= ordered
    正在重新启动... [157.094513]重新启动:重新启动系统

    谢谢、
    Chris

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

    Chris、

    AM335x GP EVM 的 SPI NOR 闪存(Winbond、W25Q64CV)连接到子板上的 McSPI0、但最新的 PSDK v4.01不支持该 SPI NOR 闪存。

    您的 DTS 文件看起来不正确。 您可以参阅 AM335x ICEv2板的 DTS 文件、其中介绍了 W25Q64CV SPI NOR 闪存、并将该文件作为参考:

    linux-4.9.41/arch/arm/boot/dts/am335x-icev2.dts

    spi0{(&S)
       状态="正常";
       pinctrl-names ="default";
       pinctrl-0 =<&spi0_pins_default>;

    SPI_NOR:FLASH@0{
          #address-cells =<1>;
          大小单元格=<1>;
          兼容="Winbond、w25q64"、"JEDEC、SPI-NOR ";
          SPI-max-frequency =<8000000000>;
          m25p、快速读取;
          reg =<0>;

          分区@0{
             标签="u-boot-spl";
             reg =<0x0 0x80000>;
             只读;
          };

          分区@1{
             标签="u-boot";
             REG =<0x80000 0x100000 >;
             只读;
          };

          分区@2{
             label ="u-boot-env";
             REG =<0x180000 0x20000>;
             只读;
          };

          分区@3{
             标签="MISC";
             REG =<0x1A0000 0x660000>;
          };
       };

    };

    am33xx_pinmux{(am33xx_pinmux)}

    spi0_pins_default:spi0_pins_default{
          pinctrl-single、pins =<
             AM33XX_IOPAD (0x950、PIN_INPUT_PULLUP | MUX_MODE0)/*(A17) spi0_SCLK.spi0_SCLK */
             AM33XX_IOPAD (0x954、PIN_INPUT_PULLUP | MUX_MODE0)/*(B17) spi0_d0.spi0_d0 */
             AM33XX_IOPAD (0x958、PIN_INPUT_PULLUP | MUX_MODE0)/*(B16) spi0_D1.spi0_D1 *
             AM33XX_IOPAD (0x95c、PIN_INPUT_PULLUP | MUX_MODE0)/*(A16) spi0_cs0.spi0_cs0 *
             AM33XX_IOPAD (0x960、PIN_INPUT_PULLUP | MUX_MODE0)/*(C15) spi0_CS1.spi0_CS1 */
             AM33XX_IOPAD (0x9a0、PIN_INPUT_PULLUP | MUX_MODE7)/*(B12) McASP0_aclkr.GPIO3[18]*
          >;
       };

    };

     

    有关这些 DTS 项的更多信息,另请参见以下文件:

    Linux-4.9.41/devicetree/bindings/MTD/JEDEC、spi-nor.txt

    另请查看 McSPI 驱动程序用户指南:

    processors.wiki.ti.com/.../Linux_Core_SPI_User's_Guide

     

    此致、
    帕维尔

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

    您好、Pavel、

    我看不到我的 DTS 有什么问题。 如果查看设备树绑定,则不会说需要分区。 实际上、所示的示例没有任何分区。 根据我的理解、分区可以通过以下两种方式之一传递到内核:1通过您所演示的器件树、2通过 U-Boot 中的内核命令行参数。 我是第二种做这件事的、因为我不想维护2个可能未对齐的 mtdparts 版本。 就 Linux 而言,通过命令行传递分区是有效的。 它会创建 MTD 器件节点、我可以访问它们、读取 SPI 写入等、也不会出现任何问题。 问题仅在于重新启动。 在我看来、这似乎是 SPI 驱动程序(我尚未修改)更改某些设置并将外设置于 ROM 引导无法使用的状态的问题。

    谢谢、

    Chris

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

    Chris、

    [引用 user="Chris Karaplies">我看不到我的 DTS 有什么问题。 如果查看设备树绑定,则不会说需要分区。 实际上、显示的示例没有任何分区。

    我不怀疑缺少分区子节点问题、我怀疑以下行可能会导致故障:

    NOR@0、0{

    您能否将其修改为如下所示、并尝试一下是否可以解决问题?

    spi0{(&S)
      pinctrl-names ="default";
      pinctrl-0 =<&spi0_pins_default>;
      状态="正常";

      -NOR@0、0{
     +SPI_NOR:闪存@0{
       #address-cells =<1>;
       大小单元格=<1>;
       兼容="micron、n25q256a"、"JEDEC、SPI-NOR ";
       SPI-max-frequency =<48000000>;
       reg =<0>;
      };
    };

    此致、
    帕维尔

     

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

    您好、Pavel、

    我尝试更改了器件树、但遗憾的是、它仍然表现出相同的行为。 我一直跟踪代码发出热复位、然后什么也不发出。 我正在尝试使用 CCS 方法来查看 ROM 引导中是否出现故障、但很难让调试器连接并运行脚本。 我应该能够在没有将调试器连接到 CPU 的情况下读取存储器、这是正确的吗?

    谢谢、

    Chris

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

    [引用 user="Chris Karaplies">我尝试了对器件树的更改、但遗憾的是、它仍然表现出相同的行为。 我一直跟踪代码发出热复位、然后什么也不发出。

    在两种情况下,请提供完整的控制台启动日志(u-boot、内核、rootfs)+“reboot”命令的完整日志:

    1."重新启动"正常时- DTS 中没有 SPI 和闪存节点

    2."重新启动"失败时- DTS 中有 SPI NOR 闪存节点

    [引用 user="Chris Karaplies"]如果没有将调试器连接到 CPU,我应该能够读取内存,这是正确的吗?

    在哪个阶段? 到底是哪种内存?

    如果您的流程位于 ROM 代码内(由于某种原因卡在该代码内)、则只能通过 JTAG 调试器读取 AM335x 寄存器。

    此致、
    帕维尔

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

    我没有听到您的反馈,我认为您能够解决您的问题。 如果不是、只需在下面发布回复(如果该线程由于超时而锁定、则创建新线程)

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

    您好、Pavel、

    我还没有解决这个问题-我的注意力被转移到一个更紧迫的问题上。 但我希望很快就会回来、并为您提供这些日志。

    谢谢、

    Chris