VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
1

Свой драйвер COM порта для USB устройства

19.12.2016, 19:22. Показов 20630. Ответов 128
Метки нет (Все метки)

Всем здрасте...
Хотелось бы услышать мнения профессионалов. В частности Убежденного видел много сообщений от него..
Итак. Есть устройство usb, в данный момент используется виндовый usbser, но говорят работает плохо.
Мне поставили задачу(я на первом своём испытательном сроке) написать драйвер для данного устройства. Драйвер должен эмулировать COM порт(основной приоритет), а также возможно как сетевое устройство или сырой обмен, можно все вместе.
Знания драйверов у меня на уровне хелловорлд. Английский очень плохо. Читаю Уолтер Они, Комиссарова, Агуров, USB in Nutshell.
Вопрос первый - реально ли с моими знаниями хорошо сделать это за 2 месяца?
Вопрос второй - направьте меня на путь истинный)) дельные советы дайте
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2016, 19:22
Ответы с готовыми решениями:

Свой драйвер для устройства ...
Здравствуйте друзья. Мне очень интересна схематехника, но минус мой в том что я плохо ее знаю. А...

Возможно ли создать драйвер для usb-устройства на шарпе?
Создал usb-девайс, воткнул в компьютер, и в операционной системе windows в диспетчере устройств он...

Драйвер USB устройства
Задача состоит в написании драйвера для флешки или USB мыши. Перечитал массу статей, начал читать...

Переводить команды USB WIFI Адаптера через компьютер по USB-USB для устройства
name: как передавать сигнал от требующего установку драйверов USB WIFI Адаптера через компьютер по...

128
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.12.2016, 21:12 2
Цитата Сообщение от VD Посмотреть сообщение
Хотелось бы услышать мнения профессионалов. В частности Убежденного
Я, к сожалению, ничего дельного по теме написать не смогу, так как
программированием устройств не занимаюсь и знания у меня в этой
области чисто теоретические и очень поверхностные.

Цитата Сообщение от VD Посмотреть сообщение
Вопрос первый - реально ли с моими знаниями хорошо сделать это за 2 месяца?
Нет.


А как ты попал в разработку драйверов USB, - такую головоломную и сложную тему, -
со "знанием драйверов у меня на уровне хелловорлд" и английским, который "очень плохо"?

Цитата Сообщение от VD Посмотреть сообщение
Вопрос второй - направьте меня на путь истинный)) дельные советы дайте
Пиши код, исследуй, думай, задавай вопросы.
2 месяца - нет, не реально. Но за полгодика, думаю, вполне можно что-то наваять...
1
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
22.12.2016, 11:44  [ТС] 3
А может стоит начать с WDF. Может быстрее получится решить задачу?
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
22.12.2016, 11:54 4
WDF хорош тем, что позволяет сконцентрироваться на задаче, не отвлекаясь на реализацию.
Но с WDF или без него - тебе все равно придется осваивать науку программирования в ядре:
устройство памяти, уровни привилегий, контексты, IRQL, синхронизация, стандартные
функции, планировщик, системные API и т.д. От этого никуда не денешься.
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
22.12.2016, 12:04  [ТС] 5
Да я бы и не спрашивал а начал c всего этого.. читал здесь комменты по этому поводу ваши.. просто время.. боюсь не успеть и не примут. А может набросать план действий для конкретной задачи? Сделать из USB устройства COM порт, а то сказали стандартный usbser глючит? План в смысле изучить...список глав например из Уолтера Они или еще что то. Может есть где пример какой. Может потренироваться с флешкой есть какие примеры несложные чтоб USB понять. А то в голове каша пока... т.к. в википедии написано: "WDM требует от разработчиков драйверов полного знакомства со множеством сложных технических деталей перед написанием даже простейшего драйвера."
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
22.12.2016, 12:36 6
Цитата Сообщение от VD Посмотреть сообщение
А то в голове каша пока... т.к. в википедии написано: "WDM требует от разработчиков драйверов полного знакомства со множеством сложных технических деталей перед написанием даже простейшего драйвера."
Так оно и есть. И добавить к этому нечего.

"Приняли на работу хирургом, как скальпель держать правильно?
Может, есть какие-то видеоуроки, чтобы побыстрее начать оперировать?
А то в Википедии написано: хирургия требует от хирурга высокого мастерства и
знания множества технических деталей перед проведением даже самой
простой операции"...
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
22.12.2016, 12:38  [ТС] 7
Да я же не прошу у вас книжку как за 11 дней выучить С++. Я просто хочу выжать максимум из этого времени и не тратить время на вещи которые можно потом освоить
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
22.12.2016, 12:44 8
Начни с чтения литературы. В первую очередь Уолтер Они и MSDN, главы, связанные с
общими вопросами программирования драйверов и USB в частности.

Скачай Windows Driver Kit и изучай исходники примеров для USB. Они сейчас есть онлайн.
Вопросов, которые будут возникать по ходу изучения, хватит для полной и глубокой
загрузки на много лет

