Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DMA counter  (Прочитано 5553 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
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;
}
« Последнее редактирование: 16-12-2007 17:38 от Алексей1153++ » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-11-2005 17:27 » 

dd.AutoInitialize = FALSE
вроде бы? а точно ли там ошибка?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
max0
Гость
« Ответ #2 : 28-11-2005 20:59 » 

Как раз сегодня разобрался с этой проблемой. Оказывается всё делаю правильно, а баг кроется в платформе на которой пишется драйвер. Cyrix Media GX. попробовал запустить на чипсете i440BX и всё сразу заработало.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines