6410 DMA传输

很早做的一个以太网芯片的DMA传输驱动,还是写写,免得以后忘了,采用DMA方式确实可以大幅度降低CPU利用率,但传输的性能就我测试的结果来看大数据时DMA和cpu模式差不多,小数据则cpu要快的多 1 申请DMA通道,将DMA中断和指定事件绑定 dmatest = LocalAlloc(LPTR, sizeof(LAN_HARDWARE_CONTEXT)); DMA_request_channel(&dmatest->g_OutputDMA, DMA_MEM);//因为是内存数据直接传输到设备选择DMA_MEM dmatest->hTxDmaDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwHwIntr, sizeof(DWORD), &dmatest->dwTxDmaDoneSysIntr, sizeof(DWORD), NULL)) { RETAILMSG(1,(TEXT("[SSP] Failed to request the SPI_DMA sysintr./n"))); dmatest->dwTxDmaDoneSysIntr = SYSINTR_UNDEFINED; return FALSE; } if (!InterruptInitialize(dmatest->dwTxDmaDoneSysIntr, dmatest->hTxDmaDoneEvent, NULL, 0)) { RETAILMSG(1,(TEXT("[SSP] DMA Interrupt Initialization failed!!!/n"))); return FALSE; } 2 DMA传输,先初始化DMA通道,设置通道数据源和目的,WORD_UNIT选择是由总线决定的,BURST_1 INCREASE 地址+1B传输,设置传输数据长度后开始传输 DMA_initialize_channel(&dmatest->g_OutputDMA, TRUE); DMA_set_channel_source(&dmatest->g_OutputDMA, (UINT)dmaXfer->pdwBuf, WORD_UNIT, BURST_1, INCREASE); DMA_set_channel_destination(&dmatest->g_OutputDMA, (UINT)dwLanPhysAddr, WORD_UNIT, BURST_1, INCREASE); DMA_set_channel_transfer_size(&dmatest->g_OutputDMA, dmaXfer->dwDwCnt); DMA_initialize_LLI(&dmatest->g_OutputDMA, 0); DMA_channel_start(&dmatest->g_InputDMA); 3 等待传输结束,清中断 WaitReturn = WaitForSingleObject(dmatest->hTxDmaDoneEvent, READ_TIME_OUT_CONSTANT); if ( WAIT_TIMEOUT == WaitReturn ) { RETAILMSG (1, (TEXT("timeout!!!/r/n"))); } DMA_set_interrupt_mask(&dmatest->g_OutputDMA); DMA_clear_interrupt_pending(&dmatest->g_OutputDMA); InterruptDone(dmatest->dwTxDmaDoneSysIntr); DMA_clear_interrupt_mask(&dmatest->g_OutputDMA);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值