А два месяца - нет, это совершенно нереально.
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
26.12.2016, 19:31  [ТС] 9
Взял пример stupid из Они, сделал инициализации в DriverEntry, в AddDevice создал device object, зарегистрировал в ней интерфейс COM порта, и посадил созданный девайс в стек. Взял валявшийся у меня usb rutoken, взял inf файл от его дров, там тоже прописал интерфейс для ком порта. В итоге когда я подключаю рутокен вызывается AddDevice. Я правильно двигаюсь? Теперь я так понимаю нужно сделать обработку IRP от PnP, Power и WMI т.к. все WDM драйверы должны это уметь? И для моих целей обработку Read Write? Получается есть наверно какая то спецификация по преобразованию запросов IRP для дальнейшей передачи их на драйвер шины? А можно в общих словах объяснить логику обработки PnP, Power и WMI например если устройство питается от USB и нет?
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
26.12.2016, 19:49 10
Цитата Сообщение от VD Посмотреть сообщение
Взял пример stupid из Они, сделал инициализации в DriverEntry, в AddDevice создал device object, зарегистрировал в ней интерфейс COM порта, и посадил созданный девайс в стек. Взял валявшийся у меня usb rutoken, взял inf файл от его дров, там тоже прописал интерфейс для ком порта.
Ну что ж, поздравляю, это весьма глубокое продвижение за такой короткий срок!

Цитата Сообщение от VD Посмотреть сообщение
Я правильно двигаюсь?
Судя по успехам - да.

Цитата Сообщение от VD Посмотреть сообщение
Теперь я так понимаю нужно сделать обработку IRP от PnP, Power и WMI т.к. все WDM драйверы должны это уметь?
Да.
PnP и Power - обязательно. WMI - опционально.

Цитата Сообщение от VD Посмотреть сообщение
Получается есть наверно какая то спецификация по преобразованию запросов IRP для дальнейшей передачи их на драйвер шины?
Цитата Сообщение от VD Посмотреть сообщение
А можно в общих словах объяснить логику обработки PnP, Power и WMI например если устройство питается от USB и нет?
Логика обработки PnP и Power во всех драйверах одинакова на 90-95%.
5% - это специфика твоего драйвера и/или устройства, которым он управляет.
Если ты программируешь какое-то устройство, то у тебя должна быть спецификация для него.
Иначе это мало чем будет отличаться от реверс инжиниринга...
1
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
27.12.2016, 21:24  [ТС] 11
Вроде как появился COM3 в диспетчере устройств. IoRegisterDeviceInterface и IoSetDeviceInterfaceState вызываются. Но putty не подключается к нему, как будто его нет. Я что то не так понял или не дочитал?
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.12.2016, 08:46 12
"Я написал программу. Но она не работает. Я что-то сделал не так?"


Давай уже конкретику.
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
28.12.2016, 11:17  [ТС] 13
Нуу я не написал, я просто взял пример toaster/func из ddk 2600, и изменил там пару строчек

Добавлено через 1 час 35 минут
C++
1
2
3
4
5
6
7
8
// COM {4d36e978-e325-11ce-bfc1-08002be10318}
DEFINE_GUID(GUID_DEVINTERFACE_COM, 
        0x4d36e978L, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18);
...
    status = IoRegisterDeviceInterface(PhysicalDeviceObject, &GUID_DEVINTERFACE_COM, NULL, &fdoData->InterfaceName);
    DbgPrint("%wZ", &fdoData->InterfaceName);
...
status = IoSetDeviceInterfaceState(&FdoData->InterfaceName, TRUE);
После этого я могу обращаться к com порту например по com3 или еще что то нужно? Вроде почитал msdn не особо въехал. Написано что то типа пользовательские приложения могут использовать &fdoData->InterfaceName
&fdoData->InterfaceName

Добавлено через 37 минут
О вот на \\.\USB#Vid_.........{4d36e978-e325-11ce-bfc1-08002be10318} реагирует, когда я ввожу это в pytty. Выдает код для STATUS_NOT_SUPPORTED. А как сделать так чтоб он на имя COM... реагировал?
0
Ушел с форума
Эксперт С++
16452 / 7416 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.12.2016, 11:21 14
Создай символьную ссылку COM -> \\.\USB#Vid...
А вообще, здесь моя сфера знаний заканчивается. Я реальные устройства никогда не
программировал, занимался только безопасностью - перехват процессов, фильтрация на
разных уровнях, недокументированные возможности системы, сигнатурный поиск и т.п.
Так что на меня в вопросах программирования железа лучше не полагаться
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
29.12.2016, 10:52  [ТС] 15
Да я в курсе читал уже в каком то посте про "безопасностью - перехват процессов, фильтрация на
разных уро....". Ладно спасибо..лихо там в примере все закручено буду разбираться

