24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
1 |
|
19.12.2016, 19:22. Показов 21196. Ответов 128
Всем здрасте…
__________________
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
19.12.2016, 21:12 |
2 |
Хотелось бы услышать мнения профессионалов. В частности Убежденного Я, к сожалению, ничего дельного по теме написать не смогу, так как
Вопрос первый — реально ли с моими знаниями хорошо сделать это за 2 месяца? Нет. А как ты попал в разработку драйверов USB, — такую головоломную и сложную тему, —
Вопрос второй — направьте меня на путь истинный)) дельные советы дайте Пиши код, исследуй, думай, задавай вопросы.
1 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
22.12.2016, 11:44 [ТС] |
3 |
А может стоит начать с WDF. Может быстрее получится решить задачу?
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
22.12.2016, 11:54 |
4 |
WDF хорош тем, что позволяет сконцентрироваться на задаче, не отвлекаясь на реализацию.
0 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
22.12.2016, 12:04 [ТС] |
5 |
Да я бы и не спрашивал а начал c всего этого.. читал здесь комменты по этому поводу ваши.. просто время.. боюсь не успеть и не примут. А может набросать план действий для конкретной задачи? Сделать из USB устройства COM порт, а то сказали стандартный usbser глючит? План в смысле изучить…список глав например из Уолтера Они или еще что то. Может есть где пример какой. Может потренироваться с флешкой есть какие примеры несложные чтоб USB понять. А то в голове каша пока… т.к. в википедии написано: «WDM требует от разработчиков драйверов полного знакомства со множеством сложных технических деталей перед написанием даже простейшего драйвера.»
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
22.12.2016, 12:36 |
6 |
А то в голове каша пока… т.к. в википедии написано: «WDM требует от разработчиков драйверов полного знакомства со множеством сложных технических деталей перед написанием даже простейшего драйвера.» Так оно и есть. И добавить к этому нечего. «Приняли на работу хирургом, как скальпель держать правильно?
0 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
22.12.2016, 12:38 [ТС] |
7 |
Да я же не прошу у вас книжку как за 11 дней выучить С++. Я просто хочу выжать максимум из этого времени и не тратить время на вещи которые можно потом освоить
0 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
22.12.2016, 12:44 |
8 |
Начни с чтения литературы. В первую очередь Уолтер Они и MSDN, главы, связанные с Скачай Windows Driver Kit и изучай исходники примеров для USB. Они сейчас есть онлайн. А два месяца — нет, это совершенно нереально.
0 |
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 |
Ушел с форума 16456 / 7420 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
26.12.2016, 19:49 |
10 |
Взял пример stupid из Они, сделал инициализации в DriverEntry, в AddDevice создал device object, зарегистрировал в ней интерфейс COM порта, и посадил созданный девайс в стек. Взял валявшийся у меня usb rutoken, взял inf файл от его дров, там тоже прописал интерфейс для ком порта. Ну что ж, поздравляю, это весьма глубокое продвижение за такой короткий срок!
Я правильно двигаюсь? Судя по успехам — да.
Теперь я так понимаю нужно сделать обработку IRP от PnP, Power и WMI т.к. все WDM драйверы должны это уметь? Да.
Получается есть наверно какая то спецификация по преобразованию запросов IRP для дальнейшей передачи их на драйвер шины?
А можно в общих словах объяснить логику обработки PnP, Power и WMI например если устройство питается от USB и нет? Логика обработки PnP и Power во всех драйверах одинакова на 90-95%.
1 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
27.12.2016, 21:24 [ТС] |
11 |
Вроде как появился COM3 в диспетчере устройств. IoRegisterDeviceInterface и IoSetDeviceInterfaceState вызываются. Но putty не подключается к нему, как будто его нет. Я что то не так понял или не дочитал?
0 |
Ушел с форума 16456 / 7420 / 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 минут
После этого я могу обращаться к com порту например по com3 или еще что то нужно? Вроде почитал msdn не особо въехал. Написано что то типа пользовательские приложения могут использовать &fdoData->InterfaceName Добавлено через 37 минут
0 |
Ушел с форума 16456 / 7420 / 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 минуты
XXX Filed Create Symbolic Link
0 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
02.02.2017, 15:54 [ТС] |
16 |
Кто нибудь разбирается в запросах к USB CDC устройству
0 |
1366 / 511 / 70 Регистрация: 21.07.2015 Сообщений: 1,290 |
|
07.02.2017, 12:32 |
17 |
VD, найди документацию на свой чип, там должно быть описание usb-запросов. Я думаю, что там одна или две дополнительные конечные точки, одна из них скорее всего имеет тип передачи по прерыванию. По второй данные записываются в порт, а возможно что и вообще через 0ю (контрольную) запись и управление идет. В любом случае для инициализации устройства нужно установить ему конфигурацию одноименным стандартным запросом. По умолчанию у USB устройств обычна установлена конфигурация ожидания, в которой по факту только могут отвечать на запросы (типа режим спячки такой). Также тебе потребуются запросы установки параметров обмена (скорости обмена и прочего). В крайнем случае залезь в исходники линуксового драйвера.
1 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
08.02.2017, 08:12 [ТС] |
18 |
Спасибо за ответ. Да конфигурация уже была установлена и с этим разобрался в принципе, простой обмен прошел устройство отвечает. Оно соответствует спецификации CDC, узнал все из дескрипторов там 4 конечные точки. 2 для данных bulk, нулевая и прерывающая. Ни как не пойму как задействована прерывающая. Снифером смотрел как стандартный драйвер от майкрософт общается с устройством, но запросов к прерывающей точке не видел. И как моему драйверу узнавать что есть данные для считывания. Прерываний для USB нет, вроде как хост опрашивает. В винде я так понимаю этим занимаются драйверы хоста и прочее их куча под моим. Может кто то из них оповещает мой драйвер? Может кто то знает кроме товарища shmkv, который не хочет об этом знать
0 |
1366 / 511 / 70 Регистрация: 21.07.2015 Сообщений: 1,290 |
|
08.02.2017, 13:46 |
19 |
Снифером смотрел как стандартный драйвер от майкрософт общается с устройством, но запросов к прерывающей точке не видел. А данные в этот момент принимаются?
И как моему драйверу узнавать что есть данные для считывания. Мне думалось, что для этого и предназначена interrupt-in КТ. Тогда всех проще посмотреть снифером какие команды и куда шлет виндовый драйвер и потом отыскать их в документации. Я думаю, что там какой-то запрос наличия данных в буфере постоянно высылается, а после него уже команда считывания данных. А непосредственно сами данные вчитываются из bulk-in. В винде должен быть механизм асинхронного уведомления о завершении обработки USB запроса.
0 |
24 / 13 / 3 Регистрация: 02.08.2012 Сообщений: 160 |
|
08.02.2017, 14:18 [ТС] |
20 |
Да данные в этот момент принимаются и нет запросов к прерывающей точке. Хост вроде как опрашивает все устройства на шине. Ну по идее он должен бы моему сообщить драйверу что есть данные для приема и я уже сигнализировать об этом приложению чтоб оно выдало запрос на чтение. Короче ни как пока не въеду
0 |
Микроконтроллеры К1986ВЕ1QI, К1986ВЕ92QI, К1901ВЦ1GI и К1986ВК01GI имеют контроллер USB-интерфейса, реализующий функции контроллера ведомого устройства (Device) и ведущего устройства (Host). В составе библиотеки SPL приведён пример для ведомого устройства (Device) под названием «VCOM_Echo», который позволяет использовать МК в качестве CDC USB устройства (Класс Коммуникационного Устройства), настроенного как виртуальный COM-порт. Чтобы ПК определял МК именно как устройство, подключенное по COM-порту, необходимо установить специальный драйвер. Ссылка на скачивание драйвера доступна в конце статьи.
В данной статье рассмотрена пошаговая установка драйвера Virtual COM порт в ОС Windows 7.
Установка драйвера
Для установки драйвера виртуального COM-порта необходимо иметь права администратора!
Загружаем в МК проект «VCOM_Echo» и подключаем отладочную плату к ПК с помощью кабеля USB A-B. На ПК открываем «Диспетчер устройств Windows», его можно найти в поиске меню «Пуск». Если драйвер не установлен, то после подключения МК по USB в диспетчере устройств появится «Неизвестное устройство». Открываем «свойства» нового устройства, как показано на рисунке 1.
Рисунок 1 — Диспетчер устройств Windows: неизвестное устройство
Если МК определился в группе «Контроллеры USB» и отображается как «Unknown Device», вероятно был нарушен протокол обмена по USB, и проблему следует искать в ПО МК.
В открывшемся окне «Свойства…» выбираем пункт «Изменить параметры» (рисунок 2), при этом возможно потребуется ввести пароль администратора.
Рисунок 2 — Свойства «неизвестного устройства»
В новом окне выбираем пункт «Обновить драйвер», как показано на рисунке 3.
Рисунок 3 — Обновление драйвера в окне «Свойства…»
Здесь необходимо выбрать «поиск драйверов на компьютере» (рисунок 4).
Рисунок 4 — Окно «Обновление драйверов»
Теперь необходимо разархивировать папку с драйверами в любую директорию на ПК, например, в корень диска С, после чего в открывшемся окне нужно указать путь к папке с драйвером и нажать кнопку «Далее» (рисунок 5).
Рисунок 5 — Окно «Обновление драйверов»: выбор директории с драйвером
В процессе установки Windows может вывести предупреждение, в котором необходимо выбрать пункт «Всё равно установить этот драйвер», как показано на рисунке 6.
Рисунок 6 — Окно с предупреждением при установке драйвера
После установки драйвера в диспетчере устройств во вкладке «Порты(COM и LPT)» должно появиться новое устройство «Milandr USB RS-232 Emulation Driver» (рисунок 7).
Рисунок 7 — Диспетчер устройств Windows: новое COM-устройство
Если установить всё-таки не получается, то
Можно попробовать запустить операционную систему Windows в безопасном режиме или режиме с отключенной обязательной проверкой подписи драйверов.
Для Windows 7 при запуске компьютера необходимо быстро нажимать клавишу F8, после чего появится окно аналогично тому, что представлено на рисунке 8. После этого выбрать либо безопасный режим, либо режим с отключенной обязательной проверкой подписи драйверов и попробовать установить драйвер снова.
Рисунок 8 — Дополнительные варианты загрузки Windows 7
Для Windows 8 и 10 есть несколько способов перейти в аналогичное Windows 7 меню выбора режима загрузки, но самый простой заключается в том, чтобы нажать кнопку «Перезагрузка» вместе с зажатой кнопкой Shift прямо в меню «Пуск» (рисунок 9).
Рисунок 9 — Алгоритм попадания в первоначальный загрузчик Windows
После перезагрузки всплывёт полностью синий экран с различными вариантами загрузки операционной системы, необходимо перейти в меню «Поиск и устранение неисправностей» > «Дополнительный параметры» > «Параметры загрузки». После этого всплывёт окно с выбором режима загрузки операционной системы, как на рисунке 10.
Рисунок 10 — Меню выбора режимов загрузки Windows 8 (10)
Соответственно, также необходимо выбрать либо безопасный режим, либо режим с отключенной обязательной проверкой подписи драйверов и попробовать установить драйвер снова.
Сохранить статью в PDF
В статье описывается 2 проекта, основанные на библиотеке V-USB — CDC-232 и CDC-IO. Автор — Osamu Tamura @ Recursion Co., Ltd.
Оба проекта представляют из себя простую схему на микроконтроллере AVR (ATtiny45/85, ATtiny461, ATtiny2313, ATmega8/48/88), которая при подключении к порту USB компьютера (далее просто PC) создает виртуальный COM-порт. В обоих проектах используется бесплатная библиотека V-USB, которая позволяет средствами firmware, прошитого в микроконтроллер AVR, поддержать работу интерфейса USB. Первый проект (CDC-232) создает на компьютере виртуальный COM-порт, через который можно обмениваться данными с каким-нибудь другим устройством, имеющим низковольтный RS-232C (например, с микроконтроллером AT89C51 Atmel). Второй проект (CDC-IO) тоже создает виртуальный COM-порт, но он предназначен для управления ресурсами микроконтроллера (регистрами внутреннего назначения). То есть посылкой простых текстовых команд в консольной программе Вы можете менять состояние ножек микроконтроллера AVR, читать их состояние, управлять таймерами — счетчиками, PWM, читать ADC и т. д.
[CDC-232]
CDC-232 создает виртуальный COM-порт на PC, даже если он не имеет реального порта RS-232C. Это позволяет производить обмен данными RS-232C (без сигналов управления) после подсоединения устройства и установки драйвера.
Виртуальный COM-порт, работающий через программную реализацию USB
[Применение CDC-232]
Запрограммируйте AVR, спаяйте схему и подключите устройство в порт USB компьютера. Установите драйвер (если у Вас операционная система Windows). Получите доступ к устройству через сгенерированный виртуальный COM-порт из программы терминала или написанную Вами программу (которая работает с COM-портом). Сигналы управления (DTR, DTS, RTS, CTS) не используются, поэтому настройте программу терминала в режим «no flow-control» (без контроля потока).
Windows запросит установку драйвера заново всякий раз, когда Вы подключите устройство в другой порт USB. Ранее установленный драйвер детектируется автоматически. Будет назначен другой номер COM-порта. Если Вы установите серийный номер в AVR (пересоберите исходный код с новым usbconfig.h), Вы можете получить тот же самый номер COM-порта на любом порте USB. Но в этом случае Вы не можете подключить сразу несколько устройств CDC с одним и тем же серийным номером.
Перед тем, как отсоединить устройство, закройте COM-порт в терминальной программе или в Вашем самописном приложении. В противном случае Вы не сможете подключить устройство снова из-за неверного дескриптора файла (broken file handle). В этом случае перезапустите программу терминала или Ваше приложение. Переключиться в режим быстрой передачи можно использованием «lowcdc.vbs», при этом можно получить скорость выше 9600 bps.
Loop-back тест на версии ATtiny45
[Принципиальные схемы CDC-232]
Эти схемы рассчитаны на ATtiny45/85, ATtiny2313/AT90S2313 и ATmega8/48/88/168. У всех этих микроконтроллеров firmware программируется через ISP. Красный LED понижает напряжение USB от 5V до 3.3V, и предоставляет его для AVR. Ток потребления около 10mA, и его мало для питания других узлов. Когда подключаетесь к другому MCU (микроконтроллеру), соедините Gnd и соедините TxD и RxD крест-накрест. R4 ограничивает обратный ток, когда внешний MCU питается от Vcc 5V (Вы можете R4 не ставить, если напряжение питания внешнего MCU равно 3.3V). R5 защищает ножку TxD, когда она замкнута на Gnd. Вы можете опустить и R4 и R5, если Вы соединяетесь через RS-232C драйвер наподобие MAX232. Используйте кварцевый резонатор. Несмотря на то, что керамический резонатор в большинстве случаев работает хорошо, но для данного применения он не подходит, поскольку уход частоты слишком большой, и поэтому устройство может работать нестабильно.
ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Frame) порта USB, когда устройство подключено к PC. UART в этом случае реализован программно. Он не может поддерживать высокую скорость передачи данных. Если TxD и RxD проинвертированы (пересоберите проект с опцией -DINVERT), Вы можете напрямую подключиться к сигналам RS-232C. Формат настройки порта 300-4800bps, 8N1.
CDC-232 для ATtiny45-20
Пример на ATtiny45 с использованием коннектора mini-B
У микроконтроллера ATtiny2313/AT90S2313 всего лишь 2 KB памяти программ. Механизм установки терминала опущен (т. е. автодетекта скорости нет). Установите переключатель DIP для смены скорости.
CDC-232 для ATtiny2313-20
У микроконтроллеров ATmega8/48/88’s внутренний UART конфигурируется от PC автоматически. Формат настройки 1200-57600bps, данные 7/8, четность N/E/O, количество стоп-бит 1/2
CDC-232 для ATmega8/48/88-20
Подключение к физическим линиям RS-232C требует инверсии полярности TxD и RxD, а также соответствие уровней сигнала. Используйте специальную IC наподобие MAX232. Вы можете её заменить простыми схемами (см. далее).
Когда целевой MCU имеет другое питание Vcc (отличное от 3.3V), образуются обратные токи утечки через сигнальные линии. Это искажает сигнал, либо подпитывает MCU без источника питания. Эта схема не очень хороша, но достаточна для большинства случаев.
[CDC-IO]
CDC-IO управляет регистрами специального назначения (Special Function Registers, SFR) микроконтроллера AVR через виртуальный COM-порт на PC. Это позволяет свободно читать/записывать параллельные порты MCU (ножки микроконтроллера). Работают также операции с таймерами/счетчиками, PWM, ADC, EEPROM, что позволяет приложению на PC достичь очень глубокого управления микроконтроллером и разрабатываемым на нем устройством.
Внешний интерфейс с использованием программной реализации протокола USB
[Применение CDC-IO]
Инсталляция такая же, как и у CDC-232. Скорость COM-порта произвольна. Отправка текстовых команд происходит через программу терминала или из вашей программы на PC. Если Вы хотите получить более высокую скорость передачи, используйте «lowcdc.vbs» для переключения в bulk transfer mode.
Набор команд CDC-IO (Instruction Set)
Функция | Команда | Формат | Ответ |
Who | @ | @ | «cdc-io», CR-LF |
Get | ? | address ? | data, CR-LF |
Set | = | data address = | CR-LF |
AND & Set | & | data address & | CR-LF |
OR & Set | | | data address | | CR-LF |
EX-OR & Set | ^ | data address ^ | CR-LF |
Set Double | $ | data2 data1 address $ | CR-LF |
Версия с ATtiny2313 имеет только команды «Set», «Get», «Xor».
В таблице команд использованы следующие обозначения:
address: адрес регистра SFR, отображенный на память (memory mapped) в hex-формате
data: 8 бит данные в hex
разделитель: Tab, Space, CR, LF
predefined addr (предопределенные символические адреса, case-insensitive, НЕ поддерживаются ATtiny2313): PINB, DDRB, PORTB PINC, DDRC, PORTC PIND, DDRD, PORTD
Примеры (‘_’ означает разделитель):
DDRB_?_ Возвращает значение DDRB вместе с CR-LF.
12_34_=_ Запись 0x12 по адресу 0x34, в ответ возвращает CR-LF.
FB_PORTC_&_ Запись (PORTC & 0xFB) в PORTC, возвращает CR-LF.
(примеры для ATtiny2313)
36_?_ Возвращает величину PINB(0x36) вместе с CR-LF.
12_37_=_ Запись 0x12 по адресу DDRB(0x37), возвращает CR-LF.
FB_38_^_ Запись (PORTB ^ 0xFB) в PORTB(0x38), возвращает CR-LF.
Предыдущие данные и адрес могут быть использованы повторно. Просто введите символ команды для повтора.
Команда «Set Double» используется для записи в EEPROM.
Избегайте изменения бит порта, на котором присутствуют сигналы USB. Используйте ‘&’, ‘|’ или ‘^’ для модифицирования направления порта (вход или выход). Используйте PIN* для переключения бит в противоположное состояние (toggle), если порт назначен как выход (output).
Когда разрешены прерывания, сообщается номер вектора прерывания, когда оно вызывается.
Все регистры SFR доступны. См. даташит AVR для использования таймеров, ADC, EEPROM, и т. п.
[Принципиальные схемы CDC-IO]
Если напряжение питания Vcc целевой схемы равно 5V, и порты AVR сконфигурированы как входы, поставьте резисторы (3K3…10Kом) для предотвращения обратного тока. Используйте только кварцевый резонатор. Несмотря на то, что керамический резонатор в большинстве случаев работает хорошо, но для данного применения он не подходит, поскольку уход частоты слишком большой, и поэтому устройство может работать нестабильно.
ATtiny45/85 использует внутренний RC-генератор и PLL. Он откалиброван на частоту 16.5 МГц по частоте сигнала SOF (Start Of Frame) порта USB, когда устройство подключено к PC.
CDC-IO для ATtiny45-20
CDC-IO для ATtiny461-20
Для ATtiny2313 реализованы только команды «Set», «Get» и «Xor» из-за ограниченной памяти программ этого микроконтроллера. Эта версия также не имеет механизма interrupt-report.
CDC-IO для ATtiny2313-20
CDC-IO для ATmega8/48/88-20
[Пример программы]
Это экспериментальная схема и пример программы для ATmega8/48. Программа написана на C, VB, VC, VC++ и C#. Вы можете использовать другие языки (или макросы), если они могут работать с портом RS-232C.
На фото показан внешний вид экспериментальной схемы
Регулятор изменяет тон пищалки и маску мигания светодиодов.
[Пример управления без программы]
Операционные системы позволяют работать с COM-портами, как с обычными файлами. Вот так, например, под Windows Вы можете послать команду устройству, которое создает виртуальный COM-порт COM3 (в текстовом файле comands.txt записана последовательность команд):
c:temp>copy comands.txt COM3
1 file(s) copied.
Что интересно — под Windows XP можно использовать только имена COM1..COM9. Имена COM10, COM11, COM12, COM13 и далее Windows не воспринимает как системные, и думает, что это не порт, а файл (даже если такой порт реально имеется в Диспетчере Устройств).
[Ссылки]
1. Исходные тексты программ и firmware, описанные в статье, документация, драйвер для w2k, XP, Vista.
2. Проект CDC-232, портированный на AVR-USB-MEGA16 (ATmega16 с кварцем на 16 МГц).
3. AVR-CDC — Virtual COM Port over Low-Speed USB site:recursion.jp — сайт AVR-CDC Osamu Tamura @ Recursion Co.
4. USB консоль для управления радиолюбительскими приборами.
Natur_Keks
Интересующийся |
Здравствуйте. На работе поставили задачу: написать драйвер, создающий виртуальный COM порт, к которому сторонняя прога подключается как к реальному, но все отправляемые данные должны перенаправляться моему приложению. Также и наоборот: все данные от моей проги должны через драйвер уходить в этот виртуальный COM порт(и соответственно стороннему приложению). |
||
|
RXL
Технический
|
http://sourceforge.net/projects/com0com/ |
||
… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |
Natur_Keks
Интересующийся |
http://sourceforge.net/projects/com0com/ Спасибо за ссылку, но данный вариант я уже предлагал начальству — ответ был отрицательный и до ужаса простой: зачем 2 виртуальных порта, когда нужен только один… Вот так |
||
|
RXL
Технический
|
А как второе приложение будет общаться с драйвером — об этом они подумали? И вообще, нафига изобретать велосипед, если все уже давно придумано. |
||
… мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |
Ochkarik |
эээ… я не совсем понимаю что требуется. если очень приперло, и во второй программе интерфейс COM не надо эмулировать, то можно поискать/изобрести драйвер. но я бы рекомендовал отбрехаться от этого дела) Добавлено через 13 минут и 22 секунды: |
||
RTFM уже хоть раз наконец! |
Natur_Keks
Интересующийся |
Насчёт невозможности открытия одного виртуального COM порта — программа VSPE http://www.radioscanner.ru/files/miscsoftware/file9815) каким-то образом это позволяет,т.е. возможно создать виртуальный COM порт, который можно открыть несколькими приложениями (типа Hyper Terminala) одновременно (проверял — работает). Причём данные из одного приложения передаюся в другое. |
||
|
darkelf
Молодой специалист |
Во второй программе,да действительно, интерфейс COM эмулировать не нужно — она (по задумке) производит обмен данными напрямую с драйвером. Ну ведь она не телепатически с драйвером общается — с ним тоже должен быть определённый интерфейс, а если так — почему-бы ему не быть com-портовым. |
||
|
Natur_Keks
Интересующийся |
К сожалению, рабочие реалии на данный момент таковы, что при работе вышеописанной связки в системе должен появляться только один виртуальный COM порт — с которым будет общаться сторонняя программа. |
||
|
Ochkarik |
VSPE свой драйвер подставляет. если драйвер… то, ща поищу с чего начать. Добавлено через 1 час, 53 минуты и 51 секунду: там есть примеры драйвера COM порта, но он вам не факт что подойдет, потому как использует железо. хотя теоретически его тоже можно обрезать до виртуального устройства. еще есть пример в DDK/WDF DDK6001.18001srcinputvserial да. сразу — в винде существует два подхода написания драйвера. при помощи «чистого» DDK (начиная с win98) и с использованием WDF (начиная с XP+SP, книга Пенни Орвик). |
||
RTFM уже хоть раз наконец! |
Natur_Keks
Интересующийся |
Спасибо за помощь |
||
|
Ochkarik |
если DS создает такую «рыбу»(не знал;) — то лучше конечно использовать ее, иначе чей то сторонний драйвер виртуального порта все таки придется ставить? нумега оч хорошие «рыбы» варит) до сих пор пользуюсь) но наверное оба способа имеют право на жизнь… DS — фильтры кстати тоже генерила. PS или вы имели в виду, что хотите два драйвера собрать? |
||
RTFM уже хоть раз наконец! |
Natur_Keks
Интересующийся |
Спасибо за помощь, работа над драйвером движется, но вот возникла одна проблема: … То как мне в дальнейшем его обработать? … приводит к синему экрану |
||
|
Ochkarik |
первое не совсем верно. точнее совсем не верно. кстати там достаточно много нюансов связанных с различными случаями…. |
||
RTFM уже хоть раз наконец! |
Serge Roussak
Новенький |
Natur_Keks, скажите, получилось ли у Вас что-нибудь по этой теме? |
||
|
Natur_Keks
Интересующийся |
получилось процентов на 70 |
||
|
-
Aids
New Member
- Публикаций:
-
0
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 275
Я пытаюсь написать собственный драйвер для RS232. В ходе поиска я выяснил что микроконтроллером COM порта можно управлять инструкциями OUT и IN. Адреса портов я узнал в дисптчере задачь. COM1 3F8-3FE; COM2 2F8-2FE; но прежде чем пересылать или принимать данные надо сконфигурировать порт. Может кто знает какие байты надо пересылать для конфигурации порта?
-
wasm_test
wasm test user
- Публикаций:
-
0
- Регистрация:
- 24 ноя 2006
- Сообщения:
- 5.582
как и всеми остальными девайсами компа. ну еще используется аппаратное проецирование памяти.
ВОобще, если честно, то гугл рулит.
НО ладно, так и быть:-
Read = KiInPort ( ComPorts[ComPortNumber] );
-
if( !CheckComPortConnected( Port ) )
-
// Port is not connected.
-
USHORT Multiplier = (USHORT)(COMPORT_BASEFREQ / (16 * Frequency));
-
WRITE_COM(Port, 0, Multiplier & 0xFF);
-
WRITE_COM(Port, 0, Multiplier >> 8);
-
// READY BR FixParity ParityCheck Stop Size
-
Lcr = 7; // 0 0 0 00 1 11
-
if (GET_COMPORT_STATE(ComPortPreferred) & COMPORT_DATAREADY)
-
t = READ_COM (ComPortPreferred, 0);
-
if (ARGUMENT_PRESENT(Byte))
-
if (GET_COMPORT_STATE(ComPortPreferred) & COMPORT_READER_ERROR)
-
while( !(GET_COMPORT_STATE(ComPortPreferred) & COMPORT_READY_TO_WRITE) )
-
WRITE_COM( ComPortPreferred, 0, Byte );
Константы очевидны:
-
#define PORT_COM1_BASE 0x3F8
-
#define PORT_COM2_BASE 0x2F8
-
#define COMPORT_DATAREADY 0x01
-
#define COMPORT_OVERFLOW_READERR 0x02
-
#define COMPORT_PARITY_READERR 0x04
-
#define COMPORT_SYNCH_READERR 0x08
-
#define COMPORT_READER_ERROR
-
(COMPORT_OVERFLOW_READERR | COMPORT_PARITY_READERR | COMPORT_SYNCH_READERR)
-
#define COMPORT_READER (COMPORT_DATAREADY | COMPORT_READER_ERROR)
-
#define COMPORT_READY_TO_WRITE 0x20
-
#define COMPORT_WRITE_COMPLETED 0x40
-
#define COMPORT_WRITER (COMPORT_READY_TO_WRITE | COMPORT_WRITE_COMPLETED)
-
#define READ_COM(N,OFS) KiInPort( ComPorts[N] + (OFS) )
-
#define WRITE_COM(N,OFS,V) KiOutPort( ComPorts[N] + (OFS), V )
-
#define GET_COMPORT_STATE(N) READ_COM( N, 5 )
-
#define COMPORT_BASEFREQ 1843200
Ну и как вызывать думаю ясно. InitializeComPort(0, 117500) например
-
Aids
New Member
- Публикаций:
-
0
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 275
Great Спасибо за пример. Ты не вкурсе где можно скачать документацию по системе команд других устройств? (Например контроллеру USB порта, команды на звуковую плату)
-
Vov4ick
Владимир
- Публикаций:
-
0
- Регистрация:
- 8 окт 2006
- Сообщения:
- 581
- Адрес:
- МО
Google -> <название устройства> specification
Полную доку по послед. порту, на русском языке я выкладывал на этом форуме, либо на коденете. Поиск по форуму рулит.