工具/软件: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 预取、为什么不能?
请帮我 ;)