|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 recorner 于 2012-11-29 13:45 编辑
最近用DS写PCIe的驱动,用到DMA控制传输,关于DMA的三个类KDmaAdapter,KDmaTransfer和KCommonBuffer应该怎么用呢?
初始化KDmaAdapter:
- DEVICE_DESCRIPTION dd;
- RtlZeroMemory(&dd, sizeof(dd));
- dd.Version = DEVICE_DESCRIPTION_VERSION;
- dd.Master = TRUE;
- dd.ScatterGather = FALSE;
- dd.Dma32BitAddresses= TRUE;
- dd.Dma64BitAddresses= FALSE;
- dd.InterfaceType = PCIBus;
- dd.MaximumLength = MAX_DMA_LENGTH;
复制代码
1. 初始化KDmaAdapter时设置了DMA单个传输的最大长度为1M:
- dd.MaximumLength = MAX_DMA_LENGTH; // 1M
复制代码 再为KDmaTransfer分配非分页内存
- m_DmaTransfer = new(NonPagedPool) KDmaTransfer(this, &m_Dma);
复制代码 这是只是分配了一个非分页内存也就是4KB大小是么?因为我只能读写的4KB的数据,我不知道为什么。。。为什么DMA可传输数据量不是KDmaAdapter里设置的DMA单个传输的最大长度为1M呢?怎样才能写入大于4KB的数据呢?
2. 不支持Scatter/Gather的话,需不需要用到KCommonBuffer呢?在什么情况下用KCommonBuffer呢?
3. scatter /gather是硬件本身支持与否决定的,还是如下代码,在DS中的设置的呢?
- dd.ScatterGather = FALSE; //不支持
复制代码
4. 支持与不支持scatter /gather,哪个更好些呢?
5. 怎样连续多次DMA传输呢?
驱动菜鸟,希望得到各位大侠指点!!! |
|