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

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

ru
Offline Offline

« : 18-10-2011 06:49 » 

Здравствуйте!
Есть такая задачка: имеется некое устройство, типа клавиатуры. Виндой оно и определяется как HID клавиатура, поэтому и работает вместе с основной клавой(как одна или в один поток). Но хочется, чтобы эта клавиатура работала не всегда, а только тогда, когда ей скажут, то есть в конкретном приложении. В общем все видимо сводится к написанию драйвера.

Прочитал уже достаточно разного материала, но как-то так и не получилось извлечь нужное. Каша в голове)
Сейчас больше инетересует как получать данные с устройства. DriveEntry и прочие общие понятия вроде как усвоились.

http://www.e-reading.org.ua/bookreader.php/130090/Tarvo_-_Ispol'zovanie_NuMega_DriverStudio_dlya_napisaniya_WDM-draiiverov.html - вот вроде как хороший пример, но к сожалению DriverStudio не работает на версиях винды старше XP SP2.
То есть что нить бы подобное под WDK...

И надо чтобы в итоге это все кончилось какой-нить dll по взаимодействую с этим устройством, ну или в идеале - .NET объектом )
Записан
Ochkarik
Модератор

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

« Ответ #1 : 18-10-2011 13:12 » 

ссылка с примером плохая. то есть описание ядра еще можно читать. а пример смотреть вредно, он на устаревших нумеговских классах. я тут не один раз выкладывал как можно использовать нумегу.

по теме, посмотрите http://www.developerfusion.com/article/84338/making-usb-c-friendly/
и тут http://forum.ixbt.com/topic.cgi?id=26:40684-2
-> http://23w.livejournal.com/4046.html
человек вроде говорил что алгоритм работает с мышкой и вроде должен с клавиатурой.
смотрел мельком - сил сегодня не осталось)
если не натолкнет на идеи - скажите, еще подумаем... если натолкнет - отпишитесь что получается, для потомков)
да. и чуть поточнее - что за девайс)
« Последнее редактирование: 18-10-2011 13:21 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #2 : 19-10-2011 04:53 » 

Спасибо за ответ )

По ссылкам: Raw Input собственно на данный момент и реализован, правда без хуков, но это не так важно. Проблема в том, что это работает только при запущенном приложении, в котором собственно raw input и реализован. Конечно можно попробовать его реализовать в виде сервиса или службы, запускаемой при входе в винду, но это немного не то (ее можно закрыть, (случайно например) и все тогда упадет,а  пользователь не догадается в чем же дело:) ). То есть все-таки нужно что-то ближе к железу, типа драйвера. К тому же драйвер можно расширять на линейку продуктов. Ну это вообще наврено более правильно ))

По поводу первой ссылки - там работа с HID устройствами. Это не драйвер, как мне представляется. Просто библиотека, которая, к слову, у меня не работает Улыбаюсь Не коннектит девайсы. Список то выдает, но ID PnP (полные) не совпадают с теми, что есть в системе. как-то так.

Устройство - считыватель карточек. Он выдает просто номер карточки(цыфирками), которую подносим.
При подключении он автоматически грузит его PnP драйверами и определяет как HID клавиатуру. Из моих никчемных знаний, PnP дрова работают с железом на уровне ядра. И пусть работают. А дальше вот надо перехватытать данные и не выводить пока не скажут. То есть уже в моем приложении делать типа ConnectDevice, где загружается устройство и дальше читать то, что мне надо.
Записан
Ochkarik
Модератор

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

« Ответ #3 : 19-10-2011 20:12 » 

тогда возможно вам стоит начать читать соответствующий раздел Interactive Input Device Architecture

я просто задачу не совсем понял... мне казалось что вашу задачу можно решать без написания драйвера, поэтому и ссылки соответствующие дал А черт его знает...
в конце концов, наверное можно даже для конкретного устройства модифицировать keyboard.inf файл, чтобы грузился только готовый минипорт, но не цеплялся к драйверу класса HID-клавиатур. а оставался просто драйвером с HID интерфейсом. ( этим вопросом не занимался но мне отчего то кажется что это возможно)

