很早做的一个以太网芯片的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);
6410 DMA传输
最新推荐文章于 2024-01-19 17:15:25 发布