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 交叉开关就足够了?
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.
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 交叉开关就足够了?
e2e.ti.com/.../devicetree.rarHiRK、
我们使用的是 SDIO 卡。
请找到随附的 DTS、dtsi 文件。 还附加了我们正在使用的配置文件。
请核实我们是否遗漏了任何东西?
请提供以下详细信息
传输配置的源地址应为什么(P set)
2.我们应将哪个事件编号用于 MMC1_DREQ_RX
我们使用的是 DMA 交叉开关62、这是正确的吗?
谢谢、此致、
Sangeetha
您好、Sangeeta、
是的、我已经浏览过这些文件、我有几个问题。
我不太清楚你在这里要做什么。
此致、
RK
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、
我们无法这样使用 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
抄送: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:
感谢您的回复。
我们不喜欢"在块间隙时停止"功能、因为它会导致实时数据丢失。 总之、我们将尝试一下。
关于无限传输、我们已发送 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