Отключить режим usb host

Обновлено: 06.07.2024

Данный режим поддерживается только у микроконтроллеров AT90USB647/1287.

23.1. Описание канала (Pipe)

Взамен термина конечная точка, употребляемый в описании Device-контроллера, применительно к Host-контроллеру используется другой термин - канал (pipe). Соответствие канала Host-контроллера конечной точке Device-контроллера установлено стандартом USB.

Рисунок 23.1. Каналы и конечные точки USB-системы

Для настройки канала согласованно с параметрами конечной точки Device-стороны, Host-контроллер должен использовать дескрипторы настроек Device-стороны (Device Configuration Descriptors).

23.2. Отсоединение (Detach)

После сброса бит управления отсоединением (DETACH) равен 1. Таким образом, перед переходом в режим Host (установка бита HOST) необходимо программно сбросить бит отсоединения.

23.3. Подача питания и сброс

Следующий рисунок иллюстрирует основные состояния Host-контроллера после подачи питания.

Рисунок 23.2. Состояния Host-контроллера после сброса

После аппаратного сброса Host-контроллер находится в состоянии RESET. Разрешение работы USB-контроллера и активизация его режима Host-контроллера приводят к переводу в состояние IDLE. В таком состоянии Host-контроллер ожидает подключение Device-стороны, по минимуму потребляя ток.

Оконечные каскады USB-контроллера должны находиться в режиме IDLE. Для перехода в состояние HOST READY не обязательно активизировать блок PLL.

Если Host-контроллер не генерирует пакеты START OF FRAME (SOF), шина USB и сам контроллер переходят в состояние SUSPEND. В этом состояние потребляемый USB-контроллером ток минимален. Host-контроллер выходит из состояния SUSPEND с началом генерации пакета SOF по линии USB.

23.4. Обнаружение Device-стороны

Контроллер обнаруживает подключение Device-стороны, когда уровень на одном из выводов, D+ или D-, отличается от нуля. Иными словами, Host-контроллер следит за появлением подтяжки к плюсу питания на линии D+ или D-. Однако, перед началом такого слежения необходимо обеспечить подачу напряжения VBUS на Device-сторону.

Отключение Device-стороны Host-контроллер определяет по состоянию IDLE шины, которому соответствуют низкие уровни на линиях D+ и D-.

23.5. Выбор канала

Перед выполнением каких-либо действий ЦПУ должен выбрать канал, с которым он желает работать. Для этого предусмотрены биты PNUM2:0 (регистр UPNUM). Значение, записанное в данные биты, определяет номер канала, которым будет управлять ЦПУ.

После выбора канала, ЦПУ может осуществлять доступ к его регистрам и данным.

23.6. Настройка канала

Для активизации канала необходимо придерживаться следующего алгоритма.

Рисунок 23.3. Последовательной активизации канала

Сразу после активизации канала (EPEN = 1) все готово для отправки запросов Device-стороне.

По завершении конфигурации (CFGOK = 1), можно модифицировать только TOKEN канала (PTOKEN) и интервал опроса канала типа INTERRUPT.

Канал типа CONTROL поддерживает только 1 банк. Попытка установки любого другого значения приведет к ошибке конфигурации (CFGOK = 0).

Обнуление бита PEN приводит к сбросу настроек канала. В таком случае, все соответствующие регистры канала принимают их значения по умолчанию. Подробности см. в разделе, посвященному управлению памятью.

Прим.: программа должна выполнить настройку канала по умолчанию (CONTROL) со следующими параметрами:

  • Тип: CONTROL
  • Тип пакета TOKEN: SETUP
  • Банк данных: 1
  • Размер: 64 байта

В этих байтах содержится параметр MaxPacketSize (максимальный размер пакета) конечной точки типа CONTROL Device-стороны, которая используется по умолчанию. С помощью данного параметра необходимо повторно настроить размер канала по умолчанию.

23.7. USB-сброс

После установки бита сброса (RESET) USB-контроллер отправляет запрос USB RESET. После отправки этого запроса автоматически устанавливается бит RSTI. Если RSTE=1, это приводит к запуску прерывания.

После отправки запроса USB RESET сбрасываются все настройки канала и назначение памяти. Состояние общего регистра разрешения прерываний Host-контроллера остается неизменным.

Если перед этим шина находилась в режиме SUSPEND (SOFEN = 0), USB-контроллер автоматически перейдет в режим RESUME (HWUPI=1), а в целях генерации пакета SOF, сразу после USB RESET, будет аппаратно установлен бит SOFEN.

23.8. Настройка адреса

23.9. Обнаружение запроса удаленного возобновления (REMOTE WAKE-UP)

Host-контроллер вводит режим SUSPEND обнулением бита SOFEN. В дальнейшем пакеты START OF FRAME по шине USB не передаются, что приводит к переводу Device-стороны в режим SUSPEND по истечении 3 мс.

Device-сторона активизирует Host-контроллер отправкой запроса UPSTREAM RESUME (функция REMOTE WAKE-UP; удаленное возобновление). Host-контроллер обнаруживает отличное от IDLE состояние на шине USB и устанавливает бит HWUPI. Если таким, отличным от IDLE, состоянием оказывается UPSTREAM RESUME (K-состояние), произойдет аппаратная установка бита RXRSMI.

Не позднее 1 мс программа должна установить бит RESUME для генерации DOWNSTREAM RESUME, при этом, длительность такой генерации должна быть не менее 20мс.

Сразу после генерации DOWNSTREAM RESUME автоматически устанавливается бит SOFEN, что приводит к незамедлительной генерации SOF.

23.10. Сброс канала

Программа имеет возможность сброса канала. Для этого предусмотрен регистр сброса канала. Настройка канала и переключатель данных остаются неизменными. Сбросу подвергаются только настройки банка и биты статуса, которые принимают свои значения по умолчанию.

Для полного сброса канала программа должна отключить, а затем включить канал.

23.11. Доступ к данным канала

Чтобы прочитать или записать данные в буфер FIFO канала, ЦПУ должен выбрать номер канала с помощью регистра UPNUM и выполнить операцию чтения или записи регистра UPDATX.

23.12. Управление каналом CONTROL

Транзакция CONTROL разделяется на три этапа:

  • Настройка (SETUP)
  • Данные (IN или OUT)
  • Статус (OUT или IN)

На каждом из этапов программа должна управлять изменением TOKEN.

Исходное значение переключателя данных устанавливается с учетом типа пакета (действительно только для канала CONTROL):

  • SETUP: DATA 0
  • OUT: DATA 1
  • IN: DATA 1 (ожидаемое значение переключателя данных)

23.13.Управление каналом OUT

Для начала нужно убедиться, что канал настроен и не остановлен.

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

После освобождения текущего банка выполняется аппаратная установка бита TXOUT. Если бит TXOUTE установлен, это вызовет генерацию прерывания. Одновременно с этим устанавливается бит FIFOCON. ЦПУ записывает данные в FIFO, а затем сбрасывает бит FIFOCON для разрешения USB-контроллеру передавать данные. Если канал OUT состоит из нескольких банков, сброс FIFOCON также приведет к смене банка на следующий. Обновление бит TXOUT и FIFOCON осуществляется автоматически в зависимости от состояния следующего банка.

23.14. Управление каналом IN

Вначале нужно сконфигурировать канал.

Когда канал должен получить данные от Device-стороны, программа вводит режим IN. Это делается с помощью бита INMODE.

  • INMODE = 0. Во внимание берется значение регистра INRQX. Host-контроллер выполняет запросы типа IN в количестве (INRQX+1) через выбранный канал (предшествует его остановке). Данный режим позволяет избежать избыточных запросов IN в канале.
  • INMODE = 1. USB-контроллер выполняет бесконечное число запросов IN до тех пор, пока программа не остановит канал.

Генерация запроса IN начинается после программного обнуления бита PFREEZE. После каждого заполнения текущего банка выполняется установка бит RXIN и FIFOCON. Если установлен бит RXINE, это приводит к запуску прерывания. Программа может подтвердить USB-прерывание путем обнуления бита RXIN. Для освобождения текущего банка программа считывает данные и обнуляет бит FIFOCON. Если канал IN состоит из нескольких банков, обнуление бита FIFOCON инициирует переключение к следующему банку. Обновление бит RXIN и FIFOCON выполняется аппаратно в соответствии со статусом нового банка.

23.14.1. Ошибка CRC (только для передачи типа ISOCHRONOUS)

Ошибка CRC может возникнуть на этапе IN, если USB-контроллер обнаружит повреждение в принятом пакете. В такой ситуации запускается прерывание STALLEDI/CRCERRI, но оно не исключает запуска прерывания RXINI.

Приветствую!

Отключение USB портов может понадобиться в самых различных целях и сценариях. Одной из наиболее часто встречающихся причин отключения ЮСБ порта или портов можно назвать предотвращение «утечки» каких-либо важных и конфиденциальных данных с компьютера. Также стоит отметить и безопасность (зловредное программное обеспечение, вирусы никто не отменял), которая повышается, если отключить возможность подключения каких-либо съёмных накопителей (флеш-дисков, портативных HDD и иных устройств, имеющих интерфейс USB).

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

Содержание:

Управление работой USB через BIOS

Этот способ позволяет эффективно отключить работу всех USB портов на компьютере или ноутбуке. Однако стоит учесть, что при этом будет отключена работа периферии, что подключена к USB портам. И если у вас подключена клавиатура с мышкой через USB порт, то при использовании данного способа оные перестанут работать.

Найдя их, следует воспользоваться переключателем напротив и выбрать пункт Disabled (Отключить).

На изображении ниже показано, как это может примерно выглядеть.

Выключаем или включаем USB через групповую политику

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

    Для открытия окна групповой политики воспользуемся комбинацией клавиш Win + R. Нажав оную, будет выведено окно, в которое следует вписать «gpedit.msc» (без кавычек) и далее нажать по кнопке OK.

Отключение или включение USB через реестр

Как и предыдущий способ, оный так же не затрагивает работу периферии. Отключается только возможность работы со съёмными накопителями.

Следует отметить, что если вы ранее не сталкивались с реестром, ничего там не редактировали, то следует на всякий случай сделать его резервную копию. Это окажет посильную помощь, если что-то будет сделано неверно, и операционная система начнёт проявлять нестабильность в работе.
  1. Следует открыть редактор реестра. Для этого существует несколько способов, одним из которых является следующий: нажав на клавиатуре комбинацию клавиш Win + R, следует далее в открывшемся окошке ввести команду «regedit» (без кавычек) и нажать OK.

И далее в правой части окна следует осуществить двойной клик мышкой по пункту с именем Start.

Отключение работы USB портов со съёмными накопителями

Надстройка управления доступом к USB с использованием программ

Существует целый ряд программ, ограничивающих работу для подключаемых USB носителей данных.

Среди таковых можно отметить: USB Block, USB Disabler Pro, MyUSBOnly, Gilisoft USB Lock. Всё они обладают англоязычным интерфейсом, возможностью настройки «белого списка» подключаемых накопителей и некоторыми другими возможностями.

Программы и утилиты, позволяющие управлять работой USB портов, ограничивать и разрешать подключение к ним устройств

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

Управление работой USB портов через диспетчер устройств

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

И да, отключение USB таким способом приведёт и к отключению работы подключенной периферии (мышка, клавиатура, принтер и т.д.). Будьте внимательны.

  1. Откройте Диспетчер устройств. Более подробно о том, как это сделать, написано в материале «Открываем диспетчер устройств в Windows (7, 8, 10)».
  2. В открывшемся окне следует кликнуть по пункту с именем Контроллеры USB, дабы он был развёрнут.

В данном списке отобразятся аппаратные элементы, отвечающие за работу USB. Наведите мышку, кликните правой клавишей и в отобразившемся меню выберите Отключить устройство.

Отключаем ЮСБ через диспетчер устройств

Аппаратное отключение USB

В данном случае речь идёт об отключении USB кабеля на материнской плате, который отвечает за подключение USB портов на лицевой стороне системного блока.

Порты USB на лицевой панели ПК подключены к материнской плате через шлейф

USB порты сзади, которые непосредственно размещены на материнской плате, отключить таким способом, естественно, не получится.

То же касается и ноутбуков.

Деинсталляция драйвера USB для отключения работы

Данный способ не является рациональным. Это связанно с тем, что впоследствии операционная система восстанавливает удалённые драйвера (обычно после перезагрузки компьютера), т.к. видит, что физически компонент в системе присутствует.

Более того, если удалить драйвер, то нарушается работа всех подключенных USB устройств.