но если вам ооочень хочется написать именно драйвер...
два варианта:
- HID Class для ваших устройств к которым будет подключатся родной готовый драйвер минипорта той самой USB клавиатуры/ридера... вроде в DDK пример для клавиатуры был - можно посмотреть. по крайней мере USB HID клавиатура ставится через  kbdhid.sys - минипорт, который подключен к классу kbdclass.sys, который уже опрашивает система. насколько я понимаю.
- обычный драйвер USB устройства. в этом случае вам надо самому общаться с USB устройством. но зато интерфейс вы можете делать любой. в этом случае вам надо смотреть в сторону USB функционального драйвера (собирается в том числе нумегой).

да, могу где то ошибаться, поскольку сам никогда с HID не работал)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #4 : 20-10-2011 10:32 » new

Дочитал Уолтера Они... )

Да, пожалуй тут надо писать минипорт драйвер с HID интерфейсом. Просто это ж все-таки драйвер, пусть и мини, а не что-то типа метода Raw input Улыбаюсь

До Нового года надо сделать. Потом может поделюсь результатами "для потомков" ))

Ochkarik, спасибо за ответы и за уделенное внимание  Улыбаюсь
Записан
Ochkarik
Модератор

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

« Ответ #5 : 20-10-2011 12:24 » 

да пока не за что)
 я просто хочу сказать что минипорт там и так написан... может быть возможно только класс переписать?
интерфейс в user mode  идет именно с класса, если я не ошибаюсь.
да и вообще... подумайте, а нужен ли вам именно HID драйвер? (то есть HID интерфейс в приложение)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #6 : 21-10-2011 09:48 » 

И все таки до конца не все ясно...

Вообще устройство(сегодня обнаружил) имеет 2 команента, так сказать. USB устройство ввода (hidclass.sys, hidusb.sys, hidparse.sys) и вторую часть, как HID- клавиатуру (kbdclass). Если для второй части загрузить драйвера не как для клавы, а как просто для HID устройства, то соответственно уже само устойство и не работает как клава. (уже что-то). Но при этом винда говорит, что драйверов нет для него (не требуются или не установлены).

Вот мысль - на этом этапе может общаться с этим HID-устройством с помощью hid.dll в пользовательской проге? Просто ни один из примеров, скачанных с нета по поводу hid-устройств не коннектится к моему устройству(причем к клаве тоже). Обнаружить - обнаруживает, но видимо на этапе CreateFile падает. (скорее всего разные имена устройств... )

Просто раньше никогда не работал так с железками, поэтому и такие детские вопросы... )

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

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

« Ответ #7 : 21-10-2011 11:29 » 

http://www.lvr.com/hidpage.htm
вот тут посмотрите, наверное подойдет для начала)
там в разделе софта одна из тестовых программулек выдает список устройств и позволяет некоторые IOCTL вызывать для них. попробуйте поиграться)
ну и так - глянуть чего там есть полезного)

драйвера для HID имеют стандартный интерфейс, описание http://msdn.microsoft.com/en-us/library/ff538848(VS.85).aspx
чтобы вызвать эти IOCTL - есть DeviceIOControl() API.
поэтому драйвер заново писать не обязательно) его надо просто отлучить от самодеятельности ОС)

PS собстно HID - это как раз некая стандартизация программного интерфейса. чтобы вести весь обмен данными с железкой на уровне стандартных сообщений и стандартных команд независимо от ее типа.

PS да. найдите книжку Агурова. страница 148 - HID устройства.
PPS по нему. если тип устройства определен как клавиатура или мышь - windows позволяет делать createFile но блокирует Readfile.
« Последнее редактирование: 21-10-2011 11:53 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #8 : 24-10-2011 09:53 » 

посмотрел ) многое уже видел.

новые соображения:
в общем если отключаем драйвер HID клавиатуры(ставим просто в HID совместимое(то есть не загружаются драйверы)), то устройство уже вообще не находится как HID устройство с помощью прог типа снифферов и прочее... 
Вторая его составная часть - USB устройство ввода. к ней(не знаю почему) не удается подключится с помощью createfile Жаль. (подумал, раз оно использует драйвера hid класса(hidusb и hidclass), то можно оттуда принимать данные,... фигушки), хотя обычную клаву открывает. И Агуров тут уже не помощник....
Записан
Ochkarik
Модератор

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

« Ответ #9 : 24-10-2011 10:17 » 

не, каша)

значится насколько я понимаю, есть программный, интерфейс HID, доступный пользователю.
для его создания стоит драйвер соответствующего класса HID. этот драйвер класса имеет описанный и стандартизированный интерфейс.
он в свою очередь ищет и подключается к драйверам -минипорта, которые тоже имеют стандартный интерфейс. эти драйвера общаются с железом, и формируют что то типа HAL для HID интерфейса.

