Выставить приоритет прерывания от контроллера usb в который подключена карта

Обновлено: 04.07.2024

В этой статье я хотел бы рассказать о том, что может никогда не напоминать о себе, а может и стоить нервов после сборки или апгрейда компьютера: зависания, самопроизвольные перезагрузки, упорное нежелание грузиться, постоянные "синие экраны смерти", невозможность обнаружения устройств, неверная работа… Список можно продолжать еще долго. Очень часто такие "глюки" происходят именно по вине прерываний, а если Вы интересуетесь компьютерами, то обязательно должны знать, откуда и почему появляются подобные проблемы и, самое, наверно, главное, как с этим бороться.

Прерывания или IRQ (Interrupt Request) - это сигналы, которые сообщают процессору, что нужно обработать поступивший от устройства запрос, а посылает процессору оные сигналы контроллер этого самого устройства, то есть при помощи IRQ процессор реагирует на различные события.

Так уж сложилось, что при разработке какой-нибудь технологии создаются некоторые ограничения, не специально, конечно, а из-за какой-нибудь особенности этого новшества или просто недочета. Так случилось и с прерываниями. Первоначально, когда IBM разрабатывала архитектуру IBM PC (аж в 1980-81 годах прошлого тысячелетия), их было заложено не так много (8), потом, правда, добавили еще столько же, забрав одно "старое" прерывание под контроллер новых, но я бы не сказал, что и этого оказалось достаточно. А потом фирма IBM перестала быть единственной, кто занимался платформой PC, и, во избежание несовместимости с другими, никто больше прерываний и не добавил.

Какие могут быть проблемы?

Когда архитектуру IBM PC только создавали, прерываний было создано немного, всего восемь, как я уже писал, и отдавали их на всякую "ерунду", вроде портов COM, хотя оправдывает инженеров IBM то, что выбора особого не было, его пришлось искать позже. Очевидно, никто не пророчил платформе такое будущее, поэтому для ее изюминки, то есть возможности расширения, было оставлено только одно прерывание, которое потом было занято контроллером второй "восьмерки" IRQ. Правда, стоит заметить, что дополнительные прерывания могли (и могут) быть высвобождены путем отключения различных занимающих их ISA-устройств: портов, флоппи-дисковода. Так вот, ошибки, или конфликты, возникают когда несколько устройств пытаются работать на одном прерывании. Это очень проблематично, потому что многие современные устройства, особенно звуковые карты и всевозможные мультимедийные комбайны несут на себе сразу несколько устройств. Даже самые простые "звуковухи" имеют на борту не менее четырех девайсов. Вот так выглядит карта прерываний в современном компьютере:

Так что же это получается? На современный компьютер можно установить только три дополнительных устройства? Судя по таблице, да, но не все так страшно. У Вас, например, есть порт LPT2? Очень сомневаюсь. Значит, если порта нет, то и прерывание свободно. Итак, теоретически можно освободить следующие прерывания:

IRQ Описание
3 Порт вполне можно освободить, отключив его в BIOS. Я думаю, в большинстве случаев он и так свободен.
4 Тоже можно отключить. Но он используется значительно чаще: мыши, модемы, сканеры.
5 Про это я уже писал. Почти всегда свободен.
6 Если будете собирать новый компьютер, тем более домой, польза от старого доброго флопика, значительно меньше, чем даже пару лет назад. Очень у многих уже есть дисководы CD-RW. Больше места, надежнее, быстрее, хотя, хоронить FDD еще рано… Флоп можно отключить и освободить IRQ.
7 Если у Вас принтер на USB, можете хоронить…
12 В большинстве современных компов мыши именно такие. Можете поставить грызуна на COM, но забьете другое прерывание, мышку можно купить и на USB, но это будет уже маниакальной борьбой за IRQ :)
14 Слабо без винта? Хотя, теоретически, можно…
15 Даже если у вас только два IDE-устройства, их лучше развести на два разных канала. Работать будет быстрее. Но прерывание можно и освободить.

Уже проще. Но хватает ли этого? Лезу в свойства системы (у меня Windows XP Professional). Пуск -> Все программы -> Стандартные -> Служебные -> Информация о системе. Дальше в окне программы: Ресурсы аппаратуры -> Прерывания (IRQ). Вот, что я там вижу:

IRQ Описание
0 Системный таймер
1 Стандартная (101/102 клавиши) или клавиатура PS/2 Microsoft Natural
3 Последовательный порт (COM2)
4 Последовательный порт (COM1)
5 Conexant SoftK56 Data Fax Voice Speakerphone
5 VIA Rev 5 USB универсальный хост-контроллер
5 VIA Rev 5 USB универсальный хост-контроллер
6 Стандартный контроллер гибких дисков
8 CMOS и часы
9 Microsoft ACPI-совместимая система
10 Avance AC'97 Audio for VIA (R) Audio Controller
11 ATI RADEON VE DDR
12 PS/2-совместимая мышь
13 Процессор числовых данных
14 Первичный канал IDE
15 Вторичный канал IDE

Спрашивается: что делает мой внутренний модем, который, кстати, несет на себе несколько устройств, на одном прерывании (из-под отсутствующего LPT2) со сразу двумя контроллерами USB? А вот что.

Выход был найден

Наступило начало девяностых. Системная шина (ISA - Industrial Standard Architecture), которая работала на частоте процессора, уже исчерпала себя. А все потому, что она могла нормально передавать данные только на частоте 8 МГц, чего вполне хватало для всяких там PC/XT/AT/286/386. А такой продвинутый процессор как 486 работал на значительно большей частоте. Пришлось эту шину замедлять, что отрицательно сказывалось на частоте. В 1989 году была разработана 32-битная шина EISA - Extended Industrial Standard Architecture, которая работала на частоте 10 МГц, но это была всего лишь попытка сделать из телеги велосипед, просто исправление ошибок ISA. Примерно в это время IBM создала шину MCA, которая не прижилась. Была создана и шина VESA (или VL-bus), но она могла работать только с Intel 486. И вот в 1991 году, в качестве своего внутреннего проекта, Intel приступила к разработке абсолютно новой локальной шины PCI - Personal Component Interconnect. Она разрабатывалась можно сказать с нуля, а не была очередной заплатой к ISA, что дало ей большие преимущества. Например, она работала на фиксированной частоте в 33 МГц, плюс у процессора была собственная быстродействующая шина, что позволяло ему обращаться к кэшу и оперативной памяти на той частоте, на которой ему надо, и не опираться на технические ограничения локальной шины. Новая шина PCI могла нести приличную нагрузку: до десяти слотов. Именно к PCI подключаются все видеоадаптеры, ведь шина AGP это всего лишь "прикрученная" PCI с большей тактовой частотой - 66 МГц. К ней же подключается (через контроллер) и системная шина ISA, которая присутствует на всех современных компах в виде портов COM и LPT, гибких дисков. Правда, необходимости в ней становится все меньше: флопики простаивают по вине CD-R/RW, COM/LPT - по вине USB… Так вот эта шина PCI, без которой не обходится ни одна современная материнская плата, стала решением проблемы прерываний.

Как известно, компьютеры могут оперировать только с "1" и "0" или "есть сигнал" и "нет сигнала". Если устройство ISA выставит на линию сигнал "1", то другому устройству на этой же линии свои единицы как не выставляй, контроллер на них не отреагирует. В случае с PCI контроллер проверяет источник сигнала и только потом обрабатывает его. Это и позволяет помещать несколько устройств на одно прерывание. Теоретически да, но имейте ввиду, что не стоит "вешать" устройства постарше и поновее на один канал IRQ. Есть также мнение, что не стоит ничего ставить на одно прерывание со звуковой картой, могут появляться ошибки. Это, конечно, происходит далеко не всегда, но лучше сообразить что-нибудь понадежнее.

Хороший Вы человек, для своего компа ничего не жалко. Вот купили Вы крутейшую видеокарту, принтер, сканер, профессиональный звук, усугубили это дело модемом, сетевухой, да еще и TV-тюнером. Вот "глюки" и пошли. Как ни меняй их местами в слотах, ничего не работает, хоть вон выкинь. Что делать?

Настройка прерываний из BIOS

Так по какому же принципу распределяются прерывания? При загрузке системы BIOS раздает прерывания следующим образом: линии IRQ всех устройств, которые поддерживают технологию Plug'n'Play, а это все современные устройства, получают по одному свободному прерыванию. Если прерывания кончились, а неохваченные девайсы еще есть, BIOS раздает их по второму кругу, потому и получается, что несколько устройств получили одно прерывание. Все будет чудесно работать, если одно прерывание получили два PCI устройства, а если PCI + ISA или ISA + ISA? Все, конфликт. Надо бы это процесс прибрать к рукам.

Далее стоит заметить, что я использую материнскую плату Epox 8K3AP с Award BIOS 6.00PG. Наиболее удобный и логичный способ настройки IRQ - назначить их "ручками". Заходим в PCI/PnP Configurations. Там есть настройки INT Pin n Assignment (это у меня, а у Вас может быть и это, и такие названия как Slot n Use IRQ (точно помню, так было в Award BIOS v. 4.51 PG); PCI Slot n Priority или что-нибудь подобное). Каждый пункт этого меню соответствует одной из четырех линий IRQ, так что вы можете назначить каждой линии свое прерывание.

Есть еще один способ переназначения IRQ. Заходите в тот же PCI/PnP Configurations, там есть пункт IRQ resources (чтобы туда зайти надо поставить значение параметра Resources controlled by равным Manual), а именно он и нужен нам сейчас. Там будут настройки каждого возможного прерывания. Я почти уверен, что на всех номерах будет стоять вариант, связанный с шиной PCI, например, PCI/ISA или PCI device, это зависит от вашей версии BIOS. А нам ведь надо, чтоб одно или несколько прерываний оставались пропущенными, то есть резервировались для ISA устройств. Так вот, на том прерывании, которое хотите оставить, просто выставляете значение вроде Legacy ISA. В более современных компьютерах все стало значительно проще из-за отсутствия слотов ISA, а это значит, что вы не можете добавить свои ISA устройства, а уж с системными, вроде флопика или последовательных/параллельных портов система сама разберется сносно. В таких системах вместо значения Legacy ISA появляется значение Reserved, то есть можно просто оставить прерывание свободным. Это может понадобиться в скорее теоретическом случае, если к Вам попало устройство не поддерживающее Plug'n'Play, тогда BIOS его просто не увидит.

В том же меню есть еще один полезный пункт. Информация об установленном оборудовании хранится в ESCD (Extended System Configuration Data). Эта информация проверяется каждый раз перед обращением к жесткому диску для запуска операционной системы. Естественно, при изменении конфигурации ESCD обновляется, а когда происходит обновление, изменяются и IRQ. Установив значение опции Reset Configuration Data в Enabled, Вы сбросите ESCD при следующем перезапуске.

В Award 6.00, а именно это BIOS установлен на большинстве материнских плат, есть еще одна интересная "фича". Если зайти в Power Management Setup ' IRQ/Event Activity Detect ' IRQs Activity Monitoring, то там можно настраивать, от устройств на каких прерываниях компьютер будет просыпаться. Там же можно посмотреть и текущее распределение номеров IRQ, но не всегда на это можно положиться, а вот почему:

Настройка прерываний из Windows

После BIOS в процесс распределения номеров IRQ сует свой нос Windows. Для того чтобы она правильно все сделала, хоть вмешивается винда в оный процесс далеко не всегда, надо ВСЕГДА иметь самые свежие драйверы материнской платы. Это очень важно, особенно, если вы собрали/купили современный компьютер, с материнской платой на новом или относительно новом чипсете и поставили на все это какой-нибудь Windows 98… Лично я знаю много таких людей, которые считают примерно так: у меня на материнской плате никаких наворотов нет, все там по стандарту, никаких "дров" не надо… Это совсем неправильно. Для нормальной работы системы, особенно когда прерывания используются совместно, нужно, чтобы Windows распознала чипсет и загрузила IRQ Miniport. Не забывайте также поставить свежие или хотя бы "родные" драйверы всех устройств, это поможет системе правильно работать.

Если Вы используете более новые Win 2000 или XP, что, на мой взгляд, является более оправданным выбором, то Вы можете столкнуться с некоторыми проблемами. Вы знаете, что такое ACPI (Advanced Configuration and Power Interface)? Это специальный интерфейс конфигурирования. Он несет в себе массу полезностей, но в Win 2K/XP может Вам здорово насолить. Особенно, если в системе есть ISA платы. Из-за него винда распределяет все PCI устройства, которые сидят в одноименных разъемах, на одно прерывание (вот почему у меня USB с модемом на IRQ 5, а остальное - на других), хорошо, хоть содержимое AGP слота и AC'97-кодек туда не спихнули ;). Из-за этого, если не выключать ACPI в BIOS перед установкой Windows, переназначить IRQ не удастся. Как посмотреть их распределение, я уже писал выше. А чтобы изменить ситуацию, придется выключать ACPI в BIOS (пункт ACPI Functions в разделе Power Management Setup) и изменять драйвер устройства Компьютер в диспетчере устройств с Компьютер с ACPI на Стандартный Компьютер. Хотя, лично мне бы не особо хотелось терять такие функции, напрямую связанные с ACPI, как автоматическое выключение компьютера или включение с клавиатуры. Кстати говоря, иногда и этот прием отмены ACPI не срабатывает, потому приходится выключать в BIOS и переставлять Windows.

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

Отключение 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 устройств.

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

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

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

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

Для работы требуется высокоскоростная выдача данных с 1986ВЕ1Т на компьютер с целью дальнейшей обработки средствами ПК.
Для данной задачи не достаточно скоростных возможностей UART.

Есть ли какие то примеры использования USB для этих целей?
Как вариант использование USB как виртуальный UART но на скоростях превышающий возможности UART ?

Доброго времени суток.

Для работы требуется высокоскоростная выдача данных с 1986ВЕ1Т на компьютер с целью дальнейшей обработки средствами ПК.
Для данной задачи не достаточно скоростных возможностей UART.

Есть ли какие то примеры использования USB для этих целей?
Как вариант использование USB как виртуальный UART но на скоростях превышающий возможности UART ?

В демопрограмме к SPL интегрирован USB виртуальный COM порт. Скорость передачи порядка 600 кБайт в сек. При ручной оптимизации возможно выжать и больше.
viewtopic.php?f=33&t=277&start=15

В принципе есть пример виртуального COM-порта для контроллера 1986ВЕ91, который был создан Фитоном. Мы его постарались адаптировать под 1986ВЕ1. Посмотрите, может быть вас устроит этот вариант.

Описание проекта:
Демонстрационная программа USB_Phyton_virtual_comm_echo для работы с USB.
Представляет собой виртуальный COM-порт замкнутый сам на себя (то есть данные, которые
передаются на плату, возвращаются обратно).
Программа взаимодействует с компьютером под управленим ОС Windows XP. Работа с другими
ОС и версиями Windows не проверялась.
Для обмена данными на компьютере должен быть установлен стандартный дайвер от Microsoft
для работы с CommunicationDeviceClass usbser.sys (при отсутствии взять из директории
текущего проекта /driver).
Также в директории /driver находится MDRVComport.inf файл для установки устройства в системе.
При первом подключении платы к компьютеру необходимо выполнить установку устройства с
использованием MDRVComport.inf файла и мастера установки оборудования.

