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/AM3358:GPIO-LED 触发器和 MMC 重序

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/777840/linux-am3358-gpio-leds-triggers-and-mmc-renumbering

器件型号:AM3358

工具/软件:Linux

在 Linux 中、将指示灯 LED 连接到给定 MMC 接口上的活动的正确方法是什么? 我假定您只是将器件树设置为使用 GPIO LED 驱动器的触发器。 如下所示:

mmc1-led{
pinctrl-names ="default";
pinctrl-0 =<&mmc1_led_pines>;
兼容="GPIO-LED";

mmc1-led@0{
标签="mmc1:activity";
GPIO =<&gpioX YY GPIO_ACTIVE_LOW>;
linux、default-trigger ="mmc1";
默认状态="off";
};
}; 

但是、内核给出的器件名称并不总是与物理接口一致。 很明显、这很烦人、因为驱动指示灯的触发器现在显示错误信息。 下面是一个示例、我有以下 MMC 器件:

mmc0上的 SD 卡名为 mmc1
mmc1上的 eMMC 被命名为 mmc2
mmc2上的 wifi 被命名为 mmc0

但是、在没有 WIFI 的电路板型号上、器件名称与正确的总线相匹配。

mmc0上的 SD 卡名为 mmc0
mmc1上的 eMMC 被命名为 mmc1

从我读取的内容中、内核会根据发现 MMC 器件的顺序动态分配它们的名称。 因此、器件名称与物理接口匹配的情形可能很幸运。 是否有办法强制器件名称与器件所连接的物理总线相匹配? 查找顺序是否基于我可以在存储器映射中处理的类似升序地址的可预测性? 或者、答案是否是 init 脚本之类的权变措施、以确定器件的名称以设置相应的 LED 触发器? 如果有任何关于如何解决此问题的指示、我们将不胜感激。

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

    尊敬的 Andrew:

    Linux 中 MMC 模块的分配基于 am33xx.dtsi 中的条目(请参见下图)。 在器件树的上下文中、mmc1始终是 mmc1、因为它被分配给模块实例所在的特定存储器地址。 混淆来自硬件编号、硬件编号从1开始、但在 Linux 中、"/dev/mmcblk "值从0开始。 因此、只有在 Linux 中、MMC1上的 SD 卡才会变为"mmcblk0"、而 MMC2上的 eMMC => mmcblk1。  

    这些信息是否有助于您设置 GPIO LED? 您始终可以使用其他电路板 DTS 文件作为参考。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据 TRM、IP 块基于零、AM335x 物理上具有 MMC[0-2]。 器件树(am33xx.dtsi)使用一个基于索引的索引来命名模块并提供 MMC[1-3]。 如前所述、Linux 还使用基于零的编号(为什么设备树中的 MMC 条目是基于零的?)。 因此、是的、有差异、但我认为这不是我的问题。

    带 wifi 的板载:

    将物理 mmc0寄存器注册为 mmcblk1 (与预期的 mmc1器件树名匹配)
    物理 mmc1寄存器作为 mmcblk2 (与预期的 mmc2器件树名匹配)
    物理 mmc2 (没有 mmcblk 器件、因为这是 wifi、但 dmesg 会显示 mmc0的消息)

    没有无线网络

    物理 mmc0寄存器为 mmcblk0 (与预期的 mmc1器件树名不匹配)
    物理 mmc1寄存器为 mmcblk1 (与预期的 mmc2器件树名不匹配)

    因此、两个板之间共享的核心器件树定义了具有 mmc1触发器的 LED 的行为不同。 这是我的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Andrew:

    我无法确定为什么在 Linux 中将 WiLink 分配给 MMC0。 因此、我已将此主题分配给我们的软件团队进行评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你,艾哈迈德。

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

    我认为这与器件的探测方式有关。 WiFi 可能首先探测并获取 MMC0 "触发器"。 我将尝试获取有关这方面的更多信息以进行确认、但在此期间、我可以考虑两种可能的解决方法:

    1.将 WiFi 构建为模块,并在另外两个模块之后启动。
    2.使用 sysfs 来更改不起作用的系统上的 LED 的触发器。

    希望这两种解决方案中的一种能够满足您近期的需求。

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

    作为实验、我修改了器件树以运行所有可能的 MMC 组合。 根据结果、MMC 探针看起来始终从物理地址最低的模块开始、然后递增(对于 AM335x 存储器映射 mmc2 < mmc0 < mmc1)。 为了简短起见、我没有包括所有结果、但下面的日志消息显示了一般趋势。

    设备树:SD + EMMC + WIFI 已启用
    # dmesg | grep MMC[012]
    [1.438306]   mmc0:地址0001处的新高速 SDIO 卡
    [1.719685]   mmc1:主机不支持读取只读开关、假设已启用写入
    [1.727845]   mmc1:地址 AAAA 处的新高速 SDHC 卡
    [1.734150]   mmcblk1:mmc1:AAAA SL16G 14.8GiB
    [1.758374]   mmc2:地址0001处的新高速 MMC 卡
    [1.764454]   mmcblk2:mmc2:0001 W52532 28.5 GiB
    [1.769241]   mmcblk2boot0:mmc2:0001 W52532分区1 4.00 mib
    [1.775472]   mmcblk2boot1:mmc2:0001 W52532分区2 4.00 mib

    设备树:SD + EMMC 已启用
    # dmesg | grep MMC[012]
    [3.650171]   mmc0:主机不支持只读开关、假设启用了写功能
    [3.664153]   mmc0:地址 AAAA 处的新高速 SDHC 卡
    [3.670343]   mmcblk0:mmc0:AAAA SL16G 14.8GiB
    [3.680171]   mmc1:地址0001处的新型高速 MMC 卡
    [3.690132]   mmcblk1:mmc1:0001 W52532 28.5 GiB
    [3.694911]   mmcblk1boot0:mmc1:0001 W52532分区1 4.00 mib
    [3.701155]   mmcblk1boot1:mmc1:0001 W52532分区2 4.00 mib

    器件树:eMMC 已启用
    # dmesg | grep MMC[012]
    [3.618187]   mmc0:地址0001处的新型高速 MMC 卡
    [3.624309]   mmcblk0:mmc0:0001 W52532 28.5 GiB
    [3.629151]   mmcblk0boot0:mmc0:0001 W52532分区1 4.00 mib
    [3.635308]   mmcblk0boot1:mmc0:0001 W52532分区2 4.00 mib

    我认为确定将分配给器件的名称的规则是可预测的。 因此、我可以在提供 WIFI 绑定的器件树文件中重新定义 LED 触发器。 遗憾的是、分配的名称与物理接口无关。 至少串行端口的行为不是这样的...

    感谢 Ron 和 Ahmad。