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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Драйвер не успевает читать память PCI-девайса [Win2K & XP]  (Прочитано 11354 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Monsta
Гость
« : 24-02-2005 12:38 » 

Дано:
Простенький PCI-девайс с небольшой внутренней памятью.

Нужно:
Прочесть значение памяти (32-х битное слово) по адресу, например, 0х10 от начала памяти.

Что получается:
В Win2k значение возвращается нормально.
В XP почему-то вместо значения ячейки памяти упорно возвращается адрес этой ячейки. Например, если адрес 0хE0000010 (BAR = 0xE0000000, смещение = 0х10), то и возвращается 0xE0000010.

Вопрос:
Что это, Бэрримор?

Дополнительные данные:
Драйвер для девайса написан на VC++ 6.0 с использованием DDK2000 и DriverStudio 2.0. Могу кинуть кусок кода, но там ничего особенного - только запись и чтение KMemoryRegister...
« Последнее редактирование: 03-03-2005 10:08 от Monsta » Записан
Monsta
Гость
« Ответ #1 : 03-03-2005 10:04 » 

Внесу кое-какие уточнения.
В XP значение адреса возвращается, похоже, тогда, когда драйвер не успевает читать значение из памяти девайса. В Win2K такое "неуспевание" тоже бывало, только возвращалось значение 0xFFFFFFFF (т.е. как будто на эту область памяти не отображено ничего). Значение я читаю в цикле (сначала запись, потом чтение - это весь цикл), и на некоторых итерациях цикла такое и происходит.
Компы такие: Celeron 1700 с WinXP и P4-2600 с Win2K. На обоих заметен этот глюк. Зато на старом P-90 (c Win2K) всё нормально, все итерации цикла проходят без ошибок. Такое впечатление, что девайс не успевает за слишком быстрым процессором... Отлично

Приведу куски кода из драйвера:
Код:
...кусок из заголовочного файла:

    // внутренняя память девайса
    KMemoryRange InfRegs;
   
    // регистр RSO
    KMemoryRegister regRSO;

...кусок из обработчика OnStartDevice:

    PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources();
    PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources();

    KPciConfiguration PciConfig(m_Lower.TopOfStack());

    status = InfRegs.Initialize(
        pResListTranslated,
        pResListRaw,
        PciConfig.BaseAddressIndexToOrdinal(0)
        );

    // регистр regRSO - одно 32-битное слово по смещению 0x20 от начала памяти девайса
    regRSO = InfRegs[0x20];

...кусок из обработчика IOCTL-функции, которая пишет и сразу читает память девайса:

NTSTATUS Device406::TEST_STATUS_REGISTER_Handler(KIrp I)
{
    ULONG *bufData;

    // получаем указатель на юзерский буфер
    bufData = (ULONG *) I.IoctlBuffer();

    // тестируем (пишем/читаем) регистр RSO
    regRSO = *bufData;
    *bufData = regRSO;

    // количество записанных байт
    I.Information() = 4;

    return STATUS_SUCCESS;
}

Вот эту функцию я как раз и вызываю в цикле из проги.

Подозреваю, что между записью и чтением нужно поставить проверку на готовность девайса к чтению. Как это сделать, если, конечно, проблема именно в этом?
« Последнее редактирование: 03-03-2005 10:09 от Monsta » Записан
dachny
Гость
« Ответ #2 : 04-03-2005 09:55 » 

Девайс сам делал или помог кто
Записан
Monsta
Гость
« Ответ #3 : 05-03-2005 08:59 » 

Девайс сам делал или помог кто
Посмешил... Отлично
Девайс делали товарищи железячники из соседней комнаты, которые разработкой PCI-девайса занимаются первый раз. Соответственно, при тестировании уйма времени уходит на выяснение того, в железе или в софте проблема...
Девайс делали по спецификации PCI 2.2, теперь они читают недавно скачанную доку по 3.0 и разбираются в различиях...
Записан
daxhny
Гость
« Ответ #4 : 07-03-2005 06:11 » 

вообще судя по симптомам писать в ворум надо не тебе а братьям железячникам из соседней комнаты
Порекомендуй им пообщатся например на
http://www.telesys.ru/wwwboards/fpga/index.shtml



Записан
Monsta
Гость
« Ответ #5 : 09-03-2005 08:38 » 

вообще судя по симптомам писать в ворум надо не тебе а братьям железячникам из соседней комнаты
Порекомендуй им пообщатся например на
http://www.telesys.ru/wwwboards/fpga/index.shtml

Понимаешь ли, данные железячники работают в НИИ и являются старпёрами, которые вряд ли смогут что-то понять в форуме, даже если я потрачу пару недель на их обучение. Если бы они это уже умели, стал бы я распинаться тут на эту тему, как ты думаешь?

Кроме того, у меня был ещё вопрос о том, что нужно вставить в код драйвера, чтобы узнать готовность девайса. А это как раз для этого форума. Правда, местные гуру что-то игнорируют эту тему...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 09-03-2005 08:51 » 

Стоп - я проморгал тему.
1. Во первых не игнорируем а просто задолбадись в реале - прошу извинить.
2ю. Работая с железом ты посылаешь запрос - почему не ждешь ответа???
Где так сказать PENDNIG код возврата.
Т.е. ты посылаешь в девайс просьбу на чтение и игнорируешь как я понимаю, состояние девайса.
С одной стороны ты читаешь из памяти и это очень быстро, с другой, это шина PCI с определенной скорокстью...

Слип не ставь - это кернель мод - упадет все нахрен.
Я не работая с PCI но имея опыт просто в драйвере сети могу сказать что в случкае когда процедура вернуть данные неуспела, вот как это определить в PCI не скажу - посмотри железо, воврат статуса из функции идет PENDING после чего вызывается стандартная функция с постфиксом Complete для текущей опреации где довершается все остальное.

Возможно в этом направлении тебе надо копать.
Записан

А птичку нашу прошу не обижать!!!
Monsta
Гость
« Ответ #7 : 09-03-2005 13:42 » 

2ю. Работая с железом ты посылаешь запрос - почему не ждешь ответа???
Где так сказать PENDNIG код возврата.
Т.е. ты посылаешь в девайс просьбу на чтение и игнорируешь как я понимаю, состояние девайса.
С одной стороны ты читаешь из памяти и это очень быстро, с другой, это шина PCI с определенной скорокстью...

Слип не ставь - это кернель мод - упадет все нахрен.
Я не работая с PCI но имея опыт просто в драйвере сети могу сказать что в случкае когда процедура вернуть данные неуспела, вот как это определить в PCI не скажу - посмотри железо, воврат статуса из функции идет PENDING после чего вызывается стандартная функция с постфиксом Complete для текущей опреации где довершается все остальное.

Возможно в этом направлении тебе надо копать.
Вот! Хоть кто-то про PENDING сказал. Я этот пендинг, конечно, выставил бы, но понятия не имею, как узнать, что девайс готов вернуть данные. На Pentium-90 всё и так работало (без всякой проверки состояния девайса), я так понимаю, из-за медленного проца.
Да, а драйвер писался на DriverStudio 2.0, так что был создан готовый каркас с кучей комментов. Среди них был и такой (в функции SerialRead):

Код:
// TODO:  If the data is not yet available, initiate a request to the
//      physical device here, and defer the Information, Status,
//      and NextIrp handling until the hardware indicates that the
//      read is complete.  Typically, this might be handled in a
//      DPC that is called after the hardware finishes transferring
//      the data.
Вот как для PCI-девайса определить, что "data is not yet available", я и хотел бы узнать...
Записан
rkot
Гость
« Ответ #8 : 02-04-2005 07:53 » new

Коллеги, очень нужна документация (спецификация) по PCI-3.0, PCI Express и PCI-X. Поскажите где добыть данное счастье.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines