![]() |
Мне надо достучаться до USB
Ребята пишем программу для работы с модемами. Нужно посылать данные через USB порт, а как его инициализировать, то есть получить хэндл устройства не знаем ( то есть хотим получить хэндл как при работе с СОМ-портом). Заранее спасибо!!!!
|
Знаешь Евгений ... по моим сведениям такой халявы как с COM-портом - с USB не будет... Com порт почему можно открыть c CreateFile("\\\\.\\com1",....... - потому что драйвер стандартный есть который етот линк и предоставляет.
На USB драйвера тоже есть, но только на HID девайсы (и еще на что-то) и собственно на USB BUS... А вообще это выглядит так - на самом нижнем уровне лежит драйвер, который общается непосредственно с шиной, чуть повыше него - ТВОЙ ДРАВЕР который принимает запросы из пользовательского приложения и формирует запрос (URB) нижележашему драйверу на передачу, конфигурацию или чего еще там тебе надо. URB отправляется туда через IRP и никак иначе - поетому обычное USERMODE приложение работать напрямую не сможет. Вывод: пишем свой USB драйвер (да, да - не надо делать такое лицо), который и предоставит интерфейс для твоего девайса. И тогда ты сможешь получить Handle от своего драйвера. Еще одна ложка дегтя - по-DDKшному драйвер должен быть еще и Plug'n'Play и интерфейс создавать не через IoCreateSymbolicLink а через IoRegisterDeviceInterface. Почему "по-DDKшному " - я сейчас пытаюсь сделать ето по другому хотя в DDK написано что должно быть так. |
Неужто семплов нет нигде как работать с USB ? ...
|
W knowledge baze MS'ow wrode est.
|
В DDK есть но..... Очень уж крученые, слишком USB-шные и черезчур Plug'n'Play-ные :-) . Изучать по ним работу тяжеловато немного....
|
Prosto eto prawilno napisannie.
|
Sh Это я уже понял, но вот второй вопрос. То есть переселка данных в порт с помощью WriteFile(/////) у меня не получится. Если я не прав, то поправьте. И мне придется писать свою функцию, которая будет посылать данные на порт, так? Тогда объясните мне одну вещь, что такое в USB конечная точка(end point) и для чего она нужна. Кстати кому нужен исходник проги, а также драйвер, то ищите програмку для написания драйверов Kernel Driver версию не помню. Можете полазить по нету и найти интсталляшку. У нее в примерах есть много чего интересного, и дрова которые она устанавливает являются универсальными. Проги там написаны С. Так ищите и разбирайте. Кстати Sh а где можно найти инфу по этой теме (желателбно русскоязычную). Спасибо заранее!!!!
|
Enpoint?? - На аппаратном уровне, если не ошибаюсь - ето ...ммм... скажем регистр на N-ое количество байт (по принципу FIFO), причем для поддержки Control transfer обязательно резервируется так называемый Нулевой ЕндПойнт (endpoint zero ) обычно 8-ми байтовый и двунаправленный. А дальше endpoint-ов столько сколько девайс поддерживает. Да чуть не забыл - так называемый "коммуникационный канал" (соединение) между ендпойнтами завется ПАЙПОМ.
И когда ты хочешь отправить данные по USB ты используешь именно хендл пайпа отправляя запрос из своего драйвера нижележащему. А хендлы пайпов получают запрашивая и выбирая конфигурацию девайса. (надеюсь не слишком загрузил :)) Хотя если ты, как говоришь, используешь JUNGO KERNEL DRIVER или JUNGO WINDRIVER то тебе ето все не понадобится практически. Я привык по старинке писать... :-)) З.Ы Да! Инфа! Чуть не забыл.. :-) DDK и USB spec. rev 2.0 - рускоязычных не встречал... Хотя может и есть такое |
Sh - molodec!
|
Sh
Спасибо большое выручил!!!!Объясни почему мне это не надо, если я пользуюсь этой прогой??? |
Так она за тебя все генерит по-моему....
По крайней мере WinDriver делает сразу программу в которой уже готовые вызовы всего чего только душа не пожелает.... Вообще это удобно но есть маленькое НО. Надо использовать их так называемый KERNEL PLUGIN - не знаю как у тебя а у меня он был не вполне лицензионный :-) Иеще одна деталь из-за которой я не использую ету прогу: мы когда отчет сдаем - от нас требуют ВСЕ ИСХОДНИКИ на ВСЕ пограммные модули которые только есть в проекте и принципиальные схемы на ВСЕ аппаратные модули которые у нас есть. Ну и вот... Дизассемблировать же его не будешь, типа ты его на asme писал... :-) З.Ы. А вообще рад был помочь.... :-) честно-честно :-) |
Strannaya u was kontora. W normalnoi kontore sprosili-bi, chto deshewle: kupit modul ili pisat samim.
|
Sh Большое , при большое спасибо. Я конечно понимаю, что спасибо на хлеб не намажишь и в карман не положишь. Так что пиши, если чего-нибудь надо там помочь или инфу какую-нибудь тебе будет надо, чем смогу, тем помогу. Кстати ты когда-нибудь был на буржуйских сайтах типа www.lvr.com или www.usb-by-example.com. Там даже исходнички есть, но вот работать они не хотят, так как злые дядьки скорей всего написанный ими драйвер не поставляют. Но инфа там есть, так что если не знал, то загляни.
helldomain сам понимаешь, как у нас офисах происходят дела. Лучше человек пусть мучается пишет прогу, но он ее напишет (вот этим отличается русский программист от других буржуйских программеров), чем выложить бабки за готовый рабочий продукт. |
Sh вот думал что, тебя больше мучать не буду, но извини прийдется. Ты обмолвился про, то что работал с Kernel. Скажи функция WD_Open открывает устройство (в моем случае ты понял какое) или открывает ссылку на драйвер, а драйвер потом обращается к устройству? Мне вот интересно эта функция возращает хэндл устройства? И последний вопрос так все таки могу ли я использовать WriteFile() для записи в порт данных или мне надо ее писать, или в Kernel есть своя функция для записи? Фух все. СПАСИБО ТЕБЕ ЗАРАНЕЕ
|
Ponimaju. Prosto u burjuew rabochee wremya programmera oplachiwaetsya po chasam. Poetomu chastenko deshewle kupit kakoi-to kusok chem pisat samomu.
|
Извини Kernel рядом не нашел, но нашел WinDriver. Давай посмотрим что там есть :-)
Если выдрать кое-что из контекста получаем ...... #define WD_Open WD_OpenLocal ...... #elif defined(WIN32) #define WD_OpenLocal()\ CreateFile(\ TEXT("\\\\.\\WINDRVR"),\ GENERIC_READ,\ FILE_SHARE_READ | FILE_SHARE_WRITE,\ NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL) static DWORD WD_FUNCTI ......... Обратил внимание куда смотрит CreateFile ??? Ето и есть их стандартный драйвер (в Kernele по-моему такой же) который и делает всю черную работу. :-) Ето в ответ на вопрос что же возвращает WD_OPEN. Второй вопрос: ...WriteFile.... Немного теории :-) Как ты знаешь (ну или догадываешься :-)) в результате вызова WriteFile и ReadFile драйверу посылается IRP-ы, соответственно IRP_MJ_WRITE и IRP_MJ_READ. Чтобы ты смог юзать WriteFile надо чтобы драйвер их обрабатывал, типа так pDriverObject->MajorFunction[IRP_MJ_WRITE] = Usb_Write; pDriverObject->MajorFunction[IRP_MJ_READ] = Usb_Read; где Usb_Write и Usb_Read функции твои, которые и будут обрабатывать запрос. А теперь суть - посмотри обрабатывает ли твой драйвер пакет IRP_MJ_WRITE и если нет - добавь что надо (подробнее см DDK 2k) Прототипы такие: NTSTATUS Usb_Write( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp ) есть гемор с передачей буффера размером большим чем размер USB пакета - то есть прийдется разбивать на несколько. Ето так - предупреждение. З.Ы. А вообще ты знаешь разница между Windriver и Kernel по-моему небольшая. Они обе всего лишь навсего предоставляют интерфейс для работы со своим драйвером который судя по всему сделан так, что может работать со всем и подходить ко всему (ты наверно заметил когда проекты создавал) З.З.Ы. Пасибо за ссылки, обязательно посмотрю... З.З.Ы. To HELL Так конторка наша при институте... денег немного... вылезаем за счет себя же :-) Мда... мне бы в Intel махнуть - хочешь пироженого... хочешь мороженного ... хочешь импульсный стабилизатор с кофемолкой и GSM трансивером. :-)) Да кто меня туда возьмет. А тут слишком много не купишь. |
А как же родина товарищи ?
|
Ponimaju.
|
To RaZEr : я имею в виду российское отделение, конечно. Заграницей что-то не очень хочется работать: каждый день ездить из дома за границу на работу, а вечером назад возвращаться в родной Клин - ломает... :-) Я и так каждый день на учебу в другой город езжу. :-)
|
RaZEr Родина Родиной а кушать хочется всегда и деньжат бы нам по самые не хочу.
Sh после двух суток работы с USB я понял наконец-то как с ним работать. Могу сказать следующие РЕБЯТА ПИШИТЕ ВСЕ САМИ. Эти блин буржуи со своим Kernelом, вобщем плохие дядьки. Пришлось писать функцию передачи и приема данных на порт самому. А теперь еще неделю буду отлаживать и встраивать в основную прогу. Sh ты DDK качал с нета или использовал те, которые идут с MSDN???? |
Hou Hou Hou... МОЛОДЕЦ!!! Хвалю!!! Сильное, разумное и довольно благородное решение!!!
DDK - у нас на серваке лежало.... Даже не знаю где тебе посоветавать поискать, кроме www.microsoft.com/ddk/ З.Ы. Microsoft щас продает DDK Suite 2 всего за 200$ за 20!!! дисков |
Prelest. Mne uj deshewle kachnut budet, chem pokupat diski primernos 35MB na kajdom i sobrat ih na odin ;-))).
|
Фух все закончил!!!! Я наконец-то разделался с USB!!! Прога работает, но что самое интересное (я даже не ожидал такого) правильный прием данных составляет 96%, на коме такого не было. Сдал эту прогу шефу, теперь он ее каверкает. А сам занимаюсь сейчас программированием микроконтроллеров. Очень весело пока!!! Спасибо всем кто помогал в написаннии проги для USB!!! Огромное спасибо тебе Sh!!! Если б не ты, то мучался я б с ней долго.
|
Pozdrawlyam ;-))).
|
| Часовой пояс GMT +4, время: 10:23. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.