工具/软件:
您好、
外部存储器为 FPGA。 设备类型:PSRAM
MCU_PLUS_SDK_am64x 仅提供了在 NAND 闪存中使用 UDMA 的示例 (GPMC_FLASH_IO_am64x-evm_r5fss0-0_nortos_ti-arm-clang)。 我在此基础上进行了修改。
可以将数据从 FPGA 读取到 r5fss0-0 存储器。 但数据无法写入 FPGA。通过 FPGA 捕获 GPMC 信号。 地址、CS、ADV、我们都正确、但数据为 0。
写入 FPGA 和从 FPGA 读取都直接涉及调用 GPMC_dmaCopy ()。
写入 FPGA:GPMC_dmaCopy (gpmcDmaHandle、FPGAMem、R5Mem、120、false)
从 FPGA 读取:GPMC_dmaCopy (gpmcDmaHandle、R5Mem、FPGAMem、120、false)
禁用 DMA、GPMC 读取和写入都可以。
gpmc_nandlife_v0.c:
GPMC_NandReadData() 调用了 GPMC_dmaCopy()、但 GPMC_NandWriteData() 没有调用 GPMC_dmaCopy()。
写入不能使用 gpm_dmaCopy()?
我觉得问题应该出在 UDMA 配置中。 GPMC 应该没有问题。
/* GPMC Driver Parameters */
GPMC_Params gGpmcParams[CONFIG_GPMC_NUM_INSTANCES] =
{
{
.gpmcDmaChIndex = 0,
.devType = CSL_GPMC_CONFIG1_DEVICETYPE_NORLIKE,
.devSize = CSL_GPMC_CONFIG1_DEVICESIZE_THIRTYTWOBITS,
.chipSel = GPMC_CHIP_SELECT_CS0,
.intrEnable = FALSE,
.dmaEnable = TRUE,
.transferMode = GPMC_TRANSFER_MODE_BLOCKING,
.transferCallBckFunc = NULL,
.memDevice = GPMC_MEM_TYPE_NORLIKE,
},
};
/*
* GPMC
*/
/* Regions restricted for DMA. We should use CPU memcpy in these cases */
static GPMC_AddrRegion gGpmcDmaRestrictRegions[] =
{
{
.regionStartAddr = CSL_R5FSS0_ATCM_BASE,
.regionSize = CSL_R5FSS0_ATCM_SIZE,
},
{
.regionStartAddr = CSL_R5FSS0_BTCM_BASE,
.regionSize = CSL_R5FSS0_BTCM_SIZE,
},
{
.regionStartAddr = CSL_R5FSS1_ATCM_BASE,
.regionSize = CSL_R5FSS1_ATCM_SIZE,
},
{
.regionStartAddr = CSL_R5FSS1_BTCM_BASE,
.regionSize = CSL_R5FSS1_BTCM_SIZE,
},
{
.regionStartAddr = CSL_MCU_M4FSS0_IRAM_BASE,
.regionSize = CSL_MCU_M4FSS0_IRAM_SIZE,
},
{
.regionStartAddr = CSL_MCU_M4FSS0_DRAM_BASE,
.regionSize = CSL_MCU_M4FSS0_DRAM_SIZE,
},
{
.regionStartAddr = 0xFFFFFFFFU,
.regionSize = 0U,
}
};
#include <drivers/gpmc/v0/dma/gpmc_dma.h>
#include <drivers/gpmc/v0/dma/udma/gpmc_dma_udma.h>
#include <drivers/udma.h>
/*
* GPMC UDMA Blockcopy Parameters
*/
#define GPMC_UDMA_BLK_COPY_CH_RING_ELEM_CNT (1U)
#define GPMC_UDMA_BLK_COPY_CH_RING_MEM_SIZE (((GPMC_UDMA_BLK_COPY_CH_RING_ELEM_CNT * 8U) + UDMA_CACHELINE_ALIGNMENT) & ~(UDMA_CACHELINE_ALIGNMENT - 1U))
#define GPMC_UDMA_BLK_COPY_CH_TRPD_MEM_SIZE (UDMA_GET_TRPD_TR15_SIZE(1U))
#define GPMC_UDMA_NUM_BLKCOPY_CH (1U)
/* GPMC UDMA Blockcopy Channel Objects */
static Udma_ChObject gGpmcUdmaBlkCopyChObj[GPMC_UDMA_NUM_BLKCOPY_CH];
/* GPMC UDMA Blockcopy Channel Ring Mem */
static uint8_t gGpmcUdmaBlkCopyCh0RingMem[GPMC_UDMA_BLK_COPY_CH_RING_MEM_SIZE] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
/* GPMC UDMA Blockcopy Channel TRPD Mem */
static uint8_t gGpmcUdmaBlkCopyCh0TrpdMem[GPMC_UDMA_BLK_COPY_CH_TRPD_MEM_SIZE] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
GpmcDma_UdmaArgs gGpmcUdma0Args =
{
.drvHandle = &gUdmaDrvObj[CONFIG_UDMA0],
.chHandle = &gGpmcUdmaBlkCopyChObj[0],
.trpdMem = &gGpmcUdmaBlkCopyCh0TrpdMem,
.trpdMemSize = GPMC_UDMA_BLK_COPY_CH_TRPD_MEM_SIZE,
.ringMem = &gGpmcUdmaBlkCopyCh0RingMem,
.ringMemSize = GPMC_UDMA_BLK_COPY_CH_RING_MEM_SIZE,
.ringElemCount = GPMC_UDMA_BLK_COPY_CH_RING_ELEM_CNT,
.localEventID = 29,
};
GPMC_DmaConfig gGpmcDmaConfig[CONFIG_GPMC_NUM_DMA_INSTANCES] =
{
{
.fxns = &gGpmcDmaUdmaFxns,
.gpmcDmaArgs = (void *)&gGpmcUdma0Args,
}
};
uint32_t gGpmcDmaConfigNum = CONFIG_GPMC_NUM_DMA_INSTANCES;
/*
* UDMA
*/
/* UDMA driver instance object */
Udma_DrvObject gUdmaDrvObj[CONFIG_UDMA_NUM_INSTANCES];
/* UDMA driver instance init params */
static Udma_InitPrms gUdmaInitPrms[CONFIG_UDMA_NUM_INSTANCES] =
{
{
.instId = UDMA_INST_ID_BCDMA_0,
.skipGlobalEventReg = FALSE,
.virtToPhyFxn = Udma_defaultVirtToPhyFxn,
.phyToVirtFxn = Udma_defaultPhyToVirtFxn,
},
};
期待您的回复!
此致、
Andy Zhou