Когда же появятся библиотеки и примеры чтобы можно было просто обмениваться данными используя Bulk передачи? Когда же появятся библиотеки и примеры чтобы можно было просто обмениваться данными используя Bulk передачи? Когда же появятся библиотеки и примеры чтобы можно было просто обмениваться данными используя Bulk передачи? Когда же появятся библиотеки и примеры чтобы можно было просто обмениваться данными используя Bulk передачи? Там есть библиотека стандартных функций работы с периферией. На базе этой библиотеке написан пример для USB (VCOM_echo), в котором контроллер представляется HOST-контроллеру USB (например, ПК) как виртуальный COM-порт.
А с каким устройством вы хотите обмениваться данными? Там есть библиотека стандартных функций работы с периферией. На базе этой библиотеке написан пример для USB (VCOM_echo), в котором контроллер представляется HOST-контроллеру USB (например, ПК) как виртуальный COM-порт.
А с каким устройством вы хотите обмениваться данными? С компьютером, только не через виртуальный Com-порт, а передачами массивов данных Bulk Там есть библиотека стандартных функций работы с периферией. На базе этой библиотеке написан пример для USB (VCOM_echo), в котором контроллер представляется HOST-контроллеру USB (например, ПК) как виртуальный COM-порт.
А с каким устройством вы хотите обмениваться данными? С компьютером, только не через виртуальный Com-порт, а передачами массивов данных Bulk
В реализованном устройстве типа Виртуальный COM порт, используются передачи типа Bulk.
Возможно вам интересен другой тип устройств, например MassStorage, или HID.
Тип передачи определяется требованиями типа устройства.
Если возможно то расскажите подробней, что именно вы хотите получить? В реализованном устройстве типа Виртуальный COM порт, используются передачи типа Bulk.
Возможно вам интересен другой тип устройств, например MassStorage, или HID.
Тип передачи определяется требованиями типа устройства.
Если возможно то расскажите подробней, что именно вы хотите получить? Делаю переходник: по определенному протоколу микропроцессор принимает из компьютера данные по USB и разбрасывает их на четыре канала ARINC, также четыре приемника ARINC принимают данные, микропроцессор заворачивает их по протоколу и отправляет по USB на комп. Так вот хотелось бы сделать это без использования VCOM,а просто отправлять передачами Bulk. Драйвер для подобного устройства написан под MS-DOS (и здесь на тип устройства вообщем-то до лампочки, главное чтобы были конечные точки типа Bulk), также возможно понадобится его реализация под Linux.
Если передачи типа Bulk там реализованы то подскажите, пожалуйста, как называются функции которые их выполняют, потому что я что-то не нарыл ничего похожего. В реализованном устройстве типа Виртуальный COM порт, используются передачи типа Bulk.
Возможно вам интересен другой тип устройств, например MassStorage, или HID.
Тип передачи определяется требованиями типа устройства.
Если возможно то расскажите подробней, что именно вы хотите получить? Делаю переходник: по определенному протоколу микропроцессор принимает из компьютера данные по USB и разбрасывает их на четыре канала ARINC, также четыре приемника ARINC принимают данные, микропроцессор заворачивает их по протоколу и отправляет по USB на комп. Так вот хотелось бы сделать это без использования VCOM,а просто отправлять передачами Bulk. Драйвер для подобного устройства написан под MS-DOS (и здесь на тип устройства вообщем-то до лампочки, главное чтобы были конечные точки типа Bulk), также возможно понадобится его реализация под Linux.
Если передачи типа Bulk там реализованы то подскажите, пожалуйста, как называются функции которые их выполняют, потому что я что-то не нарыл ничего похожего.

Функция USB_CDC_RecieveData(uint8_t* Buffer, uint32_t Length) автоматически вызывается если получены данные в массив Buffer длиной Length.

Просто программная часть реализации USB несколько сложнее чем просто принять пакет передать пакет.

Доброго времени суток. Накопились вопросы по интерфейсу USB. Подскажите пожалуйста, кто имел дело с ним режиме device.
1. Вообще, очень жаль, что нет нормальной структуры регистров в модуле (регистр с номером точки, в которую пришёл пакет, какой пакет, и т.д.). Каков алгоритм определения точки, адрес которой указан в токене? Ведь в регистрах USB_SEPx.TS, как я понял, биты не сбрасываются (а если и сбрасываются, то это означает токен-Setup ). Т.е. с помощью бита SCTDONE определяем наличие какого-то пакета для какой-то точки, а дальше.

2. Бит SCTDONE регистра USB_SIS. "Устанавливается в 1 после выполнения передачи". Судя по описанию IN/OUT транзакций в спецификации, этот бит устанавливается по приходу токен-пакета, но не данных. Вопрос - как определить окончание передачи данных от хоста (т.е. когда точно можно проверять количество байт в ФИФО приёмника)?

3. "Если оконечная точка готова (Рисунок 35в) и на шине был пакет SETUP, то биты SCTTYPE[1:0] в регистре USB_SEPx.TS устанавливаются в значение 00 для конечной точки с номером, содержащимся в поле пакета."
Но биты SCTTYPE[1:0] по умолчанию 00. Как же узнать, в какую точку пришёл Setup?

4. Сбрасываются ли аппаратно биты в регистрах USB_SEPx.STS?

Доброго времени суток. Накопились вопросы по интерфейсу USB. Подскажите пожалуйста, кто имел дело с ним режиме device.
1. Вообще, очень жаль, что нет нормальной структуры регистров в модуле (регистр с номером точки, в которую пришёл пакет, какой пакет, и т.д.). Каков алгоритм определения точки, адрес которой указан в токене? Ведь в регистрах USB_SEPx.TS, как я понял, биты не сбрасываются (а если и сбрасываются, то это означает токен-Setup ). Т.е. с помощью бита SCTDONE определяем наличие какого-то пакета для какой-то точки, а дальше.

2. Бит SCTDONE регистра USB_SIS. "Устанавливается в 1 после выполнения передачи". Судя по описанию IN/OUT транзакций в спецификации, этот бит устанавливается по приходу токен-пакета, но не данных. Вопрос - как определить окончание передачи данных от хоста (т.е. когда точно можно проверять количество байт в ФИФО приёмника)?

