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:使用 Linux 器件树配置为 GPMC 进行多个 ChipSelect 分配的正确方法是什么?

Guru**** 2448780 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1549257/am6442-what-is-the-correct-way-to-make-multiple-chipselect-assignments-for-the-gpmc-using-the-linux-device-tree-configuration

器件型号:AM6442


工具/软件:

您好:

我尝试使用默认的 GPMC 驱动程序 (OMAP-LGPMC.c)、以便将某些硬件连接到 GPMC。 据我所知、OMAP-LGPMC 驱动程序在某种程度上专用于连接 NAND 或 NOR 闪存等内容、这不是我要做的。 但是、OMAP-LGPMC 驱动程序似乎是一个非常好的起点、我将尝试利用这里的大多数默认功能。

现在、我很难将地址窗口分配给各个 ChipSelects。  

器件树文件中的条目如下所示:

&gpmc0{
    pinctrl-names =“default";“;
    pinctrl-0 =<&gpmc0_pins_default>;
    Assigned-clocks =<&K3_CLKS 80 0>;
    assigned-clock-parter =<&k3_CLKS 80 1>;
    分配的时钟速率=<66666667>;
    //assigned-clock-rates =<100000>;
    GPMC、num-cs =<4>;
    RANGE =<0 0x00 0x50000000 0x01000000>、/* CS0 空格。 最小分区= 16MB */
         <1 0 0x00 0x51000000 0x010000000>、/* CS1 空间。 最小分区= 16MB */
         <2 0 0x00 0x52000000 0x01000000>、/* CS2 空间。 最小分区= 16MB */
         <3 0 0x00 0x53000000 0x010000000>;/* CS3 空间。 最小分区= 16MB */
    状态=“正常“;
};

因此有 4 个窗口、每个窗口大小为 16MiB、从给定的地址(当然是在 GPMC 数据窗口内)开始分配给 ChipSelects 0、1、2 和 3。

我不确定是否需要这一点、但我还添加了该行  gpmc、num-cs =<4>;以表明有四个可用的 ChipSelects。

构建器件树 (make linux-dtbs) 并使用其引导时、dmesg | grep GPMC 会显示以下内容:

[  1.154690] OMAP-LGPMC 3b000000.memory-controller:GPMC 修订版 6.0
[  1.161173] GPMC_mem_init:禁用在 0x0-0x1000000 映射的 CS 0

第一行正常、表明 OMAP-LGPMC 正在运行、而第二行对我来说很有问题。

首先、为什么它在写入时会禁用 CS 0? 其次、0x0-0x1000000 表示什么 — 它应该报告 0x51000000-0x51000000? 第三、剩下的三个 ChipSelects 呢?

还有一个问题是,每个范围条目中的第三个条目实际上意味着什么。 我查看了有关 OMAP-LGPMC 的器件树设置的 Linux 文档、该文档也在以下位置提供:

www.kernel.org/.../omap-gpmc.txt

根据该文档、范围元组必须具有以下形式:

0 

尝试使用该格式时、我会在器件树编译期间收到警告。   

我上面使用的格式与这个附加 0x00 参数一起实际从默认器件树文件复制而来、其中存在一个 ChipSelect 分配、如下所示:

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

顺便说一下、此默认设置还显示我禁用 cs 0...

我还没有深入研究 OMAP-LGPMC.c、以便可能了解所发生的情况。 也许这里有一些简单的解决方案。 一般来说、似乎很难找到有关 GPMC 模块的一些示例文档。

感谢您的见解、

Mario

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

    嗨、Mario、

    [1.161173]  GPMC_mem_init:禁用映射到 0x0-0x1000000
    的 CS 0

    此信息具有误导性。 可以忽略它。 我们有一个内部传票来删除此消息。

    我很快会调查您的其他问题。

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

    尊敬的 Bin:

    AHA、很好了解。 谢谢您的提问。

    在平均时间,我花了几个小时收集各种片段的信息,我相信我也在这里做一些错误。 似乎还需要向器件树的 GPMC 部分提供“子部分“部分。 即、还应该有四个子部分、每个子部分都描述时序特性以及与相应通道/芯片选择相关的其他设置。

    最后一个目标是设置这四个地址窗口、然后将事务驱动到连接的 FPGA 上。 我认为通过设备树设置来设置这些东西是相当简单的 — 如果有人知道该怎么做. 目前、当我丢弃此寄存器并通过操作 OMAP-LGPMC 驱动程序对各种 GPMC 寄存器设置进行硬编码时、似乎可以加快速度。 但这当然不是一个很好的方法。

    您好、

    Mario

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

    作为更新:

    我刚刚在 board-support/ti-linux-kernel-6.12.17+git-ti/arch/arm64/boot/dts/ti/k3-am642-evm.dtb 中进行了该设置

    &gpmc0{
        pinctrl-names =“default";“;
        pinctrl-0 =<&gpmc0_pins_default>;
        Assigned-clocks =<&K3_CLKS 80 0>;
        assigned-clock-parter =<&k3_CLKS 80 1>;
        分配的时钟速率=<66666667>;

        GPMC、num-cs =<4>;

        RANGE =<0 0x00 0x50000000 0x01000000  /* CS0 空间。 最小分区= 16MB */
             1 0 0x00 0x51000000 0x01000000  /* CS1 空间。 最小分区= 16MB */
             2 0 0x00 0x52000000 0x01000000  /* CS2 空间。 最小分区= 16MB */
             3 0 0x00 0x53000000 0x010000000>;/* CS3 空间。 最小分区= 16MB */
        状态=“正常“;

        FPGA@0、0{
            reg =<0 0 0x001000000>;
        };
        FPGA@1、0{
            REG =<1 0 0x001000000>;
        };
        FPGA@2、0{
            reg =<2 0 0x001000000>;
        };
        FPGA@3、0{
            reg =<3 0 0x001000000>;
        };
    };

    现在我无法判断映射是否正常。 但我通过 dmesg 收到了关于所有四个通道的大量配置信息、可能是使用默认值。 (我在  defconfig 中启用了 CONFIG_OMAP-LGPMC_DEBUG=y 以构建 Linux 内核。) 我想我可以在此基础上、填写各个计时参数、然后查看进展情况。 可以在 Linux 内核的  Documentation/devicetree/bindings/memory-controllers/ti、gps-child.yaml 中找到有关所有这些参数的良好总结。

    尽管如此、对于范围中每个元组的第五个参数仍有一些可疑之处、通常用 0x00 填充该参数、尽管可以找到的所有文档在每个元组中都有四个参数。 三元组的排列方式也很奇怪。 在我最近的版本中,我把所有四个元组放入一个不带任何分隔符的<>大括号中。 在我的例子我在我的初始帖子我把每个元组放入一个单独的一组<>大括号,并以逗号分隔它们。  也许这两种表示法都是有效的。

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

    我只需确认上面显示的器件树设置框架是否有效(根据 SDK 11.00.09.04)。 但为了更好的可读性、我稍微更改了范围表示法。 即:

        RANGE =<0 0x00 0x50000000 0x01000000>、/* CS0 空格。 最小分区= 16MB */
             <1 0 0x00 0x51000000 0x010000000>、/* CS1 空间。 最小分区= 16MB */
             <2 0 0x00 0x52000000 0x01000000>、/* CS2 空间。 最小分区= 16MB */
             <3 0 0x00 0x53000000 0x010000000>;/* CS3 空间。 最小分区= 16MB */  

    当然、 在 使用 GPMC 之前、仍需要填充各种参数。

    之后、用户空间进程可以通过/dev/mem 中的 mmap() 映射单个地址窗口、然后进行访问。

    尽管如此、我还是想鼓励 Texas Instruments 在此处添加文档部分: https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/latest/exports/docs/linux/gpm.html 、其中包含有关如何设置和使用 Foundational_Components_Kernel_Drivers 模块的几句话。 事实上,这是真的很简单 — 如果你知道该做什么..