Добавлено через 23 часа 22 минуты
Создай символьную ссылку COM -> \\.\USB#Vid...
Что то не получается создать символьную ссылку на символьную ссылку
C++
1
2
3
4
5
6
7
8
status = IoRegisterDeviceInterface(PhysicalDeviceObject, &GUID_DEVINTERFACE_COM, NULL, &fdoData->InterfaceName);
status = IoCreateSymbolicLink(&fdoData->portName, &fdoData->InterfaceName);
if (!NT_SUCCESS (status)) 
{
    DbgPrint("  XXX   Filed Create Symbolic Link");
    DbgPrint("  XXX   %wZ", &fdoData->InterfaceName);
    DbgPrint("  XXX   %wZ", &fdoData->portName);
}
XXX Filed Create Symbolic Link
XXX \??\USB#Vid_0a89&Pid_0020#5&18f54cb7&0&2#{4d36e978-e325-11ce-bfc1-08002be10318}
XXX COM3
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
02.02.2017, 15:54  [ТС] 16
Кто нибудь разбирается в запросах к USB CDC устройству
Например как отправить SET_CONTROL_LINE_STATE?
Накопал UsbBuildVendorRequest в MSDN с запросом GET_LINE_CODING получилось. А с SET_CONTROL_LINE_STATE не очень
0
1365 / 510 / 70
Регистрация: 21.07.2015
Сообщений: 1,290
07.02.2017, 12:32 17
VD, найди документацию на свой чип, там должно быть описание usb-запросов. Я думаю, что там одна или две дополнительные конечные точки, одна из них скорее всего имеет тип передачи по прерыванию. По второй данные записываются в порт, а возможно что и вообще через 0ю (контрольную) запись и управление идет. В любом случае для инициализации устройства нужно установить ему конфигурацию одноименным стандартным запросом. По умолчанию у USB устройств обычна установлена конфигурация ожидания, в которой по факту только могут отвечать на запросы (типа режим спячки такой). Также тебе потребуются запросы установки параметров обмена (скорости обмена и прочего). В крайнем случае залезь в исходники линуксового драйвера.
ЗЫ: я много работал с USB железом, но только не в винде (через свой самописный драйвер хост-контроллера). Поэтому могу просто подсказать по железной части, про программную модель USB видны не знаю и знать не хочу.
1
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
08.02.2017, 08:12  [ТС] 18
Спасибо за ответ. Да конфигурация уже была установлена и с этим разобрался в принципе, простой обмен прошел устройство отвечает. Оно соответствует спецификации CDC, узнал все из дескрипторов там 4 конечные точки. 2 для данных bulk, нулевая и прерывающая. Ни как не пойму как задействована прерывающая. Снифером смотрел как стандартный драйвер от майкрософт общается с устройством, но запросов к прерывающей точке не видел.

И как моему драйверу узнавать что есть данные для считывания. Прерываний для USB нет, вроде как хост опрашивает. В винде я так понимаю этим занимаются драйверы хоста и прочее их куча под моим. Может кто то из них оповещает мой драйвер? Может кто то знает кроме товарища shmkv, который не хочет об этом знать
0
1365 / 510 / 70
Регистрация: 21.07.2015
Сообщений: 1,290
08.02.2017, 13:46 19
Цитата Сообщение от VD Посмотреть сообщение
Снифером смотрел как стандартный драйвер от майкрософт общается с устройством, но запросов к прерывающей точке не видел.
А данные в этот момент принимаются?
Цитата Сообщение от VD Посмотреть сообщение
И как моему драйверу узнавать что есть данные для считывания.
Мне думалось, что для этого и предназначена interrupt-in КТ. Тогда всех проще посмотреть снифером какие команды и куда шлет виндовый драйвер и потом отыскать их в документации. Я думаю, что там какой-то запрос наличия данных в буфере постоянно высылается, а после него уже команда считывания данных. А непосредственно сами данные вчитываются из bulk-in. В винде должен быть механизм асинхронного уведомления о завершении обработки USB запроса.
0
VD
24 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 160
08.02.2017, 14:18  [ТС] 20
Да данные в этот момент принимаются и нет запросов к прерывающей точке. Хост вроде как опрашивает все устройства на шине. Ну по идее он должен бы моему сообщить драйверу что есть данные для приема и я уже сигнализировать об этом приложению чтоб оно выдало запрос на чтение. Короче ни как пока не въеду
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2017, 14:18
Помогаю со студенческими работами здесь

USB-адаптер TL-WN727N: "Не удалось инициализировать драйвер этого устройства. (Код 37)"
Беспроводной сетевой USB-адаптер TL-WN727N. Все было нормально, пока не обновил 10-ку. Сейчас у...

Драйвер для COM-порта
Доброго времени суток. Подскажите нужен ли драйвер на порт RS232 под windos7? Зарание спасибо за...

Драйвер-фильтр для COM порта
Всем привет и доброго времени суток! //Я надеюсь кто-нибудь сможет мне помочь Передо мной...

Драйвер для устройства
Нужен срочно драйвер для этого устройства...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru