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

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

ru
Offline Offline

« : 14-06-2012 11:33 » 

Я не профессиональный драйверописатель, поэтому может не совсем правильно по терминологии опишу свою проблему. Необходимо сделать два одинаковых устройства (каждое устройство - канал двухстороннего обмена данными по нестандартному последовательному интерфейсу) на плате с одним Usb интерфейсом. Каждое устройство при загрузке драйвера должно получать свое символическое имя. Доступ к этим устройствам из пользовательских  приложений должен быть независимый. Делал когда-то давно такое устройство на PCI интерфейсе, там я решил эту задачу указав в конфигурационном пространстве, что плата имеет две функции. Проще говоря, со стороны пользовательского приложения не должно быть разницы где физически находятся эти устройства, на одном или двух Usb портах.
Записан
Ochkarik
Модератор

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

« Ответ #1 : 14-06-2012 14:51 » 

дык!
...поскольку вопроса так и не прозвучало)))))
Записан

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

ru
Offline Offline

« Ответ #2 : 15-06-2012 05:42 » 

Так сам вопрос, как это сделать?
Записан
oleshii
Участник

ru
Offline Offline

« Ответ #3 : 15-06-2012 10:22 » 

Схемотехнически или чисто soft ?
Записан
olis
Интересующийся

ru
Offline Offline

« Ответ #4 : 15-06-2012 11:47 » 

Схематехнически нет проблем, на чипе Cypress EZ-USB FX2LP, две конечные точки на одно устройство, две на другое. Не знаю как программно это сделать, в смысле в драйвере.
Записан
Ochkarik
Модератор

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

« Ответ #5 : 15-06-2012 13:48 » 

значит на уровне конечных точек и разделить...
просто вопрос очень пространный. чисто с позиции программирования - проблем разделить запросы от двух приложений - я не вижу) поэтому очень сложно ответить КАК это сделать))) просто начать делать! думаю вопрос КАК отпадет сам собой) либо возникнут другие более конструктивные вопросы)

Добавлено через 1 минуту и 11 секунд:
минуточку... устройства все таки на одном сайпресе будут или на разных?
« Последнее редактирование: 15-06-2012 13:49 от Ochkarik » Записан

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

ru
Offline Offline

« Ответ #6 : 15-06-2012 14:15 » 

Устройства на одном сайпресе.
Записан
Ochkarik
Модератор

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

« Ответ #7 : 15-06-2012 14:17 » 

ну и тем более. регистрируете в драйвере обработчики четырех ваших точек и разделяете как угодно. хоть крестиком)
Записан

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

ru
Offline Offline

« Ответ #8 : 15-06-2012 14:38 » 

Нужно что бы обмен с устройствами велся через ReadFile и WriteFile. Имена функциональных устройств должны быть разные: Устройство1, Устройство2...УстройствоN (если несколько плат подключено). При подключении платы к Usb разъему функция AddDevice в драйвере будет вызываться один раз, в этом вызове 2 раза делать IoCreateDevice с разными именами (Устройство1, Устройство2) и IoAttachDeviceToDeviceStack ? Так вообще можно, никогда так не делал.
Записан
Ochkarik
Модератор

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

« Ответ #9 : 15-06-2012 16:10 » 

не не надо два раза IoCreateDevice....
разрулите это на уровне IOCTL запросов для привязки номера пары канала к процессу.
потом будете определять от какого ID процесса пришел запрос... зачем вообще два имени городить?
можно сделать две разные символические ссылки на один объект драйвера, но я с ходу не соображу как их внутри драйвера потом разобрать... по какой из них запрос пришел. покопать надо, никогда не пробовал.


Добавлено через 2 минуты и 13 секунд:
для разных плат - можно и разные имена, в внутри одной платы - можно решить вопрос просто дополнительным вызовом функции для адресации первой или второй половины каналов.
« Последнее редактирование: 15-06-2012 16:15 от Ochkarik » Записан

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

ru
Offline Offline

« Ответ #10 : 17-06-2012 08:50 » 

Повторюсь, нужно что бы обмен с устройствами велся через ReadFile и WriteFile, как в уже в имеющейся плате PCI. Почему: 1) не хотелось бы влазить в софт, для которого нужен этот интерфейс, софт большой и капризный, распределенная сетевая архитектура, писался много лет, в одном месте тронешь не известно где потом кака вылезет. 2) не хотелось бы делать разные варианты этого софта для работы с разными интерфейсными платами (PCI и USB), тем более не исключен вариант одновременного присутствия двух видов интерфейса.
Записан
Ochkarik
Модератор

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

« Ответ #11 : 17-06-2012 10:48 » new

тогда регистрируйте два разных DosDevice имени для каждого устройства( вы так к драйверу из приложения обращаетесь?)
UNICODE_STRING linkname;
RtlInitUnicodeString(&linkname, L"\\DosDevices\\Device0");
IoCreateSymbolicLink(&linkname, &devname);

в обработчике IRP_MJ_CREATE отслеживаете ID процесса который обращается по именам:
http://www.wd-3.com/archive/namespace.htm
запоминаете ID процесса.

при обработке IRP_MJ_WRITE - проверяете ID процесса и узнаете какое чтение/запись производить.

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

Добавлено через 40 секунд:
о чем то я... даже запоминать ID не надо. можно каждый раз проверять.
« Последнее редактирование: 17-06-2012 10:57 от Ochkarik » Записан

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

ru
Offline Offline

« Ответ #12 : 18-06-2012 05:29 » 

Можно сделать и так, как советовали предыдущие авторы. Но если устройство - "комбайн", я б порекомендовал "покопать" в сторону
шинного эмулятора. Так, например, делают производители 3g modem - на одной "свистульке" 3 разнофункциональных устройства +
пара модулей для обмена с UI. В Вашем случае сего - не надо. Поднимается bus enum driver, который экспортирует интерфейс.
Для каждого устройства, "цепляющегося" к данному интерфейсу через GUID, создается свой plugin-driver. Разделение полосы
пропускания в литературе по USB описано неплохо.
Записан
olis
Интересующийся

ru
Offline Offline

« Ответ #13 : 18-06-2012 09:42 » 

Ochkarik, oleshi спасибо за ответы, буду пробовать. oleshi, если у вас есть, дайте пожалуйста ссылки где можно почитать про ваш вариант.
Записан
oleshii
Участник

ru
Offline Offline

« Ответ #14 : 18-06-2012 12:13 » 

Увы, НИКАКОЙ литературы по этому поводу нет. Можно посмотреть в Ms DDK toaster driver пример.
Почему в голову пришло ИМЕННО это - возился когда-то с эмулятором виртуальной шины.
На вопросы отвечать готов. Можно даже подумать в сторону "рыбы" драйвера (main sceleton)

Добавлено через 16 часов, 35 минут и 5 секунд:
Хотя, если Вы имеете ввиду разделение полосы пропускания USB, то это можно посмотреть у Chris Cant "Writing WDM Device Drivers"
В ИНЕТ есть вариант в виде .fb2 и .djvu файлов. На русском языке, к сожалению, нет... Разве что custom translated найдете...
« Последнее редактирование: 19-06-2012 04:48 от oleshii » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines