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/PROCESSOR-SDK-AM335X:AM335x SDK-06.00 GPMC 预取 NAND EDMA

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/624865/linux-processor-sdk-am335x-am335x-sdk-06-00-gpmc-prefetch-nand-edma

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

大家好、

我修改了一些代码来支持 NAND EDMA、

但我想会错过一些东西。

以下是差异:

diff --git a/arch/arm/mach-omap2/board-am335xevm.c b/arch/arm/mach-omap2/board-am335xevm.c
索引9d8a071.fa6be50 100644
-- a/arch/arm/mach-omap2/board-am335xevm.c
++ b/arch/arm/mach-omap2/board-am335xevm.c
@@-1325、6 +1325、7 @@静态 void EVM_nand_init (int EVM_id、int profile)
       &AM335x_nand_timings);
    如果(!pdata)
       返回;
+   pdata->xfer_type = NAND_OMAP-Prefetch_DMA;
    pdata -> ecc_opt =omap_ecc_bch8_code_hw;
    pdata -> elm_used = true;
    GPMC_DEVICE_0].pdata = pdata;
diff --git a/drivers/MTD/nand/OMAP2.c b/drivers/MTD/nand/OMAP2.c
索引 deb1c1a.2e33788 100644
-- a/drivers/MTD/nand/OMAP2.c
++ b/drivers/MTD/nand/OMAP2.c
@@-26、6 + 26、9 @@
 #include
 #include
 
+/-*某些 EDMA 特定的黑客可能会更改*/
+#include
+
 #define   DRIVER_NAME   "OMAP2-NAND"
 #define   OMAP-NAND_TIMEOUT_MS   5000
 
@@-366、12 +369、6 @@静态内联内部 OMAP-nand_DMA_transfer (struct MTD_info * MTD、void * addr、
    内转台;
    unsigned long Tim、limit;
 
-/*   FIFO 深度最大为64字节
-   *但将 FIFO-三保持配置为32以在每个帧上获得同步
-   *且帧长度为32字节。
-   */
-int   buf_len = len >> 6;
-
    if (addr >= high_memory){
       结构页*p1;
 
@@-392、28 +389、36 @@静态内联 int omap_nand_dma_transfer (struct MTD_info * MTD、void * addr、
    }
 
    如果(是_write){
-      omap_set_dma_dest_params (info->dma_ch、0、omap_dma_amote_constant、
+      OMAP-SET_DMA_DEST_params (INFO->DMA_ch、0、OMA_DMA_AMODE_POST_INC、
                   INFO->PHYS_BASE,0,0);
       OMAP-SET_DMA_src_params (INFO->DMA_ch、0、OMA_DMA_AMODE_POST_INC、
-                      dma_addr、0、0);
+                      dma_addr、4、len);
       omap_set_dma_transfer_params (info->dma_ch、omap_dma_data_type_s32、
-                0x10、buf_len、omap_dma_sync_frame、
+                L3/4、1、OMAP-DMA_SYNC_FRAME、
                OMAP24xx_DMA_GPMC、OMAP_DMA_DST_SYNC);
    }否则{
-      OMAP-SET_DMA_src_params (INFO->DMA_ch、0、OMAP-DMA_AMODE_CONSTANT、
+      OMAP-SET_DMA_src_params (info->DMA_ch、0、OMA_DMA_AMODE_POST_INC、
                   INFO->PHYS_BASE,0,0);
       OMAP-SET_DMA_DEST_params (INFO->DMA_ch、0、OMA_DMA_AMODE_POST_INC、
-                      dma_addr、0、0);
+                      dma_addr、4、len);
       omap_set_dma_transfer_params (info->dma_ch、omap_dma_data_type_s32、
-                0x10、buf_len、omap_dma_sync_frame、
+                L3/4、1、OMAP-DMA_SYNC_FRAME、
                OMAP24xx_DMA_GPMC、OMAP_DMA_SRC_SYNC);
    }
+#if 0
    /* 配置并启动预取传输*/
    RET = GPMC_PREFETCH_ENABLE (INFO->GPMC_cs、
          prefetch_FIFOHRESHOLD_MAX、0x1、len、Is_write);
    IF (RET)
       /* PFPW 引擎忙,请使用 CPU 复制方法*/
       转到 out_copy;
+#endif
+
+   /*启用中断*/
+   struct edmacc_param p_ram;
+   EDMA_READ_SLOT (info->DMA_ch、&p_ram);
+   p_ram.op= TCINTEN | EDMA_TCC (EDMA_CHAN_SLOT (INFO->DMA_ch));
+   EDMA_write_slot (info->dma_ch、&p_ram);
 
    init_completion (&info->comp);

所以我没有使用 GPMC 预取、为什么不能?

请帮我 ;)

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

    如果我启用 GPMC 预取、内核无法启动、这有什么意义?

    [0.899505]  OMAP-GPMC OMAP-GPMC:GPMC 版本6.0

    [0.904510]  在 CS0上注册 NAND

    [0.909210]_regulator  _get:L3_main.0未找到电源 VDD_CORE、正在使用虚拟稳压器

    [0.917541]  AM335x_opp_update:内核不存在物理稳压器(-22)

    [0.925018]  寄存式 am33xx_SR 器件

    [0.930389]  mtdoops:必须提供 MTD 器件(mtddev=name/number)

    [0.937530]  OMAP2-nand 驱动程序正在初始化

    [0.941925]  OMAP-SET_DMA_DEST_BURST_MODE:不支持的 SDMA 包装程序

    [0.948455]  OMAP-SET_DMA_src_BURST_MODE:不支持的 SDMA 包装程序

    [0.955169]  NAND 器件:制造商 ID:0xC2、芯片 ID:0xF1 (Macronix NAND 128Mib3、3V 8位)

    [0.964385]  在"OMAP2-nand.0"上创建1个 MTD 分区:

    [0.969940]  0x000000000000-0x000008000000:"文件系统"

    [1.026977]  OneNAND 驱动程序正在初始化

    [1.031463]  UBI:将 mtd0连接到 ubi0

    [1.035491]  UBI:物理内存块大小: 131072字节(128 KiB)

    [1.041992]  UBI:逻辑 eraseblock 大小:  126976字节

    [1.047637]  UBI:最小闪存 I/O 单元:  2048

    [1.052520]  UBI:VID 标头偏移:      2048 (对齐2048)

    [1.058746]  UBI:数据偏移:         4096

    我知道在这里停止了:

    while (GPMC_READ_STATUS (GPMC_PREFETCH_COUNT)&&(Tim++< LIMIT)

        cpu_elime();

    EDMA 似乎读取数据本身、无法使用 GPMC 预取?

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

    我看到您使用的是板级配置文件、因此您使用的是旧内核(v3.2)、对吧?

    您能否升级到最新的 DISDK、因为它不再维护?

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

    感谢您的回复。

    是的、正如您所说、我正在使用旧内核。

    但是 、如果我升级到最新的 TiSDK、有很多事情要做。

    现在我想了解这一点、您对 GPMC Prefetch NAND 与 EDMA 有什么了解吗?

    谢谢:)