Здравствуйте. Кто-нибудь может подсказать, как можно это сделать? Ситуация такая: есть некое устройство, которое включается программно. Раньше оно висело на COM-порту, но встал вопрос о переключении на USB. Включалось оно замыканием ком-порта самого на себя. Пока порт замкнут, устройство работает. Разомкнут - не работает. Все. Более никакого общения с этим устройством нет. Вопрос соответствия уровня напряжения на этих портах не стоит, он уже решен. Надо просто программно подавать напряжение на USB-порт и отключать его при необходимости. Причем под виндой. И как это сделать? Можете помочь? Сроки поджимают.
Еще раз здравствуйте. Может, кто-нибудь может подсказать, где надо искать эту информацию. Та литература, что продается в нашем городе, полностью обходит вопросы по USB (чего уж говорить о программировании). Из Москвы заказать невозможно. Срок доставки - месяц, без гарантии. Интернет модемный, весь его не перероешь. А срок на работу очень маленький. Все дело в том, что программа уже переписана под виндоус. Одно из устройств с успехом заведено на клавиатуру. Второе же требует для своего включения 12 вольт. Здесь в дело вступают реле типа РЭС-15, которые можно включать от 5-ти вольт. А ведь такое питание и подается по USB. Реле уже замыкают цепь нужного устройства. Схема сложновата, но как еще можно управлять программно таким устройством с учетом того, что нужно на один компьютер повесить 5-6 таких агрегатов? На клавиатуре токи маленькие. Ком-портов мало. На LPT в данной ситуации тоже не посадишь. Какие либо дополнительные порты? Вряд ли. Остается USB. Но очень нужна информация, с помощью которой можно запрограммировать порты на этой шине.
Avil Читай сей документ, там все есть. http://www.usb.org/developers/whitepapers/wdm_pm11.pdf Вот только у меня такое чувство, что тебе не удастся контролировать питание каждого устройства в отдельности. Если ты отключаешь, то сразу весь рут хаб...
По-моему делать так - садизм над компьютером. Я бы лучше собрал небольшую схемку (буквально на паре микросхем) и подключил бы ее к COM или LPT порту. Придумав простенький "протокол" передачи данных, а далее - хоть релюшки, хоть транзисторы (что помощьнее) вешай
Avil USB - это сложная кухня. Реле ты туда вряд ли повесишь - нужен как минимум микропроцессор. А если будет микропроцессор, то опять же лучше вешать на COM или LPT. Использовать же USB, как управляемый источник 5в ?! Может и можно, но тогда это точно в wasm.electronics и специализированные форумы. К сожалению я тоже не имею времени сейчас искать : попроси кого-нибудь сходить на telesys.ru в форум Микропроцессоры и там поискать и спросить. Если выкрою время, то спрошу сам.
отключить питание на USB не получится никак, кажется. Есть микруха от ftdi называется ft232 кажется, на неё есть дрова http://www.ftdichip.com . Представляет собой мост RS232 - USB. То есть берёшь её поключаешь к USB, а с другой стороны микроконтроллер с внутренним UART. Программулиной с хоста посылаешь отключить/включить - мк ловит команду и выдаёт на ключ соотв. уровень.
Большое спасибо. В принципе, понятно, что так просто это не сделать. По проводу сборки контроллеров - у нас в городе это не так просто. Радиомагазины вымерли как класс. Кое что достать, конечно, можно, но не просто и не быстро. Кроме того, уж очень давно я не паял ничего сложнее выключателя. А уж контроллеры... Ну, кажись, выбора нет. Пока сделаю 2 на ком порты, благо так уже работало, хоть и под DOS. Потом буду думать. Еще раз всем БОЛЬШОЕ СПАСИБО. Есть информация для размышления.
Avil http://osdev.ru/files/Hard/USB1.0Specs.zip (1.1M) Вот что я выкопал в этой доке: 11.12.2.2 Clear Port Feature This request resets a value reported in the port status. Код (Text): bmRequestType bRequest wValue wIndex wLength Data 00100011B CLEAR_ FEATURE Feature Selector Port Zero None The port number must be a valid port number for that hub, greater than zero. Clearing a feature disables that feature; refer to Table 11-13 for the feature selector definitions. If the feature selector is associated with a change indicator, clearing that indicator acknowledges the change. Changes in connection, enable, suspend, reset, and over-current status are acknowledged using this request. Clearing the PORT_SUSPEND feature causes a host-initiated resume on the specified port. Clearing the PORT_ENABLE feature causes the port to be disabled. Clearing the PORT_POWER feature causes the port to be powered off, subject to the constraints due to the hub’s method of power switching. If a hub uses gang power switching, all ports must be requested to power off before any of the ports actually power off. Кроме этого, в другом разделе написано что далеко не каждый хаб поддерживает управление питанием портов. Только вот как объяснить винде, когда нужно, а когда не нужно отключать питание портов? Но на уровне драйверов решение наверно существует.
Tellur И ето правильно !!!!!!!! Volynkin Александр, что у Вас за аська такая странная, я уже 4 месяца не могу ничё с этим номером сделать !
letopisec Да , на ето дело есть такая гадость ф полном смысле, как ACPI. Скоро будет статья на сайте. Ох и действительно чёрт знает что нагородили .... !
Black_mirror Спасибо, читаю. CARDINAL Садизм не садизм, а что в голову приходит при таких возможностях, то и пытаюсь сделать. Ведь винда же как-то управляет питанием USB устройств? Причем каждым портом по отдельности. Значит это возможно. Если это можно сделать программным способом, то зачем городить контроллер при отсутствии квалификации и компонентов?
Не всё так просто. 1)Питание вырубить можно, либо у самого устройства либо попросив HUB. Но для этого нужно послать запрос IRP. А для этого нужно MS-DOSимя которое создаётся при загрузке драйвера. А для этого нужен дривер устройства. Но для наличия объекта-устройства нужно ответить на виндовские запросы, то бишь нужно само устройство(физическое)... А у вас такового нет. Так, что винда будет контролировать только потребляемый ток. 2)HUB. Имя узнаём SetupDixxx. Открываем. Лезем в MSDN и читаем все реквэсты. Например это: Код (Text): IOCTL_INTERNAL_USB_CYCLE_PORT Operation This I/O request simulates a device unplug and re-plug on the port associated with the PDO. This IOCTL must be sent at an IRQL of PASSIVE_LEVEL. Сам не пробовал, но полагаю, что это так...