так вот, если вы изымите драйвер класса HID, и не будете аттачить драйвер минипорта к драйверу класса HID, то должна остаться возможность использовать его  напрямую. но для этого необходимо использовать не стандартные снифера (которые должны работать через драйвер класса), а тот самый интерфейс минипорта.
вы посмотрите HID Minidriver IOCTLs, msdn говорит что этот интерфейс нельзя вызывать из ring-3, но если отсоединить устройство минидрайвера от HID класса, то я не вижу причин почему бы этому фокусу не иметь право на существование.
для этого вам надо знать - под какими именем встает устройство минипорта в системе.
и единственное препятствие для такого использования - это выделение памяти для передачи данных IOCTL. надо смотреть какой тип IOCTL (по дефенишену кода ioctl) там используется.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #10 : 25-10-2011 05:18 » 

Крыша едет не спеша.... )) уже по ночам драйверы снятся С ума сойти...

еще разок

изначально загужается драйвер клавиатуры. Я его отключаю, чтобы он не мешался. остается тогда просто устройство с HID интерфейсом. В списке HID устройств оно теперь не обнаруживается.

Если я правильно понял, то минидрайвер для всего класса - hidusb.sys, а драйвер класса hidclass.sys (не аттачить - не грузить оба? inf файл править? чего то не получается. Загружается с ошибкой 10.)
В системе устройство находится. USB#vid_...&pid.... и прочее. GUID этого устройства - не GUID HID, а USB - устройств ввода.
Для использования IOCTLов через DeviceIOControl надо знать дескриптор устройства. Я его не могу получить через createfile по найденному пути "USB#vid_...&pid.... ".

Проверил другой считыватель. Как кто-то заикнулся: "с USB интерфейсом, а потому и стоит в n раз дороже". Для его грузятся драйверы те же(hidusb.sys, hidclass.sys) но при этом оно видится в списке HID устрйоств. С ним проблем нет.

То есть все видимо зависит от внутреннего устройства железки? То есть в первой в дескрипторе конкретно прописано, что это HID-клавиатура и с другими стандартными драйверами, кроме kbdhid, kbdclass она работать не хочет.
Записан
Ochkarik
Модератор

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

« Ответ #11 : 27-10-2011 21:08 » 

я кажется сам тоже  запутался)  
по агурову:
тип HID устройства (в частности клавиатура), должно указываться в дескрипторе который железка отдает.
более того - этот тип( как и мышь) - является зарезервированным для USB-HID устройств.

да, попробуйте найти inf, и исключить только секцию которая грузит класс.
после этого возможно загрузится только минидрайвер, к которому возможно получится обратится из приложения.
но уже не как к HID устройтсву, а как к минидрайверу с его интерфейсом. надо только его имя узнать...

PS но возможно я тут совсем не прав)
« Последнее редактирование: 27-10-2011 21:13 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #12 : 28-10-2011 03:21 » 

Да, в железке написано, что это клава. Но и в железке жедолжно быть написано, что это просто HID совместимое устройство. Поэитому он ставит на нее драйвера HID устройства.
Ваш MSDN Улыбаюсь говорит, что вообще есть возможность напрямую общаться с драйверами HID класса, в обход дров клавиатуры(например я их убрал). Но эта железка этого не позволяет... Вот почему, это уже вопрос. Переписывать дескриптор железки, не зная как она физически устроена, мне кажется, не стоит.

Вообще нашел такую же проблему со сканерами штрихкодов, магнитных лент на картах. Производители штрихкодсканеров выпускают драйвера, которые эмулируют ком порт (как я понял, например, 1С работает только с ком портами). Есть драйвера для датакабелей юсб, которые тоже их эмулируют как ком. Но там везде привязка к физическому устройству (к чипу или че там). Завтра в принципе дадут переходник юсб-ком, попробую. Но возможно, если сама железка не поддерживает такой интерфейс как ком, то не получится. и мне кажется, что не получится)))

А если писать фильтр-драйвер (как для клавы) и ставить его на ридер, перехватытвать считанные циферки и дальше их не пускать, в драйвер оснвой клавы? Но надо куда то тогда девать считанные циферки. Причем прям из драйвера. Пока не знаю куда и как ) Может так?
Записан
Ochkarik
Модератор

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

« Ответ #13 : 31-10-2011 12:06 » 

