23. Работа USB-контроллера в режиме Host
Данный режим поддерживается только у микроконтроллеров 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 байта
Для получения 8 байт Device-дескриптора программа должна отправить запрос GET_DESCRIPTOR.
В этих байтах содержится параметр 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. Настройка адреса
Как только Device-сторона ответит на первый запрос Host-контроллера с адресом по умолчанию (0), Host-контроллер назначит новый адрес Device-стороне. Для этого Host должен отправить USB RESET, а затем выполнить запрос SET ADDRESS (тип CONTROL) с новым адресом, который будет использоваться Device-стороной. По окончании этого запроса программа должна сохранить новое значение адреса в регистре UHADDR. Все последующие запросы, выполненные через любой канал, будут выполняться с использованием нового адреса. Когда Host-контроллер отправляет USB RESET, значение регистра UHADDR сбрасывается и все последующие запросы будут выполняться с использованием адреса по умолчанию (0).
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.
23.15. Система прерываний
 Рисунок 23.4. Система прерываний Host-контроллера
 Рисунок 23.5. Система прерываний канала Host-контроллера
|