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.

[参考译文] AM6442:使用 SDK 11.00.09.04 在 Linux 下支持 GPMC 接口

Guru**** 2434430 points
Other Parts Discussed in Thread: PROCESSOR-SDK-AM64X

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1538788/am6442-mmapping-the-gpmc-interface-under-linux-with-sdk-11-00-09-04

器件型号:AM6442


工具/软件:

您好:

一段时间前、我遇到了访问 GPMC 接口的存储器映射 CSR 导致总线错误的问题。

那个时间。 诀窍是将以下内容添加到设备树文件中:

&gpmc0{
       状态=“正常“;
};

我将再次开始工作、我将尝试使用最新的 SDK 11.00.09.04。

不幸的是、这个技巧不再起作用、尽管我确实调整了、但我仍然收到总线错误

器件树文件 (k3-am642-evm.dts)。 我还没有看到我犯过一些错误的地方。 因此、似乎在那里

SDK 中的一些更改、因此需要执行其他操作。 但什么呢?

顺便说一句、当时我也在稍后阶段观察到了问题、并得出结论认为、GPMC CSR  

无法从用户级别的角度访问、但需要内核权限。 另请参阅此处:

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1403803/am6442-attempts-for-manually-toggling-gpmc0_wpn-under-linux-is-failing-gpmc_config-register-reads-formally-illegal-data

我不确定这是否在这里发挥作用、以及是否对 Linux 进行了一些调整

内核软件这样从用户区访问这些 CSR 通常不可能再发生,并导致总线错误。

但是、我的理解是、仅映射物理内存区域时根本不涉及 Linux 内核。

谢谢、

