Serhiy_UA
Интересующийся
Offline
|
|
« : 25-01-2010 07:49 » |
|
Приветствую всех! Есть плата своей разработки на FPGA FLEX10K от Altera, c ядром pci_mt32, все обрамление написано мной на verilog. Плата успешно работает под DOS, но коды писал другой на Pascal, да он уже и уволился. Теперь надо обслуживать эту PCI-плату под Windows XP, но коды писать уже мне. В далекой перспективе есть еще проекты на PCI-X и PCIe. Сейчас я хочу: 1. находить свою PCI-плату в компьютере; 2. обмениваться с этой платой 32-разрядными данными; 2. реагировать на её прерывания. Перечитал уже несколько книг, но в голове яснее по обслуживанию PCI-плат не стало, даже еще хуже. Все как-то фрагментами, а понимания как же это делается - нет. По этому, нужна «помощь зала», хотя бы пока по первому ряду вопросов: Как находить свою PCI-плату в компьютере, ведь там их может быть несколько? Как считать назначенный этой плате конфигурационный файл после процедур PnP? Основные книги у меня есть в djvu и я с ними работаю: 1) Уолтер Они «Использование microsoft windows driver model» 2) М. Руссинович, Д. Соломон "Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP, Windows 2000." 3) В. П. Солдатов "Программирование драйверов Windows 3-е изд. 4) Примеры "Программирование драйверов"На http://www.pcports.ru/Articles.php Буду очень благодарен за дельный ответ, по сути. Хотя я все же больше разработчик цифровой аппаратуры на FPGA, но работаю и с Microsoft Visual C++ 6.0, до этого был Borland C++ Builder 6. Последняя из моих работ - это Ethernet-100 (LAN91C111), где на C++ написан урезанный стек TCP/IP для Nios II 7.2 IDE.
|
|
|
Записан
|
|
|
|
YouROK
Интересующийся
Offline
|
|
« Ответ #1 : 26-01-2010 07:04 » |
|
Я новичек в этой области, но всетаки по поводу 1, когда плата воткнута в компьютер, и в виндовсе заходишь в диспечер устройств, там должно быть неизвестное устройство, так вот посмотреть vid&pid устройства и написать inf файл по ним, и потом когда уже напишешь драйвер то на каждую плату будет ставиться драйвер, это в теории и моё мнение, а вот на практике даже и не знаю.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #2 : 26-01-2010 07:44 » |
|
Serhiy_UA, доброго! находить свою плату в windows не надо) в процессе PnP - перечисляются все устройства на шине. все устройства имеют VendorID и DeviceID по ним - ищется Inf файл, где сопоставлены устройства и драйвер его обслуживающий. если идентичных устройств - несколько, они различаются номером слота на шине. ресурсы конфигурирует сама ОС, поэтому с этим никаких сложностей не возникнет.
насчет 2-3. поищите посты в форуме насчет NeMega DriverStudio 3.2. я несколько раз рассказывал как пользоваться ее визардом для создания рыбы драйвера. она вам сделает рыбу драйвера и с обменом словами и с затычкой на прерывание. вполне работоспособный код, тем более если у вас есть готовая и отлаженная плата - заработает сразу) правда если проверено только под DOS - возможно будут вопросы по реализации PnP на самой плате. там надо конфигурационные регистры правильно заполнить... но даже без драйвера - PCI плата ОДНОЗНАЧНО должна обнаруживаться в Windows как устройство в дереве устройств!
PS честно говоря на такие общие вопросы довольно сложно ответить - слишком многое написать надо, а общую структуру лучше в книгах))) поиграйтесь визардом с Driver Studio, у вас появятся более конкретные вопросы))))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #3 : 26-01-2010 14:06 » |
|
Спасибо за полезные ответы, я сейчас их прорабатываю. Уточняю суть по пункту «находить свою PCI-плату в компьютере».
1. Приложение без меня должно сообщить, есть или нет в системе моя PCI-плата. Как это лучше сделать?
2. Приложение должно расшифровать содержимое 256 байт конфигурационного пространства. Показать физические адреса выделенных пространств памяти или портов ввода-вывода. Здесь тоже вопрос, как?
То есть разобраться бы с этим, а потом уже обмены и прерывания.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #4 : 26-01-2010 17:36 » |
|
Serhiy_UA, ээээ... в Windows XP... а точнее начиная с Windows 2000... приложение не имеет прямого доступа к физическому адресному пространству(грубо говоря, хотя можно и отмапировать драйвером)... к портам I/O - тоже. из приложения вы можете осуществить все вышеперечисленное вызывая только функции своего драйвера. дело в том что оба приведенных вами пункта - выполняет Windows (грубо говоря) - без вашего участия. по результатам - проверки "1" - Windows загрузит ваш драйвер и скажет ему "2" - все физические адреса которые он потребовал.
конкретнее: по приходу IRP_MN_START_DEVICE, в переменной PIO_STACK_LOCATION IOStack = IoGetCurrentIrpStackLocation(Irp); находится перечисление всех требуемых ресурсов (массив структур типа CM_PARTIAL_RESOURCE_DESCRIPTOR) PCM_PARTIAL_RESOURCE_DESCRIPTOR pPartialDescriptors = &IOStack->Parameters.StartDevice.AllocatedResourcesTranslated->List->PartialResourceList.PartialDescriptors[i] поле pPartialDescriptors->Type определяет тип элемента - вам понадобятся типы CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeMemory.
адреса портов pPartialDescriptors->u.Port.Start длина окна pPartialDescriptors->u.Port.Length отображаемая память pPartialDescriptors->u.Memory.Start, длина pPartialDescriptors->u.Memory.Length
и т.д. по всем значениям массива от 0 до IOStack->Parameters.StartDevice.AllocatedResourcesTranslated->List->PartialResourceList.Count
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #5 : 27-01-2010 08:20 » |
|
Спасибо за подробную информацию в ответе, для начинающих это очень важно. Еще вопрос. После запуска msinfo32.exe, просмотрел сведения о системе и убедился в наличии в ней системного драйвера PCI шины с именем pci. Могут ли я как-то использовать (приспособить) этот драйвер для своих задач? Если да, то как?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 27-01-2010 08:56 » |
|
косвенно... по идее это должен быть драйвер шины. без него ничего не работает) он как бы является арбитром шины. но по большому счету напрямую вы его использовать не сможете. http://msdn.microsoft.com/en-us/library/aa490244.aspxвам придется делать то что нарисовано под цифрой 4 программирование устройств в Windows - кардинальным образом отличается от программировании под DOS.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #7 : 27-01-2010 10:58 » |
|
Допускается ли в WinXP из своих приложений использовать функций PCI BIOS (через каталог 32-разрядных сервисов)? Подобно тому, как это делалось ранее на ассемблере, например, через функции прерывания Int 1Ah.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #8 : 27-01-2010 13:39 » |
|
Serhiy_UA, нет, этого делать не стоит. кроме того вам это сделать из приложения - не позволят. я повторяю - все необходимые манипуляции с конфигурационным пространством PCI - выполняет операционная система. и не стоит ей в этом мешать.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #9 : 28-01-2010 07:34 » |
|
Ochkarik, еще раз СПАСИБО за содействие и помощь! 1. Ваши оценки возможностей функций PCI BIOS для WinXP приняты. Хотя, еще вдогонку, есть книга Гук М. Ю. Шины PCI, USB и FireWire. Энциклопедия. — СПб.: Питер, 2005. — 540 с.: ил. В ней автор советует использовать функций PCI BIOS. Если они не идут на WinXP, начавшего жизнь в 2001 году, то зачем о этих функциях PCI BIOS в книге 2005 года? А в целом книга супер, подобных книг мало, но было бы еще ценнее, если бы там было больше о программировании. 2. Попутно еще один вопрос: Могут ли WinAPI функции помочь в обслуживании PCI-плат? 3. DriverStudio 3.2 нашел здесь, скачал, начинаю осваивать. http://www.cracklab.ru/download.php?action=list&n=MTA=Взял из Examples пример проекта pcienum, в VC++6 все компилируется. 4. В 4-ом посте было приведен сложный оператор: PCM_PARTIAL_RESOURCE_DESCRIPTOR pPartialDescriptors = &IOStack->Parameters.StartDevice.AllocatedResourcesTranslated->List->PartialResourceList.PartialDescriptors ; Мне он оказался не по силам и я, в одном из форумов, попросил синтаксически объяснить его, что мне и сделали. Но там вопрос вызвал живую дискуссию по стилю программирования, и попросили сообщить, что стоит перед оператором, и после него. Поэтому, если можно, выложите весь файл или его части, для этого консилиума.
|
|
« Последнее редактирование: 28-01-2010 11:59 от Serhiy_UA »
|
Записан
|
|
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #11 : 29-01-2010 08:36 » |
|
Поработал с DriverStudio 3.2 на двух следующих пробных проектах (они в архивах): 1. pcienum.zip что взял из каталога примеров. 2. MyPCIa.zip построил с помощью DriverWizard.
В Microsoft Visual C++ 6.0 выполнил запуск DriverStudio –> Build with BUILD.EXE. В 1-ом примере все выполнилось без замечаний, но файл *.sys не был получен, я его не нашел. Во 2-ом выдано замечание «U1073: don't know how to make 'd:\PROGRA~1\Compuware\DriverStudio\DriverWorks\lib\i386\FREE\vdw_wdm.lib'» То есть как бы нет vdw_wdm.lib, я по каталогам ее тоже не нашел.
Тексты сообщений сведены в файле Build.txt.
Как быть? Ведь цель, как я понимаю, это хотя бы получить *.sys? Нужна помощь, что здесь не так?
|
|
« Последнее редактирование: 29-01-2010 08:40 от Serhiy_UA »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 29-01-2010 08:56 » |
|
"не так" - следующее: это плохие примеры. они написаны на классах... поверьте на слово: НЕ НАДО их использовать. КАТЕГОРИЧЕСКИ!!! поищите на форуме я уже десять раз объяснял, почему их не нужно использовать. в DS 3.2 есть две опции - генерация проекта с использованием классов и с использованием ЧИСТОГО Си (без C++).
еще раз повторяю: запустите визард VS. там должен быть пункт генерации драйвера(NuMega при инсталяции должна была добавить). используйте данный визард ТОЛЬКО для генерации Си проектов(ни в коем случае не включайте опцию использования классов С++!!!!!). визард у вас попросит указать устройство для которого нужен драйвер(заранее вставьте в машину - должно отображаться в списке устройств). и под вашу железку сгенерит и драйвер, и тестирующее приложение и inf файл для установки драйвера. вы его запустите и будете наслаждаться жизнью. если у вас скромные запросы, то скорее всего вам и трогать его не придется.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #13 : 29-01-2010 09:01 » |
|
ЗЫ через пол часика найду вам ссылок что нажимать значится так. сейчас выложу ссылку на пример с картинками, НО! там картинки и комментарии ДЛЯ СТАРОЙ ВЕРСИИ 2.0. Тогда у NuMega был визард который делал рыбу драйвера только на С++. начиная с версии 3 они добавили возможность генерации на Си без использования надстроек на классах. И только в таком режиме имеет смысл использовать данный визард. только голый Си. в общем делаете примерно все то же что на картинках, но: на самом первом шаге вместо выбора "WDM драйвер с поддержкой DriverWorks С++", выбираете просто WDM драйвер. там был такой пункт. или у них раздельные визарды были - сейчас не помню. короче все файлы проекта у вас должны появится с расширением *.c ( а не cpp!) http://www.codenet.ru/progr/visualc/wdmnumega/ЗЫ на текст этой статьи не смотрите, он устарел, под очень старую версию DS и вобще про классы.
|
|
« Последнее редактирование: 29-01-2010 09:26 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #14 : 29-01-2010 09:36 » |
|
Все получилось!!! С п а с и б о !!! По крайней мере формально я теперь имею MyPCIb.sys и MyPCIb.inf Продолжаю осваивать дальше. Тоже пытаюсь описывать действия c картинками окон, потом, если будет надо, выложу *.doc.
Статью "Использование NuMega DriverStudio для написания WDM-драйверов" еще не видел. Если есть еще аналогичные статьи, дайте, пожалуйста, ссылки.
|
|
« Последнее редактирование: 29-01-2010 09:41 от Serhiy_UA »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #15 : 29-01-2010 11:06 » |
|
вообще то, там помимо проекта драйвера должнен был сгенерится *.exe проект для использования этого драйвера. либо там отдельная кнопка была - генерить тестовое приложение... посмотрите повнимательней. PS надеюсь то что вы теперь MyPCIb без классов) а лучше выложите его, если можно, проверю...)) а статьи... вобще я www.google.com пользуюсь))))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #16 : 01-02-2010 12:03 » |
|
Прочел статью из http://www.codenet.ru/progr/visualc/wdmnumega/, но умней, почему-то, не стал. С помощью DriverStudio 3.2 создал проект MyPCIc (он в приложении). Есть вопросы: 1. Тестовую программу *.exe я не нашел, и кнопку для ее генерации тоже. Где она может быть? 2. Как я понимаю, функции из MyPCIc\app\, можно напрямую включать в свою программу. Но все же не понятно, как с их помощью, выполнить поиск своей платы в компьютере?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #17 : 01-02-2010 16:31 » |
|
почитайте руссиновича) там все есть. если будет слишком сложно - возмите что нибудь по азам программирования обычных приложений для windows. и только потом почитайте руссиновича)
1. плохо искали) MyPCIc\ReadMe.htm 2. MyPCIc\app - это и есть тестовая программа! app - это от слова application(приложение) 3. MyPCIc\driver - ЭТО драйвер. 4. ПОИСК ДЕЛАЕТ WINDOWS! судить(программно) о наличии платы вы можете через функции ВАШЕГО драйвера когда(и если) он будет загружен. посмотрите код тестового приложения. судить (визуально) о ее наличии без установки драйвера - вы можете если откроете менеджер управления устройствами.(там есть и программные функции но они вряд ли вам пригодятся)
5 почитайте о системе PnP (Plug And Play).
PS не уверен что установка в PCI вендора производителя равного FFFF (судя по коду inf файла) - хорошая идея....
|
|
« Последнее редактирование: 01-02-2010 16:40 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #18 : 04-02-2010 11:56 » |
|
Приветствую, Ochkarik! Очень нужна Ваша помощь.
Сделал по пунктам следующее: 1. С помощью DriverWizard выполнил все шаги для PCI-платы, в результате имею драйвер и тестовое приложение. В шаге “Hardware Bus” выбрал свою подключенную плату через “Select physical devicу…”, то есть она введена, а ее параметры свел для справки в Pci0.txt. 2. Выполнил компиляцию отдельно драйвера и приложения, все в норме. Имею PCI0.inf и PCI0.sys, которые установил через «Панель управления – Установка оборудования», а затем перезапустил систему. Система сообщила, что найдено новое оборудование, которое работает нормально. 3. Запускаю тестовое приложение PCI0App.exe – выдается сообщение «Программа не запускается». Аналогичным образом применил все к другой PCI-плате, поддерживающей на моем компьютере один из портов USB. Результат получился аналогичный.
Что может быть не так? Почему не работает тест?
Проект в приложении. Что-то не хочет брать большой проект, хоть я его и разбил на части. Пришлось отправить по частям в разных постах.
Еще хочу отметить, что драйвер включен в системный реестр, я его наблюдаю через regedit.exe в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Pci0\Enum В частности PCI\VEN_1172&DEV_0004&....
|
|
« Последнее редактирование: 04-02-2010 13:04 от Serhiy_UA »
|
Записан
|
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #19 : 04-02-2010 12:03 » |
|
часть 2
|
|
|
Записан
|
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #20 : 04-02-2010 12:03 » |
|
часть 3
|
|
|
Записан
|
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #21 : 04-02-2010 12:04 » |
|
часть 4
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #22 : 04-02-2010 15:58 » |
|
операционка какая? если виста или Win7 - возможно надо запускать приложение от имени администратора(в свойствах приложения была такая галочка). хотя и для XP тоже стоит попробовать. дело в том что если мне не изменяет память, в генеренном автоматом inf файле доступ к драйверу разрешен только для админов.
PS попробуйте - отпишитесь что получилось. если не получится посмотрю код)
PPS дословно - какое сообщение выдает?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #23 : 05-02-2010 07:24 » |
|
Работаю в WinXP, как администратор. На двух компьютерах один и тот же результат. Компиляцию выполнил для режима Win32 Free. Драйвер установил. Запускаю программу в VC++6 через Build->Execute Pci0App.exe. Получаю сообщения: "Could not execute: Bad executable format (Win32, error 193)", а затем "Cannot execute program."
Если запускаю из Total Commander, то сообщает "Программа не запускается".
Что может быть?
|
|
« Последнее редактирование: 05-02-2010 07:33 от Serhiy_UA »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #24 : 05-02-2010 08:02 » |
|
настройки компиляции exe-шного проекта видимо не верны... постараюсь посмотреть попозже. одна беда - у меня студия только 2005/2008 стоит.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #25 : 05-02-2010 09:02 » |
|
1. У меня, помимо Microsoft Visual C++ 6.0, на компьютере стоит и Microsoft Visual Studio 2008. Но я думал, что DriverStudio 3.2 только для VC++6. Тем более, что после установки DriverStudio 3.2 произошло автоматическое включение ее в VC++6. Если драйвера пишутся еще и на MVS2008, то подскажите, как в MVS2008 начать работу с DriverStudio 3.2. Или все же продолжать работать в VC++6?
2. В соседнем топике было написано "все никак не разберусь с настройкой прав доступа приложений к функциям драйвера (это в inf файле). приходится запускать приложения от имени администратора. иначе приложение не видит драйвер вообще." При запуске системы на 1-ом компьютере, я вошел как администратор, а на 2-ом просто вошел - система никаких вопросов не задавала. По этому, не понятно все же как "запускать приложения от имени администратора"?
3. Если можно, пожалуйста, проверьте мой проект, а то работа остановилась.
|
|
|
Записан
|
|
|
|
Рыжий Тигра
Гость
|
|
« Ответ #26 : 05-02-2010 10:02 » |
|
Драйвер установил. Запускаю программу в VC++6 через Build->Execute Pci0App.exe. Получаю сообщения: "Could not execute: Bad executable format (Win32, error 193)", а затем "Cannot execute program." Если запускаю из Total Commander, то сообщает "Программа не запускается". Что может быть? Что-то не в порядке со структурой заголовка .exe'шника - воспринимается системой как драйвер. Я начинал эту фигню копать, но бросил - придумал способ изящнее: создал новый проект типа "win32 application" и включил в него те же исходные файлы, что и в тестовом приложении. Всё отлично скомпилировалось и заработало. ЗЫ. Всё делалось под MSVS6 и DDK2000.
|
|
« Последнее редактирование: 05-02-2010 10:06 от Рыжий Тигра »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #27 : 05-02-2010 10:09 » |
|
не... DS когда выпускалась VS2005 еще не было. не то что 2008... в общем то можно и в 2008 работать, но там настроек много, я так с кондачка не объясню в двух словах. где то на фоуме выкладывал нескоьлько раз, но лучше не заморачивайтесь пока. с драйвером то я так понимаю все в порядке. просто приложение неверно компилируется. фактически надо создать новый проект и перетащить туда код тестового приложения. я думаю это будет проще... у меня он в 2005 его сконвертил но видимо совсем не верно. не компилируется. поправил cheked конфигурацию для приложения в VS2005. скопируйте проект (чтоб драйвер не запороть) и подмените там выложенные файлы. потом откройте в VS 2008 проект Pci0.sln скомпилируйте только приложение в cheked конфигурации. пардон - на большее времени сейчас нет) тоже - работа PS Рыжий Тигра, можно и так) выложи людям проектик?)
|
|
« Последнее редактирование: 05-02-2010 10:11 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Serhiy_UA
Интересующийся
Offline
|
|
« Ответ #28 : 10-02-2010 12:20 » |
|
к Рыжий Тигра Последовал вашим рекомендациям. Создал новый проект типа "win32 application" и включил в него те же исходные файлы, но ничего не получилось, уже на этапе компиляции выдаются ошибки. Мой проект, созданный в DriverStudio 3.2 в приложении. Нужна помощь, полный ступор..........
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #29 : 11-02-2010 19:48 » |
|
пользуйтесь тем что я вам во вложении отдал) а вообще - вам просто надо с ключами компиляции разобраться. там неправильные дефенишены стояли в настройках проекта. откройте свойства проекта приложения(настройки я вам выложил) и посмотрите различия между дебаговой и релизовой настройкой для приложения.
|
|
« Последнее редактирование: 11-02-2010 19:54 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|