можно и так наверное)
девать - в буфер. потом в приложение. к примеру.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
DneprSMV
Помогающий

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

« Ответ #14 : 31-10-2011 13:34 » 

Sky Dragon,
. . .
 Но хочется, чтобы эта клавиатура работала не всегда, а только тогда, когда ей скажут
. . .
не знаю, может из другой "оперы" - рассмотри вариант с программным отключением питания требуемого USB-порта.
Включением, соответственно, "когда надо". (через драйвер)
----
Если это не разовый проект, сейчас есть недорогие микроконтроллеры с USB интерфейсом.
Реализация на контроллере клавиатуры - типовой пример из AN.
Также возможно что есть команды, которые можено передавать на девайс, вроде вкл/откл
(стандартный драйвер о них "не знает").

Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #15 : 01-11-2011 03:23 » 

DneprSMV, отключать/включать не пойдет. Так как все равно устройство останется обычной клавиатурой.
Про микроконтроллеры - это наверно не вариант. Нету людей, кто бы знал, как с ними работать.И в нашем случае упор именно в низкую цену. Такая политика )

Ochkarik, спасибо за помощь. В ходе изобретения велосипеда был найден уже готовый. Именно фильтр драйвер, который и пишет, токлько не в буфер, а в реестр.
http://smart-eyes.com/?p=21

Буду просить исходный код, чтобы еще и самому разобраться.

Записан
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #16 : 28-11-2011 08:00 » 

Мне понравилось на вашем форуме ) Поэтому вернусь сюда еще раз.

Продолжу ту же тему.
Найденный драйвер не устраивает, так как пишет в реестр. На висте или 7 для доступа к реестру необходимы права админа. И не факт что у пользователя они будут.

Начал читать про сканеры штрих-кодов, так как они тем же больны. Но многие производители(!) выпускают эти сканеры в 3х-4х версиях. Просто RS-232, USB-HID("в разрыв клавиатуры", как пишут), USB с эмуляцией COM. (ну все они на 1С направлены естессно). И говорится, что из одного интерфейса в другой никак не перестроить. Причем различаются они конкретно шнурками по всей видимости, который и вставляется в ПК. И причем драйверы для эмуляции для каждого сканера разные! (эмуляцию COM так же встречал и в мобильных телефонах. Аналогично у каждой модели свой драйвер.)
А также что USB HID сканер нельзя переделать под сканер с эмуляцией COM...

Причем тут еще такая ситуация. Есть драйверы, которые ставятся на USB устройтво и тогда внда видит его, что это вирт COM порт. И видимо в дальнейшем это не будет зависеть от того, в какую розетку воткнут сканер.
А есть еще драйверы, который ставятся на USB контроллеры/концентраторы. Например на сайте FTDI (пока еще не попробовал с этим похимичить).

Вот вопросики:
1. Имеет ли смысл что-то пробовать сделать с моим карт ридером на уровне "до клавиатуры"? Мне кажется это может сделать тока изготовитель только конкретно с железкой. То есть например как-то эмулировать интерфейс Rs-232...
2. Снова к фильтру. Куда можно писать данные из фильтр драйвера, кроме как реестра? Причем желательно туда, где есть только доступ для чтения.
Записан
Ochkarik
Модератор

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

« Ответ #17 : 29-11-2011 09:59 » 

ну раз никто не отвечает, придется мне)))
1. насчет первого вопроса - я не совсем понял, в каком смысле "с картридером до клавиатуры"
2. данные из драйвера.. а зачем их куда то писать? читать можно напрямую из драйвера ReadFile
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sky Dragon
Интересующийся

ru
Offline Offline

« Ответ #18 : 30-11-2011 03:06 » 

Улыбаюсь

1. До клавиатуры - это в смысле придумать что-нибудь такое, чтобы убрать драйвер клавиатуры совсем.
2. Разве драйвер клавиатуры (ну или фильтр-драйвер. но клавиатуры) позволит обратиться через ReadFile?
Записан
Ochkarik
Модератор

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

« Ответ #19 : 01-12-2011 14:25 » 

по моему любой драйвер позволяет... если он имеет интерфейс по которому к нему обратится. открыть...
хотя, возможно с UAC будут такие же проблемы. тут тоже сначала надо выяснить есть  ли доступ к интерфейсам дров в семерке не под админом? я не пробовал, поэтому подсказать не смогу.
у меня были проблемы с доступом по IOControl, но насчет Read/Write я не знаю.
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines