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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Связать компьютер и внешнее устройство (PIC18F4550) через USB шину.  (Прочитано 27375 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mustelus
Участник

by
Offline 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
Модератор

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

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline Offline

« Ответ #2 : 14-10-2009 22:13 » 

 Отлично  и кроме pnp, ни в коем другом файле исходника ничего нет?
Для чего вообще используется DeviseIoControl (стратегическое назначение), она ж в вашем примере ничего не делает, кроме как проверяет отличие от 0 буфер и все? Или я что-то совсем не понимаю в тонкости обработки IOCL запросов...
« Последнее редактирование: 15-10-2009 04:57 от Sel » Записан
Ochkarik
Модератор

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

« Ответ #3 : 15-10-2009 18:21 » 

гы) я что написал? -
"кода там много но по сути используются только Read|Write ."
я же говорю - это рыба из нумеги) делал ее пять минут, и не особо заморачивался) но она вроде бы даже работала...
просто взбрело в голову проверить модуль один на USB. на FTDI микросхеме. взял рыбу, запустил проверил и забыл)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline Offline

« Ответ #4 : 25-10-2009 17:56 » 

Скажите, каким образом и чем можно отладить и откомпилить  драйвер (так чтоб операционку не положить  Улыбаюсь )... В DDK нашол кое чего для создание INF файла, но что то не получаеться ничего...
Записан
Ochkarik
Модератор

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

« Ответ #5 : 25-10-2009 21:30 » 

в какой то версии DDK вроде был мастер по созданию inf... что то типа geninf.exe вроде он работал даже) либо возьмите inf из какого нибудь примера) моего или из DDK.
отлаживать и компилировать... компилировать либо в студии, либо через make файл (поищите по форуму).
отлаживать... тут сложнее. из современных средств - Syser и WinDbg. из устаревших но классических - SoftIce (Syser кстати на него по интефейсу и командам очень похож, но глючный немного)
а чтоб операционку не положить - попробуйте VMWare приспособить... говорят можно.
(по началу я клал операционку раз по 30 в день, и ничего) живой) только на людей бросаться начинал)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline 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
Модератор

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

« Ответ #7 : 26-10-2009 14:39 » 

насчет SCM я кажется ошибался... по ходу дела им только НЕ PnP драйвера ставить можно... темой раньше обсуждали.
а для PnP только inf, либо есть еще API предустановки драйвера - где то была тут тема про предустановку USB дейвайса... не помню получилось у человека или нет. сам не занимался.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline Offline

« Ответ #8 : 28-10-2009 10:52 » 

Хм, впринцепе с кодом разобрался, но как уяснить что за чем вызывать (какой за каким дескриптор получать/отправлять)....
Записан
Ochkarik
Модератор

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

« Ответ #9 : 28-10-2009 21:22 » 

http://msdn.microsoft.com/en-us/library/ms790488.aspx
 Класс!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline Offline

« Ответ #10 : 29-10-2009 06:45 » 

О спасибо, хоть какаято последовательность показана...
А раскажите про Driver Studio от Numega, если скелет на етой софтине делать, годно???
Я что то читал отзывы о ней в нете так мнения очень разные, или всетаки лучше дедовским способом лучше работать (в блокноте, вручную)
Записан
Ochkarik
Модератор

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

« Ответ #11 : 29-10-2009 20:06 » 

я не сторонник дедовского способа)
пишу в VS 2005. собираю в ней же, причем не через build а обычным способом.
насчет DS... ее несколько лет назад перестали поддерживать. проект закрыт.
SoftIce - отладчик всех времен и народов, запускается только на старом железе, и XP (помоему без какого то сервиспака). в общем про него можно забыть...
а сама DS содержала в себе помимо прочего, визард(в VS) для создания скелета  драйвера. один из режимов - на C++ (это использовать нельзя не при каких обстоятельствах)
второй - на чистом Си - вполне читабельный код в который удобно "въезжать", особенно по началу помогает.... пока DDK читать не  научился)
код мало того что облегчает понимание, так он еще и вполне работоспособен сразу после создания) опять же в нем(визарде) много галочек было, можно было сравнивать.
годно ли оно до сих пор или нет... честно говоря, с Win98 ядро сильно не меняли. так что то что подходит для XP вполне будет  работать и на висте (и возможно и на 7 - с ней пока не сталкивался)..
 
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline Offline

« Ответ #12 : 30-10-2009 13:58 » 

Т.е. лучше взять DS, оттуда достать Wizard Си  (интегрировать), и работать в своей VS 2008???
Записан
Ochkarik
Модератор

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

« Ответ #13 : 30-10-2009 19:41 » 

что значит лучше? в какой то мере это может помочь в освоении... при разумном подходе) не надо сильно на нем фиксироваться... примеры DDK это конечно да, но на мой взгляд сложнее для понимания)
 это - в какой то мере альтернатива.
кстати не знаю, встанет ли он под vs2008. если будете пробовать - отпишитесь что получится)

PS другой вопрос VS... это конечно удобно, но это не значит что вы не должны понимать что делает линкер и компилятор) и зачем там столько дефайнов)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #14 : 15-11-2009 19:28 » 

продолжение перенесено в в раздел  С/С++.
https://forum.shelek.ru/index.php?topic=22442.0
« Последнее редактирование: 15-11-2009 19:35 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline 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
Модератор

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

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline Offline

« Ответ #17 : 20-11-2009 23:35 » 

Простите, а какую *.LIB включать если у меня *.SYS....
« Последнее редактирование: 21-11-2009 11:05 от Ochkarik » Записан
Ochkarik
Модератор

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

« Ответ #18 : 21-11-2009 11:11 » 

что, и в каких случаях подключать - написано в DDK.
читаете DDK по всем использованным вами функциям. Там как правило написано в каком заголовочном файле функция объявлена, и какую либу надо подключать.

первые находятся в папках C:\DDK\6001.18001\inc\
вторые - в C:\DDK\6001.18001\lib\

в любом случае вам скорее всего понадобятся ntoskrnl.lib и возможно hal.lib. остальное зависит от написанного вами драйвера
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
mustelus
Участник

by
Offline 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"                               ///



Записан
Ochkarik
Модератор

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

« Ответ #20 : 23-12-2009 21:12 » 

почитайте:
https://forum.shelek.ru/index.php/topic,8546.0.html (там есть прикрепленный txt с пояснениями)
http://www.oszone.net/3827
http://www.osronline.com/ddkx/install/create-inf_4l47.htm

а так же смотрите примеры DDK)
очень куций inf файл... если это весь файл... как минимум не хватает заголовка.
а вобще VID/PID устройства сходятся? посмотреть можно в дереве устройств в свойствах, даже для подключенного устройства без драйвера.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines