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/AM5728:当为 GPMC 使用 EDMA 时、DMA 不会被触发

Guru**** 2540720 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/773854/linux-am5728-dma-not-being-triggered-when-using-edma-for-gpmc

器件型号:AM5728

工具/软件:Linux

使用运行4.1.13内核的 TI AM5728并尝试将来自 GPMC 外设的 DMA 执行到我的驱动程序中分配的缓冲区中。 我一直在努力了解为什么没有发生任何事情、这是因为我对设置 DMA 时需要指定的"适当"地址缺乏了解。

我已经设置了 DTS、使我的器件成为 GPMC 的子节点:

GPMC{
pinctrl-names="default";
pinctrl-0 =<&FPGA_PINS_DEFAULT>;
范围=<3 0 0x3000000 0x0100000>;/* FPGA */

HS_GPMC:FPGA@3、0{
reg =<3 0 0x100000 >;

#address-cells =<1>;
大小单元格=<1>;
interrupt-parent =<&GPIO1>;
中断=<29 IRQ_TYPE_EDGE_FALLING>;
DMA =<&EDMA_Xbar 4>;
dma-names ="rxtx";
兼容="LG、hs-fpg";

组宽度=<2>;
。
。
。 

我正在使用运行4.1.13内核的 TI AM5728、并尝试将来自 GPMC 外设的 DMA 执行到驱动程序中分配的缓冲区中。 我一直在努力了解为什么没有发生任何事情、这是因为我对设置 DMA 时需要指定的"适当"地址缺乏了解。

我已经设置了 DTS、使我的器件成为 GPMC 的子节点:

&gpmc {
    pinctrl-names="default";
    pinctrl-0 = <&fpga_pins_default>; 
    ranges = <3 0 0x3000000 0x0100000>; /* fpga */

    hs_gpmc: fpga@3,0 { 
        reg = <3 0 0x100000>;

        #address-cells = <1>;
        #size-cells = <1>;
        interrupt-parent = <&gpio1>;
        interrupts = <29 IRQ_TYPE_EDGE_FALLING>;
        dmas = <&edma_xbar 4>;
        dma-names = "rxtx";
        compatible = "lgs,hs-fpga";

        bank-width = <2>;
        .
        . 
        .

我认为我正在正确地执行以下操作、因为我正在获取虚拟内核地址并将其映射到 DMA 地址:

//设置我的缓冲区以存储来自 GPMC*/
buf = devm_kzalloc (&pdev->dev、HS_GPMC_FPGA_LEN、(GFP_DMA | GFP_kernel));
//获取 DMA 地址*/
DATA->DMA_start = DMA_MAP_single (&pdev->dev_dma_gp_core_device、gpfp_m_buf);//从 FPGA_device 获得 DMA 地址*/dma_m_m_bu_single; 

现在、我通过请求与整个 GPMC 节点使用的"rxtx"名称匹配的通道来确保获得 EDMA 控制器:

data->chan = dma_request_slave_channel(&pdev->dev, "rxtx");

这里是 DTS 中的 GPMC 节点:

 
GPMC:GPMC@50000000{
兼容="ti、am3352-gpmC";
ti、hwmds ="gpmC";
REG =<0x50000000 0x2000>; /*器件 IO 寄存器*/
中断= ;
DMA =<&EDMA_Xbar 4>;
dma-names ="rxtx";
GPMC、num-cs =<8>;
GPMC、num-waitpins =<2>;
#address-cells =<2>;
大小单元格=<1>;
GPIO 控制器;
#GPIO-cells =<2>;
中断控制器;
#interrupt-cells =<2>;
状态="已禁用";
};

最后、我配置了 EDMA:

memset (&data->cfg、0、sizeof (data->cfg));
data->cfg.direction = dma_dev_TO_MEM;
data->cfg.src_addr = hs_GPMC_FPGA_DMA_start_address;
DATA->cfg.src_maxburst = 2;
dmaenger_slave_config (DATA->CHAN、&DATA->cfg); 

其中 HS_GPMC_FPGA_DMA_START_ADDRESS 设置为0x3000000 (器件物理存储器的起始地址)。

但是、当中断触发我的驱动程序启动 DMA 事务时、我可以看到在 EDMA 驱动程序中调用了底层函数、但从未执行 GPMC 事务、也未调用 DMA 回调。

0x3000000是否是传递给 DMA 引擎的有效地址?






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

    您好、Mohammed、

    请分享您正在使用的处理器 SDK Linux 吗?  

    此致、

    Krunal

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

    您好!

    感谢您回来。 如何确定它? 我们将使用 Phytec 的15.1 RDK。

    穆罕默德

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

    遗憾的是、TI 不支持 Phytec 的内核4.1.13和15.1 RDK。

    此致、
    Krunal