工具/软件: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 引擎的有效地址?