Выставить приоритет прерывания от контроллера usb в который подключена карта
В этом разделе описываются практически все (по мере создания) параметры, устанавливаемые в программе SETUP для BIOS фирмы AWARD Software International Inc. В конкретной материнской плате каких-то из описываемых параметров может и не быть. Одни и те же параметры могут называться по разному в зависимости от производителя материнской платы, поэтому здесь в некоторых случаях приведено несколько вариантов.
Для просмотра и корректировки установок chipset в BIOS вашего компьютера рекомендуем воспользоваться прелестной программой TweakBIOS. С помощью этой программы можно изменять установки в BIOS "на лету", а также увидеть, правильно ли программа SETUP выполнила установки.
ПРИМЕЧАНИЕ: Программа запускается и под различными Windows, но использовать ее можно только в DOS.
Содержание:
Раздел BIOS FEATURES SETUP
Раздел CHIPSET FEATURES SETUP
Раздел PnP/PCI Configuration Setup
Раздел Power Management Setup
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Yes - освободить IRQ 6
- No — не освобождать (независимо от того, есть ли флоппи-дисковод или нет)
- Enabled - разрешено
- Disabled - запрещено
Раздел CHIPSET FEATURES SETUP
Установка параметров для FPM DRAM, EDO DRAM и Synchronous DRAM
Конфигурирование шин PCI, AGP, портов ввода/вывода и установка параметров IDE контроллера
-
(Режим кэширования для видеопамяти) — параметр действителен только для процессоров архитектуры Pentium Pro (Pentium II, Deshutes и т.п.). В процессоре Pentium Pro была предусмотрена возможность изменять режим кэширования в зависимости от конкретной области памяти через специальные внутренние регистры, называемые Memory Type Range Registers — MTRR. С помощью этих регистров для конкретной области памяти могут быть установлены режимы UC (uncached — не кэшируется), WC (write combining — объединенная запись), WP (write protect — защита от записи), WT (write through — сквозная запись) и WB (write back — обратная запись). Установка режима USWC (uncached, speculative write combining — не кэшировать, режим объединенной записи) позволяет значительно ускорить вывод данных через шину PCI на видеокарту (до 90 MB/c вместо 8 MB/c). Следует учесть, что видеокарта должна поддерживать доступ к своей памяти в диапазоне от A0000 — BFFFF (128 kB) и иметь линейный буфер кадра. Поэтому лучше установить режим USWC, но в случае возникновения каких-либо проблем (система может не загрузиться) установить значение по умолчанию UC. Может принимать значения:
- UC - uncached — не кэшируется
- USWC — uncached, speculative write combining — не кэшировать, режим объединенной записи.
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Normal — обычный интерфейс принтера, также называется SPP
- ECP — порт с расширенными возможностями
- EPP — расширенный принтерный порт
- ECP + EPP- можно использовать оба режима
- SPP — обычный интерфейс принтера, также называется SPP
- ECP — порт с расширенными возможностями
- EPP — расширенный принтерный порт
- EPP 1.9 — версия 1.9 исполнения интерфейса
- EPP 1.7 — версия 1.7 исполнения интерфейса
- 1 — канал 1
- 3 - канал 3
- Disabled - запрещено использовать DMA
- Primary - разрешена работа только первого канала
- Secondary - разрешена работа только второго канала
- Both - разрешена работа обеих каналов
- Disable - запрещена работа обеих каналов
- Enable - контроллер разрешен
- Disable - контроллер запрещен
- PNP OS Installed(установлена ли операционная система с поддержкой режима Plug&Play?) - Установить Yes, если операционная система поддерживает Plug&Play (например, Windows 95) и No в противном случае.
- Resources Controlled By(как управляются ресурсы) - Если выбрано AUTO, то BIOS сам автоматически назначит прерывания и каналы DMA всем устройствам, подключенным к шине PCI и эти параметры не будут появляться на экране. В противном случае все эти параметры следует установить вручную. В некоторых вариантах BIOS этот параметр может устанавливаться индивидуально для каждого PCI слота и выглядеть так: Slot 1 IRQ, Slot 2 IRQ и т.д. (сброс конфигурационных данных) — Рекомендуется устанавливать его в Disabled. При установке Enabled BIOS будет очищать область Extended System Configuration Data (Расширенные данные о конфигурации системы — ESCD), в которой хранятся данные о конфигурировании BIOS`ом системы, поэтому возможны аппаратные конфликты у "брошенных" таким образом на произвол судьбы устройств. (прерывание с номером n назначено на. ) — Каждому прерыванию системы может быть назначен один из следующих типов устройств:
- Legacy ISA (классические ISA карты) — Обычные карты для ISA, такие как модемы или звуковые карты без поддержки Plug&Play. Эти карты требуют назначения прерываний в соответствии с документацией на них.
- PCI/ISA PnP (устройства для шины PCI или устройства для шины ISA с поддержкой Plug&Play) — этот параметр устанавливается только для устройств на шине PCI или ISA карт с поддержкой Plug&Play.
- Legacy ISA (классические ISA карты) — Обычные карты для ISA, такие как модемы или звуковые карты без поддержки Plug&Play. Эти карты требуют назначения каналов DMA в соответствии с документацией на них.
- PCI/ISA PnP (устройства для шины PCI или устройства для шины ISA с поддержкой Plug&Play) — этот параметр устанавливается только для устройств на шине PCI или ISA карт с поддержкой Plug&Play.
- Level (уровень) — контроллер прерываний реагирует только на уровень сигнала.
- Edge (перепад) - контроллер прерываний реагирует только на перепад уровня сигнала.
- PCI IDE IRQ mapping (используется для PCI IDE)
- PC AT (ISA) (используется для ISA)
- Enabled - разрешено
- Disabled - запрещено
- No/ICU (нет/конфигурационная утилита для ISA) — если установлено это значение, то BIOS может распоряжаться этим прерыванием по своему усмотрению. Для DOS настройка параметров в этом случае может также выполняться с помощью программы ISA Configuration Utility от Intel.
- Yes (да) - означает принудительное освобождение прерывания для какой-либо карты на шине ISA, не поддерживающей режим Plug&Play. Рекомендуется всегда указывать Yes для таких карт и нужных им прерываний, так как в противном случае BIOS может назначить прерывание, жестко используемое какой-либо картой на ISA, другой карте, что может вызвать даже прекращение нормальной работы компьютера.
- No/ICU (нет/конфигурационная утилита для ISA) — если установлено это значение, то BIOS может распоряжаться этим каналом DMA по своему усмотрению. Для DOS настройка параметров в этом случае может также выполняться с помощью программы ISA Configuration Utility от Intel.
- Yes (да) - означает принудительное освобождение канала DMA для какой-либо карты на шине ISA, не поддерживающей режим Plug&Play. Рекомендуется всегда указывать Yes для таких карт и нужных им каналом DMA, так как в противном случае BIOS может назначить канал, жестко используемый какой-либо картой на ISA, другой карте, что может вызвать даже прекращение нормальной работы компьютера.
- No/ICU (нет/ICU) - оставляет управление этим параметром на усмотрение BIOS или программы ICU.
- C800, CC00, D000, D400, D800 и DC00 - указывается адрес блока памяти. Кроме этого, появляется дополнительный параметр ISA MEM Block SIZE (размер блока памяти), который нужен в том случае, если таких ISA карт несколько и этот параметр может принимать значения 8K, 16K, 32K, 64K
- AUTO (автоматически) — Разрешен поиск SCSI контроллера Adaptec и запуск BIOS для него.
- Disabled (запрещено) — Устанавливается в это значение при отсутствии SCSI карты.
- Yes - разрешено
- No — запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- AUTO (автоматически) — Разрешен поиск SCSI контроллера и запуск BIOS для него.
- Disabled (запрещено) — Устанавливается в это значение при отсутствии SCSI карты.
- Enabled - разрешено
- Disabled - запрещено
- PCI/AGP - сначала BIOS PCI видеокарты, затем AGP
- AGP/PCI - сначала BIOS AGP видеокарты, затем PCI
- OS — поддержка через операционную систему
- BIOS - поддержка через BIOS
Раздел Power Management Setup
- Power Management(управление энергопотреблением) — позволяет либо разрешать BIOS'у снижать энергопотребление компьютера, если за ним не работают, либо запрещать. Может принимать значения:
- User Define (определяется пользователем) — при установке этого параметра вы можете самостоятельно установить время перехода в режим пониженного энергопотребления.
- Min Saving (минимальное энергосбережение) — при выборе этого параметра компьютер будет переходить в режим пониженного энергопотребления через время от 40 мин. до 2 часов (зависит от конкретного BIOS материнской платы)
- Max Saving (максимальное энергосбережение) — компьютер перейдет в режим пониженного энергопотребления через 10 — 30 с. после прекращения работы пользователя с ним.
- Disable (запрещение энергосбережения) — запрещает режим энергосбережения.
- Enabled - разрешено
- Disabled - запрещено
- Susp, Stby -> Off (выключение в режиме Suspend И Standby) — монитор перейдет в режим пониженного энергопотребления при наступлении либо режима Suspend, либо Standby.
- All modes -> Off (выключение во всех режимах) — монитор будет переведен в режим пониженного энергопотребления в любом режиме.
- Always On (всегда включен) — монитор никогда не будет переведен в режим пониженного энергопотребления
- Suspend -> Off (выключение в режиме Suspend) — монитор перейдет в режим пониженного энергопотребления при наступлении режима Suspend.
- DPMS OFF - снижение энергопотребления монитора до минимума
- DPMS Reduce ON - монитор включен и может использоваться
- DPMS Standby - монитор в режиме малого энергопотребления
- DPMS Suspend — монитор в режиме сверхмалого энергопотребления
- Blank Screen - экран пуст, но монитор потребляет полную мощность
- V/H SYNC+Blank - снимаются сигналы разверток — монитор переходит в режим наименьшего энергопотребления.
- Enabled - разрешено
- Disabled - запрещено
-
(частота процессора в режиме Standby) - определяет коэффициент деления тактовой частоты в режиме Standby (ожидания работы).
- HDD Power Down(выключение жесткого диска) - устанавливает либо время, через которое при отсутствии обращения жесткий диск будет выключен, либо запрещает такое выключение вообще. Параметр не оказывает влияние на диски SCSI. Может принимать значения:
- От 1 до 15 минут
- Disabled - запрещено
- 30 Sec, 1 Min, 2 Min, 4 min, 8 Min, 20 Min, 30 Min, 40 Min, 1 Hour - время перехода (Sec — секунды, Min — минуты, Hour — час)
- Disabled - запрещено
- 30 Sec, 1 Min, 2 Min, 4 min, 8 Min, 20 Min, 30 Min, 40 Min, 1 Hour - время перехода (Sec — секунды, Min — минуты, Hour — час)
- Disabled - запрещено
- 30 Sec, 1 Min, 2 Min, 4 min, 8 Min, 20 Min, 30 Min, 40 Min, 1 Hour - время перехода (Sec — секунды, Min — минуты, Hour — час)
- Disabled - запрещено
-
— разрешение этого параметра приведет к "пробуждению" компьютера от модема или мыши, подключенных к COM2. Может принимать значения:
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Soft Off (программное выключение) — кнопка работает как обычная кнопка включения/выключения питания компьютера, но при этом разрешается программное выключение компьютера (например, при выходе из Windows 95).
- Suspend (временная остановка) — при нажатии на кнопку питания на время менее 4 секунд компьютер переходит в стадию Suspend снижения энергопотребления.
- No Function (нет функций) — кнопка Power становится обычной кнопкой включения/выключения питания.
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Enabled - разрешено
- Disabled - запрещено
- Everday (ежедневно) — при вводе времени компьютер будет включаться ежедневно в назначенное время. Время вводится в поле Time (hh:mm:ss) Alarm в порядке часы:минуты:секунды либо клавишами PgUp, PgDn, либо непосредственным вводом чисел.
- By Date (по дате) - компьютер включится в заданный день и в заданное время. При выборе этого параметра появляется поле для ввода времени (такое же, как и для Everyday) и поле для ввода дня месяца Date of Month Alarm — день месяца — в этом поле вводится число в месяце. Это автоматически означает, что запрограммировать включение компьютера можно только внутри одного месяца.
- Disabled - запрещено
- На шаге 9 Windows будет запрашивать нестандартный строковый дескриптор 0xEE. Именно правильный ответ на него начинает дальнейшую процедуры обмена данными для WinUSB.
- Далее идет запрос Extended Compat ID OS Descriptor.
- Последний — Extended Properties OS Descriptor. Именно здесь девайс сообщает свой GUID.
-
— при разрешении этого параметра компьютер не "засыпает", если подключенное к порту COM2 устройство используется. Может принимать значения:
-
(он же Soft-of By PWR-BTTN) (кнопка питания нажата менее 4 секунд) - управляет функциями кнопки Power на системном блоке компьютера. Может принимать значения:
В следующих секциях BIOS только сообщает характеристики некоторых устройств компьютера. Разрешение параметров в этих секциях позволяет отслеживать BIOS'у эти параметры и сообщать об их выходе за пределы допустимого.
Секция Voltage Monitor (наблюдение за напряжениями питания). В этой секции индицируются как напряжения питания, подаваемые на материнскую плату источником питания, так и вырабатываемые на материнской плате. Разъяснения эти параметры не требуют, кроме VCORE — это напряжение питания ядра процессора. Это напряжение вырабатывается, как правило, на материнской плате.
С помощью данной опции можно установить приоритет доступа к системной шине между процессором и шиной PCI. То есть выбор устройства (процессор или PCI-карта), которое получит доступ к системной шине при одновременном поступлении на FSB запроса от данных устройств. Опция работает только при наличии PCI-устройств, которые поддерживают режим Bus Master .
Favor CPU – при одновременном поступлении запроса на системную шину от процессора и устройства PCI приоритет имеет процессор;
Favor PCI – при одновременном поступлении запроса на системную шину от процессора и устройства PCI приоритет имеет PCI-устройство;
Rotation – каждое из устройств (процессор и PCI-карта) на время (по очереди) получают приоритет доступа к шине FSB;
Установка соотношения частот AGP -шины и шины PCI (значение частоты AGP -шины / значение частоты шины PCI ).
С помощью данной опции можно разрешить/запретить одновременную работу нескольких устройств, подключенных к шине PCI.
Примечание. Bus Master – режим, при котором устройства, подключенные к PCI-шине, самостоятельно (без участия ЦП) управляют шиной.
С помощью данной опции можно включить использование специального буфера ввода-вывода, через который устройства могут обращаться к шине PCI.
Использование опции позволяет системным устройствам инициировать повторную запись данных в шину PCI, если данные долго находятся в буфере отложенной записи.
Disabled (или Off ) – запретить повторную запись данных в шину PCI, если данные долго находятся в буфере отложенной записи.
Данный параметр позволяет ускорить процесс обмена данными с шиной PCI ( разрешает запись по 4 машинных слова за один такт в буфер чтения-записи шины PCI ). Устройства считывают данные с буфера или записывают ее туда, не используя процессор.
Примечание. Пакетный режим передачи данных ( Burst Mode ) – увеличивает скорость передачи данных за счет того, что система не тратит время на указание текущего адреса внутри пакета (блока). Адрес выдается один раз, а затем подряд выполняется серия циклов чтения/записи.
Оптимизация обмена данными между процессором и интерфейсом PCI/IDE путем предварительной буферизации данных.
Disabled (или Off ) – запретить предварительную буферизацию данных при обмене данными между процессором и интерфейсом PCI/IDE.
Установка времени задержки (в тактах системной шины) перед началом записи данных из процессора в шину PCI.
Данный параметр позволяет установить одновременный доступ к шине PCI и восьмиразрядным ISA картам расширения, что позволяет повысить производительность системы. Использование данной опции возможно только в случае поддержки материнской платой спецификации PCI 2.1.
Использование данной опции позволяет дать устройству, установленному в первый PCI-слот высший приоритет относительно других устройств.
Enabled (или On ) – устройство, установленное в первый PCI-слот имеет высший приоритет относительно других устройств;
Опция позволяет разрешить/запретить всем устройствам, управляющим шиной PCI (при использовании режима Bus Master), одновременно использовать буфер отложенной записи.
Определения приоритета процессора при работе с шиной PCI, если другим устройствам также предоставлена возможность управления данной шиной. Другими словами опция устанавливает количество PCI -циклов, по истечении которых процессор получит доступ к шине PCI.
Включение данной опции позволяет разрешить параллельную работу шин PCI и ISA (работа с устройствами PCI в момент, когда идет обмен данными с шиной ISA).
Поддержка спецификации 2.1 шины PCI . Спецификация PCI 2.1 позволяет использовать частоты 66 МГц и подключение к шине PCI более 4 устройств.
Использование режима параллельной работы нескольких устройств PCI при обращении PCI-шины к процессору.
Опция позволяет включить/отключить проверку контроллером шины данные при записи из буфера в шину PCI . В случае возникновения ошибок запись данных в шину повторяется.
Power Off (или Disabled или Keep Off или Soft Off ) – после восстановления питания компьютер останется выключенным;
Last State (или Enabled или Auto или Memory ) – после восстановления питания компьютер возвратится в исходное состояние;
Former — sts – после восстановления питания компьютер останется выключенным, но после нажатия кнопки Power компьютер возвратится в исходное состояние;
By Date – установка даты включения компьютера (нужно ввести время и день, когда необходимо включить ПК).
Отключение компьютера после длительного пребывания в режиме S3 (для Windows XP режиму S3 соответствует “спящий режим”).
Позволяет указать время отсутствия активности пользователя, после чего будет произведен переход ПК в режим Suspend .
Выход с энергосберегающего режима при каждом проявлении активности устройств, подключенных к COM -порту.
Включение компьютера и выход с энергосберегающего режима при любом воздействии на мышь или клавиатуру.
Password – после выбора данного значения появляется дополнительная опция x KB Power On Password для ввода пароля, который будет запрашиваться при выходе с энергосберегающего режима;
Hot Key – после выбора данного значения появляется дополнительная опция x KB Power On Hot Key , после чего необходимо указать клавишу (комбинацию клавиш) для запуска ПК;
Включение компьютера или выход с энергосберегающего режима при появлении сигналу из локальной сети (для Phoenix BIOS).
LPT / COM ( или On, или Enabled )– выход ПК из энергосберегающего режима при активности параллельного и (или) последовательного портов.
Выход с энергосберегающего режима при каждом проявлении активности устройств, подключенных к LPT -порту.
IRQ 3 ( COM 2) – выход компьютера из режима энергосбережения при активности контроллера прерываний IRQ3 (данному прерыванию соответствует устройство, подключенное к последовательному порту COM2);
IRQ 4 ( COM 1) – выход компьютера из режима энергосбережения при активности контроллера прерываний IRQ4 (данному прерыванию соответствует устройство, подключенное к последовательному порту COM1);
IRQ 5 ( LPT 2) – выход компьютера из режима энергосбережения при активности контроллера прерываний IRQ5 (данному прерыванию соответствует устройство, подключенное к параллельному порту LPT2);
IRQ 6 ( Floppy Disk ) – выход компьютера из режима энергосбережения при активности контроллера прерываний IRQ6 (данному прерыванию соответствует флоппи-дисковод);
IRQ 7 ( LPT 1) – выход компьютера из режима энергосбережения при активности контроллера прерываний IRQ7 (данному прерыванию соответствует устройство, подключенное к параллельному порту LPT1);
IRQ 8 ( RTC Alarm ) – выход компьютера из режима энергосбережения при срабатывании таймера встроенных часов;
IRQ 12 ( PS /2 Mouse ) – выход компьютера из режима энергосбережения при активности контроллера прерываний IRQ12 (данному прерыванию соответствует PS /2-мышь);
IRQ 1 4 – выход компьютера из режима энергосбережения при обращении к винчестеру , подключенному к первому каналу IDE ;
IRQ 1 5 – выход компьютера из режима энергосбережения при обращении к приводу оптических дисков или винчестеру;
Serial Port – выход компьютера из режима энергосбережения при появлении активности на любом из последовательных портов;
Включение/отключение режима слежения за активностью устройств (для дальнейшего выхода компьютера из режима энергосбережения).
Продолжение, первая часть здесь.
Упрощенная структура USB. Видно что есть всего два прерывания USBIRQ и USBWU
Инициализация USB
Ничего сложного, описание регистров смотрите даташите. Разрешаем endpoint 0-2, включаем прерывания, указывает буферы для хранения данных. (Endpoint 2 и 3 разрешены для работы с double buffer при отправке данных к хосту)Далее разрешаем перекрывание USBIRQ (дальше нужно анализировать флаги) и включаем прерывания глобально:
Собственно это и вся инициализация. При каждом прерывании, будет вызываться обработчик который выглядит примерно вот так:
Обработчик прерывания USB
Это основа нашей системы. Все действие будет крутиться здесь. Какое именно событие произошло будем понимать после анализа регистра IVEC.
Энумерация
Пожалуй, воспользуюсь цитатой из замечательного руководства USB in a NutShell — путеводитель по стандарту USBЭнумерация – процесс определения факта, что устройство действительно подключено к шине USB и каких параметров это требует – потребляемая мощность,
количество и тип конечной точки (или точек), класс устройства и т. д. В процессе энумерации хост назначает устройству адрес и разрешает конфигурацию,
позволяющую устройству передавать данные по шине. [. ]
Общий процесс энумерации под операционной системой Windows включает в себя следующие шаги:1. Хост или хаб детектирует подключение нового устройства с помощью pull-up резисторов, которое устройство подключает к паре сигнальных проводов данных (D+ и D-). Хост делает задержку как минимум 100 мс, что позволяет вставить коннектор полностью и застабилизировать питание устройства.
2. Хост выдает на шину сброс, который выводит устройство в состояние по умолчанию. Устройство может теперь ответить на заданный по умолчанию нулевой адрес.
3. Хост MS Windows запрашивает первые 64 байта дескриптора устройства (Device Descriptor).
4. После приема первых 8 байт дескриптора устройства, хост немедленно выдает новый сброс шины.
5. Теперь хост выдает команду Set Address, чем переводит устройство в адресуемое состояние.
6. Хост запрашивает все 18 байт дескриптора устройства.
7. Затем он запрашивает 9 байт дескриптора конфигурации (Configuration Descriptor), чтобы определить полный её размер.
8. Хост запрашивает 255 байт дескриптора конфигурации.
9. Хост запрашивает все строковые дескрипторы (String Descriptors), если они имеются.Для анализа и отладки минимальный набор это — UART на стороне контроллера и программный анализатор USB на хосте. Рекомендую бесплатный Microsoft Message Analyzer.
Итак, вся энумерация (и последующие vendor requset и прочие запросы, если они нужны) будут обрабатываться в функции isr_sudav() (Setup data valid interrupt).
Предпоследние два ветвления в этой функции ответственны за запросы Extended Compat ID OS Descriptor и Extended Properties OS Descriptor.
На этом этапе энумерация закончена, можно приступить к приму/передаче данных.Bulk Tranfer
In Tranfer
Хост хочет принять данные. Отправляет In token. Если бит inxbsy (x — номер эндпойнта) установлен, то USB контроллер отправляет данные в хост. Что бы установить это самый бит, мы должны предварительно загрузить данные в буфер inxbuf[] и сказать сколько загрузили записью в регистр inxbc, т.е. данные надо предзагрузить до прерывания.После успешной отправки данных — получили ACK — происходит прерывание INT_EP1IN (функция usb_irq) и в нем можно загрузить следующий кусок данных.
Out Tranfer
Double buffering
Ждем пока IN 2 освободиться и по очереди льем данные то в in2buf то in3buf, то при этом все время обновляем in2bc (. ). Код особо не тестировался, применяйте с осторожностью.
Программируем Host
Замеры скорости
Вот каких результатов удалось добиться:
Передача данных на хост в single buffer 360 кб/с Передача данных на хост в double buffer 510 кб/с Прием данных с хоста single buffer 230 кб/c Прием данных с хоста double buffer не тестировался
Заключение
Прежде, чем объяснять код поддержки хост-контроллеров, необходимо рассказать о некоторых принципах работы железа, а также об используемых структурах данных. Как я выяснила при написании текста, одна статья обо всём уровне поддержки хост-контроллеров получилась бы слишком большой, поэтому вторая часть цикла — которую вы сейчас читаете — рассказывает о том, что необходимо знать для понимания кода, а описание действий, происходящие в коде, я отложу до следующей части.Прерывания и потоки
Хост-контроллеры оповещают софт о происходящих событиях, генерируя прерывания. Прерывание может прийти и оторвать процессор от текущей задачи в любой момент времени; это накладывает жёсткие требования на обработчик прерывания. Обработчик прерывания не может захватывать никакие блокировки — ведь вполне возможно, что прерванный код как раз завладел блокировкой и уже не сможет её освободить. Единственным исключением является вариант спинлока, запрещающий прерывания на время блокировки, но из-за глобальности эффекта спинлок стоит применять пореже и для очень коротких участков кода. На однопроцессорных конфигурациях такой вариант вырождается в пару cli / sti без собственно спинлока, на многопроцессорных внутри cli / sti остаётся обычный спинлок. Кроме того, контроллер прерываний во время обработки одного прерывания блокирует остальные с тем же или более низким приоритетом.
Поток USB также иногда просыпается для обработки событий, отложенных по времени. Пример, о котором я позже расскажу подробнее: после события подключения устройства нужно выждать 100 миллисекунд перед дальнейшей обработкой. В этом случае поток проснётся при обнаружении подключения устройства и запланирует следующее пробуждение через 100 миллисекунд, уже не связанное с пробуждением из-за прерывания.
Структуры данных
Для уровня поддержки хост-контроллеров важны следующие структуры: структура данных контроллера *_controller , структура данных канала *_pipe , структура данных неизохронной передачи *_gtd . Каждая из них состоит из двух частей: специфичной для хост-контроллера *hci_* и общей для всех контроллеров usb_* . Хост-контроллер требует выравнивания своих структур. Данные контроллера используют выравнивание на границу страницы, то есть 1000h байт. Выравнивание прочих данных разное для разных контроллеров.В KolibriOS обе части каждой структуры располагаются в памяти последовательно. Память под обе структуры выделяется одним приёмом с учётом требуемого выравнивания. Первой в памяти идёт часть, отвечающая за общение с хост-контроллером, чтобы обеспечить выравнивание. Для адресации обеих частей используется один указатель, указывающий на границу между частями; по отрицательным смещениям находятся данные *hci_* , по неотрицательным — данные usb_* . Указатель на usb_controller постоянно размещается в регистре esi . Хэндл канала представляет собой указатель на usb_pipe ; одним из полей usb_pipe является указатель на соответствующий usb_controller .
Код, выделяющий память под структуры, должен знать размеры обеих структур и требуемое выравнивание. Для *_controller используется постраничный аллокатор, автоматически гарантирующий выравнивание на границу страницы. Аллокатор вызывается кодом, ответственным за usb_controller , размер структуры *hci_controller берётся из usb_hardware_func.DataSize ; как я упоминала в общем обзоре, usb_hardware_func описывает вещи, специфичные для хост-контроллера, остальному коду.
Для *_pipe и *_gtd выделять по странице на каждый экземпляр было бы крайне расточительно, а использовать общую кучу ядра для малых блоков — неудобно из-за требований выравнивания. Поэтому для них код использует аллокатор блоков фиксированного размера, который, выделив страницу, нарезает её на блоки заданного размера и отдаёт их один за другим. Если выделяемый размер кратен, например, 16 байтам, то все выделяемые блоки будут иметь адрес, кратный 16. Здесь аллокатору для каждого размера нужны отдельные данные; чтобы не включать их все в структуру usb_hardware_func , последняя содержит функции выделения/освобождения AllocPipe / FreePipe для пары структур *_pipe и AllocTD / FreeTD для пары структур *_gtd .Хост-контроллер должен знать физические адреса всех структур, чтобы работать с ними. Адрес структуры *hci_controller заносится в ходе инициализации контроллера. Адреса структур данных неизохронных передач собраны в односвязный список с физическим адресом первого элемента внутри *hci_pipe и физическим адресом каждого следующего элемента внутри *hci_gtd .
Каналы сгруппированы в несколько списков. Внутри каждого списка есть три связи: физический адрес следующего канала для железа, виртуальные адреса следующего и предыдущего каналов для софта. Один список состоит из всех каналов для управляющих передач. Другой список состоит из всех каналов для передач массивов данных.
Списки каналов прерываний организованы в двоичное дерево так, как показано на рисунке, где кружки обозначают списки каналов прерываний, а стрелки — физические адреса следующих элементов. Хост-контроллер начинает каждую единицу времени (фрейм для UHCI и OHCI, микрофрейм для EHCI) с того, что берёт младшие n бит номера фрейма (именно фрейма, даже если это EHCI), берёт соответствующий элемент таблицы адресов, являющейся частью *hci_controller , и начинает идти по ссылкам на следующий элемент. Первый список, таким образом, будет обрабатываться один раз каждые 2 n миллисекунд. Дальше пары ссылок «склеиваются»: на следующий список ведёт две ссылки так, чтобы следующий список получал внимание контроллера дважды за полный цикл по таблице адресов, один раз каждые 2 n-1 миллисекунд. В конце располагается список, элементы которого обрабатываются каждую миллисекунду. Такая организация каналов прерываний позволяет реализовать каналы с интервалом обработки, выражающимся в миллисекундах степенью двойки. Спецификация USB разрешает делать реальный интервал опроса меньше запрошенного.В EHCI единица планирования — микрофрейм, который в 8 раз меньше фрейма. Тем не менее, прогулки по спискам каналов по-прежнему руководствуются номером фрейма. Поэтому в каждом канале прерываний есть битовая маска на 8 бит, в которой каждый бит соответствует одному микрофрейму внутри фрейма, нулевое значение бита приводит к немедленному продолжению прогулки по ссылкам. В некоторых каналах таких масок даже две, не пересекающихся по единичным битам, но об этом позже.
Поддержка изохронных передач находится на стадии разработки, поэтому пока я скажу только несколько слов про аппаратную часть. В OHCI изохронные передачи адресуются аналогично остальным: в ohci_pipe есть бит, отвечающий за формат структур данных передачи, изохронные и остальные используют разный формат. В UHCI и EHCI структуры данных для изохронных каналов как таковой нет, а структуры изохронных передач вставляются в таблицу адресов наравне со структурами каналов прерываний. Чтобы контроллер мог понять, указывает ли адрес на канал или на изохронную передачу (которых на самом деле есть два разных типа), два бита адреса отводятся под тип структуры, которая по этому адресу находится. Как следствие, число n для UHCI и EHCI равно 10, но не для поддержки интервалов опроса в секунду с лишним, а для того, чтобы после обработки фрагмента изохронной передачи у софта была секунда на запрос следующего фрагмента. В OHCI n=5.
Передачи и транзакции
Хотя протоколы архитектуры USB ниже передач почти неинтересны, но есть некоторые вещи, которые о них знать всё же необходимо при реализации уровней ниже уровня драйверов.
Размер передачи по шине USB практически неограничен; чтобы одно устройство не занимало шину слишком надолго, передачи разбиваются на транзакции. За одну транзакцию передаётся очередной фрагмент данных ограниченной длины. Максимальная длина транзакции — одна из характеристик канала. Для одного этапа передачи (я напомню, что управляющие передачи состоят из двух или трёх этапов, а остальные — из одного этапа) все транзакции, кроме последней, имеют максимальный размер; последняя транзакция передаёт оставшиеся данные и может быть короче остальных.Размер данных, которые может описать одна пара структур *_gtd , также ограничен. Если все данные не умещаются в одну *_gtd , передачу нужно разбивать на несколько частей. Места разбиения нужно выбирать так, чтобы с точки зрения устройства происходящее оставалось одной передачей, то есть размер всех частей, кроме последней, должен делиться на максимальный размер транзакции.
UHCI — хронологически первый интерфейс, созданный Intel; в UHCI упор делается на простоту аппаратной реализации. Как следствие, UHCI-контроллер ничего не знает про передачи, а одна структура uhci_gtd описывает одну транзакцию. Для больших передач это приводит к большим накладным расходам на отдельную память для всех транзакций.
В OHCI и EHCI контроллер уже умеет самостоятельно разбивать длинные передачи на транзакции, здесь ограничения слабее. В ohci_gtd есть два поля для двух страниц данных, в лучшем случае получается 2000h байт, в худшем (если данные начинаются с адреса xxxxxFFFh ) — 1001h байт = 4 килобайта + 1 байт. В ehci_gtd помещаются уже пять страниц, что в худшем случае даёт ограничение 4001h байт. Если данных больше, то передачу по-прежнему нужно разбивать на несколько фрагментов.В USB2 появились расщеплённые транзакции (split transactions). Спецификация USB2 добавила новую скорость передачи данных 480 мегабит/с (high-speed, HS), но по-прежнему поддерживает две скорости USB1, 12 мегабит/с (full-speed, FS) и 1.5 мегабит/с (low-speed, LS). На одной шине USB в каждый момент времени можно общаться только с одним устройством. В USB1 шина, управляемая одним хост-контроллером, была единой, и во время транзакции к LS-устройству она (способная на 12 мегабит/с) работала со скоростью 1.5 мегабит/с. В USB2 аналогичным образом замедлять HS-шину было бы непрактично, поэтому выделяется одна общая шина, которая всегда работает на high-speed, и несколько FS/LS-шин, к которым подключаются FS/LS-устройства. За связь между шинами отвечает хаб, к которому подключено низкоскоростное устройство; спецификация называет соответствующую часть хаба Transaction Translator (TT).
Пока хаб медленно общается с низкоскоростным устройством по низкоскоростной шине, высокоскоростная шина оказывается свободной, причём довольно надолго. Чтобы полученное время можно было использовать с толком, транзакция по HS-шине расщепляется на две: начальную (start-split transaction) и конечную (complete-split transaction).
Детали расщепления несколько различаются для периодических транзакций (передач по прерыванию и изохронных передач) и непериодических (управляющих передач и передач массивов данных). На рисунке выше показана схема происходящего внутри хаба для периодических расщеплённых транзакций. Хорошая новость: для непериодических транзакций дополнительные действия по поддержке минимальны — нужно правильно инициализировать структуру канала и при ошибке HS-шины очищать буфер хаба с данными, за остальным будет следить сам контроллер. Для периодических транзакций всё сложнее. Именно отсюда возникает вторая битовая маска в структуре канала прерываний, которую я ранее упоминала, — для каналов прерываний FS/LS-устройств первая битовая маска отвечает за микрофреймы, в которые нужно инициировать начальную расщеплённую транзакцию, вторая — за микрофреймы, в которые нужно инициировать конечную расщеплённую транзакцию. Отсюда же появляется второй тип изохронных транзакций в EHCI — структуры обычной и расщеплённой изохронных транзакций различаются.EHCI и компаньоны
При проектировании хост-контроллера для USB2 Intel решила по возможности задействовать уже существующую базу в виде железа UHCI/OHCI и программной поддержки. В корневом хабе EHCI отсутствует Transaction Translator; вместо него каждый порт может быть подключён к контроллеру-компаньону, им может быть UHCI или OHCI. Компаньонов может быть несколько. Пока EHCI-контроллер не инициализирован, все порты подключены к компаньонам; код, умеющий программировать UHCI и OHCI, сможет работать со всеми устройствами и в такой конфигурации, естественно, на скорости USB1. После инициализации EHCI-контроллера каждому порту можно назначить владельца независимо от других. Контроллер, не являющийся владельцем, воспринимает порт в состоянии «нет устройства». Порты, на которых действительно нет устройства, а также порты с HS-устройствами назначаются контроллеру EHCI; порты с низкоскоростными устройствами назначаются контроллеру-компаньону.
Позднее Intel решила, что больше не хочет ставить UHCI рядом с EHCI. Чтобы не переделывать спецификацию и не заставлять всех переписывать драйверы, Intel не стала менять контроллер, но на пути от «настоящих» портов до контроллера поставила «виртуальный» хаб с официальным названием Rate Matching Hub (RMH), а контроллеру оставила только два порта, к одному из которых всегда подключён хаб. Назначение второго порта, к сожалению, мне выяснить не удалось. С программной точки зрения «виртуальный» хаб ничем не отличается от обычного, просто при написании своей реализации следует иметь в виду, что для доступа к устройствам на некоторых конфигурациях придётся реализовать не только поддержку EHCI, но и поддержку хабов.Читайте также: