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/AM5708:带 WiFi 模块的 MMC 吞吐量

Guru**** 2595805 points
Other Parts Discussed in Thread: AM5708

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/639301/linux-am5708-mmc-throughput-with-wifi-module

器件型号:AM5708

工具/软件:Linux

您好!

我们有一个基于 am5708 处理器的定制板、可使用 mmc3 (SDIO)接口与 u-blox Lili-W1 Wi-Fi 模块(基于 Marvell Avastar 88W8801芯片组)连接。 我们能够成功连接路由器、但我们面临的性能问题似乎与 MMC 接口配置有关。   

我们成功地在最大10Mbit/s 的系统中获得吞吐量数据速率(TCP 连接)、使用 iperf 工具、我们预计数据速率会高得多。

我们根据 AM5708技术参考手册(SPRUHZ7E–2015年8月–2017年2月修订版)和 U-blox 系统集成手册、使用时钟和总线宽度设置通过器件树配置 MMC 接口。

U-blox 模块在 0至50MHz 的全时钟范围内支持1位和4位 SDIO 传输模式。

可以配置 MMC3主机控制器(AM5708)(根据 TRM)  

- DS 模式(3.3V IO):高达12Mbps (24MHz 时钟)
- HS 模式(3.3V IO):高达24Mbps (48MHz 时钟)

- 默认 SD 模式1位数据传输速率高达24Mbps (3Mbps)

通过配置时钟24MHz 和总线宽度1位模式的 MMC3主机控制器、我们可以观察到最佳性能(~ 10Mbit/s)。

我们的期望是在 MMC3主机控制器配置有48MHz 时钟和4位总线宽度时获得最佳性能、但吞吐量下降至~ 6Mbit/s。。。。

注:

我们已对照我们用于测试的 Lili-W1模块的评估板、检查了 u-blox 模块的射频质量和原理图/电路板设计。 射频链路可与参考板进行比较。

借助此评估模块、我们可以使用连接到定制板的 USB 接口达到~30Mbit/s 的比特率。

问题是:

是否有人可以向我们提供如何配置和验证 MMC 接口的正确设置的指导/指导。?

-------------------------------------- 配置细节和结果-------------------------------------------------------

mmc3{(&M)

pinctrl-names ="default"、"hs";
pinctrl-0 =<&mmc3_PINS_DEFAULT>;
pinctrl-1 =<&mmc3_PINs_hs>;

最大频率=<48000000>;
TI、不可拆卸;
TI、双电压;
disable-wp;
总线宽度=<4>;
/delete-property/sds-uhs-sdr50;
/delete-property/sds-uhs-sdr25;
/delete-property/sds-uhs-sdr12;
};


根部@WA55-PROTO-A:~# cat /sys/kernel/debug/mmc2/ios
时钟:48000000 Hz
VDD:21 (3.3 ~ 3.4V)
总线模式:2 (推挽)
芯片选择:0 (无关)
功率模式:2 (开启)
总线宽度:2 (4位)
时序规格:2 (SD 高速)
信号电压:0 (3.30V)
驱动程序类型:0 (驱动程序类型 B)

root@wa55-proc-a:~# iperf -c 192.168.5.100
----------------------------------------
客户端连接到192.168.5.100、TCP 端口5001
TCP 窗口大小:43.8 KB (默认值)
---- [712.298841]发送 addba:TID 0
[712.306063]发送 addba RA:
[712.308901] 64 D1 A3 32 Fe da
[712.312103] wlan0:Queue_CMD:CMD=0xce 已排队
------------------------ [712.317641] wlan0:---
dnld CMD (1493043712.129249):0xce、act 0x6400、len 22、seqno 0x37
[712.329928] dnld _cmd:
[712.332310] ce 00 16 00 37 00 00 00 00 64 D1 A3 32 Fe da 01
[712.338246]02 08 ff A3 dd
[3]本地192.168.5.101端口44564与192.168.5.100端口5001相连
[712.358906] CMD_RESP:
[712.361294] ce 80 18 00 37 00 00 00 64 D1 A3 32 Fe da 01
[712.367235] 00 00 02 08 00 00 00 00 00
[712.371040] wlan0:CMD_RESP (1493043712.182649):0x80ce、result 0、len 24、seqno 0x37
[712.379286] ADDA 请求:64:XX:XX:XX:FE:da tid=0 SSN=0 WIN_SIZE =32、AMSDU=0
[ ID]间隔传输带宽
[3] 0.0 - 10.0秒7.50 MB 6.29 MB /秒

