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.

[参考译文] AM6442:GPMC PSRAM /NOR 访问使用 DMA 问题

Guru**** 2568565 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1570988/am6442-gpmc-psram-nor-access-use-dma-problem

器件型号:AM6442


工具/软件:

您好、

外部存储器为 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

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

    您好 Andy Zhou、

    我正在查看您的查询,你可能会期待在一两天内回复.

    此致、

    Anil.

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

    您好 Andy Zhou、

    很抱歉、延迟的回复。

    如果读取操作正常运行、但写入操作没有、我需要查看该代码实现、以了解用户如何为读取和写入操作配置 TRPD。

    通常、PSRAM 映射到 SoC 的存储器、因此可通过 BCDMA 通道访问。

    我已经创建了一个示例、演示如何根据 GPIO 输入触发 DMA 传输。
    在该常见问题解答示例中、我使用了具有读取功能的 GPMC。

    您可以参考此示例以检查 TRPD 的配置方式、类似地、用户需要为写入操作配置 TRPD。

    在配置与读取 TRPD 类似的写入 TRPD 后、如果问题仍然存在、请分享客户的示例工程、以便我可以从自己的角度进行审阅。

     【常见问题解答】:如何在 AM64X/AM243 和 AM62X 器件上借助 GPIO 触发 DMA? 

    此致、

    Anil.