3. "Если оконечная точка готова (Рисунок 35в) и на шине был пакет SETUP, то биты SCTTYPE[1:0] в регистре USB_SEPx.TS устанавливаются в значение 00 для конечной точки с номером, содержащимся в поле пакета."
Но биты SCTTYPE[1:0] по умолчанию 00. Как же узнать, в какую точку пришёл Setup?

4. Сбрасываются ли аппаратно биты в регистрах USB_SEPx.STS?

1. Вы можете с помощью бита SCTDONE регистра USB->SIS определить, что успешно завершена транзакция, далее анализировать биты EPRDY регистров USB->SEP[x].CTRL для определения оконечной точки, которая завершила транзакцию, а потом уже смотреть USB->SEP[x].TS для определения типа транзакции (IN, OUT, SETUP).

2. То что описано в пункте 2 происходит аппаратно, то есть программисту этого "не видно" (прохождение всех стадий транзакции). Программист знает только результат выполнения транзакции (то есть после завершения всех стадий приема/передачи данных): закончилась транзакция успешно или с ошибкой. У End_Point'ов FIFO RX и TX разные (их 2).

P. S. Если вы увидели, что бит SCTDONE регистра USB_SIS установлен (успешно закончена транзакция), а в регистре USB_SEP0.TS вы видите значение:
0 (SC_SETUP_TRANS), то это значит, что транзакция уже выполнилась, в FIFO RX уже находятся данные пакета, и их можно прочитать и обработать (после чтения не забыть установить бит EPRDY в регистре USB_SEP0.CTRL).
1 (SC_IN_TRANS), то это значит, что транзакция уже выполнилась, HOST уже получил данные из FIFO TX, и вам необходимо либо занести новые данные в FIFO TX, а затем установить флаг EPRDY (регистра USB_SEP0.CTRL), либо если данных для передачи больше нет, то просто установить бит EPRDY (естественно не забыть правильно устанавливать EPDATASEQ в регистре USB_SEP0.CTRL).
2 (SC_OUTDATA_TRANS), то это значит, что транзакция уже выполнилась, в FIFO RX оконечной точки уже находятся данные пакета, и их можно прочитать и обработать (после чтения не забыть установить бит EPRDY в регистре USB_SEP0.CTRL).

Так как в 1986ВЕ1Т и 1986ВЕ9х USB контроллер одинаковый, то можно также заглянуть в эту тему

Petr, спасибо большое! Прочитал тему ВЕ9. На всякий случай ещё уточню, чтобы никаких уж сомнений:
1. Бит SCTDONE устанавливается после "полного окончания" ТРАНЗАКЦИИ.
2. Бит SCTDONE устанавливается независимо от результата транзакции (если, например, хост не ответит AKC'ом на данные, посланные девайсом в IN-запросе, то SCTDONE установится, но при этом в регистре статуса STS точки установится бит ошибки времени ожидания ответа от хоста).
3. Бит EPREADY точки, которая только что участвовала в транзакции сбрасывается одновременно с установкой бита SCTDONE (если SCTDONE был сброшен до этого).
4. Бит EPREADY АППАРАТНО сбрасывается как после отправления данных из TX буфера точки, так и после приёма в RX буфер.

Если всё так, то зря ругаю контроллёр).
Заранее спасибо.

Petr, спасибо большое! Прочитал тему ВЕ9. На всякий случай ещё уточню, чтобы никаких уж сомнений:
1. Бит SCTDONE устанавливается после "полного окончания" ТРАНЗАКЦИИ.
2. Бит SCTDONE устанавливается независимо от результата транзакции (если, например, хост не ответит AKC'ом на данные, посланные девайсом в IN-запросе, то SCTDONE установится, но при этом в регистре статуса STS точки установится бит ошибки времени ожидания ответа от хоста).
3. Бит EPREADY точки, которая только что участвовала в транзакции сбрасывается одновременно с установкой бита SCTDONE (если SCTDONE был сброшен до этого).
4. Бит EPREADY АППАРАТНО сбрасывается как после отправления данных из TX буфера точки, так и после приёма в RX буфер.

Если всё так, то зря ругаю контроллёр).
Заранее спасибо.

