max0
Гость
|
|
« : 24-11-2005 10:01 » |
|
Здравствуйте!
У меня проблема во время дма передачи, когда DMACOUNTER достигает значение 0, по идее процесс должен остановиться, а у меня счётчик принимает значение 65535 и далее работа идёт необратимым образом до краха системы. Как сделать, чтобы контроллер дма прекращал работу при ReadDmaCounter равным 0?
Инициализирую дма адаптер вот так: // Инициализация DmaAdapter NTSTATUS GetDmaInfo(PDEVICE_OBJECT fdo, INTERFACE_TYPE busType, ULONG channel, ULONG port) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
DEVICE_DESCRIPTION dd; // Zero out the entire structure RtlZeroMemory( &dd, sizeof(dd) );
dd.Version = DEVICE_DESCRIPTION_VERSION; dd.Master = FALSE; // this is a slave device dd.ScatterGather = FALSE;
dd.DemandMode = FALSE; dd.AutoInitialize = FALSE; //dd.IgnoreCount = FALSE;
dd.Dma32BitAddresses = FALSE;
dd.InterfaceType = Isa; // as passed in
dd.DmaChannel = channel; dd.DmaPort = port; dd.MaximumLength = MAX_DMA_TRANSFER; // 8192 dd.DmaWidth = Width8Bits; dd.DmaSpeed = Compatible;
// Compute the maximum number of mapping regs // this device could possibly need. Since the // transfer may not be paged aligned, add one // to allow the max xfer size to span a page. pdx->nMapRegisters = ( MAX_DMA_TRANSFER / PAGE_SIZE ) + 1; pdx->AdapterObject = IoGetDmaAdapter(pdx->Pdo, &dd, &pdx->nMapRegisters);
KdPrint(("Allocated registers=%d\n", pdx->nMapRegisters));
// If the Adapter object can't be assigned, fail if ( !pdx->AdapterObject ) return STATUS_INSUFFICIENT_RESOURCES; return STATUS_SUCCESS; }
|