Mario

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

    嗨、Mario、

    [报价 userid=“499222" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1538788/am6442-mmapping-the-gpmc-interface-under-linux-with-sdk-11-00-09-04

    那个时间。 诀窍是将以下内容添加到设备树文件中:

    &gpmc0{
           状态=“正常“;
    };

    [/报价]

    在上一个 e2e 主题中、您已经在&gpmc0 节点中将状态设置为“oke",“,但、但无法访问 GPMC 寄存器、但现在您说可以、我错过了什么?

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

    尊敬的 Bin:

    问题有两个方面。 那次我消除了总线错误、因为 GPMC 默认已完全关断。  

    激活 GPMC 后、我能够访问 GPMC CSR。 然而、第二个问题是、访问某些 CSR 似乎不起作用。 即我能够访问它们,但系统没有按预期运行 — 大概是因为您当时指出的权限级别。 现在我想从那里开始工作并深入了解内核驱动程序的问题。

    但是、使用较新的 SDK 时、我面临一个事实:尽管在器件树文件中将状态设置为“oke",“,但、但我仍然看到这些总线错误。

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

    嗨、Mario、

    感谢您的澄清。 我现在明白了问题。

    但是、使用较新的 SDK 时、我面临的事实是、尽管在设备树文件中将状态设置为“oke",“,但、但我还是看到了这些总线错误。

    我预计不会发生这种情况、但您是否在内核引导日志中看到任何与 GPMC 相关的消息指示了任何错误? 我能想到的唯一问题是、您仅在器件树中启用了 gpmc0 节点、但未提供任何 GPMC 配置参数、这可能会导致 GPMC 初始化失败、然后不会通电。

    SDK11.0 内核还提供 GPMC 覆盖 dtbo 文件。 如果您将此 dtbo 应用于内核、总线错误是否仍然发生?

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

    您好 Bin、

    我在 dmesg(即 dmesg | grep GPMC)中看不到任何与 GPMC 相关的错误(甚至是常规消息)。 这对我来说并不奇怪、因为默认情况下没有与 GPMC 相关的驱动程序。  

    实际上、正如我在另一个线程中所描述的、我将在 09 SDK 中使用的所有设置接管到器件树文件中

    (https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1403803/am6442-attempts-for-manually-toggling-gpmc0_wpn-under-linux-is-failing-gpmc_config-register-reads-formally-illegal-data)

    不过、据我所知、尤其是那些不同的 gpmc0 引脚设置当时并不真正与总线错误问题相关。

    我注意到、在 SDK 11 中、有一个关于 k3-am642-evm.dts 中 gpmc0 的新条目:

    &gpmc0{
        RANGE =<0 0x00 0x51000000 0x01000000>;/* CS0 空间。 最小分区= 16MB */
    };

    我也删除了那一个测试,但这不会改变任何东西。

    您提到此 GPMC 覆盖 dtbo 文件。 如何将其应用到内核?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您提及此 GPMC overlay dtbo 文件。 如何将其应用到内核?

    如果您从 SD 卡引导、您可以在 SD 卡引导分区(所有 U-Boot 二进制文件都位于其中)上的文件 uEnv.txt 中添加以下行、然后 U-Boot 脚本将为内核加载该行。

    name_overles=k3-am642-evm-nand.dtbo

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

    我刚刚在内核 k3-am642-evm.dts、&gpmc0 节点中添加了 status =“oke",“,可以、可以看到在内核启动期间加载了 GPMC 驱动程序:

    root@am64xx-EVM:~# dmesg |grep GPMC
    [  1.150989] OMAP-LGPMC 3b000000。存储器控制器:GPMC 修订版 6.0
    [  1.157515] GPMC_mem_init:禁用映射在 0x0-0x1000000 的 CS 0

    请确保您在测试中使用了打补丁的 k3-am642-evm.dtb:

    root@am64xx-EVM:~# cat /sys/firmware/devicetree/base/bus@f4000/memory-controller@3b000000/status
    好的 Root@am64xx-EVM:~#

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

    尊敬的 Bin:

    至于这个 uEnv.txt 扩展:我尝试了这个。 还有其他障碍。 我还必须复制/boot/dtb/ti/k3-am642-evm-nand.dtbo (从 rootfs、而不是 bootfs!)  /boot/dtb (即一级更新的 k3-am642-evm-nand.dtbo)中  。 否则 u-boot 无法找到它(它不会在 ti-subdirectory 中搜索)。

    当我以这种方式直接从 SD 卡引导(即不是 tftpboot 且没有 NFS 根)、然后执行时  

    CAT /sys/firmware/devicetree/base/bus@f4000/存储器 — 控制器@3b000000/status

    我也得到了“好“。 如果没有覆盖、我将收到“禁用“、顺便说一句。

    但是、dmesg 没有向我显示您最后引用的这些与 GPMC 相关的消息。

    但是、当我尝试使用 devmem2 读出 0x3b000000 处的存储器位置时、我收到了总线错误:

    root@am64xx-EVM:~# devmem2 0x03B000000
    /dev/mem 已打开。
    映射到地址 0xff85f2f000 的存储器。
    总线错误(核心转储)
    Root@am64xx-EVM:~#

    i 刚刚在内核 k3-am642-evm.dts、&gpmc0 节点中添加了 status =“oke",“,我、我可以看到内核启动期间加载了 GPMC 驱动程序:

    这很奇怪。 您能否引用 k3-am642-evm.dts 的详细更改? 变更后、您的流程是什么? 我在这里使用了 tftpboot 和 rootfs、修改器件树文件后我要做的是:

    创建 Linux

    创建 linux_stage

    创建 linux_install

    sudo cp board-support/build-images/Image /tftpboot/Image-am64xx-evm.bin

    sudo cp board-support/build-images/dtb/ti/k3-am642-evm.dtb /tftpboot/ti/k3-am642-evm.dtb

    我刚刚尝试了  cat /sys/firmware/devicetree/base/bus@f4000/memory-controller@3b000000/status  

    “好了,我现在就去洗澡了。“ 但访问 CSR 会导致总线错误。

    我不清楚的一点是、为什么您在 dmesg 中看到这些与 GPMC 相关的消息、而我看不到它们。  

     您这边在做什么?devmem2 0x03B000000?  

    我不确定,但对我来说,这看起来像在最近的 Linux 内核版本中,他们完全禁止这种对这样的 CSR 的默许。 这是奇怪的是,一个总线错误被抛出,但谁知道..

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

    嗨、Mario、

    as for this uEnv.txt extension:我尝试了这个方法。 还有其他障碍。 我还必须复制/boot/dtb/ti/k3-am642-evm-nand.dtbo (从 rootfs、而不是 bootfs!)  /boot/dtb (即一级更新的 k3-am642-evm-nand.dtbo)中  。 否则 u-boot 无法找到它(它不会在 ti-subdirectory 中搜索)。

    我认为我之前的说明不是完全正确的、您可能需要使用

    name_overles=ti/k3-am642-evm-nand.dtbo

    [报价 userid=“499222" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1538788/am6442-mmapping-the-gpmc-interface-under-linux-with-sdk-11-00-09-04/5920648 #5920648“]

    我也得到了“好“。 如果没有覆盖、我将收到“禁用“、顺便说一句。

    但是、dmesg 没有向我显示您最后引用的这些与 GPMC 相关的消息。

    [/报价]

    当 gpmc0 设置为“oke"时“时、您仍然看不到与 GPMC 相关的内核启动消息? 这是意料之外的、但我不确定导致问题的原因。

    但是、当我尝试使用 devmem2 读出 0x3b000000 处的内存位置时、我收到总线错误:

    如果您没有看到 GPMC 初始化消息、GPMC 模块未通电、则会收到此类总线错误。

    [报价 userid=“499222" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1538788/am6442-mmapping-the-gpmc-interface-under-linux-with-sdk-11-00-09-04/5920648 #5920648“]

    sudo cp board-support/build-images/Image /tftpboot/Image-am64xx-evm.bin

    sudo cp board-support/build-images/dtb/ti/k3-am642-evm.dtb /tftpboot/ti/k3-am642-evm.dtb

    [/报价]

    我认为问题是您只更新了内核映像而不更新内核模块、然后 GPMC 驱动程序.ko 没有加载。

    请仅将新的 k3-am642-evm.dtb 更新到 sdcard、但不更新内核映像。

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

    尊敬的 Bin:

    对于使用覆盖层的普通实验、我从下面的从头开始以非常明确的方式重新尝试:

    • 我将默认映像 (tisdk-default-image-am64xx-evm-11.00.09.04.rootfs.wic) 写入 microSD 卡。
    • 我安装了 microSD 卡 RESP。 它是引导分区。
    • 在引导分区中、我将  tiboot3-am64x-gp-evm.bin 重命名 tiboot3.bin (对于 eval 套件上的处理器型号,我需要执行此操作)。
    • 我将 name_overles=ti/k3-am642-evm-nand.dtbo 添加引导分区的 uEnv.txt 中。

    我从准备好的 microSD 卡引导系统(无 tftpboot)。 之后

    • dmesg | grep GPMC 没显示任何内容
    • CAT /sys/firmware/devicetree/base/bus@f4000/memory-controller@3b000000/status 将返回我“oke"</s>“
    • devmem2 0x03B000000 导致出现总线错误。

    那么、这里有什么问题呢?

    至于你关于我缺失的模块重建/更新的提示:我确实检查了。 我从头开始重新安装了最新的 SDK 11、并为 tftpboot 和 NFS root 设置了所有设置。 启动时、 cat /sys/firmware/devicetree/base/bus@f4000/memory-controller@3b000000/status 将使我返回“已禁用“、这与当时的预期一致。

    接下来、我调整了  board-support/ti-linux-kernel-6.12.17+git-ti/arch/arm64/boot/dts/ti/k3-am642-evm.dts 、使相关条目如下所示:

    &gpmc0{
        RANGE =<0 0x00 0x51000000 0x01000000>;/* CS0 空间。 最小分区= 16MB */
        状态=“正常“;
    };

    所以我刚刚添加了 status =“好“;

    然后、我按照前面所述重新构建内核:

    创建 Linux

    创建 linux_stage

    创建 linux_install

    顺便说一句、这个进程实际上是构建和安装所有内核模块、并且只要我能够监督这种情况。  

    然后、我更新了.dtb 文件、使内核映像保持不变:

    sudo cp board-support/build-images/dtb/ti/k3-am642-evm.dtb /tftpboot/ti/k3-am642-evm.dtb

    SIEMENT HERE:显然 SDK 11 中仍然存在一个错误、因此 k3-am642-evm.dtb 文件需要位于 /tftpboot/ti 中、而不是位于 /tftpboot/中(默认情况下它所在的位置)。  

    结果与上述使用默认映像和此 NAND 覆盖的测试结果相同。 重复此操作:

    • dmesg | grep GPMC 没显示任何内容
    • CAT /sys/firmware/devicetree/base/bus@f4000/memory-controller@3b000000/status 将返回我“oke"</s>“
    • devmem2 0x03B000000 导致出现总线错误。

    将构建内核映像复制到 /tftpboot/中不会更改此处的任何内容。

    最后、这个过程实际上非常简单。 我还没有看到我在这里犯了一个重大错误。

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

    嗨、Mario、

    我正在进行另一项调试工作、但没有查看您的最新详细信息。 您能否按照以下步骤来更新 sdcard 上的 dtb、看看您是否仍有总线错误、然后我们将解决其余问题。

    -将 SDK 默认 WIC 映像刷写到 sdcard;

    - k3-am642-evm.dts 的&gpmc0 节点中添加 status =“oke" 以“以启用 GPMC,

    -执行“make linux-dtbs“编译内核器件树,

    -然后将“board-support/ti-linux-kernel-.../arch/arm64/boot/dts/ti/k3-am642-evm.dtb 复制到 sdcard 根分区/boot/dtb/ti 目录中、该目录应该具有原始的 k3-am642-evm.dtb 文件。

    -用 sdcard 引导板, /sys/firmware/devicetree/base/bus@f4000/memory-controller@3b000000/status 应该是“好“,

    -并且内核引导日志应该有一个 GPMC init 消息。 否则、您在读取 GPMC 寄存器时会遇到总线错误。

    -然后检查 devmem2  0x03B000000 是否 仍有总线错误。  

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

    尊敬的 Bin:

    好的、我确实尝试了以一种非常明确的方式执行此操作、如下所示:

    • 我准备了一张带有默认映像的 microSD 卡 (tisdk-default-image-am64xx-EVM-11.00.09.04.rootfs.wic)。
    • 我重新安装了 SDK 11.00.09.04(我完全删除了现有安装)。
    • 我修复了 SDK 的 bin/setup-targetfs-nfs.sh 中的一个错误(我认为这里没有关系,但值得一提的是,最近的 SDK 11.00.09.04 中仍然存在这个错误。 我在这里报告了一个:PROCESSOR-SDK-AM64X: 版本 09.02.01.10 的安装脚本中存在错误(已解决)) 
    • 我确实执行了 setup.sh。 实际上直接包括 tftpboot、NFS 等的配置(尽管在特定测试中不一定需要,因为我们在这里不会使用其中任何一个)。
    • 我确实  以某种方式调整了 board-support/ti-linux-kernel-6.12.17+git-ti/arch/arm64/boot/dts/ti/k3-am642-evm.dts、使相关条目如下所示:

      &gpmc0{
          RANGE =<0 0x00 0x51000000 0x01000000>;/* CS0 空间。 最小分区= 16MB */
          状态=“正常“;
      };

    • 我运行了  make linux-dtbs  
    • 我将  board-support/ti-linux-kernel-6.12.17+git-ti/arch/arm64/boot/dts/ti/k3-am642-evm.dtb 复制到 准备好的 microSD 卡的根分区(而不是引导分区)的/boot/dtb/ti 中。
    • 在 microSD 卡的引导分区中、我将  tiboot3-am64x-gp-evm.bin 重命名 tiboot3.bin (对于评估套件上的处理器型号,我需要执行此操作)。
    • 然后、我直接从 microSD 卡引导系统。

    现在猜猜是什么:问题仍然是一样的。 即在 dmesg 中不引用 GPMC、状态显示“正常“、devmem2 会导致总线错误。

    我在平均时间内又有了另一个怀疑。 简单而简单:SDK 11.00.09.04 中默认不会构建 GPMC 的标准内核模块。 在旧的 SDK 09 中、我可以找到 一个  board-support/ti-linux-kernel-6.1.83+gitAUTOINC+c1c2f1971f-ti/drivers/memory/OMAP-LGPMC.o 文件、即一个已编译的源文件。 在 SDK 11.00.09.04 中、我只能找到  board-support/ti-linux-kernel-6.12.17+git-ti/drivers/memory/OMAP-LGPMC.c、大概是用于 从其中创建 OMAP-LGPMC.o 的源文件。 尽管如此,奇怪的是,事情似乎在你的网站上工作。

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

    嗨、Mario、

    当我在办公室时、我会尝试这个精确的过程、看看缺少什么。 我在上一次测试中在内核引导日志中确实看到 2 条 GPMC 相关消息、devmem2 可以读取 GPMC 寄存器。

    在 SDK 11.00.09.04 中、我只是找到 board-support/ti-linux-kernel-6.12.17+git-ti/drivers/memory/OMAP-LGPMC.c 、大概是用于 从其中创建 OMAP-LGPMC.
    的源文件。

    如果只执行了“make linux-dtbs“、则不会生成 OMAP-LGPMC.o、则此命令仅编译内核 arch/arm64/dts/目录。

    请尝试“make linux“以查看是否会生成 OMAP-LGPMC.o。

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

    尊敬的 Bin:

    不、这不仅仅是因为制作 Linux-dtb。 在上面发布之前、我已经完成了完整的构建。 因此、默认映像中也缺少此模块。 我怀疑您正在使用另一个 Linux 内核配置进行测试。 我已经准备在哪里可以启用此默认 GPMC 模块的编译。

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

    是的,我通常直接处理内核存储库(用于轻松切换内核版本和上行远程文件等),而不是 SDK 中的内核存储库。 但我将检查 SDK11.0 中的内核、了解为什么没有启用/编译 OMAP-LGPMC。

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

    尊敬的 Bin:

    好的,所以这对我来说很清楚…

    board-support/ti-linux-kernel-6.12.17+git-ti/.config 中肯定未设置 CONFIG_OMAP_GPMC (它在 SDK 09 中相应地进行设置)。 但是会自动生成.config、更改它是无用的。

    在平均时间、我似乎无法找到必须启用默认 GPMC 驱动程序的位置。

    我发现有迹象表明、在 make menuconfig 中可以在 Device Drivers -> Memory Technology Device -> NAND 下找到。 但我在这里找不到任何相关信息。  我也扫描了许多其他菜单 — 没有...

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

    嗨、Mario、

    是的、不会生成 OMAP-LGPMC.o 是肯定的、因为在内核.config 中未设置 CONFIG_OMAP-LGPMC。 现在我检查了 SDK11.0、可以确认在 defconfig 中未设置此标志。 请应用以下内核补丁、然后重新生成.config 并构建内核、它应该将 OMAP-LGPMC 驱动程序编译到内核映像中。

    e2e.ti.com/.../0001_2D00_TI_2D00_arm64_2D00_defconfig_2D00_Enable_2D00_GPMC_2D00_NAND_2D00_related_2D00_configs.patch

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

    尊敬的 Bin:

    好的、那是个诀窍! 非常感谢! 我再次完成了 SDK 重新安装、并在制作 Linux 等之前应用了该补丁  

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

    很高兴问题得到解决。 我没有想到在 SDK11.0 内核 defconfig 中未启用 GPMC 驱动程序、但我不经常触摸 GPMC。

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

    似乎我是地球上处理 GPMC 的三个人中的一个。 但我认为,当涉及到处理器的专有硬件连接时,这是一件非常强大的事情 — 去掉了 PCIe 选项。 在竞争对手中、这似乎是一个独特的功能。 AM64x (AM65x) 的较大兄弟仅支持 16 位宽的 GPMC、这一点有点遗憾

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

    我想说的是、我在 SDK11.0 中没有经常接触 GPMC、因为它是新的。 我使用 GPMC 的大多数客户都使用 SDK9.x 和 10.x GPMC 在连接 FPGA 用例中非常流行。

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

    我还设计了 FPGA 接口。 是的、在最新的 SDK 之后运行肯定并不重要。 我与这些“3 人“开玩笑、但我想、没有多少人利用了刚果民主共和国武装部队、尽管我认为这是非常重要的。

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

    我们建议对任何新工程使用最新的 SDK、这不仅是因为错误修复、还因为支持时间更长。

    我使用 GPMC 的大多数客户都在 SDK9.x 和 10.x.
    上。

    仅仅是因为这些客户几年前就开始了这些项目。