1. Да, бит SCTDONE устанавливается после "полного окончания" ТРАНЗАКЦИИ.
2. Отвечу немного позднее
3. Да, бит EPREADY оконечной точки, которая только что участвовала в транзакции, сбрасывается одновременно с установкой бита SCTDONE (если SCTDONE был сброшен до этого).
4. Да, бит EPREADY АППАРАТНО сбрасывается и после отправления данных из TX буфера точки, и после приёма в RX буфер.

Часовой пояс: UTC+03:00

Кто сейчас на конференции

Как заряжать гаджеты через USB если компьютер выключен

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

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

На материнских платах от Gigabyte стоит искать функцию ON/OFF Charge. В продуктах от MSI эта возможность называется Super Charger или i-Charger. Главное условие — функция должна работать не только в состояниях S3 и S4 (режимы экономии энергии), но и в S5 (выключенный компьютер). обратите внимание, что поддержку зарядки при выключенном компьютере могут иметь только определенные USB порты.


В мануале, который поставляется вместе с материнской платой, нужно поискать строку charge function under S3, S4, S5 mode или аналогичную.

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

Перемычка на материнской плате

Для активации подачи питания на USB-порты на некоторых моделях плат будет достаточно переместить в другое положение небольшую перемычку. На материнке необходимо найти коннекторы, которые обозначаются как USBPW1-4 или USBPW5-10. По цифрам вы можете понять, за какие конкретно порты USB отвечает данный блок выводов.

С завода перемычка стоит в положении 1–2, что говорит о значении 5V. Вам необходимо переместить ее в положение 2–3, чтобы перевести материнскую плату в режим 5V SB (Stand By). В этом случае будут использоваться дежурные 5 вольт с блока питания.

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


Изменение параметров BIOS

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

Зайти в данное системное меню можно при включении компьютера до загрузки самой операционной системы. Для этого следует постоянно нажимать клавишу F2 или Del. Именно они в большинстве компьютеров отвечают за переход в BIOS. В ноутбуках Asus может использоваться кнопка F9, а в продукции от Acer и Lenovo понадобится нажимать F1 или F2 в зависимости от модели.

AMI, AWARD BIOS

В старых компьютерах и ноутбуках стоят именно эти версии системного меню. Большинство пунктов и разделов у AMI и AWARD совпадают, поэтому рассмотрим их в одном блоке. Как только вы зашли в главное меню BIOS, выполните следующие действия:

1. С помощью клавиш на клавиатуре перейдите в раздел Integrated Peripherals.


2. Пункты USB Controller и USB Device Legacy Support должны находиться в состоянии Enabled (Включено).


3. Выйдите в основное меню с помощью клавиши Escape. Зайдите в раздел Power Management Setup.


4. Убедитесь, что пункт ACPI Functions находится в состоянии Enabled. Зайдите в подраздел Wake Up Event.


5. Необходимо включить пункт Resume From S3 by USB Device, установив состояние Enabled.


6. Остается только сохранить изменения по F10 и перезагрузить компьютер.

В зависимости от конкретной версии пункты меню могут отличаться в названии. Если материнская плата поддерживает ErP/EuP, то обязательно отключите этот режим, иначе питание на USB-порты подаваться не будет.


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

При активации ErP компьютер будет потреблять не более 1 Вт

UEFI Bios

Новейшие «материнки» уже имеют продвинутую версию BIOS с массой дополнительных настроек и более интерактивным меню. Чтобы активировать питание на USB-порты при выключенном компьютере, вам необходимо выполнить следующие действия:

1. Рекомендуется включить английский язык в UEFI BIOS, поскольку перевод на русский в некоторых пунктах может быть выполнен некорректно. Для этого перейдите в Advanced Mode (F7) и выберите в меню System Language английский язык.


2. Затем на вкладке Advanced зайдите в блок настроек Onboard Devices Configuration.


3. Найдите среди пунктов строку USB Battery Charging Support или Charging USB Devices in State S5. Необходимо перевести параметр в значение Enable. Конкретно для этой материнской платы зарядка будет доступна только через USB 3.1. Остается только сохранить изменения.


«Важно. Не забудьте выключить функцию ErP Ready. Она находится в разделе APM Configuration».


На материнских платах фирмы MSI следует перейти в раздел Advanced главного меню. Далее выбирается пункт Wake Up Event Setup.


Остается только перевести параметр Resume from S3-S5 by USB Device в состояние Enabled (Включено).


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

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