mustelus
Участник
Offline
|
|
« : 13-10-2009 09:16 » |
|
Доброго всем времени суток... Появилась идейка связать компьютер и внешнее устройство (PIC18F4550) через USB шину (metod BUFFERED, тип передачи изохорный). От системы (PIC18F4550) требуется, для начала, получить (от хоста) и передать хосту 2 слова данных. С внешним устройством проблем нет (программой), а на компьютер есть. Драйверами начал заниматься где-то около месяца назад, прочитал умные книги : Агуров, Уолтер Они, и теперь в голове каша полная. Взял пример из DDK isoUSB за основу (правильно ли это?). На мой взгляд, там слишком много включено ненужных (необязательных) функций драйвера (так ли это?). Я уяснил, что есть обязательные функции: DriverEntry, DriverUnload, AddDevice. Рабочие процедуры регистрируются:
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsoUsb_DispatchDevCtrl; DriverObject->MajorFunction[IRP_MJ_POWER] = IsoUsb_DispatchPower; DriverObject->MajorFunction[IRP_MJ_PNP] = IsoUsb_DispatchPnP; DriverObject->MajorFunction[IRP_MJ_CREATE] = IsoUsb_DispatchCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsoUsb_DispatchClose; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = IsoUsb_DispatchClean; DriverObject->MajorFunction[IRP_MJ_READ] = DriverObject->MajorFunction[IRP_MJ_WRITE] = IsoUsb_DispatchReadWrite; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = IsoUsb_DispatchSysCtrl; DriverObject->DriverUnload = IsoUsb_DriverUnload; DriverObject->DriverExtension->AddDevice = (PDRIVER_ADD_DEVICE) IsoUsb_AddDevice;
Скажите, все ли эти процедуры нужно включать в драйвер для моей будущей системы, если мне нужно просто передавать и принимать без отслеживания и контроля транзакций, правильно ли будет ограничиться следующим набором рабочих процедур:
DriverObject->MajorFunction[IRP_MJ_CREATE] = IsoUsb_DispatchCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsoUsb_DispatchClose; DriverObject->MajorFunction[IRP_MJ_READ] = IsoUsb_DispatchReadWrite; DriverObject->MajorFunction[IRP_MJ_WRITE] = IsoUsb_DispatchReadWrite; DriverObject->DriverUnload = IsoUsb_DriverUnload; DriverObject->DriverExtension->AddDevice = (PDRIVER_ADD_DEVICE) IsoUsb_AddDevice;
Помогите "разложить все по полочкам". Конкретные вопросы будут потом. СПАСИБО.
|
|
« Последнее редактирование: 15-10-2009 04:52 от Sel »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 13-10-2009 11:33 » |
|
IRP_MJ_PNP - обязательно оставить. остальные не обязательно. давайте так... у меня со временем сейчас к сожалению туго. я вам скину свой проектик из DriverStudio.... ага. уже скидывал. вы его посмотрите и подумаете. там лишнего не очень много должно быть. кода там много но по сути используются только Read|Write . https://forum.shelek.ru/index.php/topic,17063.msg192607.html#msg192607там: DriverEntry AddDevice Start_Device - в файле usb_ftdi.c основная процедура обращения к pipe usb - в файле usb.c (usb_ftdiPipe1Io) доступ на чтение запись по Read|Write файл iorw.c. и посмотрите pnp.c - там много чего лишнего, но осталось читабельным. написано помоему для 6 студии было. или для 7... должна компилится, но надо объявить путь к DDK.... тот же пример можете попробовать сгенерить сами - для этого нужна DriverStudio 3.2 она устарела - но визард проектов на Си(без плюсов!!!) там был самое то)))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #2 : 14-10-2009 22:13 » |
|
и кроме pnp, ни в коем другом файле исходника ничего нет? Для чего вообще используется DeviseIoControl (стратегическое назначение), она ж в вашем примере ничего не делает, кроме как проверяет отличие от 0 буфер и все? Или я что-то совсем не понимаю в тонкости обработки IOCL запросов...
|
|
« Последнее редактирование: 15-10-2009 04:57 от Sel »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 15-10-2009 18:21 » |
|
гы) я что написал? - "кода там много но по сути используются только Read|Write ." я же говорю - это рыба из нумеги) делал ее пять минут, и не особо заморачивался) но она вроде бы даже работала... просто взбрело в голову проверить модуль один на USB. на FTDI микросхеме. взял рыбу, запустил проверил и забыл)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #4 : 25-10-2009 17:56 » |
|
Скажите, каким образом и чем можно отладить и откомпилить драйвер (так чтоб операционку не положить )... В DDK нашол кое чего для создание INF файла, но что то не получаеться ничего...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 25-10-2009 21:30 » |
|
в какой то версии DDK вроде был мастер по созданию inf... что то типа geninf.exe вроде он работал даже) либо возьмите inf из какого нибудь примера) моего или из DDK. отлаживать и компилировать... компилировать либо в студии, либо через make файл (поищите по форуму). отлаживать... тут сложнее. из современных средств - Syser и WinDbg. из устаревших но классических - SoftIce (Syser кстати на него по интефейсу и командам очень похож, но глючный немного) а чтоб операционку не положить - попробуйте VMWare приспособить... говорят можно. (по началу я клал операционку раз по 30 в день, и ничего) живой) только на людей бросаться начинал)))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #6 : 26-10-2009 12:46 » |
|
как-то вот так ? (с использованием Build) необходимо создать два файла: Makefile и source. Первый управляет работой Build и имеет следующий стандартный вид : # DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !INCLUDE $ (NTMAKEENV) \ makefile.def # Файл source: TARGETNAME=PRIMER // имя компилируемого драйвера TARGETTYPE=DRIVER // тип компилируемого проекта #DRIVERTYPE=WDM // При компиляции WDM драйвера эту строку нужно раскомментировать, а в заголовочном файле Driver.h вместо // ntddk.h подключить wdm.h TARGETPATH=obj // директория, в которой будут размещены промежуточные файлы SOURCES=main.cpp // главный файл сорцов помещаем все в один каталог и запустить компиляцию утилитой Build. Всё, компиляция и сборка драйвера завершены. Инсталляция драйвера: Инсталлировать драйвер с использованием (geninf.ехе) INF - файла и с использованием SCM - менеджера (программно) ...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 26-10-2009 14:39 » |
|
насчет SCM я кажется ошибался... по ходу дела им только НЕ PnP драйвера ставить можно... темой раньше обсуждали. а для PnP только inf, либо есть еще API предустановки драйвера - где то была тут тема про предустановку USB дейвайса... не помню получилось у человека или нет. сам не занимался.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #8 : 28-10-2009 10:52 » |
|
Хм, впринцепе с кодом разобрался, но как уяснить что за чем вызывать (какой за каким дескриптор получать/отправлять)....
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 28-10-2009 21:22 » |
|
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #10 : 29-10-2009 06:45 » |
|
О спасибо, хоть какаято последовательность показана... А раскажите про Driver Studio от Numega, если скелет на етой софтине делать, годно??? Я что то читал отзывы о ней в нете так мнения очень разные, или всетаки лучше дедовским способом лучше работать (в блокноте, вручную)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 29-10-2009 20:06 » |
|
я не сторонник дедовского способа) пишу в VS 2005. собираю в ней же, причем не через build а обычным способом. насчет DS... ее несколько лет назад перестали поддерживать. проект закрыт. SoftIce - отладчик всех времен и народов, запускается только на старом железе, и XP (помоему без какого то сервиспака). в общем про него можно забыть... а сама DS содержала в себе помимо прочего, визард(в VS) для создания скелета драйвера. один из режимов - на C++ (это использовать нельзя не при каких обстоятельствах) второй - на чистом Си - вполне читабельный код в который удобно "въезжать", особенно по началу помогает.... пока DDK читать не научился) код мало того что облегчает понимание, так он еще и вполне работоспособен сразу после создания) опять же в нем(визарде) много галочек было, можно было сравнивать. годно ли оно до сих пор или нет... честно говоря, с Win98 ядро сильно не меняли. так что то что подходит для XP вполне будет работать и на висте (и возможно и на 7 - с ней пока не сталкивался)..
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #12 : 30-10-2009 13:58 » |
|
Т.е. лучше взять DS, оттуда достать Wizard Си (интегрировать), и работать в своей VS 2008???
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 30-10-2009 19:41 » |
|
что значит лучше? в какой то мере это может помочь в освоении... при разумном подходе) не надо сильно на нем фиксироваться... примеры DDK это конечно да, но на мой взгляд сложнее для понимания) это - в какой то мере альтернатива. кстати не знаю, встанет ли он под vs2008. если будете пробовать - отпишитесь что получится)
PS другой вопрос VS... это конечно удобно, но это не значит что вы не должны понимать что делает линкер и компилятор) и зачем там столько дефайнов)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #14 : 15-11-2009 19:28 » |
|
|
|
« Последнее редактирование: 15-11-2009 19:35 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #15 : 16-11-2009 23:31 » |
|
Блин, не могу догнать как ети API использовать.... Прочел MSDN, но все равно не понятно.... Нашол пример. там система: приложение->DLL ->драйвер, тут вопросов нет (как мне кажеться).... Чисто импортируються функции по очереди без всяких SetupDiDestroyDeviceInfoList и т.д. Вот еще нашол то что вы имеете ввиду:
[DllImport("setupapi.dll" , CharSet = CharSet::Seeifdef, EntryPoint="SetupDiGetClassDevs")] extern "C" HDEVINFO SetupDiGetClassDevsUM( LPGUID ClassGuid, //Input: Supply the class GUID here. PCTSTR Enumerator, //Input: Use NULL here, not important for our purposes HWND hwndParent, //Input: Use NULL here, not important for our purposes DWORD Flags); //Input: Flags describing what kind of filtering to use.
[DllImport("setupapi.dll" , CharSet = CharSet::Seeifdef, EntryPoint="SetupDiEnumDeviceInterfaces")] extern "C" WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInterfacesUM( HDEVINFO DeviceInfoSet, //Input: Give it the HDEVINFO we got from SetupDiGetClassDevs() PSP_DEVINFO_DATA DeviceInfoData, //Input (optional) LPGUID InterfaceClassGuid, //Input DWORD MemberIndex, //Input: Specify the "index" of the device you are interested i
[DllImport("setupapi.dll" , CharSet = CharSet::Seeifdef, EntryPoint="SetupDiEnumDeviceInfo")] extern "C" WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInfoUM( HDEVINFO DeviceInfoSet, DWORD MemberIndex, PSP_DEVINFO_DATA DeviceInfoData);
[DllImport("setupapi.dll" , CharSet = CharSet::Seeifdef, EntryPoint="SetupDiDestroyDeviceInfoList")] extern "C" WINSETUPAPI BOOL WINAPI SetupDiDestroyDeviceInfoListUM( HDEVINFO DeviceInfoSet); //Input: Give it a handle to a device info list to deallocate from RAM.
[DllImport("setupapi.dll" , CharSet = CharSet::Seeifdef, EntryPoint="SetupDiGetDeviceRegistryProperty")] extern "C" WINSETUPAPI BOOL WINAPI SetupDiGetDeviceRegistryPropertyUM( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD PropertyRegDataType, PBYTE PropertyBuffer, DWORD PropertyBufferSize, PDWORD RequiredSize);
[DllImport("user32.dll" , EntryPoint="RegisterDeviceNotification")] extern "C" HDEVNOTIFY WINAPI RegisterDeviceNotificationUM( HANDLE hRecipient, LPVOID NotificationFilter, DWORD Flags); и как ими пользоваться... Где здесь мои Read/WriteFile и т.д. Может у вас примеры нормальные есть.... Ото горю....
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #16 : 17-11-2009 18:32 » |
|
вызываете свойства проекта "Property Pages" ищете там в дереве "Configuration Properties->Linker->Input" ищете поле "Additional Dependencies" в это поле добавить соответствующий файл xxxxx.lib (там уже по умолчанию обычно включены kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib). включить этот lib надо и для Release и для Debug версии проекта. в *.c файл вашего проекта, откуда вызывается даная функция добавить добавить соответствующий #include <xxxxx.h> все. ЗЫ это если вы из VS компиляцию производите. если из build.exe - надо в make файле добавить в переменную LIB_чего то там. не помню... по аналогии там наверняка строчка такая будет PPS вообще - очень рекомендую посмотреть, что там в настройках вообще есть... чтобы потом разобраться зачем это все нужно) PPPS и кстати printf - это НЕ API Windows
|
|
« Последнее редактирование: 17-11-2009 20:33 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #17 : 20-11-2009 23:35 » |
|
Простите, а какую *.LIB включать если у меня *.SYS....
|
|
« Последнее редактирование: 21-11-2009 11:05 от Ochkarik »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #18 : 21-11-2009 11:11 » |
|
что, и в каких случаях подключать - написано в DDK. читаете DDK по всем использованным вами функциям. Там как правило написано в каком заголовочном файле функция объявлена, и какую либу надо подключать.
первые находятся в папках C:\DDK\6001.18001\inc\ вторые - в C:\DDK\6001.18001\lib\
в любом случае вам скорее всего понадобятся ntoskrnl.lib и возможно hal.lib. остальное зависит от написанного вами драйвера
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
mustelus
Участник
Offline
|
|
« Ответ #19 : 23-12-2009 10:36 » |
|
Не устанавливаеться драйвер... Есть скомпилированый драйвер mchpusb.sys, и есть .INF фаил... Когда подключаю устройство операционка говорит что неизвесное устройство менеджер предлогает установить нужный драйвер, и я указываю путь к папке в которой скомпилированый драйвер и .INF фаил... На почемуто возникает ошибка мол .INF фаил не содержит инфы об устройстве.... Вот содержимое и .INF фаила: 1=%INSTDISK%,,,
[DeviceList] %DESCRIPTION%=DriverInstall,USB\VID_04D8&PID_000B, USB\VID_04D8&PID_000C
;------------------------------------------------------------------------------ ; Windows 2000/XP Sections ;------------------------------------------------------------------------------
[DriverInstall.ntx86] CopyFiles=DriverCopyFiles
[DriverCopyFiles] mchpusb.sys,,,2
[DriverInstall.ntx86.Services] AddService=MCHPUSB,2,DriverService
[DriverService] ServiceType=1 StartType=3 ErrorControl=1 ServiceBinary=%10%\system32\drivers\mchpusb.sys AddReg=TraceFlags
;------------------------------------------------------------------------------ ; Windows 98/Me Sections ;------------------------------------------------------------------------------
[DriverInstall] AddReg=DriverAddReg CopyFiles=DriverCopyFiles,StubCopyFiles DriverVer=01/01/2003 ; TODO replace with real info
[DriverAddReg] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,,"wdmstub.sys,mchpusb.sys"
[StubCopyFiles] wdmstub.sys,,,2
;------------------------------------------------------------------------------ ; String Definitions ;------------------------------------------------------------------------------
[Strings] /// MFGNAME="Microchip Technology, Inc." // ВОТ ЖЕ INSTDISK="Microchip Technology, Inc. Installation Disc" // ИНФОРМАЦИЯ DESCRIPTION="PIC18F4550 Family Device" ///
|
|
|
Записан
|
|
|
|
|
|