Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Железо. Написание драйверов
Перезагрузить страницу Зависание платы PCI
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
anaid anaid вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.03.2006
По умолчанию Зависание платы PCI - 17.03.2006, 16:03

Есть плата PCI. Для работы с ней драйвер выделяет буфер (AllocateCommonBuffer()). Буфер я сделалала 28К байт, чтобы он разместился на 8 страницах ( мне выделяется 8 map registers). В плату записывается адрес буфера и размер, и она начинает писать (Burst Master Memory Writes по 8 DWORDов) в буфер значения последовательного 32-х разрядного счетчика , заполнив буфер до конца продолжает писать с начала, при переполнении счетчик обнуляется. Прерывания не используются. Переодически я просматриваю содержимое буфера . Плата отлично работает, если я на компе больше ничего не делаю. Но когда запускаю какое-нибудь приложение плата зависает: пытается писать данные, но пересылок нет. Такая картина если моя сетевая карта отключена. Если я подключаю сетевую карту, то тоже какое-то время пересылки идут нормально, но потом вместе с платой уже весь комп виснит.
Буду очень рада, если поможете советом где искать ошибку.
Ответить с цитированием
  (#2 (permalink)) Старый
anaid anaid вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.03.2006
По умолчанию Зависание платы PCI - 17.03.2006, 16:03

Есть плата PCI. Для работы с ней драйвер выделяет буфер (AllocateCommonBuffer()). Буфер я сделалала 28К байт, чтобы он разместился на 8 страницах ( мне выделяется 8 map registers). В плату записывается адрес буфера и размер, и она начинает писать (Burst Master Memory Writes по 8 DWORDов) в буфер значения последовательного 32-х разрядного счетчика , заполнив буфер до конца продолжает писать с начала, при переполнении счетчик обнуляется. Прерывания не используются. Переодически я просматриваю содержимое буфера . Плата отлично работает, если я на компе больше ничего не делаю. Но когда запускаю какое-нибудь приложение плата зависает: пытается писать данные, но пересылок нет. Такая картина если моя сетевая карта отключена. Если я подключаю сетевую карту, то тоже какое-то время пересылки идут нормально, но потом вместе с платой уже весь комп виснит.
Буду очень рада, если поможете советом где искать ошибку.
Ответить с цитированием
  (#3 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию 20.03.2006, 09:02

Драйвер свой или стороннего производителя? Если свой то листинг в студию...
Ответить с цитированием
  (#4 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию 20.03.2006, 09:02

Драйвер свой или стороннего производителя? Если свой то листинг в студию...
Ответить с цитированием
  (#5 (permalink)) Старый
anaid anaid вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.03.2006
По умолчанию 20.03.2006, 13:13

Драйвер свой
Код:
//в функции обработки IRP_MN_START_DEVICE получаю объект DMA_ADAPTER
...
      PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

      DEVICE_DESCRIPTION dd;
    RtlZeroMemory(&dd, sizeof(dd));
    dd.Version = DEVICE_DESCRIPTION_VERSION;
    dd.InterfaceType = InterfaceTypeUndefined;    
    dd.MaximumLength = 0x7000;
    dd.Dma32BitAddresses = TRUE;
    dd.Master = TRUE;

    pdx->AdapterObject = IoGetDmaAdapter(pdx->Pdo, &dd, &pdx->nMapRegisters);
//в переменной nMapRegisters получаю 8

//размещаю буфер доступный одновременно устройству и драйверу 
//vaCommonBuffer - fixed virtual address to access the buffer from driver
//paCommonBuffer - fixed logical address to access the same buffer by device
    pdx->vaCommonBuffer =
  (*pdx->AdapterObject->DmaOperations->AllocateCommonBuffer)
  (pdx->AdapterObject, BUFSIZE, &pdx->paCommonBuffer, FALSE);
...


NTSTATUS DispatchControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    ...
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
    switch (irpStack->MajorFunction)
    {



//запускаю плату
  case IOCTL_START_TRANSFER:
//заполняю буфер нулями
      PULONG inbuf;
      inbuf=(PULONG) pdx->vaCommonBuffer;
      memset(inbuf, 0, BUFSIZE);

//задаю плате циклически заполнять буфер подряд 0xfffffff раз
      WRITE_REGISTER_ULONG((PULONG) (pdx->membase+0x8),0xfffffff);

//сообщаю плате размер буфера
      WRITE_REGISTER_ULONG((PULONG) (pdx->membase+0x4),0x7000);

//пишу в плату адрес буфера, получив адрес плата начинает транзакции
      WRITE_REGISTER_ULONG((PULONG) (pdx->membase),pdx->paCommonBuffer.LowPart);
//получив адрес плата начинает транзакции пока не запишет буфер 0xfffffff раз 
//или пока не зависнит        
  break;
...

//смотрю что в буфере
  case IOCTL_CHECK_TRANSFER:
    
      PULONG buf;
      buf=(PULONG) pdx->vaCommonBuffer;


      for(ULONG i=0; i<(0x7000<<2);i++)
      {    
    KdPrint((DRIVERNAME "CHECK_TRANSFER i=%pn",i));    
    KdPrint((DRIVERNAME " inbuf[i]=%pn",inbuf1[i]));
      }    
    
  break;
...
запустив плату, переодически просматриваю буфер, все идет ок пока не запущу например музыку на компе, музыка играет а вот плата передавать перестает. Вообще есть подозрение что проблемы в прошивке платы, но может и драйвер что не так делает.
Ответить с цитированием
Ads.
Ads
  (#6 (permalink)) Старый
anaid anaid вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.03.2006
По умолчанию 20.03.2006, 13:13

Драйвер свой
Код:
//в функции обработки IRP_MN_START_DEVICE получаю объект DMA_ADAPTER
...
      PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

      DEVICE_DESCRIPTION dd;
    RtlZeroMemory(&dd, sizeof(dd));
    dd.Version = DEVICE_DESCRIPTION_VERSION;
    dd.InterfaceType = InterfaceTypeUndefined;    
    dd.MaximumLength = 0x7000;
    dd.Dma32BitAddresses = TRUE;
    dd.Master = TRUE;

    pdx->AdapterObject = IoGetDmaAdapter(pdx->Pdo, &dd, &pdx->nMapRegisters);
//в переменной nMapRegisters получаю 8

//размещаю буфер доступный одновременно устройству и драйверу 
//vaCommonBuffer - fixed virtual address to access the buffer from driver
//paCommonBuffer - fixed logical address to access the same buffer by device
    pdx->vaCommonBuffer =
  (*pdx->AdapterObject->DmaOperations->AllocateCommonBuffer)
  (pdx->AdapterObject, BUFSIZE, &pdx->paCommonBuffer, FALSE);
...


NTSTATUS DispatchControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    ...
    PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
    switch (irpStack->MajorFunction)
    {



//запускаю плату
  case IOCTL_START_TRANSFER:
//заполняю буфер нулями
      PULONG inbuf;
      inbuf=(PULONG) pdx->vaCommonBuffer;
      memset(inbuf, 0, BUFSIZE);

//задаю плате циклически заполнять буфер подряд 0xfffffff раз
      WRITE_REGISTER_ULONG((PULONG) (pdx->membase+0x8),0xfffffff);

//сообщаю плате размер буфера
      WRITE_REGISTER_ULONG((PULONG) (pdx->membase+0x4),0x7000);

//пишу в плату адрес буфера, получив адрес плата начинает транзакции
      WRITE_REGISTER_ULONG((PULONG) (pdx->membase),pdx->paCommonBuffer.LowPart);
//получив адрес плата начинает транзакции пока не запишет буфер 0xfffffff раз 
//или пока не зависнит        
  break;
...

//смотрю что в буфере
  case IOCTL_CHECK_TRANSFER:
    
      PULONG buf;
      buf=(PULONG) pdx->vaCommonBuffer;


      for(ULONG i=0; i<(0x7000<<2);i++)
      {    
    KdPrint((DRIVERNAME "CHECK_TRANSFER i=%pn",i));    
    KdPrint((DRIVERNAME " inbuf[i]=%pn",inbuf1[i]));
      }    
    
  break;
...
запустив плату, переодически просматриваю буфер, все идет ок пока не запущу например музыку на компе, музыка играет а вот плата передавать перестает. Вообще есть подозрение что проблемы в прошивке платы, но может и драйвер что не так делает.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание Black_Writed Любые вопросы от новичков 3 25.02.2012 20:44
Зависание Stiga Любые вопросы от новичков 12 06.01.2012 20:51
зависание клавиш fLo_0ps Любые вопросы от новичков 17 11.11.2011 14:05
зависание win 7 bavikin Windows 7 25 03.11.2011 16:23
Зависание компьютера Dimentiys Любые вопросы от новичков 3 27.08.2011 15:05
Зависание компьютера The Undertaker Любые вопросы от новичков 2 08.04.2011 14:13
Выбор платы оперативной памяти к материнской платы ASUS Crosshair IV Formula. Hilfiger Любые вопросы от новичков 2 10.03.2011 20:01
Зависание компьютера Suppiluliuma Любые вопросы от новичков 12 18.02.2011 01:45
DelphiX зависание Невилл Delphi 1 05.06.2010 12:31
Периодическое зависание vitalyvesta Материнские платы 17 19.05.2010 11:23
зависание компьютера Тимур 99 Windows 7 6 03.05.2010 17:37
Зависание формы Pavel55 Visual Basic 2 28.07.2006 00:20



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов