Регистры ввода-вывода универсального
хост-контроллера шины USB.
USB выстраивает необычные отношения между устройством и драйвером. Драйвер не управляет устройством напрямую, а имеет доступ только к четырем типам операций приема-передачи данных: передача массива, управление, прерывание и изохронные передачи. Все типы передач реализованы на уровне программного интерфейса. Стандартизация классов устройств USB и программного обеспечения способствует росту популярности данного способа расширения персональных компьютеров среди широкого круга пользователей и производителей компьютерной техники.
Драйвер интерфейса USB управляет работой хост-контроллера через регистры. Регистры универсального хост-контроллера принят разделять на две группы: группу конфигурационных регистров PC (USB PCI Configuration Registers) и группу регистров пространств ввода-вывода (USB Host Controller IO Space Registers). Ниже рассматриваются регистры ввода-вывода хост-контроллера. Непосредственная работа с конфигурационными регистрами из прикладных программ нежелательна (может привести к «зависанию» системы). Для описания режима доступа к данным в регистрах USB используются следующие стандартные обозначения: RO - возможно только считывание данных; WO - возможна только запись данных; R/W - разрешено выполнение как записи, так и считывании данных; R/WC - разрешено считывание данных и сброс отдельных разрядов регистра (запись единицы в некоторый разряд регистра приводит к тому, что этот разряд сбрасывается в ноль). Список регистров ввода-вывода хост-контроллера шины USB при веден в табл.1. Доступ к этим регистрам осуществляется через группу портов ввода/вывода, базовый адрес которой задан в конфигурационном регистре USBBA.
Таблица 1. Регистры ввода-вывода универсального хост-контроллера шины USB
Смещение |
Размер |
Доступ |
Мнемонике |
Наименование регистра |
00h |
WORD |
R/W |
USBCMD |
Регистр команды USB |
02h |
WORD |
R/WC |
USBSTS |
Регистр состояния USB |
04h |
WORD |
R/W |
USBINTR |
Регистр управления прерываниями USB |
06h |
WORD |
R/W |
FRNUM |
Регистр номера кадра USE |
08h |
DWORD |
R/W |
FLBASEADD |
Регистр базового адреса списка кадров USB |
0Ch |
BYTE |
R/W |
SOFTMOD |
Регистр модификатора начала кадра USB |
10h |
WORD |
R/WC |
PORTSCO |
Регистр состояния и управления порта 0 |
12h |
WORD |
R/WC |
PORTSC1 |
Регистр состояния и управления порта 1 |
Регистр команды USB (USBCMD) предназначен для передачи команды хост-контроллеру и доступен как
для записи, так и для считывания данных. Контроллер начинает выполнение команды сразу же после того, как она записана в регистр. Назначение разрядов регистра команды USB:
- бит 0 (RS) - запуск/останов, запись единицы в данный разряд активизирует работу контроллера, контроллер приступает к обработке и передаче данных, а запись нуля приводит к немедленной остановке контроллера и прекращению всех выполняемых операций (контроллер сам может сбрасывать данный разряд в ноль в случае возникновения серьезных ошибок и сбоев);
- бит 1 (HCRESET) - сброс
хост- контроллера, запись единицы в данный разряд приводит к сбросу
регистров, отражающих внутреннее состояние контроллера, механизм, обеспечивающий обнаружение подсоединения и отсоединения
устройств обнуляется, работа
обоих портов хост-контроллера блокируется. В результате происходит «виртуальное
отсоединение» подключенных к контроллеру устройств, биты 1 и 3 в
регистрах состояния портов контроллера ycтанавливаются в единицу, а биты 0 и 8 сбрасываются. После завершения процесса обнуления всех
внутренних регистров контроллер самостоятельно сбрасывает бит HCRESET и разрешает обнаружение
подсоединенных устройств и определение скорости их работы, что приводит к соответствующему
изменению битов 0 и 8 в
регистрах состояния портов;
- бит 2 (GRESET) - глобальный сброс, запись единицы в данный разряд вызывает общий сброс хост-контроллера и всех подключенных к нему устройств. Снять сигнал глобального сброса можно по прошествии не менее 10 мс после его установки, записав в данный разряд ноль.
- бит 3 (EGSM) - переключение в глобальный режим ожидания. Запись единицы в данный разряд вызывает переключение хост-контроллера и всех подключенных к нему устройств в режим ожидания. Перед установкой в единицу бита EGSM необходимо остановить контроллер, сбросив бит запуска/останова RS. При выходе из режима ожидания данный бит сбрасывается в ноль программным обеспечением после сброса в ноль бита 4;
- бит 4 (FGR) - общий выход из режима ожидания. Запись единицы в данный разряд выводит хост-контроллер и подключенные к нему устройства из режима ожидания. Устанавливать данный разряд может не только программное обеспечение, но и сам хост-контроллер - при обнаружении подключения или отключения устройства во время пребывания системы в режиме ожидания. Снять сигнал «пробуждения» можно по прошествии не менее 20 мс после его установки, записав в данный разряд ноль;
- бит 5 (SWDBG) - переключение в режим отладки. Устанавливать бит SWDBG можно только при сброшенном бите RS, то есть только тогда, когда работа контроллера приостановлена. Запись единицы в данный разряд переводит контроллер в режим отладки программного обеспечения. В режиме отладки контроллер останавливается после выполнения каждой транзакции и сбрасывает бит RS. Возобновление работы контроллера происходит после того, как программное обеспечение установит бит RS в единицу.
- бит 6 (CF) - флаг завершения конфигурирования контроллера. Данный разряд может быть установлен в единицу программным обеспечением после завершения процесса конфигурирования хост-контроллера, но на работу самого контроллера никак не влияет;
- бит 7 (МАХР) - максимальный размер пакета завершения кадра (0 - 32 байта, 1 - 64 байта); ,
- биты 8-15 зарезервированы (всегда должны быть сброшены в ноль).
После аппаратного или программного сброса контроллера регистр команды USB содержит значение 0000h.
Регистр состояния USB (USBSTS) отражает текущее состояние хост-контроллера. Регистр USBSTS доступен для чтения и сброса (запись единиц в какие-либо его разряды сбрасывает эти разряды в ноль). Назначение разрядов регистра состояния USB:
- бит 0 (USBINT) - признак USB-прерывания.
Данный разряд устанавливается контроллером при возникновении запроса прерывания
по завершению транзакции (при установленном бите ЮС
в дескрипторе передачи) или при обнаружении короткого пакета (размер пакета
меньше заданной в дескрипторе величины);
- бит 1 - признак прерывания по ошибке, которая произошла при выполнении транзакции;
- бит 2 (RSMDET) - признак поступления на шину сигнала «пробуждения» от устройства USB;
- бит 3 - признак системной ошибки (устанавливается при возникновении сбоев в процессе передачи данных по шине РСI);
- бит 4 - признак обнаружения ошибки в работе контроллера;
- бит 5 - признак останова контроллера (устанавливается после сброса в ноль бита RS в регистре команды USB);
- биты 6-15 зарезервированы.
После аппаратного или программного сброса контроллера регистр состояния USB содержит значение 0020h.
Регистр управления прерываниями (USBINTR) позволяет разрешать и запрещать генерацию прерываний различных типов хост-контроллером. Регистр USBINTR доступен для записи и считывания. Назначение разрядов регистра управления прерываниями:
- бит 0 - управление прерыванием по тайм-ауту и обнаружению ошибок CRC (0 - прерывание запрещено, 1 - разрешено);
- бит 1 - управление прерыванием по сигналу пробуждения (0 - прерывание запрещено, 1 - разрешено);
- бит 2 - управление прерыванием по завершению транзакции IOС (0 - прерывание запрещено, 1 - разрешено);
- бит 3 - управление прерыванием по обнаружению короткого пакета (0 - прерывание запрещено, 1 - разрешено);
- биты 4-15 зарезервированы.
Регистр управления прерываниями позволяет заблокировать любые прерывания от контроллера USВ, кроме прерываний, генерируемых при обнаружении ошибок в работе самого контроллера. После аппаратного или программного сброса контроллера регистр USBINTR содержит значение 0000h, т.е. все прерывания (за исключением прерываний по сбоям в работе контроллера) запрещены.
Регистр номера кадра (FRNUM) содержит текущий номер кадра USB. Младшие 11 разрядов регистра (биты 0-10) содержат текущий номер кадра, а остальные разряды зарезервированы и должны содержать нули. Регистр доступен для чтения в любой момент времени, а запись данных разрешена только в том случае, если работа контроллера приостановлена (бит RS в регистре команды USB сброшен в ноль). Значение, содержащееся в разрядах 0-10 регистра FRNUM, увеличивается на единицу (инкрементируется) после завершения каждого кадра; после достижения значения 7FFh регистр обнуляется. Содержимое разрядов 0-10 служит номером кадра и передается в начале кадра в SOF-пакете. Кроме того, разряды 0-9 используются при формировании индекса текущего элемента в списке кадров (соответствуют разрядам
2-11 индекса). После аппаратного или программного сброса контроллера регистр FRNUM содержит значение 0000h.
Регистр базового адреса списка кадров USB (FRBASEAOD) содержит начальный (абсолютный) адрес списка кадров в оперативной памяти компьютера. Регистр доступен FRBASEADD для записи и считывания данных. Используются только старшие 20 бит регистра FRBASEADD, соответствующие битам 12-31 линейного адреса, а младшие 12 бит зарезервированы и должны содержать нули. Таким образом, базовый адрес списка кадров должен быть выровнен на границу гранулярности свопинга памяти процессоров Intel x86 (4 Кбайт).
Контроллер формирует указатель на текущий элемент списка кадров путем комбинирования сдвинутых влево на два разряда битов 0-9 из регистра номера кадра и битов 12-31 из регистра базового адреса. Разряды 0 и 1 указателя всегда равны нулю (указатель выровнен на границу двойного слова). Количество указателей в списке кадров равно 1024, а размер списка составляет 4 Кбайт. После аппаратного или программного сброса контроллера значение регистра базового адреса считается «неопределенным»: перед запуском контроллера надлежит создать в оперативной памяти список кадров и загрузить его абсолютный (линейный) адрес в регистр FRBASEADD.
Регистр модификатора начала кадра USB (SOFMOD) служит для подстройки частоты кадров USB с целью обеспечения синхронизации всех устройств системы при работе в режиме реального времени. Значение младших семи разрядов этого регистра складывается с числом 11936, в результате чего формируется делитель частоты кварцевого резонатора генератора тактовой частоты. Старший разряд регистра SOFMOD (бит 7) зарезервирован и должен содержать значение 0. Частота кварцевого резонатора составляет 12 МГц, а значение, устанавливаемое в регистре модификатора начала кадра после аппаратного или программного сброса контроллера равно 64 (40h), поэтому частота генерации кадров равна 1 кГц. Изменяя значение модификатора от 0 до 127, можно осуществлять подстройку частоты кадров USB в пределах ± 0,5 %.
Регистр состояния и управления порта (PORTSC) позволяет контролировать режим работы порта хост-контроллера. Регистры PORTSC0 и PORTSC 1 доступны для записи и считывания данных. Назначение разрядов регистра состояния порта:
- бит 0 - текущий статус подключения. Данный разряд доступен только для считывания и служит для определения наличия подключения USB-устройства к данному порту (0 - к порту ничего не подключено, 1 - к порту подключено устройство USB);
- бит 1 - признак изменения статуса подключения: устанавливается в единицу при любых изменениях текущего статуса подключения (см. бит 0). Бит признака изменения статуса подключения доступен для считывания и сброса (запись единицы в данный разряд сбрасывает его в ноль);
- бит 2 (PORTEN) - включение и отключение порта (0 - порт заблокирован, 1 - работа порта разрешена). Данный разряд доступен для записи и считывания: запись нуля (блокировка порта) может выполняться как программным обеспечением, так и хост-контроллером (при возникновении сбоя в работе порта), а запись единицы - только программным обеспечением. Состояние данного разряда не изменяется, пока не изменится реальное состояние порта (возможна задержка срабатывания);
- бит 3 - признак включения и отключения порта (0 - состояние порта не изменялось, 1 - произошло включение или отключение порта). Бит признака включения и отключения порта доступен для считывания и сброса (запись единицы в данный разряд сбрасывает его в ноль);
- бит 4 - состояние линии D+. Данный бит отражает текущей логический уровень линии D+ и доступен только для чтения;
- бит 5 - состояние линии D-. Данный бит отражает текущей логический уровень линии D- и доступен только для чтения;
- бит 6 (RSM_DET) - признак обнаружения сигнала пробуждения (0 - сигнал не поступал, 1 - поступил сигнал пробуждения). Бит признака обнаружения сигнала пробуждения доступен для записи и считывания. Хост-контроллер устанавливает бит RSM_DET в 1 при обнаружении сигнала пробуждения; программное обеспечение устанавливает бит RSM_DET для формирования сигнала пробуждения. Если бит RSM_DET имеет значение 1, запись нуля приводит к тому, что порт посылает низкоскоростной ЕОР (до окончания ЕОР бит остается в состоянии 1);
- бит 7 зарезервирован, доступен только для считывания и при считывании всегда имеет значение 1;
- бит 8 - признак подключения низкоскоростного устройства. Данный бит доступен только для считывания и устанавливается в единицу, если к порту подключено низкоскоростное устройство;
- бит 9 - сброс порта. Бит сброса в современных контроллерах доступен только для считывания, хотя ранние варианты допускали выполнение операции записи. Бит сброса порта устанавливается в единицу при подаче команды сброса и находится в этом состоянии до тех пор, пока процедура сброса не будет завершена;
- бит 10 - признак активности линии «Overcurrent» (0 - линия неактивна, 1 - линия активна). Бит 10 используется лишь в современных контроллерах и доступен только для считывания;
- бит 11 - признак изменения состояния линии «Overcurrent». Данный бит доступен для считывания и сброса. Он устанавливается контроллером в состояние 1 при переходе линии «Over-current» из неактивного состояния в активное. Признак сбрасывается программным обеспечением путем записи единицы в бит 11. Бит 11 используется только в современных контроллерах;
- бит 12 - признак режима ожидания (устанавливается в 1, когда порт находится в режиме ожидания). Данный бит доступен для считывания и записи; он может использоваться программным обеспечением для перевода в состояние ожидания отдельного порта;
- биты 13-15 зарезервированы.
После аппаратного или глобального сброса оба регистра PORTSC содержат значение 0080h: бит 7 имеет значение 1, остальные разряды сброшены. После сброса контроллера (HCRESET) могут быть установлены биты 1 и 3. В современных контроллерах после осуществления сброса бит 11 может иметь значение 1.