=========================================== 测试2 ===========================================
mmc3{(&M)

pinctrl-names ="default";
/*pinctrl-0 =<&mmc3_PINS_DEFAULT>;*/
pinctrl-0 =<&mmc3_PINs_h>;

最大频率=<24000000>;
不可拆卸;
TI、双电压;
disable-wp;
总线宽度=<1>;
/delete-property/sds-uhs-sdr50;
/delete-property/sds-uhs-sdr25;
/delete-property/sds-uhs-sdr12;
};

根部@WA55-PROTO-A:~# cat /sys/kernel/debug/mmc2/ios
时钟:24000000 Hz
VDD:21 (3.3 ~ 3.4V)
总线模式:2 (推挽)
芯片选择:0 (无关)
功率模式:2 (开启)
总线宽度:0 (1位)
时序规格:0 (传统)
信号电压:0 (3.30V)
驱动程序类型:0 (驱动程序类型 B)

[ ID]间隔传输带宽
[3] 0.0 - 15.0秒16.8 MB 9.36兆位/秒
root@wa55-proto-a:~# iperf -c 192.168.5.100 -t 15
----------------------------------------
客户端连接到192.168.5.100、TCP 端口5001
TCP 窗口大小:43.8 KB (默认值)
----------------------------------------
[3]本地192.168.5.101端口43956与192.168.5.100端口5001相连
[ ID]间隔传输带宽
[3] 0.0 - 15.0秒17.2 MB 9.64 MB /秒

谢谢、

