WDM DMA编程笔记

1、在IRP_MN_START_DEVICE处理函数中调用IoGetDmaAdapter获取DMA适配器对象,该函数会返回需要的映射寄存器数;

2、在IRP_MJ_READ/WRITE处理函数中调用DMA适配器对象的AllocateAdapterChannel函数,该函数需要传入一个AdapterControl回调函数指针,AllocateAdapterChannel会等待DMA适配器空闲并分配一定数量的映射寄存器,当DMA适配器变为有效并分配好映射寄存器后,会调用我们编写的AdapterControl函数,分配的映射寄存器的首地址作为AdapterControl的参数返回;

3、我们在AdapterControl中会调用MapTransfer,MapTransfer的作用是为执行DMA传输做准备,注意不是MapTransfer后设备就开始执行DMA了,MapTransfer后,我们可能需要写设备相关寄存器(通过WRITE_PORT/REGISTER_UCHAR之类的HAL函数),以命令设备开始DMA传输,当这样做了后,设备就开始执行DMA传输了,当执行完DMA操作后,设备产生中断,系统会调用我们在StartDevice中设置的中断处理函数。

你可能感兴趣的:(笔记)