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.

[参考译文] DRA746:MMC_EDMA

Guru**** 2963310 points

Other Parts Discussed in Thread: DRA746

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/650936/dra746-mmc_edma

器件型号:DRA746

要使 MMC DMA 正常工作、是否需要配置 IRQ 交叉开关(或) DMA 交叉开关就足够了?

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

    需要 DMA 交叉开关来在 EDMA 事件源和 EDMA 通道之间建立连接。 中断配置需要 IRQ 交叉开关才能将中断源与中断线连接。 根据您的用例、您可能同时需要这两者、例如、如果您使用中断来完成 EDMA。

    此致、
    Rishabh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rishabh、
    非常感谢。
    是否有适用于 MMC EDMA 配置的任何参考/示例代码、如果有、请提供链接
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Jeba、

    您使用的软件包是什么以及哪个版本。

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

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

    您好、Jeba、

    我使用 Vision SDK 软件包。
    我已经与一位 GLSDK 专家进行了联系、他将在这方面为您提供帮助。

    此致、
    Rishabh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Jeba、
    您能告诉我问题的背景吗?

    这是用于 eMMC 还是 SD? 这是出于性能原因还是其他一些系统原因?

    在硬件中启用时、MMC 驱动程序使用 ADMA:
    IF (val 和 MADMA_EN)
    host->use_adma = true;

    ADMA 是主 DMA、在 IP 内部也比 SDMA 和 EDMA 具有更好的性能。

    即使要切换到 EDMA、除了修改设备树节点以通知 MMC 使用 EDMA 之外、您也不需要显式配置任何内容。


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

    请查找以下详细信息以获取背景信息、
    我们希望使用 MMC1端口。 我们将一个外部器件连接到该端口。 我们已禁用器件树中的默认 MMC1。
    我们已经配置了 MMC 驱动程序、并且能够与外部器件通信。 如果没有 EDMA、我们能够在轮询模式下从该器件读取存储的数据。

    现在、我们需要通过 EDMA 进行读取。 您能否澄清以下内容、
    传输配置的源地址应为什么(P set)
    2.我们应将哪个事件编号用于 MMC1_DREQ_RX
    我们使用的是 DMA 交叉开关62、这是正确的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sangeetha、
    您尚未阐明什么是外部器件。
    它是 SD 还是 MMC 等存储设备?
    它是基于 SDIO 的卡吗?

    此致、
    RK
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sangeetha、
    除了以上详细信息、请共享您的电路板 DTS 文件、以便我可以检查您的配置。

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

    e2e.ti.com/.../devicetree.rarHiRK、

    我们使用的是 SDIO 卡。

    请找到随附的 DTS、dtsi 文件。 还附加了我们正在使用的配置文件。

    请核实我们是否遗漏了任何东西?

    请提供以下详细信息

    传输配置的源地址应为什么(P set)

    2.我们应将哪个事件编号用于 MMC1_DREQ_RX

    我们使用的是 DMA 交叉开关62、这是正确的吗?

    谢谢、此致、

    Sangeetha

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

    您好 RK、

    请提供详细信息。

    请提供以下详细信息

    传输配置的源地址应为什么(P set)

    2.我们应将哪个事件编号用于 MMC1_DREQ_RX

    我们使用的是 DMA 交叉开关62、这是正确的吗?

    您是否有机会按照请求查看附件。 请提供您的反馈。

    谢谢、此致、

    Sangeetha

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

    您是否有机会浏览附加的文件。 请提供您的反馈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sangeeta、

    是的、我已经浏览过这些文件、我有几个问题。

    我不太清楚你在这里要做什么。

    1. 连接了什么 SDIO 器件?
    2. 您是否正在尝试将现有的 SDIO 驱动程序/代码移植到 Linux?  
    3. 为什么 在 DTS 中禁用默认设备? 您可以使用现有 MMC/SDIO 控制器驱动程序。 您只需拥有一个器件驱动程序、终端器件便可与 SDIO 控制器通信。 使用现有框架将简化整个过程、使您可以轻松实施和维护。
    4. 如果这是您第一次在 Linux 下使用 DRA7x 与 SDIO 器件连接、则可以参阅 TI Wilik (WLAN)驱动程序等现有示例、了解它如何与底层 SDIO 控制器进行通信。 查看 drivers/net/wireless/ti/wlcore/SDIO.c

    此致、
    RK

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

    我们使用的是连接到 SDSlot 的 FPGA 存储器件。
    通过在上一帖子中附加的驱动程序、我们能够在轮询模式下读取数据。 我们希望通过 EDMA 读取它。
    为此、我们需要配置 EDMA 和 IRQ、但我们无法获得正确的详细信息。
    请指导我们为 SDIO (MMC1 DRA746)在链接模式下配置 EDMA。

    使用默认驱动程序时、它会在引导期间被插入和激活。 目前、我们希望通过 EDMA 从应用程序读取 SDIO 数据。

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

    e2e.ti.com/.../sdio_5F00_irq_5F00_issue_5F00_1.xlsxHiRK、

    请找到以下 详细信息和附件 、以便更好地理解、

    我们尝试通过 SDIO 接口将外部 FPGA 连接到 SD 插槽。

    为此、我们在轮询模式下编写了一个驱动程序代码来读取数据、这种操作正常、我们能够正确读取数据。

    我们希望更新此代码以使用 EDMA、但这对我们不起作用。 有关更多详细信息,请参阅随附的工作表“SDIO_IRQ_issee_1.xlsx”。

    没有 EDMA_START (即手动触发)、EDMA 回调不会发生。 (我们期望回叫由 EDMA_DREQ_61触发事件) 请指导我们配置事件触发、而不是当前手动触发。      

    2 我们无法设置 MPU_IRQ_83 (MMC1_RX)线路。 我们的配置过程是否正确?     

    请告诉我们配置中是否缺少任何内容。

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

    目前、我们已在器件树中启用默认 MMC、我们已设置主机-> USE_DMA。
    我们正在接收 IRQ 回调、并且传输完成标志已设置。

    您能不能告诉我们 DMA 的目标地址是什么、我们可以从哪里获得这些详细信息。

    谢谢、此致、
    Sangeetha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sangeetha、
    正如我前面提到的,您不需要更改任何控制器端参数,包括 host->use_dma。
    这由驱动程序自动设置。

    此外、目标 DMA 地址取决于传输是从 DEV_TO_MEM 还是从 MEM_TO_DEV。

    对于 MEM_TO_DEV、它是 MMCHS_DATA 寄存器地址;对于 DEV_TO_MEM、它是块层提供的目标缓冲器地址。

    这在块层和 MMC 驱动程序内部自动处理。

    在设备树中启用默认 MMC 设备后,是否能够看到 probe ()完成?
    您是否看到按预期枚举的器件?
    如果您能够从器件中读取或写入器件、则器件已按预期工作、因为每次传输都是 DMA 传输。

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

    您好 RK、

    我们无法这样使用 TI 框架工作。 由于我们使用的是特定于客户的 FPGA、其命令流与默认内核不同。
    请找到我们已检查的以下步骤

    使用 TI 框架、'OMAP-Hsmmc_probe"成功并且能够正确地注册 IRQ。 (文件名:drivers/MMC/host/omap_hsmmc.c)

     

    2.在 drivers/MMC/core/core.c 中尝试'mc_rescan_try _freq()'时,SDIO_reset()调用失败。 这是因为 SDIO_RESET()内的 MMC_IO_RW_DIC_HOST()调用被卡住。 由于我们使用的是特定于客户的 FPGA 板,因此我们无法使用 MMC_IO_RW_DIC_HOST()中给出的 CMD52,因此会发生卡滞。

     

    如果我们忽略 SDIO_RESET()调用,则在调用 MMC_attach_SDIO()时,它再次在 MMC_SEND_IO_OP_COND () API 中失败。 MMC_SEND_IO_OP_COND ()正在尝试发送我们的 FPGA 不支持的 CMD5。 因此、我们排除了 TI 的流程和硬编码 MMC1、并使用我们自己的命令将 FPGA 板(即 PAD 多路复用器)、时钟配置、初始化过程、总线电源配置、命令序列(复位、SDR 模式设置和读取多个块命令)设置为 FPGA。

     

    完成此过程后、我们可以看到用于数据读取的中断。 如果我将 OMAP-HSMMC_READ (host->base、data)放入中断处理程序中、我可以获得正确的读取值(我们知道数据读取过程不应该位于中断处理程序中。 但对于初始检查、我们尝试这样做)。 在这里、我们可以确认数据是通过轮询方法读取的。 接下来、我们将尝试通过 DMA 读取数据。

     

    我们了解到 OMAP-hsmmc_probe ()中已经配置了 DMA、并且可以获得 TX_CHAN 和 Rx_CHAN。

     

    问题是、我们需要使用什么 API 从 DMA 获取数据。 源地址和目标地址是什么? 在 omap_hsmmc_request() API 中,我们可以看到 omap_hsmmc_start_dma_transfer ()调用。 但我们无法确定何时调用此 OMAP-hsmmc_request()。 如果我们手动调用它、则此调用未成功。

    我们也没有收到任何 DMA 回调函数。

    请提供您的意见、我们如何继续。

    谢谢、此致、
    Sangeetha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sangeeta、
    您可以按照在 omap_hsmmc.c 文件中完成的确切步骤来配置 DMA 并使用 DMA 读取数据。
    只需添加新的驱动程序(使用现有代码)并使用设备树中的兼容性标志即可。
    这样、驱动程序的探测器将作为器件驱动程序初始化的一部分被调用。 将 OMAP-DMA 引擎 API 用于其余配置。

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

    您好 RK、

    我们已根据您的建议使用兼容性标志进行了检查。

    现在、我们能够以有限传输类型传输命令、并通过该驱动程序读取数据。

    默认情况下、所有命令都作为有限传输类型进行传输、如果我们将其更改为无限传输类型、则没有命令完成。

    之后没有响应。

    请给出建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sangeeta、
    很好、很高兴您能取得进展。
    您能描述两种情况之间的命令序列吗?
    1.有限
    2.无限

    您是否说过、当您未设置块计数时、没有 CC?

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

    抄送:Sangeetha

    尊敬的 RK:

    感谢你的帮助。

    我们将为 FPGA 板发送 CMD0和 CMD18。

    对于有限传输、

    1)我们已初始化具有 DMA 大小的 SG 缓冲区(当前大小为20480字节)。

    2) 2)将块长度设置为512

    3) 3)将块计数设置为 DMA_SIZE /块长度(即) 20480/512 = 40个块

    4) 4)在 MMC_Request 结构中也设置停止操作码

    结果:

    i)在 CMD18 CC 完成后进行一次 DMA 回调。

    II)传输20480字节后获得一个 TC 中断。

    III)读取值正常。

    对于无限传输、

    我们在 SDIO_hsmmc_start_command()中禁用了 BCE,剩余的流程与有限传输步骤(1)到(4)相同。 [我们知道、如果禁用 BCE 位、设置块计数不会产生影响]

    结果:

    i)在 CMD18 CC 完成后进行一次 DMA 回调。

    II)未获得 TC 中断。 因为该驱动程序代码在此行后卡住。

    由于这是无限传输、在 DMA 回调 API 中、'q_in_progress'值将为1。 因此不会调用 MMC_Request_Done ()。 但为什么我们没有获得 TC 中断呢?

    对于有限传输、我们还期望在传输每个块长度(512)字节后产生 TC 中断。 但我们只有在传输完满量后才能获得它。 EDMA 和 SDMA 的响应相同。 在 EDMA 代码(drivers/dma/edma.c)中未设置 ITCINTEN。 当我尝试启用它时、它会挂起系统。 这是否是无限传输问题的根本原因? 如果是、请告诉我们如何解决。

     

    此致、

    Rajeswari S

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

    尊敬的 RK:

    除了前一条消息、我们还尝试了以流为导向的传输、而不是块传输。 CON 寄存器中的 STR 位被置位。 为此、我们得到的响应与无限块传输相同。 (IE)在 CMD18 CC 完成后进行一次 DMA 回调、未获得 TC 中断、并且卡滞。

    在获取连续数据时、我们有什么严重漏掉的事情吗?

    谢谢、

    Rajeswari S

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rajeswari、
    行为是预期的。 您仅在传输结束时获得 TC、而不是在每个块之后获得 TC。

    要在每个块结束处获取中断、您可以设置 MMCHS_HCTL[16]SBGR 位来启用 BGE 中断(MMCHS_STAT[2] BGE)。
    启用 SBGR 后、控制器将在传输等于块长度的数据大小后停止。 主机驱动程序需要显式发出恢复请求-MMCHS_HCTL[CR]-以继续传输。

    此外、在执行无限传输时、在发送命令12 (STOP)之前不会获得 TC。

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

    尊敬的 RK:

    感谢您的回复。

    我们不喜欢"在块间隙时停止"功能、因为它会导致实时数据丢失。 总之、我们将尝试一下。

    关于无限传输、我们已发送 CMD12 (STOP)。 我们仍然没有获得 TC、因此会发生卡滞。 请在下面找到使用过的代码:

           /*发送 CMD 18 (READ_MULTIPLE_BLOCK)*/
           memset(ptr -> buffer,0,size );
           sg_init_one (&sg、ptr -> buffer、size);

           MRQ.cmd =&cmd;
           MRQ.DATA =数据(&D);
           MRQ.STOP =停止(&S);

           mq.cmd->opcode = mmc_read_multiple_block;
           MRq.cmd->arg = 0x4809C220;
           mrq.cmd->flags = MMC_RSP_R1 | MMC_CMD_ADTC;

           mq.data->blksz = blocklen;                          /* blocklen = 512 */
           mq.data->blocks =(size / blocklen);          // size = 20480,我们设置无限传输时无关紧要*/
           MRQ.DATA->flags = MMC_DATA_READ;
           MRQ.DATA->SG =&SG;
           mq.data->sg_len = sg_len;

           mq.stop->opcode = MMC_stop_transmission;
           mq.stop->arg = 0;
           mrq.stop->flags = MMC_RSP_R1B | MMC_CMD_AC;

           MMC_WAIT_for_req (host->MMC、&MRQ);

    有人对此 RK 提出建议吗?

    此致、

    Rajeswari S

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

    您好、Rajeswari、

      以下分配错误  

    MRq.cmd->arg = 0x4809C220;

    这应该是 CMD18的参数、CMD18是需要从卡读取的第一个数据块的地址、而不是 MMCHS_DATA。

    它应该是0x0和扇区(块)最大数量-1之间的有效块地址。

    此致、

    RK

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

    我们尝试将 arg 值设置为0。 但它仍不能用于无限传输。

    此致、
    Rajeswari S
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能否按如下所述启用 CONFIG_MMC_DEBUG 并共享日志?
    processors.wiki.ti.com/.../Processor_SDK_Linux_Automotive_FAQ

    此致、
    RK
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    此外、尝试在"arg"中使用不同的偏移- 0x0、0x100、0x400等

    此致、
    RK
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能否共享正在使用的卡的数据表?

    此致、
    RK
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我希望您能够解决这个问题、因为我在过去两周没有收到任何反馈。

    如果您有任何后续问题、请回复。

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

    您好 RK、

    非常感谢您的支持。

    在使用 FPGA 配置 SDIO 时、我们仍然面临一些问题。 目前、我们已暂停执行此任务。

    如果将来需要,我们将要求作出任何澄清。

    谢谢、此致、

    Sangeetha

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

    感谢您的更新。 我现在将关闭该线程、但当您再次开始处理该线程时、您可以在此处发布问题以重新打开该线程(如果该线程由于不活动超时而锁定、则启动新线程)。

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