Мы рады, что смогли помочь Вам в решении поставленной задачи или проблемы.

В свою очередь, Вы тоже можете нам очень помочь.

Просто поделитесь статьей в социальных сетях и мессенджерах с друзьями.

Поделившись результатами труда автора, вы окажете неоценимую помощь как ему самому, так и сайту в целом. Спасибо!

С каждым годом возможности смартфонов и планшетов Андроид превышают своих предшественников в несколько раз, предоставляя пользователям очень интересные и полезные функции. Теперь вы можете подключить к своему мобильному гаджету разные устройства, как к компьютеру. Такую возможность предоставляет технология OTG (One-The-Go).

Из статьи вы узнаете

Что это такое?

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

  1. Во-первых, это лишнее место на корпусе телефона. Практически все компании, занимающиеся производством техники, стараются уменьшать толщину корпуса и это огромное преимущество перед конкурентами, поэтому ни один производитель не пойдет на такой шаг.
  2. Во-вторых, такой порт будет активно потреблять дополнительную энергию, а это сильно бьет по общему расходу заряда батареи.
  3. В-третьих, на продаже аксессуаров зарабатывают огромные деньги партнеры разработчиков. То есть, в Андроид добавили поддержку USB OTG, побудили интерес к своей технологии, а партнеры предоставили на рынке те самые переходники, которые необходимы для работы. В итоге выигрывают все, даже потребитель!

Какие устройства можно подключать через OTG?

Подключение различных устройств

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

Без проблем можно подключать USB-накопители до 32 Гб. Можно попробовать и больше, например, на 64 Гб, но они работают не везде.

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

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

Компьютерная мышь

Если вы заядлый геймер, то сможете при помощи OTG в телефоне подключить и геймпад. Только учтите, что не все игры из Google Play поддерживают такую технологию и подобные устройства. Здесь многое зависит от самого разработчика приложения.

Геймпад

Если же у вас плохая фронтальная камера на смартфоне, то просто подключите внешнюю!

Эта технология удобна для фотографов, которые могут через картридер или USB просмотреть фотографии на своем устройстве, например, планшете или смартфоне. Даже можно подключать адаптеры для интернета, чтобы подключаться через оптоволокно!

Но и это еще не все! Нужно срочно распечатать документы? Подключите принтер! Сюда же можно добавить еще и монитор или телевизор.

Подключение принтера к смартфону

В итоге пользователь получает полноценное устройство, с помощью которого можно управлять другими девайсами. А если учесть, что мощность некоторых телефонных аппаратов превосходит часть бюджетных компьютеров старых поколений, то в будущем и вовсе можно ожидать полной реализации всей работы с ПК на мобильном устройстве.

Какие смартфоны поддерживают технологию?

Некоторые производители убирают эту опцию лишь затем, чтобы сэкономить заряд батареи, повысив в целом его эффективность. Но на такие шаги идут только ради бюджетных моделей. Средний и высокий классы смартфонов 100% обладают такой технологией и поддерживают большой ассортимент подключаемых устройств.

Designed by Freepik


В современных Android — приложениях для взаимодействия с другими устройствами чаще всего используются беспроводные протоколы передачи данных, как например Bluetooth. В годы, когда часть устройств имеют беспроводную зарядку, сложно представить себе связку Android устройства и периферийного модуля, в которой необходимо использование проводных интерфейсов. Однако когда такая необходимость возникает, на ум сразу же приходит USB.

Давайте разберем с вами гипотетический кейс. Представьте, что к вам приходит заказчик и говорит: “Мне нужно Android приложение для управления устройством сбора данных и вывода этих самых данных на экран. Есть одно НО — приложение надо написать на одноплатный компьютер с операционной системой Android, а периферийное устройство подключено по USB”

Звучит фантастически, но и такое иногда случается. И тут как нельзя кстати пригодится глубокое знание USB стека и его протоколов, но данная статья не об этом. В данной статье мы рассмотрим, как управлять периферийным устройством по протоколу USB Custom HID с Android устройства. Для простоты напишем Android-приложение (HOST), которое будет управлять светодиодом на периферийным устройством (DEVICE) и получать состояние кнопки (нажатия). Код для периферийной платы приводить не буду, кому интересно — пишите в комментариях.

Итак, приступим.