Andre Hoffard

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

    您是否使用带内中断或轮询?

    Steve K.

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

    您好、Steve、

    您能否给出在何处/如何验证的方向? 即、您是指 SDIO 主机控制器吗?

    在1位模式下、u-blox 模块利用数据线路1 (D1)作为中断线路、如所附 图片所示。  

    在这方面、我们观察到/proc/interrupts.中有大量来自 mmc2的内部错误  

     运行 top 时为 kdsdioirqd/mmc2。我们在寄存器概述中看到 SDIO_IRQ_MODE:轮询

    50MHz 时钟1位模式

    此致、

    Andre Hoffard

    和 kdsdioirqd/mmc2 。

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

    您好!

    您能否向我们提供有关如何在器件树中配置 mmc3.data1以启用 SDIO 带内中断的信息?  

    此致、

    Andre Hoffard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SDIO 主机配置为轮询模式。 我们观察到、在该模式下、我们的模块还会对基于 AM335x 的参考板的性能产生影响。 目前、我们尝试更新器件树以激活带内中断。 遗憾的是、当我选择 SDIO4位时、TI PinMux 工具不提供任何指示
    我们非常感谢您的任何帮助、例如您可以委托给我们的示例参考板。

    mmc3{(&M)
    状态="正常";
    pinctrl-names ="default"、"idle";
    pinctrl-0 =<&mmc3_PINS_DEFAULT>;
    pinctrl-1 =<&mmc3_PINs_idle>;
    VMMC-SUPPLY =<&VDD_3V3>;
    中断= ????
    interrupts-parent =<<&un模糊>????
    总线宽度=<4>;
    };

    mmc3_PINS_IDLE:pinmux_mmc3_PIN_IDLE{
    pinctrl-single、pins =<
    DRA7XX_CORE_IOPAD (0x3788、PIN_INPUT | MUX_MODE14) /* mmc3_dat1.mmc3_data1 */
    >;
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于 AM335x、请查看 Documentation/devicetree/bindings/mmC/ti-omap-hsmmc.txt。 底部有一个带内中断示例。

    对于 am57xx、请尝试执行类似的操作。 您不必对中断或中断父级执行任何操作。 中断默认位于 dra7.dtsi 中。 但该字段不会被使用。 如果您看一下 Documentation/devicetree/bindings/sinterrupt-controller/interrupts.txt、它介绍了中断扩展属性。请针对 am57xx 板尝试此操作。 我还在做一些研究。

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

    由于 Soeren Hoeckner 的全面分析、我们实现了更高的性能:

    您好、各位男士、

    嗯、我很确信问题是由您的 MCU (am5708)的 SDIO 主机控制器引起的。 MMC3时隙将 中断模式报告为轮询(cat /sys/kernel/mmc2/regs)。 在该模式下、还可以在 AM335x 上观察到对性能的重大影响。 因此、MMC 主机控制器需要按照 SDIO 规范中的规定将 DATA_1引脚复用到 GPIO 触发的中断。 从我们的角度来看、模块是否在其指定参数内运行。 顺便说一下、SDIO 主机控制器驱动程序上发现的这一问题会影响所有 SDIO 器件。 

     

    在深入分析了 OMAP_hsmmc.c 主机控制器驱动程序实现后、似乎需要特定的器件树条目来激活带内中断处理[1]。 所谓的 WAKE_IRQ 被指定为第二个中断[2]。 否则、控制器实现会返回到轮询[3]。 此外、MCU 功能还决定了是否将 GPIO 用作唤醒源[4]。 如果我没有弄错、这与您的 MCU (OMAP-HSMMC_SWAKEUP_MISSING)匹配[5]。 它遵循多路复用引脚"默认"和"空闲"的查找、需要也在 DEVICE_TREE 中定义该引脚、否则驱动器会返回轮询[6、7]。

     下面、我附加了 MCU 配置、该配置为您的 SDIO 主机控制器启用了通过 OMAP-hsmmc 实现的中断模式。  

    [1] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L2194

    [2] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L2069

    [3] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L1764

    [4] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L1777

    [5] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L1934

    [6] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L1783

    [7] http://elixir.free-electrons.com/linux/v4.4.32/source/drivers/mmc/host/omap_hsmmc.c#L1790

     

    连接的器件树中断模式所需的条件:

     

        mmc3_PINS_DEFAULT:pinmux_mmc3_PIN_DEFAULT{

            pinctrl-single、pins =<

                DRA7XX_CORE_IOPAD (0x377c、PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc3_clk.mmc3_clk *

                DRA7XX_CORE_IOPAD (0x3780、PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc3_cmd.mmc3_cmd *

                DRA7XX_CORE_IOPAD (0x3784、PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc3_dat0.mmc3_dat0 *

                DRA7XX_CORE_IOPAD (0x3788、PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc3_dat1.mmc3_dat1 *

                DRA7XX_CORE_IOPAD (0x378c、PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc3_dat2.mmc3_dat2 *

                DRA7XX_CORE_IOPAD (0x3790、PIN_INPUT_PULLUP | MUX_MODE0)     /* mmc3_dat3.mmc3_dat3 *

            >;

        };

     

        mmc3_PINS_IDLE:pinmux_mmc3_PIN_IDLE{

            pinctrl-single、pins =<

                DRA7XX_CORE_IOPAD (0x3788、PIN_INPUT_PULLUP | WAKEUP_EN | MUX_MODE14)     /* mmc3_dat1.GPIO7_0 *

            >;

        };

     

    mmc3{(&M)

        状态="正常";

     

              兼容="ti、dra7-hsmmc";

     

        pinctrl-names =“缺省值”、“hs”、“空闲”;

        pinctrl-0 =<&mmc3_PINS_DEFAULT>;

        pinctrl-1 =<&mmc3_PINs_hs>;

        pinctrl-2 =<&mmc3_PINS_IDLE>;

     

        VMMC-SUPPLY =<&VDD_3V3>;

        总线宽度=<4>;

        暂停时保持供电;

        TI、不可拆卸;

     

              中断扩展=<&crossbar_MPU GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH_>、

                                      <&GPIO7 0 IRQ_TYPE_LEVEL_LOW_>;

     

    };