3824|6

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE+PXA270 DMA传输问题! [复制链接]

我用的是WinCE5.0的系统,使用的BVDMAIN的bsp。

在driver里面有一个DMA文件夹,里面有一些使用DMA时相关的函数。还有一个例程代码。

但是我用例程代码调试,总是不成功。

请教一下是什么原因,谢谢




代码如下:


  1. #define FPGA_DMA_BUFFER_SIZE                    0x40000
  2. #define FPGA_DMA_BUFFER_PHYSICAL                (MEM_BASE_PHYSICAL +FPGA_BUFFER_OFFSET)
  3. #define FPGA_DMA_BUFFER_VIRTUAL                 (MEM_BASE_U_VIRTUAL+FPGA_BUFFER_OFFSET)

  4. #define FPGA_SRAM_BASE_OFFSET      0x20000
  5. #define FPGA_SRAM_BASE_PHYSICAL    (IM_STORAGE_BASE_PHYSICAL + FPGA_SRAM_BASE_OFFSET)
  6. #define FPGA_SRAM_BASE_VIRTUAL     (IM_STORAGE_BASE_U_VIRTUAL + FPGA_SRAM_BASE_OFFSET)


  7. #define TEST_BUFFER_SIZE        512


  8.     P_XLLP_UINT32_T                        pDescriptor;
  9.     P_XLLP_UINT32_T                        pSrcMemory;
  10.     P_XLLP_UINT32_T                        pDstMemory;
  11.     P_XLLP_UINT32_T                        pExtMemory;
  12. //实测:没有被调用
  13. void XllpDmacTestDeviceHandler(void* userContext, XLLP_UINT32_T channelDcsr)
  14. {

  15.     P_XLLP_UINT32_T                        pSrcLocal = pSrcMemory;
  16.     P_XLLP_UINT32_T                        pDstLocal = pDstMemory;
  17.     XLLP_UINT32_T                        i;

  18.         // Compare Src and Dst.

  19.         for(i=1; i< TEST_BUFFER_SIZE; i++)
  20.         {
  21.                 if( *pSrcLocal++ != *pDstLocal++ )
  22.                 {
  23.                         RETAILMSG(_DMA_TEST_, (TEXT("DMA_TEST Cmp Xfer Failure...\r\n")));
  24.                         break;
  25.                 }
  26.         }
  27.         return;

  28. }


  29. //        Function Name: XllpDmacTest
  30. //        Description: Setup a simple memory-to-memory transfer with the DMA hardware.
  31. INT WINAPI XllpDmacTest(void)
  32. {

  33.     XLLP_DMAC_CHANNEL_T                Channel;
  34.     P_XLLP_UINT32_T                        pbDMATemp;
  35.     XLLP_UINT32_T                        i;
  36.     BOOL                                        bSuccess=FALSE;
  37.     P_XLLP_INT32_T                        pByteSrc;
  38.     P_XLLP_INT32_T                        pByteDst;

  39.     P_XLLP_UINT32_T                        pPhyDescriptor;
  40.     P_XLLP_UINT32_T                        pPhySrcMemory;
  41.     P_XLLP_UINT32_T                        pPhyDstMemory;
  42.     P_XLLP_UINT32_T                        pPhyExtMemory;

  43.     XLLP_DMAC_COMMAND_T                TestCmd;
  44.    

  45.         if(XLLP_STATUS_SUCCESS != XllpDmacAllocChannel(&Channel, XLLP_DMAC_CHANNEL_PRIORITY_MEDIUM))
  46.         {
  47.                 RETAILMSG(_DMA_TEST_, (TEXT("\r\n...XllpDmacAllocChannel failed...\r\n")));
  48.                 return XLLP_FALSE;
  49.         }
  50.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...DMA_TEST AllocChannel=%d...\r\n"),Channel));
  51.        
  52.         //
  53.         // ?? Map a Memory-to-Memory Transfer.  // May not be needed.
  54.         //

  55.         XllpDmacMapDeviceToChannel(
  56.                                         XLLP_DMAC_MEM2MEM_MOVE,
  57.                                         Channel
  58.                                                        );

  59.         //
  60.     // Allocate a block of virtual memory big enough to hold the DMA buffers
  61.         //
  62. #if 0       
  63.     pDstMemory = VirtualAllocCopy(FPGA_DMA_BUFFER_SIZE,
  64.         "DMA TEST : FPGA_DMA_BUFFER",(PVOID)(FPGA_DMA_BUFFER_VIRTUAL));

  65.     pbDMATemp = VirtualAllocCopy((2*4*TEST_BUFFER_SIZE),
  66.         "DMA TEST : FPGA_DMA_BUFFER",(PVOID)(FPGA_SRAM_BASE_VIRTUAL));

  67.     if ((NULL == pDstMemory) || (NULL == pbDMATemp))
  68.     {
  69.         RETAILMSG(_DMA_TEST_, (TEXT("pDstMemory = 0x%08X\r\n"), pDstMemory));
  70.         RETAILMSG(_DMA_TEST_, (TEXT("pbDMATemp  = 0x%08X\r\n"), pbDMATemp));
  71.         bSuccess = FALSE;
  72.     }
  73.     else
  74.     {
  75.         bSuccess = TRUE;
  76.     }

  77.     if (bSuccess)
  78.     {
  79.         // Save pointers to the virtual & physical addresses so the driver can access them.
  80.         pDescriptor                                = pbDMATemp + TEST_BUFFER_SIZE;
  81.         pSrcMemory                                = pbDMATemp;
  82.         pDstMemory                                = pDstMemory;
  83.         pExtMemory                                = 0;

  84.         pPhyDescriptor                        = (P_XLLP_UINT32_T)(FPGA_SRAM_BASE_VIRTUAL + (4 * TEST_BUFFER_SIZE));
  85.         pPhySrcMemory                        = (P_XLLP_UINT32_T)(FPGA_SRAM_BASE_VIRTUAL);
  86.         pPhyDstMemory                        = (P_XLLP_UINT32_T)(FPGA_DMA_BUFFER_VIRTUAL);
  87.         pPhyExtMemory                        = 0;

  88.     }
  89.         else
  90.         {
  91.                 RETAILMSG(_DMA_TEST_, (TEXT("VirtualAllocCopy failed\r\n")));
  92.                 return XLLP_FALSE;
  93.         }
  94. #else
  95.     pbDMATemp = VirtualAllocCopy(FPGA_DMA_BUFFER_SIZE,
  96.         "DMA TEST : FPGA_DMA_BUFFER",(PVOID)(FPGA_DMA_BUFFER_VIRTUAL));

  97.     if (NULL == pbDMATemp)
  98.     {
  99.         RETAILMSG(_DMA_TEST_, (TEXT("pbDMATemp  = 0x%08X\r\n"), pbDMATemp));
  100.         bSuccess = FALSE;
  101.     }
  102.     else
  103.     {
  104.         bSuccess = TRUE;
  105.     }

  106.     if (bSuccess)
  107.     {
  108.         // Save pointers to the virtual & physical addresses so the driver can access them.
  109.         pDescriptor                                = pbDMATemp;
  110.         pSrcMemory                                = pbDMATemp + 1024;
  111.         pDstMemory                                = pbDMATemp + 2048;
  112.         pExtMemory                                = 0;

  113.         pPhyDescriptor                        = (P_XLLP_UINT32_T)(FPGA_DMA_BUFFER_VIRTUAL);
  114.         pPhySrcMemory                        = (P_XLLP_UINT32_T)(FPGA_DMA_BUFFER_VIRTUAL + 4096);
  115.         pPhyDstMemory                        = (P_XLLP_UINT32_T)(FPGA_DMA_BUFFER_VIRTUAL + 8192);
  116.         pPhyExtMemory                        = 0;

  117.     }
  118.         else
  119.         {
  120.                 RETAILMSG(_DMA_TEST_, (TEXT("VirtualAllocCopy failed\r\n")));
  121.                 return XLLP_FALSE;
  122.         }
  123. #endif
  124.     RETAILMSG(_DMA_TEST_, (TEXT("\r\nPHYSICAL Address:\r\n")));
  125.     RETAILMSG(_DMA_TEST_, (TEXT("PhyDescriptor= 0x%08X\r\n"), pPhyDescriptor));
  126.     RETAILMSG(_DMA_TEST_, (TEXT("PhySrcMemory = 0x%08X\r\n"), pPhySrcMemory));
  127.     RETAILMSG(_DMA_TEST_, (TEXT("PhyDstMemory = 0x%08X\r\n"), pPhyDstMemory));
  128.     RETAILMSG(_DMA_TEST_, (TEXT("PhyExtMemory = 0x%08X\r\n"), pPhyExtMemory));
  129.     RETAILMSG(_DMA_TEST_, (TEXT("\r\nLOCAL Address:\r\n")));
  130.     RETAILMSG(_DMA_TEST_, (TEXT("Descriptor = 0x%08X\r\n"), pDescriptor));
  131.     RETAILMSG(_DMA_TEST_, (TEXT("SrcMemory  = 0x%08X\r\n"), pSrcMemory));
  132.     RETAILMSG(_DMA_TEST_, (TEXT("DstMemory  = 0x%08X\r\n"), pDstMemory));
  133.     RETAILMSG(_DMA_TEST_, (TEXT("ExtMemory  = 0x%08X\r\n"), pExtMemory));

  134.         //
  135.     // Configure Channels to use Descriptors.
  136.         //

  137.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...Configure a channel for Descriptors...\r\n")));

  138.         XllpDmacCfgChannelDescTransfer(
  139.                                                                  (P_XLLP_DMAC_DESCRIPTOR_T)pPhyDescriptor,
  140.                                                                      Channel,
  141.                                                                      //XLLP_DMAC_DRCMR_T         aDeviceDrcmr,
  142.                                                                      XLLP_DMAC_MEM2MEM_MOVE,
  143.                                                                      XLLP_DMAC_ALIGNMENT_OFF
  144.                                                                   );
  145.         //
  146.     // Register Device Handler
  147.         //
  148.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...Register Device Handler...\r\n")));

  149.         XllpDmacRegisterDeviceHandler (                Channel,
  150.                                                                                 XllpDmacTestDeviceHandler,
  151.                                                                                 NULL
  152.                                                                    );

  153.         //
  154.     // Link Descriptors
  155.         //

  156.         // Only one Descriptor, so linking is not needed.

  157.         //
  158.         //  Enable interrupts for the requested channel. Not Needed.
  159.         //

  160.         //
  161.         //  Load data into the descriptor.
  162.         //

  163.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...Load the descriptor...\r\n")));

  164.         TestCmd.aLen        = (TEST_BUFFER_SIZE * 4);
  165.         TestCmd.aWidth      = XLLP_DMAC_WIDTH_32;
  166.         TestCmd.aSize            = XLLP_DMAC_BURSTSIZE_32;
  167.         TestCmd.aEndian                = XLLP_FALSE;   // Litter Endian.
  168.         TestCmd.aFlyByT                = XLLP_FALSE;        // Normal Transfer. No Fly by
  169.         TestCmd.aFlyByS                = XLLP_FALSE;        // Normal Transfer. No Fly by
  170.         TestCmd.aEndIrqEn   = XLLP_FALSE;        // Interrupt when len = 0.
  171.         TestCmd.aStartIrqEn = XLLP_FALSE;        // No Interrupt when Desc is loaded.
  172.         TestCmd.aAddrMode   = XLLP_FALSE;        // Src & Dst contains values for addresses.
  173.         TestCmd.aCmpEn      = XLLP_FALSE;
  174.         TestCmd.aFlowTrg    = XLLP_FALSE;
  175.         TestCmd.aFlowSrc    = XLLP_FALSE;
  176.         TestCmd.aIncTrgAddr = XLLP_TRUE;
  177.         TestCmd.aIncSrcAddr = XLLP_TRUE;

  178.         XllpDmacFillLinkedDesc(
  179.                                                     (P_XLLP_DMAC_DESCRIPTOR_T)pDescriptor,
  180.                                                     NULL,
  181.                                                     XLLP_DMAC_DESC_STOP_CHANNEL,
  182.                                                     XLLP_DMAC_DISABLE_DESC_BRANCH,
  183.                                                    (XLLP_UINT32_T)pPhySrcMemory,
  184.                                                    (XLLP_UINT32_T)pPhyDstMemory,
  185.                                                     &TestCmd
  186.                                                   );


  187.     //
  188.     //
  189.         // Put a Pattern in the Src memory.
  190.         //

  191.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...Initialize source memory....\r\n")));

  192.         pByteSrc = pSrcMemory;
  193.         pByteDst = pDstMemory;
  194.         for(i = 0; i < TEST_BUFFER_SIZE; i++)
  195.         {
  196.                 *pByteSrc++ = i + 1;
  197.                 *pByteDst++ = i + 3;
  198.         }
  199.     RETAILMSG(_DMA_TEST_,
  200.         (TEXT("\r\nSrcMemory[0]:0x%08X, SrcMemory[%d]:0x%08X\r\n"),
  201.         pSrcMemory[0], TEST_BUFFER_SIZE - 1, pSrcMemory[TEST_BUFFER_SIZE - 1]));
  202.     RETAILMSG(_DMA_TEST_,
  203.         (TEXT("\r\DstMemory[0]:0x%08X, DstMemory[%d]:0x%08X\r\n"),
  204.         pDstMemory[0], TEST_BUFFER_SIZE - 1, pDstMemory[TEST_BUFFER_SIZE - 1]));

  205.     // Start the Transfer
  206.         //
  207.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...The the M-M Xfer...\r\n")));

  208.         XllpDmacStartTransfer( Channel );
  209.    
  210.     if (WAIT_OBJECT_0 == WaitForSingleObject(pDMAGlobals->hDMAEvent[Channel], INFINITE))
  211.     {
  212.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...DMA_TEST Wait a event...\r\n")));

  213.         //
  214.         // Compare Src and Dst Patterms (Do this in the registerd handler. // pkdebug)
  215.             //
  216.         pByteSrc = pSrcMemory;
  217.             pByteDst = pDstMemory;
  218.             for(i = 0; i < TEST_BUFFER_SIZE; i++)
  219.             {
  220.                     if( *pByteSrc++ != *pByteDst++ )
  221.                     {
  222.                             RETAILMSG(_DMA_TEST_, (TEXT("DMA_TEST Cmp Xfer Failure...\r\n")));
  223.                             // Address of first failed location.
  224.                             RETAILMSG(_DMA_TEST_, (TEXT("pSrcLocal = 0x%08X, pDstLocal = 0x%08X\r\n"),
  225.                                         --pByteSrc, --pByteDst ));
  226.                             // Content of first failed location.
  227.                             RETAILMSG(_DMA_TEST_, (TEXT("SrcLocal = 0x%08X,  DstLocal = 0x%08X\r\n"),
  228.                                 *pByteSrc,  *pByteDst  ));
  229.                             break;
  230.                     }
  231.             }
  232.         RETAILMSG(_DMA_TEST_, (TEXT("DMA_TEST Cmp Xfer OK...\r\n")));
  233.     }

  234.         // Completed
  235.         RETAILMSG(_DMA_TEST_, (TEXT("\r\n...Completed DMAC Test...\r\n")));
  236.        
  237.         return XLLP_TRUE;

  238. }
复制代码

最新回复

但是硬件已经定了 现在不能改其他硬件了。  详情 回复 发表于 2010-5-6 11:27
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你看静态库.lib链接了没有
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 domworldjohn 的回复:
你看静态库.lib链接了没有


应该是连接了的吧,因为我的测试程序里面,DMA测试开始之后,中断都能够收到,但是不知道是开始中断还是停止中断。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
不建议初学者用DMA , 厂商也是这么建议的,

DMA涉及到总线,如果总线冲突就自然不能正确收到数据了,

上面的代码 很明显是FPGA移植过来的,

#define FPGA_DMA_BUFFER_SIZE                    0x40000

地址空间对么?

初学者还是不建议你用了,反倒给自己找麻烦,
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(中级)

5
 
但是公司项目要求要使用DMA啊

而且FPGA过来的数据量特别的大。如果直接读写的话速度很慢。

FPGA与270之间使用的是SRAM接口,

现在的方法是一个for循环去读数据。

如果用memcpy的话会不会快一些呢。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
数据量特别大的话,可以考虑使用双口RAM,比DMA的效率更高。
两个MCU可以同时异步读写该RAM,实现高效率的数据共享。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
但是硬件已经定了
现在不能改其他硬件了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表