Теория. Максимально коротко

Для начала немного теории, максимально коротко. Это упрощенный минимум, достаточный для понимания кода, но для большего понимания советую ознакомиться с этим ресурсом.

Для общения по USB на периферийном устройстве необходимо реализовать интерфейс взаимодействия. Разные функции (например, USB HID, USB Mass Strorage или USB CDC) будут реализовывать свои интерфейсы, а некоторые будут иметь несколько интерфейсов. Каждый интерфейс содержит в себе конечные точки — специальные каналы связи, своего рода буферы обмена.

На моем периферийном устройстве реализован Custom HID с одним интерфейсом и с двумя конечными точками, одной для приёма, другой для передачи. Обычно информация с существующими на устройстве интерфейсами и конечными точками написана в спецификации на устройство, в противном случае определить их можно через специальные программы, к примеру USBlyzer.

Устройства в USB HID общаются через репорты. Что такое репорты? Так как данные передаются через конечные точки, то нам надо как-то идентифицировать, а также распарсить в соответствие с протоколом. Устройства не просто кидают друг другу байты данных, а обмениваются пакетами, имеющими четко определенную структуру, которая описывается на устройстве в специальном дескрипторе репорта. Таким образом, по дескриптору репорта, мы можем точно определить, какой идентификатор, структуру, размер и частоту передачи имеют те или иные данные. Идентификация пакета происходит по первому байту, который представляет из себя ID репорта. Например данные о состоянии кнопки, идут в репорта с а светодиодом мы управляем через репорт с >

Подальше от железа, поближе к Android

В Android поддержка USB устройств появилась начиная с API версии 12 (Android 3.1) Для работы с периферийным устройством нам необходимо реализовать режим USB host. Работа с USB достаточно неплохо описана в документации.

Для начала необходимо идентифицировать ваше подключаемое устройство, среди всего разнообразия USB девайсов. USB девайсы идентифицируются по сочетанию vid (vendor id) и pid (product id). Создадим в папке xml файл device_filter.xml со следующим содержимым:


Теперь необходимо внести соответствующие разрешения и action (если вам они необходимы) в манифест приложения:


В android:resource мы указываем файл с необходимыми фильтрами для устройств. Также, как я уже говорил ранее, можно назначить intent фильтры, для запуска приложения, к примеру, в результате подключения вашего устройства.

Для начала необходимо получить UsbManager, найти устройство, интерфейс и конечные точки устройства. Это необходимо делать при каждом подключении устройства.


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

Как я уже говорил ранее, устройства общаются через репорты.


В метод sendReport мы передаем массив байт, в котором нулевым байтом является репорт ID, берем текущее USB подключение к устройству и выполняем передачу. В качестве параметров в метод BulkTransfer передаем номер конечной точки, данные, их размер и таймаут передачи. Стоит отметить, что класс UsbDeviceConnection имеет методы для реализации обмена данными с устройством USB — методы bulkTransfer и controlTransfer. Их использование зависит от типа передачи, который поддерживает та или иная конечная точка. В данном случае используем bulkTransfer, хотя для HID чаще всего характерно использование конечных точек с типом control. Но у нас Custom HID, так что делаем что хотим. Про тип передачи советую почитать отдельно, так как от него зависит объем и частота передаваемых данных.

Для получения данных необходимо знать размер получаемых данных, который можно, как знать заранее, так и получить из конечной точки.

Метод получения данных по USB HID является синхронным и блокирующим и выполнять его необходимо в другом потоке, кроме того, репорты от устройства могут приходить постоянно, либо в любое время, поэтому необходимо реализовать постоянный опрос репорта, чтобы не пропустить данные. Сделаем это при помощи RxJava:


Получив массив байт, мы должны проверить нулевой байт, так как он является report ID и в соответствии с ним парсить полученные данные.

По завершении всех действий с USB нужно закрыть соединение. Можно выполнять это в onDestroy activity или в onCleared во ViewModel.

Заключение

В статье рассмотрен очень небольшой и примитивный, исключительно демонстративный код с реализацией для конкретного устройства. Конечно, классов USB существует много, не только HID и для них естественно реализация будет иная. Однако все методы достаточно неплохо документированы и имея хорошее представление о USB стеке можно легко разобраться в том, как их применять.

Читайте также: