STM32: контроллер USB OTG high-speed Печать
Добавил(а) microsin   

Эта часть документации (перевод главы "USB on-the-go high-speed (OTG_HS)" [1]) относится к MCU семейства STM32F4xx, если не указано нечто иное. В STM32F4xx имеется два раздельных контроллера USB OTG: OTG_FS и OTG_HS. В этой статье описывается архитектура и модель программирования контроллера OTG_HS (описание OTG_FS см. в статье [6]). Все непонятные термины и сокращения см. в Словарике [2]. Также см. документы [3, 4, 5].

OTG_HS это контроллер устройства, выполняющего двойную роль (dual-role device, DRD) в архитектуре USB, т. е. поддерживает в зависимости от внешних условий как устройство USB, так и хост USB. Контроллер OTG_HS полностью совместим со спецификацией On-The-Go Supplement USB 2.0 (сокращенно OTG). Он может также быть сконфигурирован либо только как контроллер хоста, либо только как контроллер устройства USB, полностью совместимо со спецификацией USB 2.0. В режиме хоста OTG_HS поддерживает скорости high-speed (HS, 480 мегабит/сек), full-speed (FS, 12 мегабит/сек) и low-speed (LS, 1.5 мегабит/сек), в то время как в режиме устройства поддерживаются только транзакции high-speed (HS, 480 мегабит/сек) и full-speed (FS, 12 мегабит/сек). OTG_HS поддерживает два новых протокола HNP и SRP. Единственный необходимый внешний компонент в режиме OTG - верхний ключ заряда (charge pump) для VBUS.

Host Negotiation Protocol (HNP). Позволяет устройствам обмениваться ролями хост/устройство, когда они оба поддерживают двойные роли устройств по спецификации OTG. При использовании HNP для смены ролей устройство USB OTG может захватить контроль над управлением планированием передачи данных. Таким образом, любое устройство OTG может инициировать передачу данных через шину USB OTG. Последняя версия дополнения также ввела HNP-опрос, в котором хост периодически опрашивает устройство USB во время активного сеанса, чтобы определить, не хочет ли оно стать хостом.

Session Request Protocol (SRP). Позволяет обоим коммуницирующим устройствам управлять моментом, когда активен линк сессии питания; в стандартной организации линка USB это может делать только хост. SRP позволяет точно управлять энергопотреблением, что очень важно для устройств, работающих от батареи (таких как камеры и мобильные телефоны). OTG или embedded-хост может оставить линк без питания, пока периферийное устройство (которым может быть устройство OTG или традиционное устройство USB) не потребует питания. OTG и embedded-хост, у которых осталось мало энергии батареи, могут оставить линк USB без питания, что увеличит время работы от батареи.

Основные функции контроллера OTG_HS можно поделить на 3 категории общие, режима хоста USB и режима устройства USB.

[Общие функции]

• Сертифицирован USB-IF для Universal Serial Bus Specification Rev 2.0 [4, 5].

• Поддерживает 3 интерфейса PHY:

– Встроенный в чип MCU full-speed PHY.
– Интерфейс ULPI для внешнего high-speed PHY [7].

• Поддерживает протоколы HNP и SRP.

• В режиме хоста позволяет выключить VBUS для экономии питания в приложениях OTG, без необходимости дополнительных внешних компонентов.

• Поддерживается мониторинг уровней VBUS с помощью внутренних компараторов.

• Поддерживается динамическое переключение ролей хост - устройство.

• Программное конфигурирование для работы в качестве:

   – поддержки SRP как периферийное устройство USB HS/FS (B-устройство).
   – поддержки SRP как хост USB HS/FS/LS (A-устройство).
   – устройства двойной роли (USB OTG HS Dual Role device).

• Поддерживается HS/FS SOF и LS импульсы для поддержания работоспособности (Keep-alive):

   – импульс SOF соединения PAD (OTG_HS_SOF).
   – импульс SOF внутреннего соединения с таймером 2 (TIM2).
   – Конфигурируемый период кадра (framing period).
   – Конфигурируемое прерывание конца фрейма (end of frame, EOF interrupt).

• Имеется встроенный DMA с поддержкой общего использования и программного выбора типа пакетов AHB (burst type) в режиме DMA.

• Поддерживаются функции пониженного энергопотребления, такие как остановка системы во время USB Suspend, внутреннее выключение доменов тактов для цифрового ядра, управление питанием PHY и DFIFO.

• Выделенное RAM на 4 килобайта для продвинутого управления FIFO:

   – Конфигуриуемое разделение пространства RAM на разные стеки FIFO для гибкого и эффективного использования RAM.
   – Каждый FIFO может хранить несколько пакетов.
   – Динамическое выделение памяти.
   – Конфигурируемые размеры FIFO, которые могут быть не равны степени двойки, чтобы позволить использовать непрерывные области памяти.

• Гарантируется максимальная полоса пропускания USB до 1 фрейма без вмешательства системы.

[Функции режима хоста USB]

• Требуется внешняя схема управления (charge pump) для генерации напряжения VBUS.

• До 12 каналов хоста (pipe): каждый канал динамически может переконфигурироваться, чтобы выделить любой тип транзакции USB.

• Встроенные аппаратный планировщик, обслуживающий:

   – до 8 interrupt запросов транзакций плюс isochronous запросов транзакций в периодической аппаратной очереди.
   – до 8 control запросов транзакций плюс bulk запросов транзакций в непериодической аппаратной очереди.

• Управление общим RxFIFO, периодическим TxFIFO и непериодическим TxFIFO для эффективного использования RAM данных USB.

• Функция динамического тримминга периода фрейма SOF в режиме хоста.

[Функции режима устройства USB]

• 1 двунаправленная конечная точка управления 0 (control endpoint0), или она же контрольная точка по умолчанию (default endpoint).

• 5 конечных точек IN (далее конечные точки сокращенно обозначаются EP), конфигурируемые для поддержки транзакций bulk, interrupt или isochronous.

• 5 EP OUT, конфигурируемые для поддержки транзакций bulk, interrupt или isochronous.

• Управление общим RxFIFO и TxFIFO для эффективного использования RAM данных USB.

• Управление до 6 выделенных стеков Tx-IN FIFO (по одному для каждой активной IN EP), для уменьшения нагрузки на процессор и приложение.

• Поддержка функции программного отключения.

Основные отличия контроллеров сведены в таблицу:

Функция OTG_FS [6] OTG_HS
Поддерживаемые стандартные скорости устройства USB FS (full-speed) FS (full-speed), HS high-speed)
Поддерживаемые стандартные скорости хоста USB LS (low-speed), FS (full-speed) LS (low-speed), FS (full-speed), HS (high-speed)
Конечные точки устройства USB 0 .. 3 0 .. 5
Каналы хоста USB 0 .. 7 0 .. 11
Поддержка DMA - Есть
Дополнительный внешний интерфейс ULPI PHY [7] - Есть
Начальный адрес регистров в адресном пространстве 0x50000000 0x40040000
Split-транзакции - Есть
Ping HS - Есть

Новые функции OTG_HS потребовали дополнительных бит в регистрах (они были вставлены на места зарезервированных бит в регистрах контроллера OTG_FS) и даже потребовали добавления новых регистров. Во врезках с описаниями регистров дополнительные биты помечены оранжевым цветом.

STM32F4 OTG HS high speed block diagram fig410

Рис. 410. Блок-схема OTG high-speed.

Примечание: USB DMA не может напрямую обращаться к внутренней Flash-памяти.

Таблица 206. Ножки ввода/вывода OTG_HS.

Имя сигнала Тип сигнала Описание
OTG_HS_DP Цифровой двунаправленный сигнал (вход/выход) Сигнал USB OTG D+ (данные)
OTG_HS_DM Цифровой двунаправленный сигнал (вход/выход) Сигнал USB OTG D- (данные)
OTG_HS_ID Цифровой вход USB OTG ID (идентификация хост/устройство USB)
OTG_HS_VBUS Аналоговый вход USB OTG VBUS (для анализа уровня напряжения питания USB)
OTG_HS_SOF Цифровой выход USB OTG Start Of Frame (импульсы видимого сигнала начала фрейма, SOF)
Внешний интерфейс USB OTG ULPI
OTG_HS_ULPI_CK Цифровой вход Тактовый сигнал
OTG_HS_ULPI_DIR Цифровой вход Сигнал для управления направлением шины данных
OTG_HS_ULPI_STP Цифровой выход Сигнал остановки потока данных
OTG_HS_ULPI_NXT Цифровой вход Сигнал запроса следующего потока данных
OTG_HS_ULPI_D[0..7] Цифровой вход/выход Двунаправленная 8-разрядная шина данных

В ядро USB OTG HS встроен интерфейс ULPI для подключения внешнего HS PHY.

Примечание: контроллер OTG_FS [6] по внешним выводам отличается от контроллера OTG_HS только тем, что у OTG_FS нет сигналов интерфейса ULPI.

Встроенный full-speed OTG PHY управляется ядром OTG HS, и передает сигналы управления и данные USB через полноскоростное подмножество шины UTMI+ (UTMIFS). Это обеспечивает физическую поддержку подключения USB.

Full-speed OTG PHY включает следующие компоненты:

• Модуль трансивера FS/LS, который используется и хостом USB, и устройством USB. Он напрямую вырабатывает сигналы передачи и считывает сигналы приема на линиях DP/DM (или D+ и D-) USB.
• Интегрированный верхний подтягивающий резистор для сигнала идентификации режима (ID pull-up) используется, чтобы прочитать уровень сигнала в процессе идентификации устройства A/B.
• Встроенные DP/DM резисторы pull-up и pull-down управляются ядром OTG_HS, в зависимости от текущей роли устройства. Если это периферийное устройство USB, то разрешается DP pull-up, чтобы сигнализировать о соединении full-speed как только VBUS была определена на допустимом уровне (допустимая B-сессия). В режиме хоста разрешаются pull-down резисторы на обоих сигналах DP/DM. Pull-up и pull-down резисторы динамически переключаются, когда меняется роль устройства по протоколу согласования хоста (HNP).
• Схема pull-up/pull-down резистора ECN. DP pull-up состоит из 2 резисторов, управляемых раздельно от OTG_HS в соответствии с указаниями Engineering Change Notice, применимые к USB Rev2.0 (см. USB_ECN_Resistor.pdf [5]). Динамическая подстройка тока DP pull-up позволяет улучшить подавление шума и качество сигнала Tx/Rx.
• Компараторы VBUS с гистерезисом, используемые для определения допустимого уровня VBUS и порогов A-B Session Valid и окончания сессии. Это используется для реализации протокола SRP, детектирования условий допустимого старта и окончания сессии, и для постоянного отслеживания уровня VBUS во время операций USB.
• Схема метода пульсации VBUS используется для заряда/разряда VBUS через резисторы во время SRP (при слабом токе).

Внимание! Чтобы гарантировать правильную работу периферийного устройства USB OTG HS, частота AHB должна быть выше 30 МГц.

[Устройство двойной роли (OTG dual role device, DRD]

Детектирование линии ID. Роль устройства USB (по умолчанию) или хоста USB распознается по ножке входа ID (OTG_HS_ID). Состояние сигнала ID определяется при подключении USB, в зависимости на какой стороне кабеля находится подключаемый коннектор-мама micro-AB:

• Если B-сторона кабеля USB подключена к плавающему проводу ID, то встроенный pull-up резистор определит высокий уровень ID, и по умолчанию будет назначена роль устройства USB. В этой конфигурации OTG_HS соответствует стандартной FSM, описанной в секции 6.8.2 On-The-Go B-device of the On-The-Go Specification Rev1.3 supplement to the USB2.0 [3, 5].
• Если A-сторона кабеля USB подключена к заземленному ID, OTG_HS выдаст прерывание изменения статуса линии ID (бит CIDSCHG в OTG_HS_GINTSTS) для инициализации ПО хоста, и происходит автоматическое переключение в роль хоста. В этой конфигурации OTG_HS соответствует стандартной FSM, описанной в секции 6.8.1: On-The-Go A-device of the On-The-Go Specification Rev1.3 supplement to the USB2.0 [3, 5].

HNP устройства двойной роли. Бит настройки функционала HNP в регистре глобальной конфигурации (регистр OTG_HS_GUSBCFG, бит HNPCAP) разрешает ядру OTG_HS динамически менять свою роль от A-хоста до A-периферийного устройства USB и обратно, или от B-периферийного устройства до B-хоста и обратно, по протоколу host negotiation protocol (HNP). Текущее состояние можно прочитать по комбинированным значениям бита Connector ID Status в регистре глобального статуса и управления OTG (бит CIDSTS в регистре OTG_HS_GOTGCTL) и биту текущего режима работы регистра глобальных прерываний и статуса (бит CMOD в регистре OTG_HS_GINTSTS).

Модель программирования HNP подробно описана далее в секции "Модель программирования OTG".

SRP устройства двойной роли. Бит настройки функционала SRP в регистре глобальной конфигурации (регистр OTG_HS_GUSBCFG, бит SRPCAP) разрешает ядру OTG_HS выключать генерацию VBUS для A-устройства, чтобы экономить энергию. Обратите внимание, что A-устройство всегда управляет VBUS, независимо от роли OTG_HS - хост или периферийное устройство. Модель программирования SRP A/B-устройства подробно описано далее в секции "Модель программирования OTG".

[Периферийное устройство USB]

В этом разделе приведено функциональное описание OTG_HS в режиме периферийного устройства USB. OTG_HS работает как устройство USB в следующих условиях:

• OTG B-устройство. Это состояние по умолчанию, если подключена B-сторона кабеля USB.
• OTG A-устройство. Это состояние OTG после HNP-переключения OTG_HS в роль периферийного устройства.
• B-устройство. Если есть линия ID, функция и подключение к B-стороне кабеля USB, и очищен бит HNPCAP в регистре OTG_HS_GUSBCFG (см. [3, 5], параграф 6.8.3).
• Только периферийное устройство (см. рис. 388). Установлен бит принудительного режима устройства (бит FDMOD в регистре OTG_HS_GUSBCFG), что заставляет ядро OTG_HS работать только как периферийное устройство USB (см. [3, 5], параграф 6.8.3). В этом случае линия ID игнорируется, даже если она присутствует на коннекторе USB.

Примечание: чтобы создать устройство с питанием от шины в случае B-устройства или конфигурации только разрешенного устройства USB, должен быть добавлен внешний регулятор, создающий напряжение питания VDD микроконтроллера из напряжения VBUS.

Устройство с функцией SRP. Бит управления функцией SRP в регистре глобальной конфигурации (бит SRPCAP в регистре OTG_HS_GUSBCFG) разрешает OTG_HS поддерживать протокол запроса сессии session request protocol (SRP). Этот метод позволяет экономить питание, подаваемое на A-устройство путем выключения VBUS, когда приостанавливается сессия USB.

Подробно программная модель управления SRP описана ниже в секции "Протокол запроса сессии B-устройства".

Powered (запитано). Вход VBUS определяет допустимое напряжение B-сессии, при котором устройству USB разрешено войти в состояние powered (см. [4, 5], параграф "9.1 USB Device States"). Тогда OTG_HS автоматически подключит DP pull-up резистор, чтобы сигнализировать о подключении к хосту full-speed устройства, и генерирует прерывание запроса сессии (бит SRQINT в регистре OTG_HS_GINTSTS), чтобы оповестить MCU о состоянии powered.

Вход VBUS также гарантирует, что хостом поданы допустимые уровни VBUS во время операций USB. Если было определено, что уровень напряжения VBUS упал ниже допустимого для B-сессии (например из-за нарушения питания, или если порт хоста был выключен), то OTG_HS автоматически отключится, и детектируется окончание сессии с прерыванием (бит SEDET в регистре OTG_HS_GOTGINT), чтобы оповестить MCU о том, что OTG_HS вышел из состояния powered.

В состоянии powered OTG_HS ожидает получения некоторой сигнализации сброса от хоста. Никакие другие операции USB невозможны. Когда получен сигнал сброса, генерируется прерывание reset (бит USBRST в регистре OTG_HS_GINTSTS). Когда сигнал сброса завершится, генерируется прерывание завершения энумерации (бит ENUMDNE в регистре OTG_HS_GINTSTS), и OTG_HS входит в состояние по умолчанию (Default state).

Soft disconnect (программное отключение от шины). Из состояния powered можно выйти программно. Резистор DP pull-up отключается путем установки бита soft disconnect (бит SDIS в регистре OTG_HS_DCTL), что приводит к прерыванию отключения устройства на стороне хоста, даже если кабель USB устройства не был физически извлечен из порта хоста.

Состояние по умолчанию (Default state). В этом состоянии OTG_HS ожидает приема команды SET_ADDRESS от хоста. Никакие другие операции USB невозможны. Когда на шине USB была определена правильная команда SET_ADDRESS, программа MCU записывает соответствующий номер в поле адреса регистра конфигурации устройства (DAD в регистре OTG_HS_DCFG). После этого устройство входит в состояние адресованности (address state), и оно готово отвечать на транзакции хоста по сконфигурированному адресу USB.

Suspended (приостановка). Блок OTG_HS постоянно мониторит активность на шине USB. После 3 мс отсутствия активности (USB idleness) выдается прерывание предварительной приостановки (early suspend interrupt, бит ESUSP в регистре OTG_HS_GINTSTS), и это подтверждается на 3 мс позже, если это необходимо, прерыванием suspend (бит USBSUSP в регистре OTG_HS_GINTSTS). Тогда автоматически установится бит приостановки устройства в регистре статуса устройства (бит SUSPSTS в регистре OTG_HS_DSTS), и OTG_HS входит в состояние suspended.

Из состояния suspended может быть осуществлен выход по инициативе самого устройства. В этом случае программа MCU устанавливает бит сигнализации remote wakeup (бит RWUSIG в регистре OTG_HS_DCTL), и очистит его в интервале от 1 до 15 мс.

Когда был детектирован сигнал возобновления от хоста (resume signaling), генерируется resume interrupt (бит WKUPINT в регистре OTG_HS_GINTSTS), и автоматически очистится бит приостановки устройства.

Ядро OTG_HS устанавливает следующие конечные точки USB:

• Control endpoint 0 (EP0). Эта конечная точка двунаправленная, и обрабатывает только сообщения управления. Имеется отдельный набор регистров для обработки транзакций IN и OUT. Имеются соответствующие регистры управления (OTG_HS_DIEPCTL0/OTG_HS_DOEPCTL0), конфигурации транзакции (OTG_HS_DIEPTSIZ0/OTG_HS_DIEPTSIZ0) и статуса-прерывания (OTG_HS_DIEPINTx/OTG_HS_DOEPINT0). Биты, доступные внутри регистров управления и размеров транзакции, незначительно отличаются от других конечных точек.

• 5 конечных точек IN.

– Каждая из них может быть сконфигурирована для поддержки типов транзакций isochronous, bulk или interrupt.
– Каждая имеет соответствующие выделенные регистры управления (OTG_HS_DIEPCTLx), конфигурации транзакции (OTG_HS_DIEPTSIZx) и статуса-прерывания (OTG_HS_DIEPINTx).
– Общий регистр маски прерывания конечных точек Device IN (OTG_HS_DIEPMSK) позволяет разрешить/запретить источник прерывание одной конечной точки для всех конечных точек IN (включая EP0).
– Они поддерживают прерывание незавершенной изохронной транзакции IN (бит IISOIXFR в регистре OTG_HS_GINTSTS). Это прерывание выставляется, когда имеется по меньшей мере одна изохронная конечная точка IN, для которой транзакция не завершена в текущем кадре. Это прерывание выставляется вместе с периодическим прерыванием завершения фрейма (OTG_HS_GINTSTS/EOPF).

• 5 конечных точек OUT.

– Каждая из них может быть сконфигурирована для поддержки типов транзакций isochronous, bulk или interrupt.
– Каждая имеет соответствующие выделенные регистры управления (в регистре OTG_HS_GINTSTS), конфигурации транзакции (OTG_HS_DOEPTSIZx) и статуса-прерывания (OTG_HS_DOEPINTx).
– Общий регистр маски прерывания конечных точек Device OUT (OTG_HS_DOEPMSK) позволяет разрешить/запретить источник прерывание одной конечной точки для всех конечных точек OUT (включая EP0).
– Они поддерживают прерывание незавершенной изохронной транзакции OUT (бит INCOMPISOOUT в регистре OTG_HS_GINTSTS). Это прерывание выставляется, когда имеется по меньшей мере одна изохронная конечная точка OUT, для которой транзакция не завершена в текущем кадре. Это прерывание выставляется вместе с периодическим прерыванием завершения фрейма (OTG_HS_GINTSTS/EOPF).

Доступно управление следующими функциями конечной точки x через регистр управления IN/OUT (DIEPCTLx/DOEPCTLx):

• Разрешение/запрет конечной точки.
• Активация конечной точки в текущей конфигурации.
• Программирование типа транзакции USB (isochronous, bulk, interrupt).
• Программирование поддерживаемого размера пакета.
• Программирование номера Tx-FIFO, связанного с конечной точкой IN.
• Программирование ожидаемого или передаваемого data0/data1 PID (только для bulk/interrupt).
• Программирование четного/нечетного фрейма во время принятой или переданной транзакции (только isochronous).
• Опциональное программирование бита NAK, чтобы всегда отправлять отрицательное подтверждение хосту, независимо от статуса FIFO.
• Опциональное программирование бита STALL, чтобы всегда останавливать (stall) токены хоста для этой конечной точки.
• Опциональное программирование режима слежения (Snoop mode) для конечных точек OUT, где не проверена CRC принятых данных.

Регистры размера транзакции конечной точки x (DIEPTSIZx/DOEPTSIZx) позволяют приложению запрограммировать параметры размера транзакции и прочитать статус транзакции. Операция программирования должна быть выполнена перед установкой бита разрешения конечной точки в регистре управления конечной точкой.

Как только конечная точка разрешена, эти поля становятся только для чтения, поскольку ядро OTG_HS обновляет их текущим статусом транзакции.

Могут быть запрограммированы следующие параметры транзакции:

• Размер транзакции в байтах.
• Количество пакетов, составляющих общий размер транзакции.

Регистры прерывания конечной точки x устройства (DIEPINTx/DOPEPINTx) показывают статус конечной точки по отношению к событиям USB и AHB. Приложение должно прочитать эти регистры, когда установлен бит прерывания OUT или IN endpoint в регистре прерываний ядра (бит OEPINT в регистре OTG_HS_GINTSTS или бит IEPINT в регистре OTG_HS_GINTSTS, соответственно). Перед тем, как приложение может читать эти регистры, оно должно сначала прочитать регистр прерывания всех конечных точек (OTG_HS_DAINT), чтобы узнать точный номер регистра прерывания конечной точки X устройства. Приложение должно очистить подходящие биты в этом регистре, чтобы очистить соответствующие биты в регистрах DAINT и GINTSTS.

Ядро USB предоставляет следующие проверки статуса и генерации прерывания:

• Прерывание завершения транзакции, показывающее, что перемещение данных завершено с обоих сторон - приложение (AHB) и аппаратура (USB).
• Завершение процедуры настройки (Setup stage done, только для control-OUT).
• Связанный передающий стек (Tx-FIFO) опустошен наполовину или полностью (конечные точки IN).
• Хосту передано подтверждение NAK (только для isochronous-IN).
• Принят токен IN, когда Tx-FIFO был пуст (только для bulk-IN/interrupt-IN).
• Принят токен OUT, когда конечная точка не была еще разрешена.
• Детектирован ошибочный, помехообразный сигнал (Babble error condition).
• Действует запрет конечной точки со стороны приложения.
• Действует NAK конечной точки со стороны приложения (только для isochronous-IN).
• Принято больше чем 3 back-to-back пакета setup (только для control-OUT).
• Детектирован таймаут (только для control-in).
• Отброшен пакет isochronous OUT без генерации прерывания.

[Хост USB]

В этом разделе приведено функциональное описание работы блока OTG_HS в режиме хоста USB. OTG_HS работает как хост USB в следующих условиях:

• OTG A-хост. Состояние по умолчанию OTG A-устройства, когда подключена A-сторона кабеля USB.
• OTG B-хост. Состояние OTG B-устройства после переключения на роль хоста по протоколу HNP.
• A-устройство. Если присутствует линия ID, функционал и подключение произошло к A-стороне кабеля USB, и очищен бит функции HNP (бит HNPCAP в регистре OTG_HS_GUSBCFG). На линиях сигналов DP/DM автоматически подключатся встроенные pull-down резисторы.
• Режим работы только как хоста (см. рис. 411). Бит FHMOD в регистре OTG_HS_GUSBCFG принудительно переводит аппаратуру в режим работы хоста USB. В этом случае линия ID игнорируется, даже если она есть на коннекторе USB. На линиях сигналов DP/DM (OTG_HS_FS_DP/OTG_HS_FS_DM) автоматически подключатся встроенные pull-down резисторы.

Примечание: генерация 5V VBUS внутри чипа MCU не поддерживается. По этой причине, если на плате доступно напряжение 5V или стабилизатор, то должен быть добавлен силовой ключ, чтобы управлять 5V шины VBUS. Внешний ключ или управляемый стабилизатор может управляться от любой выходной ножки GPIO. Это необходимо для конфигураций OTG A-хоста, A-устройства и режима "только хост". Вход VBUS обеспечивает проверку допустимых уровней VBUS, предоставленных ключом или стабилизатором во время нормальных операций USB, в то время как выходной сигнал перегрузки по току может приходить на любой вход GPIO, сконфигурированный для генерации прерываний порта. ISR перегрузки по току должен быстро запретить генерацию VBUS. Вывод VBUS может быть освобожден путем запрета опции анализа уровня VBUS (VBUS sensing). Это реализуется установкой бита NOVBUSSENS в регистре OTG_HS_GCCFG. В этом случае внутри чипа MCU считается, что на VBUS всегда допустимый уровень (5V).

STM32F4 OTG HS USB host only connection fig411

Рис. 411. Соединение только для хоста USB.

Примечания:

(1) STMPS2141STR необходим только если приложение должно поддерживать устройство USB с питанием от шины (VBUS powered device). Базовый ключ питания может использоваться, если 5V доступны на плате приложения.
(2) Диапазон VDD между 2V и 3.6V.

Хост с поддержкой SRP. Поддержка SRP доступна через бит опции SRP (бит SRPCAP в регистре OTG_HS_GUSBCFG). Когда функция SRP разрешена, хост может экономить энергию путем выключения напряжения VBUS, когда сессия USB приостановлена.

Подробно программная модель хоста для управления SRP описана ниже в секции "Протокол запроса сессии A-устройства".

Питание порта USB. Встроенная в MCU генерация 5V VBUS не поддерживается. По этой причине должна быть добавлена схема стабилизатора 5V (charge pump) или, если на плате приложения присутствует 5V, должен быть добавлен обычный силовой ключ, чтобы управлять уровнем 5V линии VBUS. Внешний стабилизатор (или ключ) может управляться любым выходом GPIO. Когда приложение хоста решает выдать питание на VBUS, используя выбранную ножку порта GPIO, оно также должно установить бит питания порта в регистре управления и статуса хоста (бит PPWR в регистре OTG_HS_HPRT).

Допустимость уровня VBUS. Когда функции HNP или SRP разрешены, то ножка входа для анализа уровня VBUS (VBUS sensing pin, PB13) должна быть подключена к VBUS. Вход VBUS гарантирует, что допустимые уровни VBUS подаются на устройство USB во время рабочих операций. Любое непредвиденное падение напряжения VBUS ниже порога допустимости (4.25V) приведет к генерации прерывания OTG от бита детектирования завершения сессии (бит SEDET в регистре OTG_HS_GOTGINT). Тогда приложению нужно снять питание VBUS и очистить бит питания порта (бит PPWR в регистре OTG_HS_HPRT).

Когда обе функции HNP и SRP запрещены, ножка детектирования уровня VBUS (PB13) не должна подключаться к VBUS. Она освобождается, и может использоваться как GPIO для любых целей.

Также используется флаг перегрузки по току стабилизатора (charge pump overcurrent flag) для предотвращения электрического повреждения системы питания VBUS. Подсоедините выход сигнала перегрузки по току к любому входу порта GPIO и сконфигурируйте его на генерацию прерывания при активном уровне. Обработчик прерывания перегрузки по току (overcurrent ISR) должен немедленно запретить генерацию VBUS и очистить бит питания порта (бит PPWR в регистре OTG_HS_HPRT).

Детектирование подключения периферийного устройства. Если разрешена функция SRP или HNP, то даже если периферийное устройство USB или B-устройства могут быть подключены в любой момент, OTG_HS не будет детектировать любое подключение к шине, пока на VBUS не окажется допустимый уровень (выше 4.75V). Когда VBUS на допустимом уровне, и подключено B-устройство, ядро OTG_HS выдает прерывание порта хоста, вызванное битом подключения устройства в регистре управления и статуса хоста (бит PCDET в регистре OTG_HS_HPRT).

Когда обе функции HNP и SRP запрещены, периферийные устройства USB или B-устройства, как только они были подключены. Ядро OTG_HS выдает прерывание порта хоста, вызванное битом подключения устройства в регистре управления и статуса хоста (бит PCDET в регистре OTG_HS_HPRT).

Детектирование отключения периферийного устройства. Событие отключения устройства USB приводит к срабатыванию прерывания отключения (disconnect detected interrupt, бит DISCINT в регистре OTG_HS_GINTSTS).

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

Перед тем, как начать выдачу USB reset, приложение ждет прерывания OTG, вызванное битом окончания дребезга(debounce done, бит DBCDNE в регистре OTG_HS_GOTGINT), который показывает, что шина стала стабильной после электрических помех на pull-up резисторе DP (FS) или DM (LS), вызванных физическим подключением устройства USB к шине.

Приложение выдает сигнализацию USB reset (single-ended zero, несимметричный нуль) через шину путем удержания бита сброса порта в регистре управления и статуса порта (бит PRST в регистре OTG_HS_HPRT) на время минимум 10 мс и максимум 20 мс. Приложение заботится об отсчете этого времени, и затем очищает бит сброса порта.

Как только последовательность USB reset завершена, срабатывает прерывание порта хоста из-за изменения бита разрешения/запрета порта (бит PENCHNG в регистре OTG_HS_HPRT). Это оповещает приложение, что скорость прошедшего энумерацию устройства может быть прочитана из поля скорости порта в регистре управления и статуса хоста (бит PSPD в регистре OTG_HS_HPRT), и хост начинает выдавать сигналы начала фрейма SOF (FS) или сигналы "поддержания жизни" Keep alive (LS). Хост теперь готов завершить энумерацию периферийного устройства отправкой команд конфигурирования.

Приостановка хоста (Host Suspend). Приложение принимает решение приостановить активность USB установкой бита приостановки порта в регистре управления и статуса порта (бит PSUSP в регистре OTG_HS_HPRT). Ядро OTG_HS останавливает отправку сигналов SOF и входит в состояние suspended.

Из состояния suspended можно опционально выйти по инициативе подключенного устройства USB (remote wakeup). В этом случае при определении сигнала удаленного пробуждения генерируется прерывание remote wakeup (битом WKUPINT в регистре OTG_HS_GINTSTS), автоматически установится бит возобновления работы порта в регистре управления и статуса порта хоста (port resume, бит PRES в регистре OTG_HS_HPRT), и через USB автоматически передается сигнализация возобновления работы (resume signaling). Приложение должно выждать окно возобновления, и затем очистить бит возобновления порта, чтобы выйти из состояния suspended и перезапустить SOF.

Если из состояния suspended произошел выход по инициативе хоста, то приложение должно установить бит возобновления порта (port resume bit), чтобы запустить сигнализацию возобновления на порту хоста, выждать окно времени возобновления и в завершении очистить бит возобновления порта.

Ядро OTG_HS инстанциирует 12 каналов хоста. Каждый канал хоста поддерживает транзакцию хоста USB (USB pipe). Хост не может одновременно поддерживать больше 8 запросов транзакций. Если от приложения было выдано больше 8 запросов на транзакцию, то драйвер контроллера хоста (host controller driver, HCD) должен заново выделить каналы, когда они станут доступны после предыдущей активности, т. е. после получения прерываний завершения транзакции и приостановки канала.

Каждый канал хоста может быть сконфигурирован для поддержки направления IN/OUT и любого типа периодической или непериодической транзакции. Каждый канал хоста обеспечивает надлежащие регистры управления (HCCHARx), конфигурации транзакции (HCTSIZx) и статуса/прерывания (HCINTx) вместе со связанными регистрами маски (HCINTMSKx).

Управление каналом хоста. Для приложения доступны следующие опции управления каналом x через регистр характеристик канала (HCCHARx):

– Разрешение/запрет канала.
– Программирование скорости HS/FS/LS целевого периферийного устройства USB.
– Программирование адреса целевого периферийного устройства USB.
– Программирование номера конечной точки целевого периферийного устройства USB.
– Программирование направления транзакции IN/OUT.
– Программирование типа транзакции USB (control, bulk, interrupt, isochronous).
– Программирование максимального размера пакета (MPS).
– Программирование периодической передачи, которая должна выполняться на нечетных/четных фреймах.

Транзакция канала хоста. Регистры размера транзакции канала (HCTSIZx) позволяют приложению запрограммировать размеры транзакции и прочитать статус транзакции. Программирование должно быть выполнено перед установкой бита разрешения канала в регистре характеристик канала. Как только конечная точка разрешена, поле счетчика пакетов становится read-only, поскольку ядро OTG_HS обновляет его в соответствии с текущим статусом транзакции.

Можно запрограммировать следующие параметры:

– Размер транзакции в байтах.
– Количество пакетов, составляющих общий размер транзакции.
– Начальный data PID.

Статус/прерывание канала хоста. Регистр прерывания канала x хоста (HCINTx) показывает состояние конечной точки, относящиеся к событиям USB и AHB. Приложение должно прочитать этот регистр, когда установится бит прерывания каналов хоста в регистре прерываний ядра (бит HCINT в регистре OTG_HS_GINTSTS). Перед тем, как приложение может прочитать эти регистры, оно должно сначала прочитать регистр прерывания всех каналов (HCAINT), чтобы получить точный номер канала для регистра прерывания канала x хоста. Приложение должно очистить подходящий бит в этом регистре, чтобы очистить соответствующие биты в регистрах HAINT и GINTSTS. Также доступны биты маски для каждого источника прерывания каждого канала в регистре OTG_HS_HCINTMSKx.

Ядро хоста предоставляет следующие проверки статуса и генерацию прерывания:

– Прерывание завершения транзакции, которое показывает завершение перемещения данных с обоих сторон - приложение (AHB) и аппаратура (USB).
– Канал был остановлен из-за завершения транзакции, USB ошибки транзакции или команды запрета от приложения.
– Связанный стек передачи (TxFIFO) опустошен наполовину или полностью (конечные точки IN).
– Принят положительный ответ/подтверждение ACK.
– Принят отрицательный ответ/подтверждение NAK.
– Принят ответ STALL.
– Ошибка транзакции USB из-за несовпадения CRC, таймаута, ошибки бит-стаффинга, ложного EOP.
– Ошибка сигнала (babble error).
– Переполнение кадра (frame overrun).
– Ошибка переключения данных (data toggle error).

В ядро хоста встроен аппаратный планировщик, который может автономно изменять порядок выполнения запросов USB-транзакций, которые выдало приложение, и управлять ими. В начале каждого фрейма хост сначала выполняет периодические транзакции (isochronous и interrupt), за которыми идут не периодические (control и bulk) транзакции, чтобы достичь более высокого приоритета для типов транзакций isochronous и interrupt - в соответствии со спецификацией USB.

Хост обрабатывает транзакции USB через очереди запросов (одна для периодических, другая для непериодических транзакций). Каждая очередь запросов может хранить в себе до 8 элементов. Каждый элемент очереди представляет запрос транзакции от приложения, и в нем хранится номер канала IN или OUT вместе с другой информацией, чтобы выполнять транзакции по шине USB. Порядок, в котором эти запросы были записаны в очередь, определяет последовательность выдачи транзакций через интерфейс USB.

В начале каждого фрейма хост сначала обрабатывает очередь периодических запросов, затем очередь непериодических запросов. Хост выдает прерывание незавершенной периодической транзакции (incomplete periodic transfer interrupt, бит IPXFR в регистре OTG_HS_GINTSTS), если в конце фрейма все еще ожидает обработки isochronous или interrupt транзакция, запланированная для текущего фрейма. Ядро OTG_HS полностью отвечает за обслуживание периодических и непериодических очередей запросов. Регистр периодического TxFIFO и статуса очереди (HPTXSTS) и регистр не периодического TxFIFO и статуса очереди (HNPTXSTS) предназначены только для чтения, и могут использоваться приложением для чтения статуса каждой очереди запросов. Они содержат:

• Количество свободных элементов в периодической (или не периодической) очереди запросов (всего может быть 8 максимум).
• Свободное пространство, доступное в настоящий момент в периодическом (или не периодическом) Tx-FIFO (транзакции OUT).
• Токен IN/OUT, номер канала и другая информация состояния.

Поскольку очереди запросов могут хранить максимум 8 элементов каждая, приложение может заранее планировать операции с хостом в отношении того момента, когда они физически достигают SB, максимум для 8 ожидающих периодических транзакций плюс 8 ожидающих непериодических транзакций.

Для проталкивания запроса транзакции планировщику хоста (постановки запроса в очередь) приложение должно проверить, что в периодической (не периодической) очереди доступно как минимум одно свободное место, путем чтения бит PTXQSAV в регистре OTG_HS_HNPTXSTS или бит NPTQXSAV в регистре OTG_HS_HNPTXSTS.

[Триггер SOF]

Ядро OTG_HS предоставляет способ мониторить, отслеживать и конфигурировать кадры SOF в хосте и периферийном устройстве USB, также как и функцию вывода импульса SOF.

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

SOF хоста. В режиме хоста программируется количество тактов PHY, происходящих между генерацией двух идущих друг за другом токена SOF (FS) или Keep-alive (LS). Это программируется в регистре интервалов фрейма хоста (OTG_HS_HFIR), что дает возможность приложению управлять периодом фреймов SOF. Генерируется прерывание в начале любого фрейма (бит SOF в регистре OTH_HS_GINTSTS). Текущий номер фрейма и оставшееся время до следующего SOF отслеживается в регистре номера фрейма хоста (OTG_HS_HFNUM).

Сигнал импульса SOF длительностью 20 тактов HCLK, генерируемый на любом стартовом токене SOF, может быть выведен наружу через вывод OTG_HS_SOF с использованием бита SOFOUTEN в главном регистре конфигурации ядра (OTG_HS_GCCFG). Импульс SOF также внутри соединяется со входом триггера таймера 2 (TIM2), так что функции захвата по входу (input capture), сравнения по выходу (output compare) и сам таймер могут срабатывать по импульсу SOF. Соединение TIM2 разрешается битами ITR1_RMP регистра опций таймера 2 (TIM2_OR).

STM32F4 OTG HS SOF connectivity fig412

Рис. 412. Соединение выхода триггера SOF с TIM2 ITR1.

SOF периферийного устройства. В режиме устройства USB прерывание начала фрейма (start of frame, SOF) генерируется всякий раз, когда по шине USB принят токен SOF (бит SOF в регистре OTH_HS_GINTSTS). Соответствующий номер фрейма может быть прочитан в регистре статуса устройства (бит FNSOF регистра OTG_HS_DSTS). Также генерируется сигнал импульса SOF шириной 20 тактов HCLK, и он может быть доступен снаружи на выводе OTG_HS_SOF, если использовать бит разрешения выхода SOF в регистре основной конфигурации ядра (бит SOFOUTEN в регистре OTG_HS_GCCFG). Импульс SOF также внутри соединяется со входом триггера таймера 2 (TIM2), так что функции захвата по входу (input capture), сравнения по выходу (output compare) и сам таймер могут срабатывать по импульсу SOF. Соединение TIM2 разрешается битами ITR1_RMP регистра опций таймера 2 (TIM2_OR).

Прерывание завершения периодического фрейма (GINTSTS/EOPF) используется для оповещения приложения, когда истекают 80%, 85%, 90% или 95% интервала фрейма, в зависимости от поля интервала в регистре конфигурации устройства (бит PFIVL в регистре OTG_HS_DCFG). Эта функция может использоваться, чтобы определить, завершен ли весь изохронный трафик для этого фрейма.

[Режимы пониженного энергопотребления OTG]

Таблица 207 определяет режимы пониженного потребления энергии STM32 (low power modes) и их совместимость с OTG.

Таблица 207. Совместимость режимов STM32 low power с OTG.

Режим Описание Совместимость USB
Run MCU полностью активен Требуется, когда USB не в состоянии приостановки (suspend).
Sleep Выход из USB suspend приводит к выходу MCU из режима Sleep. Содержимое регистров периферии сохраняется. Доступно, пока USB в состоянии приостановки (suspend).
Stop Выход из USB suspend приводит к выходу MCU из режима Stop. Содержимое регистров периферии сохраняется(1).
Standby Полное выключение (powered-down). Периферия должна быть инициализирована заново после выхода из режима Standby. Нет совместимости с приложениями USB.

Примечание (1): в режиме Stop возможны различные настройки. Также могут существовать различные ограничения, см. секцию 5 "Power controller (PWR)" [1] для получения представления, какие накладываются ограничения (если они есть) при использовании OTG. Таблица 207 полностью совпадает с аналогичной таблицей 197 контроллера OTG_FS [6].

Потребление энергии блоком OTG PHY управляется тремя битами в основном регистре конфигурации ядра:

• PHY power down (GCCFG/PWRDWN). Он включает/выключает модуль полноскоростного трансивера PHY. Он должен быть предварительно установлен, чтобы была возможна любая операция USB.

• A-VBUS sensing enable (GCCFG/VBUSASEN). Он включает/выключает компараторы VBUS, связанные с функционированием A-устройства. Он должен быть установлен, когда используется режим A-устройства (хост USB) и во время действия функции HNP.

• B-VBUS sensing enable (GCCFG/VBUSASEN). Он включает/выключает компараторы VBUS, связанные с операциями B-устройства. Он должен быть установлен, когда активен режим B-устройства (устройство USB) и во время действия функции HNP.

Доступны техники снижения потребления энергии, когда USB находится в состоянии приостановки (suspended state), если сессия USB пока не работает, или устройство не подключено.

• Stop PHY clock (STPPCLK bit in OTG_HS_PCGCCTL). Когда установлен бит остановки тактирования PHY в регистре управления тактированием, функцией управления тактами (clock gating) выключается большая часть домена тактов внутреннего высокоскоростного ядра OTG. Урезается динамическое энергопотребление из-за активности переключения тактов USB, даже если приложение удерживает в работе вход тактов. Большая часть трансивера также запрещена, и остается в работе только часть, отвечающая за определение асинхронного возобновления или события удаленного пробуждения (remote wakeup event).

• Gate HCLK (GATEHCLK bit in OTG_HS_PCGCCTL). Когда установлен бит GATEHCLK в регистре управления тактированием, большая часть системного домена тактов внутри ядра OTG_HS выключается функцией управления тактами. Доступен только интерфейс чтения и записи регистров. Урезается динамическое потребление энергии из-за активности переключения тактов USB, даже если остальная часть системных тактов остается активной для обслуживания других функций.

• USB system stop. Когда OTG_HS находится в состоянии приостановки (USB suspended state), приложение может принять решение кардинально уменьшить общее потребление энергии путем полного выключения всех источников тактирования в системе. USB System Stop активируется путем предварительной установки бита Stop PHY clock, и затем конфигурованием режима глубокого сна системы (system deep sleep mode) в модуле управления энергопотреблением системы (power control system module, PWR). Ядро OTG_HS автоматически реактивирует обе системы и такты USB путем асинхронного детектирования сигнализации remote wakeup (при работе в режиме хоста USB) или resume (при работе в режиме устройства USB) на шине USB.

[Динамическое обновление регистра OTG_HS_HFIR]

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

Когда регистр OTG_HS_HFIR меняется в пределах текущего фрейма SOF, в следующем фрейме применяется период коррекции SOF, как это показано на рис. 413.

STM32F4 OTG HS updating OTG HS HFIR dynamically fig413

Рис. 413. Динамическое обновление OTG_HS_HFIR.

[Выделение FIFO RAM]

FIFO RAM приема устройства USB. Для Receive FIFO RAM приложение должно выделить RAM для пакетов SETUP: 10 ячеек должно быть зарезервировано в RxFIFO для приема пакетов SETUP на управляющих конечных точках (control endpoints). Эти ячейки резервируются для пакетов SETUP, и они не используются ядром для записи любых других данных.

Одна ячейка должна быть выделена для Global OUT NAK. Информация статуса также записывается в FIFO вместе с каждым принятым пакетом. Таким образом, для приема пакетов должно быть выделено минимальное пространство (размер самого большого пакета / 4) + 1. Если разрешена широкополосная конечная точка или несколько изохронных конечных точек, то для приема обратных (back-to-back) пакетов должно быть выделено по крайней мере 2 пространства по (размер самого большого пакета / 4) + 1. Обычно рекомендуется выделять 2 пространства по (размер самого большого пакета / 4) + 1, когда предыдущий пакет перемещается через AHB, чтобы по шине USB можно было принимать следующий пакет.

Вместе с последним пакетом каждой конечной точки в RxFIFO также передается информация о состоянии завершения передачи. Обычно рекомендуется одна ячейка для каждой конечной точки OUT.

FIFO RAM передачи устройства USB. Для Transmit FIFO RAM требуется минимальное пространство RAM для TxFIFO каждой конечной точки IN, равное максимальному размеру пакета этой конечной точки IN.

Примечание: чем больше выделено пространства для TxFIFO передающей конечной точки IN, тем может быть выше производительность шины USB.

FIFO RAM приема хоста USB. Для выделения Receive FIFO RAM информация статуса записывается в RxFIFO вместе с каждым принятым пакетом. Таким образом, для приема пакетов должно быть выделено минимальное пространство (размер самого большого пакета / 4) + 1. Если разрешен широкополосный канал, или несколько изохронных каналов, то для приема обратных (back-to-back) пакетов должно быть выделено по крайней мере 2 пространства по (размер самого большого пакета / 4) + 1. Обычно рекомендуется выделять 2 пространства по (размер самого большого пакета / 4) + 1, когда предыдущий пакет перемещается через AHB, чтобы по шине USB можно было принимать следующий пакет.

Вместе с последним пакетом каждого канала хоста в RxFIFO также передается информация о состоянии завершения передачи. Как следствие, для сохранения этих данных должна быть выделена одна ячейка.

FIFO RAM передачи хоста USB. Для выделения Transmit FIFO RAM требуется минимальное пространство RAM для непериодического TxFIFO, равное максимальному размеру пакета для всех поддерживаемых не периодических каналов OUT. Обычно рекомендуется пространство, равное 2 размерам самого большого пакета, чтобы когда текущий пакет передается по шине USB, шина AHB могла передать следующий пакет.

Минимальное количество RAM, требуемое для периодического TxFIFO хоста, равно самому большому размеру пакета для всех поддерживаемых периодических каналов OUT. Если имеется как минимум одна изохронная конечная точка OUT с высокой пропускной способностью, то выделенное пространство должно быть как минимум двойного размера максимального пакета для этого канала.

Примечание: чем больше выделено пространство в непериодическом TxFIFO, тем будет выше производительность USB. Когда работает режим DMA, регистр адреса DMA для каждого канала хоста (HCDMAn) сохраняется в SPRAM (FIFO). Для этого должна быть выделена одна ячейка для каждого канала.

[Прерывания OTG_HS]

Когда контроллер OTG_HS работает в одном из режимов, либо устройства USB, либо хоста, приложение не должно обращаться к регистрам другого режима. Если произойдет недопустимый доступ, то произойдет прерывание несовпадения (mismatch interrupt), и это будет отражено в регистре прерываний ядра (бит MMIS в регистре OTG_HS_GINTSTS). Когда ядро переключается из одного режима в другой, регистры в новом режиме работы должны быть перепрограммированы так же, как после перезагрузки или сброса при включении питания.

STM32F4 OTG HS interrupt hierarchy fig414

Рис. 414. Иерархия прерываний.

Примечание (1): OTG_HS_WKUP становится активным (состояние лог. 1), когда происходит событие возобновления во время состояний L1 SLEEP или L2 SUSPEND.

[Регистры управления и статуса OTG_HS]

Через чтение и запись регистров управления и статуса (control and status registers, сокращенно CSR) через интерфейс AHB slave, приложение может управлять контроллером OTG_HS. Эти регистры 32-разрядные, и их адреса выровнены на границу 32-битного блока (байтовый адрес делится нацело на 4). К регистрам OTG_HS должен осуществляться доступ только через слова (32 бита).

Регистры CSR классифицируются следующим образом:

• Глобальные регистры ядра.
• Регистры режима хоста USB.
• Глобальные регистры хоста USB.
• CSR порта хоста USB.
• Регистры, специфичные для канала хоста USB.
• Регистры режима устройства USB.
• Глобальные регистры устройства USB.
• Регистры, специфичные для конечной точки устройства USB.
• Регистры управления питанием и тактированием.
• Регистры доступа к Data FIFO (DFIFO).

В обоих режимах, и хоста и устройства USB, можно обращаться только к глобальным регистрам ядра, регистрам управления питания и тактирования, регистрам доступа к Data FIFO и к регистрам управления и статуса порта хоста. Когда контроллер OTG_HS работает в одном из режимов (хост или устройство), приложение не должно обращаться к регистрам другого режима. Если происходит недопустимый доступ, то генерируется прерывание несовпадения (mismatch interrupt), и это будет отражено в регистре прерываний ядра (бит MMIS в регистре OTG_HS_GINTSTS). Когда ядро переключается из одного режима в другой, регистры в новом режиме работы должны быть перепрограммированы так же, как после перезагрузки или сброса при включении питания.

Карта памяти CSR. Регистры режима хоста и режима устройства находятся по разным адресам. Все регистры реализованы в домене тактов AHB. Смещения адресов регистров OTG_HS в адресном пространстве STM32F4xx отсчитываются относительно адреса 0x40040000 (см. таблицу 1 в даташите [1]).

STM32F4 OTG HS CSR memory map fig415

Рис. 415. Карта памяти регистров CSR.

Примечание (1): x = 5 в режиме устройства USB и x = 11 в режиме хоста USB. Карта памяти регистров CSR контроллера OTG_FS такая же, как у контроллера OTG_HS, отличается только начальное смещение в адресном пространстве, количество конечных точек устройства и количество каналов хоста.

Карта памяти глобальных CSR. Эти регистры доступны в обоих режимах - и в режиме хоста, и в режиме устройства USB.

Таблица 208. Глобальные регистры ядра для управления и статуса (CSR).

Имя регистра Смещ. адреса Полное название регистра
OTG_HS_GOTGCTL 0x000 OTG_HS control and status register (регистр управления и статуса OTG HS).
OTG_HS_GOTGINT 0x004 OTG_HS interrupt register (регистр прерываний OTG HS).
OTG_HS_GAHBCFG 0x008 OTG_HS AHB configuration register (регистр конфигурации OTG HS AHB).
OTG_HS_GUSBCFG 0x00C OTG_HS USB configuration register (регистр конфигурации OTG HS USB).
OTG_HS_GRSTCTL 0x010 OTG_HS reset register (регистр сброса OTG HS).
OTG_HS_GINTSTS 0x014 OTG_HS core interrupt register (регистр прерываний ядра OTG HS).
OTG_HS_GINTMSK 0x018 OTG_HS interrupt mask register (регистр маски прерываний OTG HS).
OTG_HS_GRXSTSR 0x01C OTG_HS Receive status debug read/OTG status read and pop registers (регистр статуса приема для отладки / чтение статуса OTG и pop-регистров).
OTG_HS_GRXSTSP 0x020
OTG_HS_GRXFSIZ 0x024 OTG_HS Receive FIFO size register (регистр размера FIFO приема OTG HS).
OTG_HS_HNPTXFSIZ
/OTG_HS_DIEPTXF0(1)
0x028 OTG_HS Host non-periodic transmit FIFO size register (регистр размера не периодического FIFO хоста) / Endpoint 0 Transmit FIFO size (регистр размера передающего FIFO конечной точки 0).
OTG_HS_HNPTXSTS 0x02C OTG_HS non-periodic transmit FIFO / queue status register (регистр не периодического FIFO передачи / регистр статуса очереди).
OTG_HS_GCCFG 0x038 OTG_HS general core configuration register (основной регистр конфигурации ядра OTG HS).
OTG_HS_CID 0x03C OTG_HS core ID register (регистр ID ядра).
OTG_HS_HPTXFSIZ 0x100 OTG_HS Host periodic transmit FIFO size register (регистр размера периодического FIFO передачи хоста).
OTG_HS_DIEPTXFx 0x104
0x108
...
0x114
OTG_HS device IN endpoint transmit FIFO size register (регистр размера передающего FIFO конечной точки устройства IN). Здесь x это номер FIFO в диапазоне 1 .. 5.

Примечание (1): основное правило - использовать OTG_HS_HNPTXFSIZ в режиме хоста и OTG_HS_DIEPTXF0 в режиме устройства.

Карта памяти CSR режима хоста. Эти регистры должны программироваться всякий раз, когда ядро меняет режим на хост USB.

Таблица 209. Регистры ядра управления и статуса (CSR) режима хоста.

Имя регистра Смещ. адреса Полное название регистра
OTG_HS_HCFG 0x400 OTG_HS Host configuration register (регистр конфигурации хоста OTG HS).
OTG_HS_HFIR 0x404 OTG_HS Host frame interval register (регистр интервала фрейма хоста OTG HS).
OTG_HS_HFNUM 0x408 OTG_HS Host frame number/frame time remaining register (регистр номера фрейма хоста / оставшегося времени фрейма OTG HS).
OTG_HS_HPTXSTS 0x410 OTG_HS_Host periodic transmit FIFO/queue status register (регистр периодического FIFO передачи хоста / регистр статуса очереди).
OTG_HS_HAINT 0x414 OTG_HS Host all channels interrupt register (регистр прерываний всех каналов хоста OTG HS).
OTG_HS_HAINTMSK 0x418 OTG_HS Host all channels interrupt mask register (регистр маски прерываний всех каналов хоста OTG HS).
OTG_HS_HPRT 0x440 OTG_HS Host port control and status register (регистр управления и статуса порта хоста OTG HS).
OTG_HS_HCCHARx 0x500
0x520
...
0x660
OTG_HS Host channel-x characteristics register (регистр характеристик канала x хоста). Здесь x это номер канала в диапазоне 0 .. 11.
OTG_HS_HCSPLTx 0x504 OTG_HS Host channel-x split control register (регистр управления split-транзакциями). Здесь x это номер канала в диапазоне 0 .. 11.
OTG_HS_HCINTx 0x508 OTG_HS Host channel-x interrupt register (регистр прерываний канала x хоста). Здесь x это номер канала в диапазоне 0 .. 11.
OTG_HS_HCINTMSKx 0x50C OTG_HS Host channel-x interrupt mask register (регистр маски прерываний канала x хоста). Здесь x это номер канала в диапазоне 0 .. 11.
OTG_HS_HCTSIZx 0x510 OTG_HS Host channel-x transfer size register (регистр размера транзакции канала x хоста). Здесь x это номер канала в диапазоне 0 .. 11.
OTG_HS_HCDMAx 0x514 OTG_HS Host channel-x DMA address register (регистр DMA канала x хоста). Здесь x это номер канала в диапазоне 0 .. 11.

Примечание: регистры OTG_HS отличаются от регистров OTG_FS наличием двух дополнительных групп регистров OTG_HS_HCSPLTx и OTG_HS_HCDMAx. Также у OTG_HS больше каналов хоста (у OTG_FS всего 8 каналов, а у OTG_HS их 12).

Карта памяти CSR режима устройства. Эти регистры должны программироваться всякий раз, когда ядро меняет режим на устройство USB.

Таблица 210. Регистры ядра управления и статуса (CSR) режима устройства.

Имя регистра Смещ. адреса Полное название регистра
OTG_HS_DCFG 0x800 OTG_HS device configuration register (регистр конфигурации устройства OTG HS).
OTG_HS_DCTL 0x804 OTG_HS device control register (регистр управления устройства OTG HS).
OTG_HS_DSTS 0x808 OTG_HS device status register (регистр статуса устройства OTG HS).
OTG_HS_DIEPMSK 0x810 OTG_HS device IN endpoint common interrupt mask register (регистр маски общих прерываний конечной точки IN).
OTG_HS_DOEPMSK 0x814 OTG_HS device OUT endpoint common interrupt mask register (регистр маски общих прерываний конечной точки OUT).
OTG_HS_DAINT 0x818 OTG_HS device all endpoints interrupt register (регистр прерываний всех конечных точек устройства).
OTG_HS_DAINTMSK 0x81C OTG_HS all endpoints interrupt mask register (регистр маски прерываний всех конечных точек устройства).
OTG_HS_DVBUSDIS 0x828 OTG_HS device VBUS discharge time register (регистр времени разряда разряда VBUS устройства).
OTG_HS_DVBUSPULSE 0x82C OTG_HS device VBUS pulsing time register (регистр времени импульса VBUS устройства).
OTG_HS_DTHRCTL 0x830 OTG_HS Device threshold control register (регистр управления порогом устройства).
OTG_HS_DIEPEMPMSK 0x834 OTG_HS device IN endpoint FIFO empty interrupt mask register (регистр маски прерываний FIFO конечной точки IN устройства).
OTG_HS_DEACHINT 0x838 OTG_HS device each endpoint interrupt register (регистр прерываний каждой конечной точки устройства).
OTG_HS_DEACHINTMSK 0x83C OTG_HS device each endpoint interrupt register mask (регистр маски прерываний каждой конечной точки устройства).
OTG_HS_DIEPEACHMSK1 0x844 OTG_HS device each in endpoint-1 interrupt register (регистр маски прерываний каждой конечной точки IN1 устройства).
OTG_HS_DOEPEACHMSK1 0x884 OTG_HS device each OUT endpoint-1 interrupt register (регистр маски прерываний каждой конечной точки OUT1 устройства).
OTG_HS_DIEPCTL0 0x900 OTG_HS device control IN endpoint 0 control register (регистр управления конечной точки IN 0 устройства).
OTG_HS_DIEPCTLx 0x920
0x940
...
0x9A0
OTG device endpoint x control register (регистр управления конечной точкой x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 5.
OTG_HS_DIEPINTx 0x908 OTG_HS device endpoint-x interrupt register (регистр прерываний конечной точки x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 5.
OTG_HS_DIEPTSIZ0 0x910 OTG_HS device IN endpoint 0 transfer size register (регистр размера транзакции конечной точки IN 0 устройства).
OTG_HS_DIEPDMAx
/OTG_HS_DOEPDMAx
0x914
/0xB14
OTG_HS device endpoint-x DMA address register (регистр адреса DMA конечной точки x). Здесь x это номер конечной точки в диапазоне 0 .. 5.
OTG_HS_DTXFSTSx 0x918 OTG_HS device IN endpoint transmit FIFO status register (регистр статуса передающего FIFO конечной точки IN). Здесь x это номер конечной точки в диапазоне 1 .. 5.
OTG_HS_DIEPTSIZx 0x930
0x950
...
0x9B0
OTG_HS device OUT endpoint-x transfer size register (регистр размера транзакции конечной точки OUTx). Здесь x это номер конечной точки в диапазоне 1 .. 5.
OTG_HS_DOEPCTL0 0xB00 OTG_HS device control OUT endpoint 0 control register (регистр управления конечной точкой OUT 0 устройства).
OTG_HS_DOEPTSIZ0 0xB10 OTG_HS device OUT endpoint 0 transfer size register (регистр размера транзакции конечной точки OUT0 устройства).
OTG_HS_DOEPCTLx 0xB20
0xB40
...
0xBA0
OTG_HS device endpoint x control register (регистр управления конечной точкой x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 5.
OTG_HS_DOEPINTx 0xB08
0xB28
...
0xBA8
OTG_HS device endpoint-x interrupt register (регистр прерываний конечной точки x устройства). Здесь x это номер конечной точки в диапазоне 1 .. 5.
OTG_HS_DOEPTSIZx 0xB30
0xB50
...
0xBB0
OTG_HS device OUT endpoint-x transfer size register (регистр размера транзакции конечной точки OUTx устройства). Здесь x это номер конечной точки в диапазоне 1 .. 5.

Карта памяти регистров доступа к Data FIFO (DFIFO). Эти регистры доступны в обоих режимах, и хоста, и устройства USB. Они используются для записи или чтения пространства FIFO определенной конечной точки или канала, которые работают в указанном направлении. Если тип канала хоста IN, то FIFO канала можно только считывать. Подобным образом, если канал хоста типа OUT, то FIFO канала можно только записывать.

Таблица 211. Карта регистров доступа к Data FIFO (DFIFO).

Секция регистров доступа к FIFO Диапазон адресов Доступ
Конечная точка IN EP0 / Канал OUT0 хоста: DFIFO доступ на запись 0x1000 .. 0x1FFC w
Конечная точка OUT EP0 / Канал IN0 хоста: DFIFO доступ на чтение r
Конечная точка IN EP1 / Канал OUT1 хоста: DFIFO доступ на запись 0x2000 .. 0x2FFC w
Конечная точка OUT EP1 / Канал IN1 хоста: DFIFO доступ на чтение r
... ... ...
Конечная точка IN EPx(1) / Канал OUTx(1) хоста: DFIFO доступ на запись 0xX000 .. 0xXFFC w
Конечная точка OUT EPx(1) / Канал INx(1) хоста: DFIFO доступ на чтение r

Примечание (1): x = 5 в режиме устройства USB и x = 11 в режиме хоста USB.

Карта CSR питания и тактирования. Имеется только один регистр для управления питанием и тактированием. Он доступен в обоих режимах - и хоста, и устройства.

Таблица 212. Регистры управления питанием и тактированием.

Имя регистра Смещ. адреса
0xE00 .. 0xFFF
Полное название регистра
OTG_HS_PCGCCTL 0xE00 .. 0xE04 Power and clock gating control register (регистр управления питанием и управлением тактами)
... 0xE05 .. 0xFFF Зарезервировано

Примечание: регистры управления питанием и тактированием для OTG_FS и OTG_HS одинаковые. Таким образом, таблица 202 [6] и таблица 212 совпадают.

В описании функций регистров используются следующие сокращения:

read/write (rw) Программа может читать и записывать эти биты.

read-only (r) Программа может только читать эти биты.

write-only (w) Программа может только записывать в этот бит. Чтение бита вернет значение сброса.

read/clear (rc_w1) Программа может прочитать бит, а также сбросить его путем записью 1. Запись 0 не дает никакого эффекта.

read/clear (rc_w0) Программа может прочитать бит, а также сбросить его путем записью 0. Запись 1 не дает никакого эффекта.

read/clear by read (rc_r) Программа может прочитать этот бит. Чтение этого бита автоматически сбросит его в 0. Запись 0 в бит не дает никакого эффекта.

read/set (rs) Программа может прочитать, а также установить этот бит. Запись 0 в бит не дает никакого эффекта.

read-only write trigger (rt_w) Программа может прочитать этот бит. Запись 0 или 1 вызовет появление события (триггер), но не окажет никакого влияния на значение бита.

toggle (t) Программа может только переключить этот бит записью 1. Запись 0 не дает никакого эффекта.

Reserved (Res.) Зарезервированный бит, его значение должно сохраняться на значении сброса.

[Глобальные регистры]

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

Значения бит в описаниях регистров выражены двоичными значениями, если не указано нечто другое.

Смещение адреса: 0x000
Значение сброса: 0x00010000

Регистр OTG_HS_GOTGCTL управляет поведением функций ядра OTG и отражает его состояние.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано BSVLD
r
ASVLD
r
DBCT
r
CIDSTS
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DHNPEN
rw
HSHNPEN
rw
HNPRQ
rw
HNGSCS
r
зарезервировано SRQ
rw
SRQSCS
r

Биты 31:20 зарезервированы и должны сохраняться в состоянии сброса (все нули).

BSVLD (бит 19): B-Session VaLiD. Показывает статус трансивера в режиме устройства USB.

0: B-сессия неправильная.
1: B-сессия корректная.

В режиме OTG можно использовать этот бит, чтобы определить, подключено устройство, или нет.

Примечание: доступно только в режиме устройства USB.

ASVLD (бит 18): A-Session VaLiD. Показывает статус трансивера в режиме хоста USB.

0: A-сессия неправильная.
1: A-сессия корректная.

Примечание: доступно только в режиме хоста USB.

DBCT (бит 17): длинное/короткое время дебоунсинга. Показывает время дебоунсинга обнаруженного подключения.

0: большое debounce time, используется для физических подключений (100 мс + 2.5 мкс).
1: малое debounce time, используется для программных подключений (2.5 мкс).

Примечание: доступно только в режиме хоста.

CIDSTS (бит 16): Connector ID STatuS. Показывает состояние ID коннектора при событии подключения.

0: контроллер OTG_HS в режиме A-device (хост USB).
1: контроллер OTG_HS в режиме B-device (устройство USB).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 15:12 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DHNPEN (бит 11): Device HNP Enabled. Приложение устанавливает этот бит, когда оно успешно получило команду SetFeature.SetHNPEnable от подключенного хоста USB.

0: HNP в приложении не разрешен.
1: HNP в приложении разрешен.

Примечание: доступно только в режиме устройства USB.

HSHNPEN (бит 10): Host Set HNP Enable. Приложение устанавливает этот бит, когда оно успешно разрешило HNP (используя команду SetFeature.SetHNPEnable) на подключенном устройстве.

0: установка хоста HNP не разрешена.
1: установка хоста HNP разрешена.

Примечание: доступно только в режиме хоста USB.

HNPRQ (бит 9): HNP ReQuest. Приложение устанавливает этот бит, чтобы инициировать запрос HNP для подключенного хоста USB. Приложение может очистить этот бит записью в него 0, когда установлен бит успешной смены состояния согласования хоста (бит HNSSCHG в регистре OTG_HS_GOTGINT). Ядро очищает этот бит, когда очищен бит HNSSCHG.

0: нет запроса HNP.
1: запрос HNP.

Примечание: доступно только в режиме устройства USB.

HNGSCS (бит 8): Host NeGotiation SuCceSs. Ядро устанавливает этот бит, когда согласование хоста успешное. Ядро очищает этот бит, когда установлен бит запроса HNP (HNPRQ) в этом регистре.

0: согласование хоста не прошло.
1: согласование хоста успешное.

Примечание: доступно только в режиме устройства USB.

Биты 7:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SRQ (бит 1): Session ReQuest. Приложение устанавливает этот бит для инициирования запроса сессии на USB. Приложение очищает этот бит записью 0, когда установлен бит успешной смены состояния согласования хоста (бит HNSSCHG в регистре OTG_HS_GOTGINT). Ядро очищает этот бит, когда очищен бит HNSSCHG.

Если Вы используете интерфейс последовательного трансивера USB 1.1 full-speed для инициирования запроса сессии, то приложение должно ждать момента, когда VBUS разрядится до 0.2V после того, как в этом регистре очистится бит B-Session Valid (бит BSVLD в регистре OTG_HS_GOTGCTL).

0: нет запроса сессии.
1: запрос сессии.

Примечание: доступно только в режиме устройства USB.

SRQSCS (бит 0): Session ReQuest SuCceSs. Ядро установит этот бит, когда был успешный запрос инициации сессии.

0: неудача запроса сессии.
1: успешный запрос сессии.

Примечание: доступно только в режиме устройства USB.

Смещение адреса: 0x004
Значение сброса: 0x00000000

Приложение считывает этот регистр, когда происходит прерывание OTG и очищает биты в этом регистре, чтобы очистить прерывание OTG.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано DBCDNE
rc_w1
ADTOCHG
rc_w1
HNGDET
rc_w1
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано HNSSCHG
rc_w1
SRSSCHG
rc_w1
зарезервировано SEDET
rc_w1
зарезервировано

Биты 31:20 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DBCDNE (бит 19): DeBounCe DoNE. Ядро установит этот бит, когда завершен дребезг после подключения устройства. Приложение может запустить сброс по шине (USB reset) после того, как увидит это прерывание. Этот бит достоверен только когда установлен бит HNP Capable или SRP Capable в регистре OTG_HS_GUSBCFG (соответственно бит HNPCAP или бит SRPCAP в регистре OTG_HS_GUSBCFG).

Примечание: доступно только в режиме хоста USB.

ADTOCHG (бит 18): A-Device TimeOut CHanGe. Ядро установит этот бит, чтобы показать, что на A-устройстве был таймаут, когда оно ждало подключения B-устройства.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

HNGDET (бит 17): Host NeGotiation DETected. Ядро установит этот бит, когда определило запрос согласования хоста, переданный по USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 16:10 зарезервированы и должны сохраняться в состоянии сброса (все нули).

HNSSCHG (бит 9): Host Negotiation Success Status CHanGe. Ядро установит этот бит при успехе или неудаче запроса согласования хоста USB. Приложение должно прочитать бит успеха согласования хоста (HNGSCS) в регистре OTG_HS_GOTGCTL чтобы проверить успех или неудачу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRSSCHG (бит 8): Session Request Success Status CHanGe. Ядро установит этот бит при успехе или неудаче запроса сессии. Приложение должно прочитать бит запроса сессии (SRQSCS) в регистре OTG_HS_GOTGCTL чтобы определить успех или неудачу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 7:3 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SEDET (бит 2): Session End DETected. Ядро установит этот бит чтобы показать, что уровень напряжения на VBUS больше недопустим для сессии B-периферии, когда VBUS < 0.8V.

Биты 1:0 зарезервированы и должны сохраняться в состоянии сброса (все нули).

Смещение адреса: 0x008
Значение сброса: 0x00000000

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

Примечание: этот регистр незначительно отличается от аналогичного по назначению регистра OTG_FS_GAHBCFG контроллера OTG_FS: добавлен бит DMAEN.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано PTXFELVL
rw
TXFELVL
rw
зарез. DMAEN
rw
зарезервировано GINTMSK
rw

Биты 31:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PTXFELVL (бит 8): Periodic TxFIFO Empty LeVeL. Показывает, когда переключаться биту прерывания опустошения периодического TxFIFO (бит PTXFE) в регистре OTG_HS_GINTSTS.

0: прерывание бита PTXFE (находится в регистре OTG_HS_GINTSTS) показывает, что периодический TxFIFO наполовину опустошен.
1: прерывание бита PTXFE (находится в регистре OTG_HS_GINTSTS) показывает, что периодический TxFIFO полностью пуст.

Примечание: доступно только в режиме хоста USB.

TXFELVL (бит 7): TxFIFO Empty LeVeL.

В режиме устройства: бит показывает, когда срабатывает прерывание опустошения стека передачи конечной точки IN (IN endpoint Transmit FIFO empty, бит TXFE в регистре OTG_HS_DIEPINTx).

0: прерывание бита TXFE (находится в регистре OTG_HS_DIEPINTx) показывает, что IN Endpoint TxFIFO опустошен наполовину.
1: прерывание бита TXFE (находится в регистре OTG_HS_DIEPINTx) показывает, что IN Endpoint TxFIFO полностью пуст.

В режиме хоста: бит показывает, когда сработает прерывание опустошения непериодического стека передачи (nonperiodic TxFIFO empty, бит NPTXFE в регистре OTG_HS_GINTSTS).

0: прерывание бита NPTXFE (находится в регистре OTG_HS_GINTSTS) показывает, что непериодический TxFIFO наполовину опустошен.
1: прерывание бита NPTXFE (находится в регистре OTG_HS_GINTSTS) показывает, что непериодический TxFIFO полностью пуст.

Бит 6 зарезервирован, и должен находиться в состоянии сброса (0).

DMAEN (бит 5): DMA ENable, разрешение использования режима DMA.

0: ядро работает в режиме Slave.
1: ядро работает в режиме DMA.

Биты 4:1 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GINTMSK (бит 0): Global INTerrupt MaSK. Приложение использует этот бит, чтобы замаскировать или отменить маскирование линии прерывания. Независимо от состояния этого бита регистры статуса прерывания все равно будут изменяться ядром.

0: маскирование прерывания для приложения. Прерывание при событиях USB генерироваться не будет, но приложение все равно может определить состояние событий USB чтением бит регистров статуса прерывания.
1: отмена маскирования прерываний для приложения.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Смещение адреса: 0x00C
Значение сброса: 0x00001440

Этот регистр может использоваться для конфигурирования ядра после включения питания или при смене режима (хоста или устройства USB). Регистр содержит конфигурационные параметры, относящиеся к USB и USB-PHY. Приложение должно программировать этот регистр перед запуском любых транзакций либо на AHB, либо на USB. Не меняйте этот регистр после начального программирования.

Примечание: этот регистр отличается от регистре OTG_FS_GUSBCFG контроллера OTG_FS тем, что добавлены биты управления интерфейсом ULPI.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
CTXPKT
rw
FDMOD
rw
FHMOD
rw
зарезервировано
ULPIIPD
rw
PTCI
rw
PCCI
rw
TSDPS
rw
ULPIEVBUSI
rw
ULPIEVBUSD
rw
ULPICSM
rw
ULPIAR
rw
ULPIFSLS
rw
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PHYLPCS
rw
зарез. TRDT
rw
HNPCAP
rw
SRPCAP
rw
зарез. PHYSEL
r
зарезервировано TOCAL
rw

CTXPKT (бит 31): Corrupt Tx PacKeT. Этот бит предназначен только для отладки. Никогда не устанавливайте его в 1.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

FDMOD (бит 30): Force Device MODe. Запись 1 в этот бит переведет ядро в режим устройства USB независимо от уровня на выводе входа OTG_HS_ID.

0: нормальный режим.
1: принудительный режим устройства USB.

После установки этого бита приложение должно подождать как минимум 25 мс перед тем, как изменение вступит в силу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

FHMOD (бит 29): Force host MODe. Запись 1 в этот бит переведет ядро в режим хоста USB независимо от уровня на выводе входа OTG_HS_ID.

0: нормальный режим.
1: принудительный режим хоста USB.

После установки этого бита приложение должно подождать как минимум 25 мс перед тем, как изменение вступит в силу.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 28:26 зарезервированы и должны сохраняться в состоянии сброса (все нули).

ULPIIPD (бит 25) ULPI Interface Protect Disable. Этот бит управляет схемой, встроенной в PHY, которая защищает интерфейс ULPI, когда линк переводит в третье состояние stp и data. Любые pull-up или pull-down резисторы, применяемые для этой функции, могут быть запрещены. Подробную информацию об этом см. в спецификации ULPI.

0: разрешает схему защиты интерфейса.
1: запрещает схему защиты интерфейса.

PTCI (бит 24): Indicator pass through, индикатор пропуска напрямую. Этот бит определяет, соответствует ли комплементарный выход внутреннему компаратору допустимости VBUS перед использованием информации о состоянии VBUS в CMD RX. Подробную информацию об этом см. в спецификации ULPI.

0: комплементарный выходной сигнал проверяется внутренним компаратором допустимости уровня VBUS (Internal VBUS valid comparator).
1: комплементарный выходной сигнал не проверяется внутренним компаратором допустимости уровня VBUS.

PCCI (бит 23): PHY Control Complement Indicator. Этот бит управляет инверсией входного сигнала ExternalVbusIndicator, и генерирует комплементарный выход. Подробную информацию об этом см. в спецификации ULPI.

0: PHY не инвертирует сигнал ExternalVbusIndicator.
1: PHY инвертирует сигнал ExternalVbusIndicator.

TSDPS (бит 22): TermSel DLine Pulsing Selection. Этот бит выбирает utmi_termselect, чтобы выдать импульс на линию данных во время сессии SRP.

0: импульс на линии данных формируется с помощью utmi_txvalid (по умолчанию).
1: импульс на линии данных формируется с помощью utmi_termsel.

ULPIEVBUSI (бит 21): ULPI External VBUS Indicator. Этот бит показывает для ULPI PHY использовать внешний индикатор перегрузки по току VBUS (VBUS overcurrent indicator).

0: PHY использует внутренний компаратор допустимости уровня VBUS.
1: PHY использует внешний компаратор допустимости уровня VBUS.

ULPIEVBUSD (бит 20): ULPI External VBUS Drive. Этот бит выбирает между внутренним или внешним источником питания для подачи 5V на VBUS в ULPI PHY.

0: PHY подает на VBUS напряжение от внутреннего ключа заряда charge pump (по умолчанию).
1: PHY подает на VBUS напряжение от внешнего источника питания.

ULPICSM (бит 19): ULPI Clock SuspendM. Этот бит устанавливает бит ClockSuspendM в регистре управления ULPI PHY. Этот бит применим только в режимах serial и carkit.

0: PHY выключает внутреннее тактирование во время приостановки (suspend).
1: PHY не выключает внутреннее тактирование.

ULPIAR (бит 18): ULPI Auto-Resume. Этот бит установит бит AutoResume в регистре управления ULPI PHY.

0: PHY не использует функцию AutoResume.
1: PHY использует функцию AutoResume.

ULPIFSLS (бит 17): ULPI FS/LS Select. Приложение использует этот бит для выбора последовательного интерфейса FS/LS для ULPI PHY. Этот бит допустим только когда на ULPI PHY выбран последовательный трансивер FS.

0: интерфейс ULPI.
1: последовательный интерфейс ULPI FS/LS.

Бит 16 зарезервирован, и должен находиться в состоянии сброса (0).

PHYLPCS (бит 15): PHY Low-Power Clock Select. Этот бит выбирает режим PHY 480 МГц или 48 МГц (низкое потребление). В режимах FS и LS PHY может обычно работать на частоте 48 МГц, чтобы экономить энергию источника питания.

0: тактовая частота 480 МГц, формируемая внутренним блоком тактирования PLL.
1: внешняя частота 48 МГц.

В режиме 480 МГц интерфейс UTMI работает либо на 60, либо на 30 МГц, в зависимости от выбранной разрядности данных 8 или 16 бит. В режиме 48 МГц, интерфейс UTMI работает на 48 МГц в режимах FS и LS.

Бит 14 зарезервирован, и должен находиться в состоянии сброса (0).

TRDT (биты 13:10): USB TuRnaround Time. Эти биты позволяют установить время выполнения работы в тактах PHY. Они должны быть установлены по таблице 213, в зависимости от частоты AHB в приложении. Чем больше значения TRDT, тем больше разрешается растянуть время ответа USB на токены IN, чтобы компенсировать латентность доступа на чтение AHB при обращении к Data FIFO.

Примечание: доступно только в режиме устройства USB.

Таблица 213. Значения TRDT.

Диапазон частот AHB (МГц)
Минимальное значение TRDT
min MAX
30 - 0xF

HNPCAP (бит 9): HNP-CAPable. Приложение использует этот бит для управления возможностями HNP контроллера OTG_HS.

0: функционал HNP не разрешен.
1: функционал HNP разрешен.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRPCAP (бит 8): SRP-CAPable. Приложение использует этот бит для управления возможностями HNP контроллера OTG_HS. Если ядро работает с B-устройством, несовместимым с SRP, то оно не может запросить подключенное A-устройство (хост USB) активировать VBUS и начать сессию.

0: функционал SRP не разрешен.
1: функционал SRP разрешен.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 7 зарезервирован, и должен сохраняться в состоянии сброса (0).

PHYSEL (бит 6): Full speed serial transceiver SELect, выбор последовательного полноскоростного трансивера. Этот бит всегда в состоянии лог. 1, и доступен только для чтения.

Биты 5:3 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TOCAL (биты 2:0): FS TimeOut CALibration. Количество тактов PHY, которое приложение программирует в этом поле, добавляется к длительности таймаута интервала между пакетами для любых дополнительных задержек, вводимых PHY при генерации состояния линии. Эта задержка может меняться для разных PHY.

Стандартное значение таймаута USB для операций full-speed составляет от 16 до 18 интервалов бит включительно. Приложение должно запрограммировать это поле на основе скорости энумерации. Количество интервалов бит, добавленных на такт PHY, составляет 0.25 интервала бита.

Смещение адреса: 0x010
Значение сброса: 0x80000000

Приложение использует регистр OTG_HS_GRSTCTL для сброса различных аппаратных функций внутри ядра.

Примечание: этот регистр незначительно отличается от аналогичного по функциям регистра OTG_FS_GRSTCTL контроллера OTG_FS: добавлен бит DMAREQ.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
AHBIDL
r
DMAREQ
r
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано TXFNUM
rw
TXFFLSH
rs
RXFFLSH
rs
зарез. FCRST
rs
HSRST
rs
CSRST
rs

AHBIDL (бит 31): AHB master IDLe. Показывает, что машина состояний мастера AHB находится в состоянии ожидания.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

DMAREQ (бит 30): DMA REQuest signal. Этот бит показывает, что выполняется запрос DMA (используется для отладки).

Биты 29:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TXFNUM (биты 10:6): TxFIFO NUMber. Это номер FIFO, содержимое которого должно быть сброшено (flush) с использованием бита TxFIFO Flush. Это поле не должно изменяться, пока ядро не очистит бит TxFIFO Flush.

00000:
– сброс не периодического TxFIFO в режиме хоста.
– сброс TxFIFO 0 в режиме устройства.

00001:
– сброс периодического TxFIFO в режиме хоста.
– сброс TxFIFO 1 в режиме устройства.

00010: сброс TxFIFO 2 в режиме устройства.

...

00101: сброс TxFIFO 15 в режиме устройства.

10000: сброс всех передающих FIFO в режиме устройства или в режиме хоста.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

TXFFLSH (бит 5): TxFIFO FLuSH. Этот бит селективно сбрасывает один или все передающие FIFO, но не может это делать, если ядро находится посередине транзакции.

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

Read - NAK Effective Interrupt гарантирует, что ядро не читает из FIFO.
Write - бит AHBIDL в регистре OTG_HS_GRSTCTL гарантирует, что ядро ничего не пишет в FIFO.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

RXFFLSH (бит 4): RxFIFO FluSH. Приложение с помощью этого бита может сбросить (flush) весь RxFIFO, но должно сначала убедиться, что ядро не находится посередине транзакции. Приложение должно записать этот бит только после проверки, что ядро ни читает из RxFIFO, ни пишет в RxFIFO. Приложение должно подождать очистки этого бита перед выполнением любых других операций. Для очистки этот бит требует 8 тактов (самая медленная частота тактов PHY или AHB).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 3 зарезервирован, и должен сохраняться в состоянии сброса (0).

FCRST (бит 2): Host Frame Counter ReSeT. Приложение записывает этот бит, чтобы сбросить счетчик количества фреймов, находящийся внутри ядра. Когда счетчик фреймов сброшен, последующие SOF, отправленные ядром, будут нумероваться от 0.

Примечание: доступно только в режиме хоста USB.

HSRST (бит 1): HCLK Soft ReSeT. Приложение использует этот бит, чтобы сбросит логику управления в домене тактов AHB. Сбросятся только конвейеры доменов тактов AHB (AHB Clock Domain pipelines). Стеки FIFO этим битом не сбрасываются.

Все машины состояний в домене тактов AHB сбрасываются в состояние ожидания (Idle state) после обрыва транзакций AHB по следующему протоколу.

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

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

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

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

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

CSRST (бит 0): Core Soft ReSeT. Сбрасывает домены HCLK и PCLK следующим образом. Очистятся прерывания и все биты регистра CSR, кроме следующих бит:

RSTPDMODL в регистре OTG_HS_PCGCCTL
GAYEHCLK в регистре OTG_HS_PCGCCTL
PWRCLMP в регистре OTG_HS_PCGCCTL
STPPCLK в регистре OTG_HS_PCGCCTL
FSLSPCS в регистре OTG_HS_HCFG
DSPD в регистре OTG_HS_DCFG

Все машины состояния модуля (кроме блока AHB slave) сбрасываются в состояние ожидания (Idle state), и сбрасываются все передающие FIFO и приемные FIFO.

Любые транзакции на AHB Master обрываются, как только это становится возможным, после завершения последней фазы данных транзакции AHB. Любые транзакции USB обрываются немедленно. Приложение может записать этот бит в любой момент времени, когда необходимо сбросить ядро. Этот бит обладает функцией самоочистки, ядро очистит его после того, как сбросится вся необходимая логика ядра, что может занимать несколько тактов, в зависимости от текущего состояния ядра. Как только этот бит очистился, программа должна подождать минимум 3 такта PHY перед тем, как осуществлять доступ к домену PHY (задержка синхронизации). Программа должна также проверить, что бит 31 в этом регистре (AHB Master is Idle) установился в лог. 1 перед запуском любой операции.

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

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Смещение адреса: 0x014
Значение сброса: 0x04000020

Это регистр прерываний приложения для событий системного уровня текущего режима (режим устройства или режим хоста USB).

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

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

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

Примечание: этот регистр отличается от аналогичного по назначению регистра OTG_FS_GINTSTS контроллера OTG_FS дополнительным битом DATAFSUSP.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
WKUINT
rc_w1
SRQINT
rc_w1
DISCINT
rc_w1
CIDSCHG
rc_w1
зарез. PTXFE
r
HCINT
r
HPRTINT
r
зарез. DATAFSUSP IPXFR/
INCOMPISOOUT

rc_w1
IISOIXFR
rc_w1
OEPINT
r
IEPINT
r
зарезерв.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
EOPF
rc_w1
ISOODRP
rc_w1
ENUMDNE
rc_w1
USBRST
rc_w1
USBSUSP
rc_w1
ESUSP
rc_w1
зарезерв. GONAKEFF
r
GINAKEFF
r
NPTXFE
r
RXFLVL
r
SOF
rc_w1
OTGINT
r
MMIS
rc_w1
CMOD
r

WKUPINT (бит 31): Resume/remote WaKeUP detected INTerrupt. В режиме устройства это прерывание выставляется, когда на USB было определено возобновление (resume). В режиме хоста это прерывание выставляется, когда на USB определен сигнал пробуждения, полученное от подключенного устройства USB (функция remote wakeup).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRQINT (бит 30): Session ReQuest/new session detected INTerrupt. В режиме хоста это прерывание срабатывает, когда был определен запрос сессии от устройства USB. В режиме устройства это прерывание выставляется, когда уровень VBUS в допустимом диапазоне для B-устройства.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

DISCINT (бит 29): DISConnect detected INTerrupt. Выставляется, когда определено отключение устройства.

Примечание: доступно только в режиме хоста USB.

CIDSCHG (бит 28): Connector ID Status CHanGe. Ядро установит этот бит, когда поменялось состояние сигнала идентификации коннектора (connector ID).

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 27 зарезервирован, и должен сохраняться в состоянии сброса (0).

PTXFE (бит 26): Periodic TxFIFO Empty. Выставляется, когда периодический передающий FIFO пуст либо наполовину, либо полностью, и есть как минимум одна свободная ячейка для записи в очередь периодических запросов. Половинчатое или полное опустошение определяется битом уровня опустошения периодического TxFIFO (бит PTXFELVL в регистре OTG_HS_GAHBCFG).

Примечание: доступно только в режиме хоста USB.

HCINT (бит 25): Host Channels INTerrupt. Ядро установит этот бит, чтобы показать наличие ожидающего обработки прерывания на одном из каналов ядра (режим хоста). Приложение должно прочитать регистр OTG_HS_HAINT, чтобы определить точный номер канала, на котором произошло прерывание, и затем прочитать соответствующий регистр OTG_HS_HCINTx, чтобы точно определить причину прерывания. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса в регистре OTG_HS_HCINTx.

Примечание: доступно только в режиме хоста USB.

HPRTINT (бит 24): Host PoRt INTerrupt. Ядро установит этот бит, чтобы показать изменение статуса портов контроллера OTG_HS в режиме хоста. Приложение должно прочитать регистр OTG_HS_HPRT, чтобы точно определить событие, которое привел к этому прерыванию. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса регистра OTG_HS_HPRT.

Примечание: доступно только в режиме хоста USB.

Бит 23 зарезервирован и должен сохраняться в состоянии сброса (0).

DATAFSUSP (бит 22): DATA Fetch SUSPended. Это прерывание допустимо только в режиме DMA. Оно показывает, что ядро остановило выборку данных для конечных точек IN из-за недоступности места в TxFIFO или места в очереди запросов. Это прерывание используется приложением для алгоритма несовпадения конечной точки (endpoint mismatch). Например, после детектирования endpoint mismatch приложение делает следующее:

– Устанавливает глобальное непериодическое отрицательное подтверждение IN NAK.
– Запрещает конечные точки IN.
– Сбрасывает (flush) FIFO.
– Определяет последовательность токена из очереди обучения последовательности токенов IN.
– Заново разрешает конечные точки.
– Очищает глобальное непериодическое отрицательное подтверждение IN NAK. Если оно очищено, ядро пока не может выбирать данные для конечной точки IN, и принимается токен IN, то ядро генерирует прерывание "IN token received when FIFO empty" (получен токен IN, когда буфер FIFO пуст). Тогда OTG отправит хосту подтверждение NAK. Чтобы избежать такого сценария, приложение может проверить прерывание FetSusp в регистре OTG_FS_GINTSTS, которое обеспечит полноту FIFO перед очисткой глобального отрицательного подтверждения NAK. Альтернативно приложение может маскировать прерывание "IN token received when FIFO empty", когда очищает глобальное отрицательное подтверждение IN NAK.

IPXFR (бит 21): Incomplete Periodic transFeR.

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

В режиме устройства INCOMPISOOUT: INCOMPlete ISOchronous OUT transfer. В режиме устройства ядро установит это прерывание, чтобы показать как минимум одну изохронную конечную точку OUT, на которой не завершена транзакция в текущем фрейме. Это прерывание установится вместе с битом прерывания окончания периодического фрейма (бит EOPF, который находится в этом регистре).

IISOIXFR (бит 20): Incomplete ISOchronous IN transFeR. Ядро установит это прерывание, чтобы показать как минимум одну изохронную конечную точку IN, транзакция которой не завершена в текущем фрейме. Это прерывание установится вместе с битом прерывания окончания периодического фрейма (бит EOPF, который находится в этом регистре).

Примечание: доступно только в режиме устройства USB.

OEPINT (бит 19): OUT EndPoint INTerrupt. Ядро установит этот бит, чтобы показать ожидающее прерывания на одной из конечных точек OUT (режим устройства). Приложение должно прочитать регистр OTG_HS_DAINT, чтобы определить точный номер конечной точки OUT, на которой произошло прерывание, и затем прочитать соответствующий регистр OTG_HS_DOEPINTx для точного определения причины прерывания. Для очистки этого бита приложение должно очистить соответствующий бит статуса регистра OTG_HS_DOEPINTx.

Примечание: доступно только в режиме устройства USB.

IEPINT (бит 18): IN EndPoint INTerrupt. Ядро установит этот бит, чтобы показать ожидающее обработки прерывание на одной из конечных точек IN (в режиме устройства). Приложение должно прочитать регистр OTG_HS_DAINT, чтобы точно определить номер конечной точки, для которой произошло прерывание, и затем прочитать соответствующий регистр OTG_HS_DIEPINTx, чтобы точно определить причину прерывания. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса регистра OTG_HS_DIEPINTx.

Примечание: доступно только в режиме устройства USB.

Биты 17:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

EOPF (бит 15): End Of Periodic Frame interrupt. Показывает, что в текущем фрейме достигнут период, указанный в поле интервала периодического фрейма (бит PFIVL) регистра OTG_HS_DCFG.

Примечание: доступно только в режиме устройства USB.

ISOODRP (бит 14): ISOchronous OUT packet DRoPped interrupt. Ядро установит этот бит, когда не смогло записать изохронный пакет OUT packet в RxFIFO, потому что в RxFIFO не было достаточно места для размещения пакета максимального размера конечной точки isochronous OUT.

Примечание: доступно только в режиме устройства USB.

ENUMDNE (бит 13): ENUMeration DoNE. Ядро установит этот бит, чтобы показать завершение быстрой энумерации (speed enumeration). Приложение должно прочитать регистр OTG_HS_DSTS, чтобы получить скорость энумерации.

Примечание: доступно только в режиме устройства USB.

USBRST (бит 12): USB ReSeT. Ядро установит этот бит, когда определит сброс по шине USB.

Примечание: доступно только в режиме устройства USB.

USBSUSP (бит 11): USB SUSPend. Ядро установит этот бит, чтобы показать детектирование приостановки (suspend) на USB. Ядро входит в состояние Suspended, когда нет активности на линиях данных в течение 3 мс.

Примечание: доступно только в режиме устройства USB.

ESUSP (бит 10): Early SUSPend. Ядро установит этот бит, чтобы показать детектирование состояния ожидания (Idle state) на USB для 3 мс.

Примечание: доступно только в режиме устройства USB.

Биты 9:8 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GONAKEFF (бит 7): Global OUT NAK EFFective. Показывает, что бит Set global OUT NAK (бит SGONAK) в регистре OTG_HS_DCTL, установленный приложением, вступил в действие для ядра. Бит GONAKEFF может быть очищен запись бита Clear global OUT NAK (бит CGONAK) в регистре OTG_HS_DCTL.

Примечание: доступно только в режиме устройства USB.

GINAKEFF (бит 6): Global IN non-periodic NAK EFFective. Показывает, что бит Set global non-periodic IN NAK (бит SGINAK) в регистре OTG_HS_DCTL, установленный приложением, вступил в действие для ядра. Таким образом, ядро произвело выборку бита Global IN NAK, установленного приложением. Бит GINAKEFF можно очистить путем очистки бита (бит CGINAK) в регистре OTG_HS_DCTL.

Это прерывание необязательно означает, что через USB было отправлено отрицательное подтверждение (NAK handshake). Бит STALL имеет приоритет над битом NAK.

Примечание: доступно только в режиме устройства USB.

NPTXFE (бит 5): Non-Periodic TxFIFO Empty. Это прерывание выставляется, когда непериодический передающий FIFO опустошен наполовину или полностью, и есть место для как минимум одной записи в непериодическую очередь запросов передачи. Статус половинной или полной опустошенности определяется по биту non-periodic TxFIFO empty level (бит TXFELVL) в регистре OTG_HS_GAHBCFG.

Примечание: доступно только в режиме хоста USB.

RXFLVL (бит 4): RxFIFO non-empty. Показывает, что в RxFIFO есть как минимум один пакет, ожидающий чтения.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SOF (бит 3): Start Of Frame. В режиме хоста ядро установит этот бит, чтобы показать передачу через USB сигнала SOF (FS) или сигнала Keep-Alive (LS). Приложение должно записать 1 в этот бит, чтобы очистить прерывание. В режиме устройства ядро установит этот бит, чтобы показать прием через USB токена SOF. Приложение может прочитать регистр состояния устройства (Device Status register), чтобы получить текущий номер фрейма. Это прерывание видно только когда ядро работает в FS.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

OTGINT (бит 2): OTG INTerrupt. Ядро установит этот бит, чтобы показать событие протокола OTG. Приложение должно прочитать регистр OTG Interrupt Status (OTG_HS_GOTGINT), чтобы точно определить событие, вызвавшее это прерывание. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса в регистре OTG_HS_GOTGINT.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

MMIS (бит 1): Mode MISmatch interrupt. Ядро установит этот бит, когда приложение пытается получить доступ к регистру, к которому в этом режиме доступ невозможен. Например, ядро находится в режиме устройства USB, и при этом обращается к регистру режима хоста. Доступ к регистру завершается на AHB ответом OKAY, однако внутренне игнорируется ядром, и не оказывает влияние на работу ядра.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

CMOD (бит 0): Current MODe of operation. Показывает текущий режим работы ядра.

0: режим устройства USB.
1: режим хоста USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Смещение адреса: 0x018
Значение сброса: 0x00000000

Этот регистр работает вместе с регистром прерываний ядра (Core interrupt register, OTG_HS_GINTSTS). Когда бит прерывания замаскирован, то связанное с этим битом прерывание не генерируется. Однако все еще установится бит регистра прерываний ядра (OTG_HS_GINTSTS), соответствующий этому прерыванию.

Примечание: этот регистр незначительно отличается от аналогичного по функциям регистра OTG_HS_GINTMSK контроллера OTG_HS: добавлен бит FSUSPM.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
WUIM
rw
SRQIM
rw
DISCINT
rw
CIDSCHGM
rw
зарез. PTXFEM
rw
HCIM
rw
PRTIM
rw
зарез. FSUSPM
rw
IPXFRM/
IISOOXFRM

rw
IISOIXFRM
rw
OEPINT
rw
IEPINT
rw
зарезерв.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
EOPFM
rw
ISOODRPM
rw
ENUMDNEM
rw
USBRST
rw
USBSUSPM
rw
ESUSPM
rw
зарезерв. GONAKEFFM
rw
GINAKEFFM
rw
NPTXFEM
rw
RXFLVLM
rw
SOFM
rw
OTGINT
rw
MMISM
rw
зарез.

WUIM (бит 31): Resume/remote WakeUp detected Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания от события возобновления / удаленного пробуждения USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SRQIM (бит 30): Session ReQuest/new session detected Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания от события запроса сессии / новой сессии USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

DISCINT (бит 29): DISConnect detected INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при обнаружении отключения от шины USB.

Примечание: доступно только в режиме устройства USB.

CIDSCHGM (бит 28): Connector ID Status CHanGe Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при изменении состояния сигнала идентификации устройства на коннекторе USB.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Биты 27 зарезервирован, и должен сохраняться в состоянии сброса (0).

PTXFEM (бит 26): Periodic TxFIFO Empty Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания опустошения (наполовину или полностью) периодического передающего FIFO.

Примечание: доступно только в режиме хоста USB.

HCIM (бит 25): Host Channels Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания канала хоста.

Примечание: доступно только в режиме хоста USB.

PRTIM (бит 24): Host PoRT Interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания порта хоста.

Примечание: доступно только в режиме хоста USB.

Бит 23 зарезервирован и должен сохраняться в состоянии сброса (0).

FSUSPM (бит 23): Data Fetch SUSPended Mask.

0: прерывание маскировано (запрещено).
1: прерывание демаскировано.

Примечание: доступно только в режиме устройства USB.

IPXFRM (бит 21): Incomplete Periodic transFer Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания незавершенной периодической транзакции.

Примечание: доступно только в режиме хоста USB.

IISOOXFRM (бит 21): Incomplete isochronous OUT transfer mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания незавершенной изохронной транзакции OUT.

Примечание: доступно только в режиме устройства USB.

IISOIXFRM (бит 20): Incomplete ISOchronous IN transFeR Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания незавершенной изохронной транзакции IN.

Примечание: доступно только в режиме устройства USB.

OEPINT (бит 19): OUT EndPoints INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания конечных точек OUT.

Примечание: доступно только в режиме устройства USB.

IEPINT (бит 18): IN EndPoints INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания конечных точек IN.

Примечание: доступно только в режиме устройства USB.

Биты 17:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

EOPFM (бит 15): End Of Periodic Frame interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания окончания периодического фрейма.

Примечание: доступно только в режиме устройства USB.

ISOODRPM (бит 14): ISOchronous OUT packet DRoPped interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания отброшенного изохронного пакета OUT.

Примечание: доступно только в режиме устройства USB.

ENUMDNEM бит 13): ENUMeration DoNE Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания по окончанию энумерации.

Примечание: доступно только в режиме устройства USB.

USBRST (бит 12): USB ReSeT mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания сброса по шине USB.

Примечание: доступно только в режиме устройства USB.

USBSUSPM (бит 11): USB SUSPend Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при входе в состояние приостановки USB.

Примечание: доступно только в режиме устройства USB.

ESUSPM (бит 10): Early SUSPend Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания при входе в состояние ранней приостановки USB.

Примечание: доступно только в режиме устройства USB.

Биты 9:8 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GONAKEFFM (бит 7): Global OUT NAK EFFective Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания, когда для ядра вступил в действие бит Set global OUT NAK (бит SGONAK) в регистре OTG_HS_DCTL, установленный приложением.

Примечание: доступно только в режиме устройства USB.

GINAKEFFM (бит 6): Global non-periodic IN NAK EFFective mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания, когда для ядра вступил в действие бит Set global non-periodic IN NAK (бит SGINAK) в регистре OTG_HS_DCTL, установленный приложением.

Примечание: доступно только в режиме устройства USB.

NPTXFEM (бит 5): Non-Periodic TxFIFO Empty Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания опустошения не периодического передающего FIFO.

Примечание: доступно только в режиме хоста USB.

RXFLVLM (бит 4): RxFIFO non-empty Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания наличия принятых данных в FIFO приема.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

SOFM (бит 3): Start Of Frame Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания начала фрейма.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

OTGINT (бит 2): OTG INTerrupt mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания события OTG.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

MMISM (бит 1): Mode MISmatch interrupt Mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания ошибочного доступа (несоответствия режима) к регистрам OTG_HS.

Примечание: доступно в обоих режимах (и хоста, и устройства USB).

Бит 0 зарезервирован и должен сохраняться в состоянии сброса (0).

Смещение адреса для Read: 0x01C
Смещение адреса для Pop: 0x020
Значение сброса: 0x00000000

Чтение регистра Receive status debug read возвращает содержимое вершины RxFIFO. Чтение регистра Receive status read and pop дополнительно извлекает данные из вершины RxFIFO.

Содержимое статуса приема должно интерпретироваться по-разному для режимов хоста и устройства. Ядро игнорирует receive status pop/read, когда RxFIFO пуст, и вернет при этом значение 0x00000000. Приложение должно делать выборку (pop) Receive Status FIFO только когда установлен бит RxFIFO non-empty (бит RXFLVL) в регистре прерываний ядра (OTG_HS_GINTSTS).

[Режим хоста USB]

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PKTSTS
r
DPID[1]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DPID[0]
r
BCNT
r
CHNUM
r

Биты 31:21 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTSTS (биты 20:17): PacKeT STatuS. Показывает статус принятого пакета.

0010: принят пакет данных IN.
0011: завершена транзакция IN (срабатывает прерывание).
0101: ошибка переключения данных (Data toggle error, срабатывает прерывание).
0111: канал остановлен (срабатывает прерывание).
Другие значения: зарезервировано.

DPID (биты 16:15): Data PID. Показывает Data PID принятого пакета.

00: DATA0
10: DATA1
01: DATA2
11: MDATA

BCNT (биты 14:4): Byte CouNT. Показывает количество байт данных принятого пакета IN.

CHNUM (биты 3:0): CHannel NUMber. Показывает номер канала, которому принадлежит текущий принятый пакет.

[Режим устройства USB]

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано FRMNUM
r
PKTSTS
r
DPID[1]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DPID[0]
r
BCNT
r
EPNUM
r

Биты 31:25 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FRMNUM (24:21): FRaMe NUMber. Это младшие значащие 4 бита номера фрейма USB, в котором был принят пакет. Это поле поддерживается только когда поддерживаются изохронные конечные точки OUT.

PKTSTS (биты 20:17): PacKeT STatuS. Показывает состояние принятого пакета.

0001: Global OUT NAK (срабатывает прерывание).
0010: принят пакет данных OUT.
0011: завершена транзакция OUT (срабатывает прерывание).
0100: завершена транзакция SETUP (срабатывает прерывание).
0110: принят пакет данных SETUP.
Другие значения: зарезервировано.

DPID (биты 16:15): Data PID. Показывает Data PID принятого пакета данных OUT.

00: DATA0
10: DATA1
01: DATA2
11: MDATA

BCNT (биты 14:4): Byte CouNT. Показывает количество байт данных принятого пакета.

EPNUM (биты 3:0): EndPoint NUMber (биты 3:0): CHannel NUMber. Показывает номер конечной точки, которой принадлежит текущий принятый пакет.

Смещение адреса: 0x024
Значение сброса: 0x00000200

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

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
RXFD
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

RXFD (биты 15:0): RxFIFO Depth. Это значение показывает глубину стека приема в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256. Значение после сброса в этом регистре указано как самая большая глубина данных RxFIFO.

Смещение адреса: 0x028
Значение сброса: 0x00000200

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
NPTXFD/TX0FD
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
NPTXFSA/TX0FSA
rw

[Режим хоста USB]

NPTXFD (биты 31:16): Non-Periodic TxFIFO Depth. Это значение показывает глубину стека передачи в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256.

NPTXFSA (биты 15:0): Non-Periodic Transmit RAM Start Address. Это поле содержит начальный адрес RAM для не периодического передающего FIFO.

[Режим устройства USB]

TX0FD (биты 31:16): Endpoint 0 TxFIFO Depth. Это значение показывает глубину стека передачи конечной точки 0 в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256.

TX0FSA (биты 15:0): Endpoint 0 transmit RAM Start Address. Это поле содержит начальный адрес RAM для передающего FIFO конечной точки 0.

Смещение адреса: 0x02C
Значение сброса: 0x00080200

Примечание: в режиме устройства USB этот регистр недопустим.

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

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. NPTXQTOP
r
NPTQXSAV
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
NPTXFSAV
r

Бит 31 зарезервирован, и должен сохраняться в состоянии сброса (0).

NPTXQTOP (биты 30:24): TOP of the Non-Periodic Transmit request queue. Элемент очереди не периодических запросов на передачу, который в настоящий момент обрабатывает MAC.

Биты 30:27: номер канала/конечной точки.

Биты 26:25:

00: токен IN/OUT.
01: пакет передачи нулевой длины (Zero-length transmit packet, для устройства IN, для хоста OUT).
11: команда остановки канала (Channel halt).

Бит 24: Terminate (последний элемент для выбранного канала / выбранной конечной точки).

NPTQXSAV (биты 23:16): Non-Periodic Transmit request Queue Space AVailable. Показывает количество свободного доступного места в очереди не периодических запросов передачи. Эта очередь в режиме хоста хранит запросы обоих видов - IN и OUT. В режиме устройства имеются только запросы IN.

00000000: очередь не периодических запросов передачи заполнена.
00000001: есть 1 свободная ячейка.
00000010: есть 2 свободных ячейки.
...
00001000: есть 8 свободных ячеек.
Другие значения: зарезервировано.

NPTXFSAV (биты 15:0): Non-Periodic TxFIFO Space AVailable. Показывает количество доступного пространства в не периодическом TxFIFO. Значения указываются в единицах 32-битных слов.

0x0000: не периодический TxFIFO заполнен.
0x0001: доступно свободное место для 1 слова.
0x0002: доступно свободное место для 2 слов.
...
0x0100: доступно свободное место для 256 слов.
Другие значения: зарезервировано.

Смещение адреса: 0x038
Значение сброса: 0x0000XXXX

Примечание: этот регистр незначительно отличается от аналогичного регистра OTG_FS_GCCFG контроллера OTG_FS: добавлен бит I2CPADEN.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано NOVBUSSENS
rw
SOFOUTEN
rw
VBUSBSEN
rw
VBUSASEN
rw
I2CPADEN
rw
PWRDWN
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано

Биты 31:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NOVBUSSENS (бит 21): опция запрета определения корректности уровня VBUS. Когда этот бит установлен, ядро считается всегда допустимым уровень VBUS (5V), т. е. этот уровень не анализируется. При этом освобождается для других функций выделенная ножка порта, предназначенная для анализа уровня VBUS. Соединение с VBUS может быть переназначено на другую ножку корпуса, и уровень VBUS может отслеживаться программно.

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

0: аппаратный анализ уровня VBUS.
1: анализ уровня VBUS недоступен для аппаратуры.

SOFOUTEN (бит 20): SOF OUTput ENable.

0: импульс SOF недоступен на выделенной ножке корпуса (OTG_HS_SOF).
1: импульс SOF доступен на выделенной ножке корпуса (OTG_HS_SOF).

VBUSBSEN (бит 19): разрешение детектирования уровня VBUS для B-устройства (устройство USB).

0: детектирование VBUS устройства B запрещено.
1: детектирование VBUS устройства B разрешено.

VBUSASEN (бит 18): разрешение детектирования уровня VBUS для A-устройства (хост USB).

0: детектирование VBUS устройства A запрещено.
1: детектирование VBUS устройства A разрешено.

I2CPADEN (бит 17): I2C PAD ENable, разрешает соединение с шиной I2C для внешнего интерфейса с I2C PHY.

0: шина I2C запрещена.
1: шина I2C разрешена.

PWRDWN (бит 16): PoWeR DoWN. Используется для активации трансивера при передаче/приеме.

0: трансивер выключен.
1: трансивер активен.

Биты 15:0 зарезервированы и должны сохраняться в состоянии сброса.

Смещение адреса: 0x03C
Значение сброса: 0x00001200

Этот регистр содержит значение идентификатора продукта (Product ID).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
PRODUCT_ID[31:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PRODUCT_ID[15:0]
rw

PRODUCT_ID (биты 31:0): Поле Product ID. В нем содержится программируемый приложением идентификатор.

Смещение адреса: 0x100
Значение сброса: 0x02000800

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
PTXFD
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PTXSA
r

PTXFD (биты 31:16): глубина периодического TxFIFO хоста. Это значение указывается в единицах 32-битных слов, минимальное значение 16, максимальное 512.

PTXSA (биты 15:0): начальный адрес периодического TxFIFO хоста. Значение после сброса в этом регистре равна сумме самой большой глубины данных RxFIFO и самой большой глубины данных не периодического TxFIFO.

Здесь x (в диапазоне от 1 до 5) обозначает номер FIFO.

Смещение адреса: 0x104 + 0x04 * (x - 1)
Значение сброса: 0x02000400

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
INEPTXFD
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
INEPTXSA
r

INEPTXFD (биты 31:16): IN EndPoint TxFIFO Depth. Глубина FIFO передачи конечной точки IN. Значение указывается в единицах 32-битных слов. Минимальное значение 16, максимальное 512. Значение после сброса в этом регистре указывается как самая большая глубина IN endpoint FIFO.

INEPTXSA (биты 15:0): IN EndPoint FIFOx Rransmit RAM Start Address. Это поле содержит начальный адрес для передающего FIFO конечной точки IN. Этот адрес должен быть выровнен на адрес 32-битного слова (т. е. байтовый адрес должен нацело делиться на 4).

[Регистры режима хоста USB]

Значения бит в описании регистров выражены двоичными значениями, если не указано нечто иное.

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

Смещение адреса: 0x400
Значение сброса: 0x00000000

Через этот регистр программа конфигурирует ядро после включения питания. Не изменяйте этот регистр после инициализации хоста.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано FSLSS
r
FSLSPCS
rw

Биты 31:3 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FSLSS (бит 2): поддерживать только FS и LS. Приложение использует этот бит, чтобы управлять скоростью энумерации ядра. Используя этот бит, приложение может сделать энумерацию ядра как хоста FS, даже если подключенное устройство поддерживает трафик HS. Не меняйте это поле после начального программирования.

1: поддержка только FS/LS (Full-Speed и Low-Speed), даже если подключенное устройство может поддерживать HS (High Speed, только чтение).

FSLSPCS (биты 1:0): выбор тактов FS/LS PHY.

Когда ядро работает в режиме хоста FS:

01: такты PHY работают на 48 МГц.

Другие значения: зарезервировано.

Когда ядро работает в режиме хоста LS:

00: зарезервировано.
01: для PHY выбрана тактовая частота 48 МГц.
10: для PHY выбрана тактовая частота 6 МГц.
11: зарезервировано.

Примечание: FSLSPCS должно быть установлено на событии подключения в соответствии со скоростью подключенного устройства (после изменения этого бита должен быть произведен программный сброс).

Смещение адреса: 0x404
Значение сброса: 0x0000EA60

В этом регистре хранится информация по интервалу фрейма для текущей скорости, с которой прошел энумерацию контроллер OTG_HS.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
FRIVL
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FRIVL (биты 15:0): FRame InterVaL. Значение, которое приложение программирует в это поле, задает интервал между двумя следующими друг за другом токенами SOF (FS) или Keep-Alive (LS). В этом поле содержится количество тактов PHY, которое составляет требуемый интервал фрейма. Приложение может записать значение в этот регистр только после того, как установлен бит разрешения порта в регистре управления и статуса порта хоста (бит PENA в регистре OTG_HS_HPRT). Если никакое значение не запрограммировано, ядро вычисляет значение на основе тактов PHY, указанных в поле FS/LS PHY Clock Select регистра конфигурации хоста (FSLSPCS в регистре OTG_HS_HCFG). Не меняйте значение в этом поле после начальной конфигурации.

Интервал фрейма = 1 мс x (FRIVL - 1)

Смещение адреса: 0x408
Значение сброса: 0x00003FFF

В этом регистре показывается текущий номер фрейма. Также в нем показано оставшееся время (в единицах количества тактов PHY) в текущем фрейме.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
FTREM
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
FRNUM
r

FTREM (биты 31:16): Frame Time REMaining. Показывает количество времени, оставшееся в текущем фрейме, в единицах тактов PHY. Это поле автоматически декрементируется с каждым тактом PHY. Когда оно достигает 0, то автоматически перезагружается значением из регистра интервала фрейма, и новый SOF передается через USB.

FRNUM (биты 15:0): FRame NUMber. Это поле инкрементируется, когда новый SOF передается через USB, и очищается в 0, когда достигает 0x3FFF.

Смещение адреса: 0x410
Значение сброса: 0x00080100

Это регистр только для чтения, где содержится информация свободного пространства для периодического TxFIFO и очереди периодических запросов.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
PTXQTOP
r
PTXQSAV
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PTXFSAVL
r

PTXQTOP (биты 31:24): TOP of the Periodic Transmit request Queue. Показывает элемент в очереди периодических запросов передачи, который в настоящий момент обрабатывает MAC. Этот регистр используется для отладки.

Бит 31: нечетный/четный фрейм.

0: отправляется четный фрейм.
1: отправляется нечетный фрейм.

Биты 30:27: номер канала/конечной точки.

Биты 26:25: тип.

00: IN/OUT.
01: пакет нулевой длины (Zero-length packet).
11: команда запрета канала.

Бит 24: Terminate (последнего элемента выбранного канала/конечной точки).

PTXQSAV (биты 23:16): Periodic Transmit request Queue Space AVailable. Показывает количество свободных ячеек, доступное для записи в очередь периодических запросов передачи. Эта очередь хранит оба вида направлений запросов - IN и OUT.

00000000: очередь периодических запросов передачи заполнена.
00000001: доступна 1 свободная ячейка в очереди.
00000010: доступны 2 свободных ячейки в очереди.
...
00001000: доступно 8 свободных ячеек в очереди.
Другие значения: зарезервировано.

PTXFSAVL (биты 15:0): Periodic Transmit data FIFO Space AVailable. Показывает количество свободных ячеек, доступное для записи в периодический TxFIFO. Значение представлено в единицах 32-битных слов.

0x0000: периодический TxFIFO заполнен.
0x0001: доступно 1 слово.
0x0002: доступно 2 слова.
...
n: доступно n слов (здесь n в диапазоне от 0 до PTXFD включительно).
Другие значения: зарезервировано.

Смещение адреса: 0x414
Значение сброса: 0x00000000

Когда на канале происходит значительное событие, в приложении происходит прерывание по биту прерывания в регистре прерываний ядра (бит HCINT в регистре OTG_HS_GINTSTS) с информации о прерывании в регистре OTG_HS_HAINT. Это показано на рис. 414. Здесь находится по одному биту прерывания на канал, максимум до 16 бит. Биты в этом регистре устанавливаются и очищаются, когда приложение устанавливает и очищает биты в соответствующем регистре прерываний канала x хоста.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
HAINT
r

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

HAINT (биты 15:0): прерывания каналов. Один бит на канал: бит 0 для канала 0, бит 15 для канала 15.

Смещение адреса: 0x418
Значение сброса: 0x00000000

Регистр маски прерываний всех каналов хоста (OTG_HS_HAINTMSK) работает вместе с регистром прерываний всех каналов (OTG_HS_HAINT), когда на канале происходит событие. Имеется по одному биту маски на канал, максимум 16 бит.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
HAINTM
r

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

HAINTM (биты 15:0): маска прерываний каналов.

0: прерывание замаскировано (запрещено).
1: прерывание не замаскировано (разрешено).

Один бит на канал: бит 0 для канала 0, бит 15 для канала 15.

Смещение адреса: 0x440
Значение сброса: 0x00000000

Этот регистр доступен только в режиме хоста. В настоящий момент хост OTG поддерживает только один порт.

Один регистр хранит информацию, относящуюся к хосту USB, такую как USB reset, разрешение, приостановка (suspend), возобновление (resume), статус подключения и режим тестирования для каждого порта (это показано на рис. 414). Биты rc_w1 в этом регистре могут привести к прерыванию в приложении через бит прерываний порта хоста (бит HPRTINT в регистре OTG_HS_GINTSTS). На прерывании порта приложение должно прочитать этот регистр и очистить бит, который привел к прерыванию. Для бит rc_w1 приложение должно записать 1 в бит, чтобы очистить прерывание.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PSPD
r
PTCTL[3]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
PTCTL[2:1]
rw
PPWR
rw
PLSTS
r
зарез. PRST
rw
PSUSP
rs
PRES
rw
POCCHNG
rc_w1
POCA
r
PENCHNG
rc_w1
PENA
rc_w0
PCDET
rc_w1
PCSTS
r

Биты 31:19 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PSPD (биты 18:17): Port SPeeD. Показывает скорость устройства, подключенного к этому порту.

00: High speed (HS, полная скорость).
01: Full speed (FS, полная скорость).
10: Low speed (LS, низкая скорость).
11: зарезервировано.

PTCTL (биты 16:13): Port Test ConTroL. Приложение записывает ненулевое значение в это поле, чтобы перевести порт в режим тестирования, и на порту появляется соответствующий шаблон сигнализации.

0000: режим тестирования запрещен.
0001: режим Test_J.
0010: режим Test_K.
0011: режим Test_SE0_NAK.
0100: режим Test_Packet.
0101: Test_Force_Enable.
Другие значения: зарезервировано.

PPWR (бит 12): Port PoWeR. Приложение использует этот бит, чтобы управлять питанием этого порта, и ядро очищает этот бит при событии перегрузки по току (overcurrent condition).

0: Power off (порт выключен).
1: Power on (порт включен).

PLSTS (биты 11:10): Port Line STatuS. Показывает текущие логические уровни на линиях данных USB D+ (DP) и D- (DM).

Бит 10: логический уровень OTG_HS_DP.
Бит 11: логический уровень OTG_HS_DM.

Бит 9 зарезервирован, и должен сохраняться в состоянии сброса (0).

PRST (бит 8): Port ReSeT. Когда приложение установит этот бит, на порту запустится последовательность сброса. Приложение должно отследить период времени сброса, и очистить этот бит после завершения последовательности сброса.

0: порт не в состоянии сброса.
1: порт в состоянии сброса.

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

PSUSP (бит 7): Port SUSPend. Приложение установит этот бит, чтобы перевести порт в режим приостановки (Suspend mode). Ядро только останавливает отправку SOF, когда этот бит установлен. Для остановки тактов PHY, приложение должно установить бит остановки тактов порта, который устанавливает входной вывод приостановки PHY.

Значение чтения этого бита отражает текущее состояние приостановки порта. Этот бит очищается ядром после детектирования сигнала удаленного пробуждения (remote wakeup), или когда приложение установит бит сброса порта или бит возобновления порта в этом регистре, или бит Resume/remote wakeup detected interrupt bit, или бит прерывания Disconnect в регистре прерываний ядра (бит WKUINT или бит DISCINT в OTG_HS_GINTSTS, соответственно).

0: порт не в режиме приостановки.
1: порт в режиме приостановки (Suspend mode).

PRES (бит 6): Port RESume. Приложение установит этот бит, чтобы выдать сигнал возобновления в порт. Ядро продолжает выдавать сигнализацию resume до тех пор, пока приложение не очистит этот бит.

Если ядро детектировало последовательность удаленного пробуждения (USB remote wakeup), что показывается битом прерывания Port resume/remote wakeup в регистре прерываний ядра (бит WKUINT в регистре OTG_HS_GINTSTS), ядро запустит сигнализацию возобновления без всякого вмешательства приложения и очистит его, когда обнаружит событие разъединения. Прочитанное значение в этом бите показывает, выдается ли в настоящий момент сигнал возобновления.

0: нет выдачи resume.
1: выдается сигнал resume.

POCCHNG (бит 5): Port OverCurrent CHaNGe. Ядро установит этот бит, когда меняется состояния активности перегрузки порта (бит 4) в этом регистре.

POCA (бит 4): Port OverCurrent Active. Показывает перегрузку на порту USB.

0: нет перегрузки по току.
1: перегрузка по току (Overcurrent).

PENCHNG (бит 3): Port ENable/disable CHaNGe. Ядро установит этот бит, когда поменяется статус разрешения порта (бит 2 в этом регистре).

PENA (бит 2): Port ENAble. Порт разрешается только ядром после последовательности сброса, и запрещается событием перегрузки по току, событием отключения или приложением, очистившим этот бит. Приложение не может установить этот бит путем записью в регистр. Оно может только очистить этот бит, чтобы запретить порт. Этот бит не вызывает никакое прерывание для приложения.

0: порт запрещен.
1: порт разрешен.

PCDET (бит 1): Port Connect DETected. Ядро установит этот бит, когда было определено подключение устройства для срабатывания прерывания с использованием бита прерывания порта хоста в регистре прерываний ядра (бит HPRTINT в регистре OTG_HS_GINTSTS). Приложение должно записать 1 в этот бит для очистки прерывания.

PCSTS (бит 0): Port Connect STatuS.

0: к порту не подключено ни одного устройства.
1: к порту подключено устройство.

Здесь x это номер канала в диапазоне от 0 до 11 включительно.

Смещение адреса: 0x500 + 0x20 * x
Значение сброса: 0x00000000

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
CHENA
rs
CHDIS
rs
ODDFRM
rw
DAD
rw
MCNT
rw
EPTYP
rw
LSDEV
rw
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
EPDIR
rw
EPNUM
rw
MPSIZ
rw

CHENA (бит 31): CHannel ENAble. Это поле устанавливается приложением и очищается хостом OTG.

0: канал запрещен.
1: канал разрешен.

CHDIS (бит 30): CHannel DISable. Приложение установит этот бит для остановки передачи/приема данных на канале, даже до завершения передачи по этому каналу. Приложение должно ждать прерывания запрета канала перед тем, как может считать этот канал запрещенным.

ODDFRM (бит 29): ODD FRaMe. Это поле устанавливается (сбрасывается) приложением, чтобы показать, что хост OTG должен выполнить транзакцию на нечетном фрейме. Это поле применимо применимо только для периодических (isochronous и interrupt) транзакций.

0: четный фрейм.
1: нечетный фрейм.

DAD (биты 28:22): Device ADdress. Это поле выбирает определенное устройство, которое представляет собой источник или место назначения данных.

MCNT (биты 21:20): MultiCouNT. Эта поле показывает для хоста количество транзакций, которые должны быть выполнены на фрейм для этой периодической конечной точки. Для не периодических передач это поле не используется.

00: зарезервировано. Это значение приведет к непредсказуемым результатам.
01: 1 транзакция.
10: 2 транзакции на фрейм для выдачи на этой конечной точке.
11: 3 транзакции на фрейм для выдачи на этой конечной точке.

Примечание: это поле должно быть установлено в значение как минимум 01.

EPTYP (биты 19:18): EndPoint TYPe. Показывает выбранный тип транзакции.

00: Control
01: Isochronous
10: Bulk
11: Interrupt

LSDEV (бит 17): Low-Speed DEVice. Этот бит устанавливается приложением, чтобы показать работу этого канала в режиме низкоскоростного устройства (low-speed device).

Бит 16 зарезервирован, и должен сохраняться в состоянии сброса (0).

EPDIR (бит 15): EndPoint DIRection. Показывает направление транзакции - IN или OUT.

0: OUT
1: IN

EPNUM (биты 14:11): EndPoint NUMber. Показывает номер конечный точки на устройстве, которое работает либо как источник, либо как место назначения данных.

MPSIZ (биты 10:0): Maximum Packet SIZe. Показывает максимальный размер пакета связанной конечной точки.

Здесь x это номер канала в диапазоне от 0 до 11 включительно.

Смещение адреса: 0x504 + 0x20 * x
Значение сброса: 0x00000000

Этот регистр показывает статус канала по отношению к USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерывания канала хоста в регистре прерываний ядра (бит HCINT в регистре OTG_HS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_HS_HAINT), чтобы получить точный номер канала для регистра прерываний канала x хоста. Чтобы очистить соответствующие биты в регистрах OTG_HS_HAINT и OTG_HS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_HS_HCINTx.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
SPLITEN
rw
зарезервировано COMPLSPLT
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XACTPOS
rw
HUBADDR
rw
PRTADDR
rw

SPLITEN (бит 31): SPLIT ENable. Приложение установит этот бит, чтобы показать, что этот канал разрешен для разделенных (split) транзакций.

Биты 30:17 зарезервированы и должны сохраняться в состоянии сброса (все нули).

COMPLSPLT (бит 16): завершать split. Приложение установит этот бит для запроса к хосту OTG выполнить завершение split-транзакции.

XACTPOS (биты 15:14): позиция транзакции. Это поле используется для определения необходимости отправки всей, первой, средней или последней полезной нагрузки с каждой транзакцией OUT.

11: All. Вся полезная нагрузка данных этой транзакции (которая меньше или равна 188 байтам).
10: Begin. Первая полезная данных этой транзакции (которая больше, чем 188 байт).
00: Mid. Средняя полезная нагрузка этой транзакции (которая больше, чем 188 байт).
01: End. Последняя полезная нагрузка этой транзакции (которая больше, чем 188 байт).

HUBADDR (биты 13:7): HUB ADDRess. В этом поле содержится адрес устройства концентратора транслятора транзакций (transaction translator’s hub).

PRTADDR (биты 6:0): PoRT ADDRess. В этом поле указывается номер порта транслятора транзакций получателя.

Примечание: регистр OTG_HS_HCSPLTx появился только в контроллере OTG_HS, аналогичного регистра в контроллере OTG_FS нет.

Здесь x это номер канала в диапазоне от 0 до 11 включительно.

Смещение адреса: 0x508 + 0x20 * x
Значение сброса: 0x00000000

Этот регистр показывает статус канала по отношению к USB и AHB. Это показано на рис. 414. Приложение должно читать этот регистр, когда установлен бит прерывания канала хоста в регистре прерываний ядра (бит HCINT в регистре OTG_HS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_HS_HAINT), чтобы получить точный номер канала для регистра прерываний канала x хоста. Чтобы очистить соответствующие биты в регистрах OTG_HS_HAINT и OTG_HS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_HS_HCINTx.

Примечание: регистр OTG_HS_HCINTx несколько отличается от аналогичного по функциям регистра OTG_FS_HCINTx контроллера OTG_FS: добавлены биты маски NYET и AHBERR.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DTERR
rc_w1
FRMOR
rc_w1
BBERR
rc_w1
TXERR
rc_w1
NYET
rc_w1
ACK
rc_w1
NAK
rc_w1
STALL
rc_w1
AHBERR
rc_w1
CHH
rc_w1
XFRC
rc_w1

Биты 31:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DTERR (бит 10): Data Toggle ERRor, ошибка переключения данных.

FRMOR (бит 9): FRaMe OverRun, превышение кадра.

BBERR (бит 8): BaBble ERRor, ошибка помехообразного сигнала.

TXERR (бит 7): Transaction ERRor. Показывает одно из следующих ошибок, произошедших на USB:

CRC check failure (ошибка контрольной суммы)
Timeout (таймаут)
Bit stuff error (ошибка бит-стаффинга)
False EOP (неправильный конец пакета)

NYET (бит 6): прерывание получения ответа (response received interrupt).

ACK (бит 5): прерывание подтверждения ACK приема/передачи.

NAK (бит 4): прерывание принятого подтверждения NAK.

STALL (бит 3): прерывание принятого ответа STALL.

AHBERR (бит 2): AHB ERRor. Эта ошибка генерируется только в режиме Internal DMA, когда ошибка AHB произошла во время операции чтения/записи AHB. Приложение может прочитать соответствующий регистр адреса канала, чтобы получить адрес ошибки.

CHH (бит 1): CHannel Halted. Показывает, что транзакция завершилась ненормально либо из-за ошибки транзакции USB, либо в ответ на запрос запрета от приложения.

XFRC (бит 0): транзакция завершена нормально без какой-либо ошибки.

Здесь x это номер канала в диапазоне от 0 до 11 включительно.

Смещение адреса: 0x50C + 0x20 * x
Значение сброса: 0x00000000

Этот регистр показывает маску статуса каждого канала, описанного ранее.

Примечание: регистр OTG_HS_HCINTMSKx несколько отличается от аналогичного по функциям регистра OTG_FS_HCINTMSKx контроллера OTG_FS: добавлены биты маски NYET и AHBERRM.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DTERRM
rw
FRMORM
rw
BBERRM
rw
TXERRM
rw
NYET
rw
ACKM
rw
NAKM
rw
STALLM
rw
AHBERRM
rw
CHHM
rw
XFRCM
rw

Биты 31:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DTERRM (бит 10): Data Toggle ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки переключения данных маскировано (запрещено).

FRMORM (бит 9): FRaMe OverRun Mask. Если этот бит сброшен в 0, то прерывание выхода за пределы фрейма маскировано (запрещено).

BBERRM (бит 8): BaBble ERRor Mask. Если этот бит сброшен в 0, то прерывание помехообразного сигнала маскировано (запрещено).

TXERRM (бит 7): Transaction ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки транзакции маскировано (запрещено).

NYET (бит 6): маска прерывания получения ответа (response received interrupt). Если этот бит сброшен в 0, то прерывание получения ответа маскировано (запрещено).

ACKM (бит 5): ACK response received/transmitted interrupt Mask. Если этот бит сброшен в 0, то прерывание положительного подтверждения приема/передачи маскировано (запрещено).

NAKM (бит 4): NAK response received interrupt Mask. Если этот бит сброшен в 0, то прерывание получения отрицательного подтверждения маскировано (запрещено).

STALLM (бит 3): STALL response received interrupt Mask. Если этот бит сброшен в 0, то прерывание получения STALL маскировано (запрещено).

AHBERRM (бит 2): AHB ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки AHB маскировано (запрещено).

CHHM (бит 1): CHannel Halted Mask. Если этот бит сброшен в 0, то прерывание остановки канала маскировано (запрещено).

XFRCM (бит 0): Transfer Completed Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено).

Здесь x это номер канала в диапазоне от 0 до 11 включительно.

Смещение адреса: 0x510 + 0x20 * x
Значение сброса: 0x00000000

Примечание: регистр OTG_HS_HCTSIZx несколько отличается от аналогичного по функциям регистра OTG_FS_HCTSIZx контроллера OTG_FS: добавлен бит DOPING.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DOPING
rw
DPID
rw
PKTCNT
rw
XFRSIZ[18:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XFRSIZ[15:0]
rw

DOPING (бит 31): DO PING, выполнить ping. Этот бит используется только для транзакций OUT. Установка этого бита в 1 указывает хосту выполнить протокол PING.

Примечание: не устанавливайте этот бит для транзакций IN хоста. Если этот бит установлен для транзакции IN, то это запретит канал.

DPID (биты 30:29): Data PID. Приложение программирует это поле типом PID для использования в начальной транзакции. Хост обслуживает это поле для остальной части транзакции.

00: DATA0
01: DATA2
10: DATA1
11: MDATA (non-control, пакет, не относящийся к управлению)/SETUP (control, управление)

PKTCNT (биты 28:19): PacKeT CouNT. В это поле приложение программирует ожидаемое количество пакетов для передачи (OUT) или приема (IN). Хост декрементирует этот счетчик при каждой успешной передаче или успешном приеме пакета OUT/IN. Как только этот счетчик достигает 0, в приложении происходит прерывание, сигнализирующее нормальное завершение транзакции.

XFRSIZ (биты 18:0): Transfer SIZe. Для OUT в этом поле находится количество байт, которое хост отправляет во время транзакции. Для IN в этом поле находится размер буфера, который приложение резервирует для транзакции. Ожидается, что приложение запрограммирует это поле как целое число, кратное максимальному размеру пакета для транзакций IN (периодических и непериодических).

Здесь x это номер канала в диапазоне от 0 до 11 включительно.

Смещение адреса: 0x514 + 0x20 * x
Значение сброса: 0x00000000

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DMAADDR[31:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DMAADDR[15:0]
rw

DMAADDR (биты 31:0): DMA ADDRess. Это поле хранит начальный адрес во внешней памяти, из которой должны быть выбраны данные для конечной точки, или куда данные должны быть сохранены. Этот регистр инкрементируется с каждой транзакцией AHB.

Примечание: регистр OTG_HS_HCDMAx появился в контроллере OTG_HS, в контроллере OTG_FS его нет.

[Регистры режима устройства USB]

Смещение адреса: 0x800
Значение сброса: 0x0x02200000

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

Примечание: регистр OTG_HS_DCFG несколько отличается от аналогичного по функциям регистра OTG_FS_DCFG контроллера OTG_FS: добавлено битовое поле PERSCHIVL.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PERSCHIVL
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано PFIVL
rw
DAD
rw
зарез. NZLSOHSK
rw
DSPD
rw

Биты 31:26 зарезервированы и должны сохраняться в состоянии сброса.

PERSCHIVL (биты 25:24): PERiodic SCHeduling InterVaL. Это поле задает количество времени подсистемы Internal DMA, которое нужно выделить для выборок данных периодической конечной точки IN. На основании количества периодических конечных точек это значение должно быть выбрано как 25, 50 или 75% от (микро)фрейма.

– Когда активны любые периодические конечные точки, внутренняя подсистема DMA выделяет указанное количество времени при выборке данных периодической конечной точки IN.
– Когда нет активных периодических конечных точек, внутренняя подсистема DMA обслуживает не периодические конечные точки, игнорируя это поле.
– После этого заданного времени в пределах (микро)фрейма подсистема DMA переключается на выборку данных не периодических конечных точек.

00: 25% от (микро)фрейма
01: 50% от (микро)фрейма
10: 75% от (микро)фрейма
11: зарезервировано

Биты 23:13 зарезервированы и должны сохраняться в состоянии сброса.

PFIVL (биты 12:11): Periodic Frame InterVaL. Показывает время внутри фрейма, в котором приложение должно быть оповещено прерыванием окончания периодического фрейма. Это может использоваться для определения, завершен ли весь изохронный трафик для этого фрейма.

00: 80% от интервала фрейма.
01: 85% от интервала фрейма.
10: 90% от интервала фрейма.
11: 95% от интервала фрейма.

DAD (биты 10:4): Device ADdress. Приложение должно запрограммировать это поле после каждой команды управления SetAddress.

Бит 3 зарезервирован и должен сохраняться в состоянии сброса (0).

NZLSOHSK (бит 2): Non-Zero-Length Status OUT HandShaKe. Приложение может использовать это поле, чтобы выбрать подтверждение (handshake), которое ядро посылает при приеме пакета не нулевой длины во время транзакции OUT стадии управления Status.

1: отправляется STALL handshake на ненулевой транзакции status OUT и не отправляет приложению принятый пакет OUT.
0: отправляется приложению принятый пакет OUT (нулевой или ненулевой длины) и отправляется handshake на основе бит NAK и STALL для конечной точки в регистре конечной точки управления устройства.

DSPD (биты 1:0): Device SPeeD. Указывает скорость, с которой приложение требует энумерации ядра, или максимальную скорость, которую может поддерживать приложение. Однако реальная скорость шины определяется только после завершения chirp-последовательности, и основывается на скорости хоста USB, к которому ядро подключено.

00: High speed (высокая скорость).
01: Full speed (полная скорость) с использованием внешнего ULPI PHY.
10: зарезервировано.
11: Full speed (полная скорость) с использованием встроенного PHY.

Смещение адреса: 0x804
Значение сброса: 0x00000000

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано POPRGDNE
rw
CGONAK
w
SGONAK
w
CGINAK
w
SGINAK
w
TCTL
rw
GONSTS
r
GINSTS
r
SDIS
rw
RWUSIG
rw

Биты 31:12 зарезервированы и должны сохраняться в состоянии сброса (все нули).

POPRGDNE (бит 11): Power-On PRoGramming DoNE. Приложение использует этот бит, чтобы показать, что программирования этого регистра завершено после выхода из режима пониженного потребления энергии (wakeup from power down mode).

CGONAK (бит 10): Clear Global OUT NAK. Запись 1 в этот бит очищает Global OUT NAK.

SGONAK (бит 9): Set Global OUT NAK. Запись 1 в этот бит установит Global OUT NAK. Приложение использует этот бит, чтобы отправить отрицательное подтверждение NAK на всех конечных точках OUT. Приложение должно установить этот бит только после наличии гарантии, что очищен бит Global OUT NAK в регистре прерываний ядра (бит GONAKEFF в регистре OTG_HS_GINTSTS).

CGINAK (бит 8): Clear Global IN NAK. Запись 1 в этот бит очистит Global IN NAK.

SGINAK (бит 7): Set Global IN NAK. Запись 1 в этот бит установит Global non-periodic IN NAK. Приложение использует этот бит для отправки отрицательного подтверждения NAK на всех не периодических конечных точках IN. Приложение должно установить этот бит только после наличии гарантии, что очищен бит Global IN NAK в регистре прерываний ядра (бит GINAKEFF в регистре OTG_HS_GINTSTS).

TCTL (биты 6:4): Test ConTroL, управление тестированием.

000: режим тестирования (Test mode) запрещен.
001: Test_J mode.
010: Test_K mode.
011: Test_SE0_NAK mode.
100: Test_Packet mode.
101: Test_Force_Enable.
Другие значения: зарезервировано.

GONSTS (бит 3): Global OUT NAK STatuS.

0: подтверждение (handshake) отправляется на основе статуса FIFO и настроек бит NAK и STALL.
1: не были записаны данные в RxFIFO, независимо от наличия свободного места. На все пакеты отправляется отрицательное подтверждение NAK, кроме транзакций SETUP. Все изохронные пакеты OUT отбрасываются.

GINSTS (бит 2): Global IN NAK STatuS.

0: подтверждение (handshake) отправляется на основе доступности данных в FIFO передачи.
1: отрицательное подтверждение NAK отправляется на всех не периодических конечных точек IN, независимо от доступности данных в FIFO передачи.

SDIS (бит 1): Soft DISconnect. Приложение использует этот бит для сигнала ядру USB OTG выполнить программное отключение (soft disconnect). Пока этот бит установлен, хост не видит, что устройство подключено, и устройство не получает сигналы по USB. Ядро остается в отключенном состоянии, пока приложение не очистит этот бит.

0: нормальное функционирование. Когда этот бит очищен после soft disconnect, ядро генерирует событие подключения устройства к хосту USB. Когда устройство подключается повторно, хост USB перезапускает энумерацию устройства.
1: ядро генерирует событие отключения устройства для хоста USB.

RWUSIG (бит 0): Remote WakeUp SIGnaling. Когда приложение установит этот бит, ядро инициирует сигнализацию удаленного пробуждения, чтобы вывести хост USB (wake up) из состояния пониженного энергопотребления. Приложение должно установить этот бит, чтобы инструктировать ядро выйти из состояния приостановки (Suspend state). Как указано в спецификации USB 2.0, приложение должно очистить этот бит в интервале времени от 1 до 15 мс после его установки.

В таблице 214 содержится минимальная длительность (по состояниям устройства), для которой должен быть установлен бит программного отключения (soft disconnect, SDIS), чтобы хост определил отключение устройства. Чтобы учесть джиттер тактов, приложению рекомендуется добавить некоторую дополнительную задержку к указанной минимальной длительности.

Таблица 214. Минимальная длительность soft disconnect.

Рабочая скорость Состояние устройства Минимальная длительность
High speed (HS) Ни Idle, ни Suspended (выполнение транзакций) 125 мкс
Full speed (FS) Suspended (приостановлено) 1 мс + 2.5 мкс
Full speed (FS) Idle (ожидание) 2.5 мкс
Full speed (FS) Ни Idle, ни Suspended (выполнение транзакций) 2.5 мкс

Смещение адреса: 0x808
Значение сброса: 0x00000010

Этот регистр показывает состояние ядра по отношению к событиям USB. Он должен быть прочитан при прерываниях регистра (OTG_HS_DAINT).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано FNSOF[13:8]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
FNSOF[7:0]
r
зарезервировано EERR
r
ENUMSPD
r
SUSPSTS
r

Биты 31:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

FNSOF (биты 21:8): Frame Number of the received SOF. Номер фрейма принятого сигнала начала фрейма.

Биты 7:4 зарезервированы и должны сохраняться в состоянии сброса.

EERR (бит 3): Erratic ERRor. Ядро установит этот бит, чтобы сообщить о любом ошибочном поведении. Из-за этих ошибок контроллер OTG_HS переходит в состояние приостановки (Suspended state), и генерируется прерывание с битом ранней приостановки (Early suspend, бит ESUSP) в регистре OTG_HS_GINTSTS. Если early suspend был выставлен из-за erratic error, то приложение может только выполнить восстановление программного отключения (soft disconnect recover).

ENUMSPD (биты 2:1): ENUMerated SPeeD. Показывает скорость, на которой контроллер OTG_HS был запущен в работу после chirp-последовательности определения скорости.

00: High speed (высокая скорость HS).
01: зарезервировано.
10: зарезервировано.
11: Full speed (полная скорость FS, такты PHY работают на частоте 48 МГц).
Другие значения: зарезервировано.

SUSPSTS (бит 0): SUSPend STatuS. В режиме устройства этот бит установлен, пока на USB определено событие приостановки (Suspend condition). Ядро входит в Suspended state, когда на линиях данных USB нет активности в течение 3 мс. Ядро выходит из suspend:

– Когда появляется активность на линиях сигнала данных USB.
– Когда приложение записывает бит удаленного пробуждения (Remote wakeup, бит RWUSIG в регистре OTG_HS_DCTL).

Смещение адреса: 0x810
Значение сброса: 0x00000000

Этот регистр работает с каждым из регистров OTG_HS_DIEPINTx для всех конечных точек, чтобы генерировать прерывание конечной точки IN. Прерывание конечной точки IN для определенного состояния в регистре OTG_HS_DIEPINTx может быть замаскировано (запрещено) записью соответствующего бита в регистре OTG_HS_DIEPMSK. Биты статуса по умолчанию замаскированы.

Примечание: регистр OTG_HS_DIEPMSK незначительно отличается от аналогичного по функциям регистра OTG_FS_DIEPMSK контроллера OTG_FS: добавлен бит TXFURM.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезерв. NAKM
rw
зарезервировано TXFURM
rw
зарез. INEPNEM
rw
INEPNMM
rw
ITTXFEMSK
rw
TOM
rw
зарез. EPDM
rw
XFRCM
rw

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAKM (бит 13): NAK interrupt Mask. Если этот бит сброшен в 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено).

Биты 12:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TXFURM (бит 8): TXFIFO UnderRun Mask. Если этот бит сброшен в 0, то прерывание недогрузки стека передачи маскировано (запрещено).

Бит 7 зарезервирован и должен сохраняться в состоянии сброса (0).

INEPNEM (бит 6): IN EndPoint NAK Effective Mask. Если этот бит сброшен в 0, то соответствующее прерывание маскировано (запрещено).

INEPNMM (бит 5): IN token received with EP Mismatch Mask. Если этот бит сброшен в 0, то соответствующее прерывание маскировано (запрещено).

ITTXFEMSK (бит 4): IN Token received when TxFIFO Empty MaSK. Если этот бит сброшен в 0, то прерывание при получении токена IN, когда передающий буфер пуст, маскировано (запрещено).

TOM (бит 3): TimeOut condition Mask (не изохронные конечные точки). Если этот бит сброшен в 0, то прерывание таймаута маскировано (запрещено).

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDM (бит 1): EndPoint Disabled interrupt Mask. Если этот бит сброшен в 0, то прерывание запрещения конечной точки маскировано (запрещено).

XFRCM (бит 0): TransfeR Completed interrupt Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено).

Смещение адреса: 0x814
Значение сброса: 0x00000000

Этот регистр работает с каждым из регистров OTG_HS_DOEPINTx для всех конечных точек, чтобы генерировать прерывания конечных точек OUT. Прерывание конечной точки OUT для определенного статуса в регистре OTG_HS_DOEPINTx можно маскировать записью соответствующего бита в регистре OTG_HS_DOEPMSK. Биты статуса по умолчанию замаскированы (запрещены).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. NYETMSK
rw
NAKM
rw
BERRM
rw
зарезервировано OUTPKTERRM
rw
зарез. B2BSTUP
rw
STSPHSRXM
rw
OTEPDM
rw
STUPM
rw
зарез. EPDM
rw
XFRCM
rw

Биты 31:15 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NYETMSK (бит 14): NYET interrupt MaSK.

NAKM (бит 13): NAK interrupt Mask. Если этот бит сброшен в 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено).

BERRM (бит 12): Babble ERRor interrupt Mask. Если этот бит сброшен в 0, то прерывание помехообразного сигнала маскировано (запрещено).

Биты 11:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

OUTPKTERRM (бит 8): OUT PacKeT ERRor Mask. Если этот бит сброшен в 0, то прерывание ошибки пакета OUT маскировано (запрещено).

Бит 7 зарезервирован и должен сохраняться в состоянии сброса (0).

B2BSTUP (бит 6): Back-to-back SETUP packets received mask. Применимо только к конечным точкам control OUT. Если этот бит сброшен в 0, то прерывание принятых back-to-back пакетов SETUP маскировано (запрещено).

STSPHSRXM (бит 5): StaTuS PHaSe Received for control write Mask. Если этот бит сброшен в 0, то прерывание фазы статуса для управляющей записи маскировано (запрещено).

OTEPDM (бит 4): OUT Token received when EndPoint Disabled Mask. Если этот бит сброшен в 0, то маскировано (запрещено) прерывание, когда получен токен OUT при запрещенной конечной точке.

STUPM (бит 3): SETUP Phase done Mask. то прерывание завершения фазы настройки маскировано (запрещено).

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDM (бит 1): EndPoint Disabled interrupt Mask. Если этот бит сброшен в 0, то прерывание запрещения конечной точки маскировано (запрещено).

XFRCM (бит 0): TransfeR Completed interrupt Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено).

Смещение адреса: 0x818
Значение сброса: 0x00000000

Когда на конечной точке происходит значимое событие, регистр OTG_HS_DAINT генерирует прерывание, используя бит прерываний конечных точек OUT устройства или конечных точек IN устройства (биты OEPINT или IEPINT в регистре OTG_HS_GINTSTS соответственно). Здесь имеется один бит прерывания на конечную точку, всего до 16 бит для конечных точек OUT и до 16 бит для конечных точек IN. Для двунаправленной конечной точки, используются соответствующие бит прерываний IN и OUT. Биты в регистре OTG_HS_DAINT устанавливаются и очищаются, когда приложение устанавливает и очищает биты в регистре соответствующей конечной точки x устройства (OTG_HS_DIEPINTx/OTG_HS_DOEPINTx).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
OEPINT
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
IEPINT
r

OEPINT (биты 31:16): OUT EndPoint INTerrupt bits, биты прерываний конечных точек OUT, по одному биту на конечную точку: бит 16 соответствует конечной точке OUT номер 0, бит 31 конечной точке OUT номер 15.

IEPINT (биты 15:0): IN EndPoint INTerrupt bits, биты прерываний конечных точек IN, по одному биту на конечную точку: бит 0 соответствует конечной точке IN номер 0, бит 15 конечной точке IN номер 15.

Смещение адреса: 0x81C
Значение сброса: 0x00000000

Регистр OTG_HS_DAINTMSK работает вместе с регистром прерываний конечных точек, когда происходит прерывание на конечной точке устройства. Биты OTG_HS_DAINTMSK позволяют маскировать (запретить) прерывание соответствующей конечной точки, однако биты регистра OTG_HS_DAINT при этом все равно будут устанавливаться, даже если прерывание запрещено.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
OEPM
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
IEPM
rw

OEPM (биты 31:16): OUT EP interrupt Mask bits, биты маски прерываний конечной точки OUT, по одному биту на конечную точку: бит 16 соответствует конечной точке OUT номер 0, бит 18 конечной точке OUT номер 3.

IEPM (биты 15:0): IN EP interrupt Mask bits, биты маски прерываний конечной точки IN, по одному биту на конечную точку: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3.

Смещение адреса: 0x828
Значение сброса: 0x000017D7

Этот регистр задает время разряда VBUS после импульса VBUS во время SRP.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
VBUSDT
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

VBUSDT (биты 15:0): Device VBUS Discharge Time. Задает время разряда VBUS следующим образом: время разряда VBUS в тактах PHY / 1024. Это значение может меняться в зависимости от нагрузки на шину VBUS (чем больше нагрузка по току и меньше емкость конденсатора фильтра VBUS, тем меньше постоянная времени разряда VBUS).

Смещение адреса: 0x82C
Значение сброса: 0x000005B8

Этот регистр задает время импульса VBUS во время SRP.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано DVBUSP
rw

Биты 31:12 зарезервированы и должны сохраняться в состоянии сброса (все нули).

DVBUSP (биты 11:0): Device VBUS Pulsing time. Задает время импульса VBUS следующим образом: время импульса VBUS в тактах PHY/1024.

Смещение адреса: 0x830
Значение сброса: 0x00000000

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано ARPEN
rw
зарез. RXTHRLEN
rw
RXTHREN
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано TXTHRLEN
rw
ISOTHREN
rw
NONISOTHREN
rw

Биты 31:28 зарезервированы и должны сохраняться в состоянии сброса (все нули).

ARPEN (бит 27): ARbiter Parking ENable. Этот бит управляет паркингом внутреннего арбитра DMA для конечных точек IN. Когда разрешен порог и этот бит установлен в 1, после этого арбитр паркуется на конечной точке IN для которой принят токен через USB. Это делается для того, чтобы не попасть в событие недогрузки (underrun). По умолчанию паркинг разрешен.

Бит 26 зарезервирован и должен сохраняться в состоянии сброса (0).

RXTHRLEN (биты 25:17): Receive HReshold LENgth. Это слово задает размер порога приема в словах. Это поле также задает количество данных, принятых через USB, перед тем, как ядро может начать передавать их через AHB. Длина порога должна быть как минимум 8 слов. Рекомендуемое значение для RXTHRLEN такое же, как и запрограммированное значение длины пакета для AHB (burst length, HBSTLEN в регистре OTG_HS_GAHBCFG).

RXTHREN (биты 16): Receive THReshold ENable. Когда этот бит установлен, ядру разрешено использовать порог в направлении приема.

Биты 15:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TXTHRLEN (биты 10:2): Transmit THReshold LENgth. Это поле задает размер порога передачи в словах. Оно задает количество данных в байтах в соответствующем TxFIFO конечной точки, перед тем как ядро может начать передавать через USB. Длина порога должна быть как минимум 8 слов. Это поле управляет порогами как изохронных, так и не изохронных конечных точек IN. Рекомендуемое значение для TXTHRLEN такое же, как и запрограммированное значение длины пакета для AHB (burst length, HBSTLEN в регистре OTG_HS_GAHBCFG).

ISOTHREN (бит 1): ISO IN endpoint THReshold ENable. Когда этот бит установлен, ядру разрешено использовать порог для изохронных конечных точек IN.

NONISOTHREN (бит 0): NONISOchronous IN endpoints THReshold ENable. Когда этот бит установлен, ядру разрешено использовать порог для не изохронных конечных точек IN.

Примечание: регистр OTG_HS_DTHRCTL появился только у контроллера OTG_HS, в контроллере OTG_FS такого регистра нет.

Смещение адреса: 0x834
Значение сброса: 0x00000000

Этот регистр используется для управления генерацией прерывания опустошения FIFO конечной точки IN (TXFE_OTG_HS_DIEPINTx).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
INEPTXFEM
rw

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули).

INEPTXFEM (биты 15:0): IN EP TxFIFO Empty interrupt Mask. Эти биты работают как маска дляOTG_HS_DIEPINTx. Если они установлены в 0, то маскируют (запрещают) прерывание опустошения стека передачи конечной точки IN: бит 0 соответствует конечной точке IN номер 0, бит 15 конечной точке IN номер 15.

Смещение адреса: 0x838
Значение сброса: 0x00000000

There is one interrupt bit for endpoint 1 IN and one interrupt bit for endpoint 1 OUT.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано OEP1INT
r
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано IEP1INT
r
зарез.

Биты 31:18 зарезервированы и должны сохраняться в состоянии сброса (все нули).

OEP1INT (бит 17): OUT EndPoint 1 INTerrupt bit.

Биты 16:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

IEP1INT (бит 1): IN EndPoint 1 INTerrupt bit.

Бит 0 зарезервирован и должен сохраняться в состоянии сброса (0).

Примечание: регистр OTG_HS_DEACHINT появился только у контроллера OTG_HS, в контроллере OTG_FS такого регистра нет.

Смещение адреса: 0x83C
Значение сброса: 0x00000000

There is one interrupt bit for endpoint 1 IN and one interrupt bit for endpoint 1 OUT.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано OEP1INTM
r
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано
IEP1INTM
r
зарез.

Биты 31:18 зарезервированы и должны сохраняться в состоянии сброса (все нули).

OEP1INTM (бит 17): OUT EndPoint 1 INTerrupt Mask bit. Если этот бит равен 0, то прерывание конечной точки OUT1 маскировано (запрещено).

Биты 16:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

IEP1INTM (бит 1): IN EndPoint 1 INTerrupt Mask bit. Если этот бит равен 0, то прерывание конечной точки IN1 маскировано (запрещено).

Бит 0 зарезервирован и должен сохраняться в состоянии сброса (0).

Примечание: регистр OTG_HS_DEACHINTMSK появился только у контроллера OTG_HS, в контроллере OTG_FS такого регистра нет.

Смещение адреса: 0x844
Значение сброса: 0x00000000

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезерв. NAKM
rw
зарезервировано BIM
rw
TXFURM
rw
зарез. INEPNEM
rw
INEPNMM
rw
ITTXFEMSK
rw
TOM
rw
AHBERRM
rw
EPDM
rw
XFRCM
rw

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAKM (бит 13): NAK interrupt Mask. Если этот бит равен 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено).

Биты 12:10 зарезервированы и должны сохраняться в состоянии сброса (все нули).

BIM (бит 9): BNA Interrupt Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

TXFURM (бит 8): TxFIFO UnderRun Mask. Если этот бит равен 0, то прерывание недогрузки стека передачи маскировано (запрещено).

Бит 7 зарезервирован и должен сохраняться в состоянии сброса (0).

INEPNEM (бит 6): IN endpoint NAK Effective Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

INEPNMM (бит 5): IN token received with EP Mismatch Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

ITTXFEMSK (бит 4): IN Token received when TxFIFO EMpty MaSK. Если этот бит равен 0, то прерывание получения токена IN при пустом стеке передачи маскировано (запрещено).

TOM (бит 3): TimeOut condition Mask (nonisochronous endpoints). Если этот бит равен 0, то прерывание таймаута маскировано (запрещено).

AHBERRM бит 2): AHB ERRor Mask. Если этот бит равен 0, то прерывание ошибки AHB маскировано (запрещено).

EPDM (бит 1): EndPoint Disabled interrupt Mask. Если этот бит равен 0, то прерывание запрещения конечной точки маскировано (запрещено).

XFRCM (бит 0): Transfer completed interrupt mask. Если этот бит равен 0, то прерывание завершения транзакции маскировано (запрещено).

Примечание: регистр OTG_HS_DIEPEACHMSK1 появился только у контроллера OTG_HS, в контроллере OTG_FS такого регистра нет.

Смещение адреса: 0x884
Значение сброса: 0x00000000

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. NYETM
rw
NAKM
rw
BERRM
rw
зарезерв. BIM
rw
TXFURM
rw
зарез. INEPNEM
rw
INEPNMM
rw
ITTXFEMSK
rw
TOM
rw
AHBERRM
rw
EPDM
rw
XFRCM
rw

Биты 31:15 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NYETM (бит 14): NYET interrupt Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

NAKM (бит 13): NAK interrupt Mask. Если этот бит равен 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено).

BERRM (бит 12): Bubble ERRor interrupt Mask. Если этот бит равен 0, то прерывание ошибочного сигнала маскировано (запрещено).

Биты 11:10 зарезервированы и должны сохраняться в состоянии сброса (все нули).

BIM (бит 9): BNA Interrupt Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

TXFURM (бит 8): TxFIFO UnderRun Mask. Если этот бит равен 0, то прерывание недогрузки стека передачи маскировано (запрещено).

Бит 7 зарезервирован и должен сохраняться в состоянии сброса (0).

INEPNEM (бит 6): IN endpoint NAK Effective Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

INEPNMM (бит 5): IN token received with EP Mismatch Mask. Если этот бит равен 0, то соответствующее прерывание маскировано (запрещено).

ITTXFEMSK (бит 4): IN Token received when TxFIFO EMpty MaSK. Если этот бит равен 0, то прерывание получения токена IN при пустом стеке передачи маскировано (запрещено).

TOM (бит 3): TimeOut condition Mask (nonisochronous endpoints). Если этот бит равен 0, то прерывание таймаута маскировано (запрещено).

AHBERRM бит 2): AHB ERRor Mask. Если этот бит равен 0, то прерывание ошибки AHB маскировано (запрещено).

EPDM (бит 1): EndPoint Disabled interrupt Mask. Если этот бит равен 0, то прерывание запрещения конечной точки маскировано (запрещено).

XFRCM (бит 0): Transfer completed interrupt mask. Если этот бит равен 0, то прерывание завершения транзакции маскировано (запрещено).

Примечание: регистр OTG_HS_DOEPEACHMSK1 появился только у контроллера OTG_HS, в контроллере OTG_FS такого регистра нет.

Здесь x это номер конечной точки в диапазоне 1 .. 5.

Смещение адреса: 0x900 + 0x20 * x
Значение сброса: 0x00000000

Приложение использует этот регистр для управления поведением любой конечной точки, отличающейся от конечной точки управления 0 (endpoint 0, так называемая конечная точка по умолчанию).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
rs
EPDIS
rs
SODDFRM
w
SD0PID/
SEVNFRM

w
SNAK
w
CNAK
w
TXFNUM
rw
STALL
rw/rs
зарез. EPTYP
rw
NAKSTS
r
EONUM
/DPID

r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
rw
зарезервировано MPSIZ
rw

EPENA (бит 31): EndPoint ENAble. Приложение использует этот бит, чтобы запустить передачу на конечной точке 0. Ядро очищает этот бит перед установкой любого из следующих прерываний этой конечной точки:

– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения.

SODDFRM (бит 29): Set ODD FRaMe. Применяется только для изохронных конечных точек IN и OUT. Запись в это поле установит поле четного/нечетного фрейма (Even/Odd frame, поле EONUM) в значение для нечетного фрейма.

SD0PID (бит 28): Set DATA0 PID. Применяется только для конечных точек interrupt/bulk IN. Запись в это поле установит поле data PID (DPID) конечной точки в этом регистре на DATA0.

SEVNFRM (бит 28): Set EVen FRaMe. Применяется только для конечных точек interrupt/bulk IN. Запись в это поле установит поле data PID (DPID) конечной точки в этом регистре на DATA0.

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. Используя этот бит, приложение может управлять передачей отрицательного подтверждения NAK конечной точки. Ядро может также установить этот бит для конечной точки после того, как для этой конечной точки принят пакет SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для конечной точки.

TXFNUM (биты 25:22): TxFIFO NUMber. Значение в этом поле устанавливает номер FIFO, назначенного для конечной точки IN номер 0.

STALL (бит 21): STALL handshake. Приложение может только установить этот бит, и ядро очистит его, когда для этой конечной точки принят токен SETUP. Если вместе с битом STALL установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет.

Бит 20 зарезервирован и должен сохраняться в состоянии сброса (0).

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. В этом поле жестко закодировано значение 00.

NAKSTS (бит 17): NAK STatuS. Показывает следующее:

0: ядро передает не-NAK подтверждения на основе статуса FIFO.
1: ядро передает отрицательные подтверждения NAK на этой конечной точке.

Когда этот бит установлен либо приложением, либо ядром, ядро останавливает передачу данных, даже если в TxFIFO есть данные для передачи. Независимо от значения этого бита ядро всегда отвечает на данные пакетов SETUP положительным подтверждением ACK.

EONUM (бит 16): Even/Odd frame NUMber. Применяется только для изохронных конечных точек IN. Показывает номер фрейма, в котором ядро передает/принимает изохронные данные для этой конечной точки. Приложение должно запрограммировать четный/нечетный номер фрейма, на котором нужно передавать/принимать изохронные данные для этой конечной точки с использованием полей данных SEVNFRM и SODDFRM в этом регистре.

0: четный фрейм.
1: нечетный фрейм.

DPID (бит 16): Endpoint Data PID. Применяется только для конечных точек interrupt/bulk IN. Содержит PID пакета для приема или передачи на этой конечной точке. Приложение должно запрограммировать PID первого пакета для приема или передачи на этой конечной точке после того, как конечная точка активирована. Приложение использует поле SD0PID регистра для программирования PID на либо DATA0, либо DATA1.

0: DATA0
1: DATA1

USBAEP (бит 15): USB Active EndPoint. Этот бит всегда установлен в 1, показывая тем самым, что конечная точка 0 активна всегда во всех конфигурациях и на всех интерфейсах.

Биты 14:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 10:0): Maximum Packet SIZe. Приложение должно запрограммировать это поле максимальным размером пакета для текущей логической конечной точки. Значение указывается в байтах.

Смещение адреса: 0xB00
Значение сброса: 0x00008000

Это регистр для настройки поведения конечной точки управления (она же конечная точка по умолчанию, или конечная точка номер 0, EP0). Для настройки ненулевых конечных точек 1 .. 15 используются другие регистры.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
w
EPDIS
r
зарезерв. SNAK
w
CNAK
w
зарезервировано STALL
rs
SNPM
rw
EPTYP
r
NAKSTS
r
зарез.
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
r
зарезервировано MPSIZ
r

EPENA (бит 31): EndPoint ENAble. Приложение устанавливает этот бит, чтобы запустить передачу на конечной точке 0. Ядро очистит этот бит перед установкой любого из следующих прерываний этой конечной точки:

– завершена фаза SETUP
– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение не может запретить управляющую конечную точку OUT 0.

Биты 29:28 зарезервированы и должны сохраняться в состоянии сброса (все нули).

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. Используя этот бит, приложение может управлять передачей отрицательных подтверждений NAK конечной точки. Ядро может также установить этот бит для прерывания завершения транзакции конечной точки, или после того, как на конечной точке принят пакет SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для конечной точки.

Биты 25:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

STALL (бит 21): STALL handshake. Приложение может только установить этот бит, и ядро очистит его, когда для этой конечной точки принят токен SETUP. Если вместе с этим битом установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет. Независимо от настройки этого бита ядро всегда отвечает положительным подтверждением ACK на пакет данных SETUP.

SNPM (бит 20): SNooP Mode. Этот бит конфигурирует конечную точку в режим слежения (Snoop mode). В этом режиме ядро не проверяет корректность пакетов OUT перед тем, как передать их в память приложения.

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. Жестко закодировано 00, потому что это конечная точка управления.

NAKSTS (бит 17): NAK STatuS. Показывает следующее:

0: ядро передает не-NAK подтверждение, основываясь на статусе FIFO.
1: ядро передает отрицательные подтверждения NAK для этой конечной точки.

Когда либо приложение, либо ядро установит этот бит, ядро прекратит принимать данные, даже если есть свободное место в RxFIFO, чтобы сохранить пришедший пакет. Независимо от настройки этого бита, ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP.

Бит 16 зарезервирован и должен сохраняться в состоянии сброса (0).

USBAEP (бит 15): USB Active EndPoint. Этот бит всегда установлен в 1, показывая тем самым, что конечная точка 0 всегда активна для всех конфигураций и интерфейсов.

Биты 14:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 1:0): Maximum Packet SIZe. Максимальный размер пакета для control OUT endpoint 0, который программируется точно так же, как и для control IN endpoint 0.

00: 64 байта
01: 32 байта
10: 16 байт
11: 8 байт

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса: 0xB00 + 0x20 * x
Значение сброса: 0x00000000

Приложение использует этот регистр для управления поведением любой конечной точки, отличающейся от конечной точки управления 0 (endpoint 0, так называемая конечная точка по умолчанию).

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
EPENA
rs
EPDIS
rs
SODDFRM/
SD1PID

w
SD0PID/
SEVNFRM

w
SNAK
w
CNAK
w
зарезервировано STALL
rw
SNPM
rw
EPTYP
rw
NAKSTS
r
EONUM/
DPID

r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
USBAEP
rw
зарезервировано MPSIZ
rw

EPENA (бит 31): EndPoint ENAble. Применимо к конечным точкам IN и OUT. Приложение устанавливает этот бит, чтобы запустить передачу на этой конечной точке. Ядро очистит этот бит перед установкой любого из следующих прерываний этой конечной точки:

– завершена фаза SETUP
– конечная точка запрещена
– транзакция завершена

EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения.

SD1PID (бит 29): Set DATA1 PID. Применимо только к конечным точкам interrupt/bulk IN и OUT. Запись в это поле регистра установит поле данных PID конечной точки (DPID) этого регистра в DATA1.

SODDFRM (бит 29): Set ODD FRaMe. Применимо только к изохронным конечным точкам IN и OUT. Запись в это поле установит поле четности/нечетности (Even/Odd) фрейма (EONUM) в нечентый (odd) фрейм.

SD0PID (бит 28): Set DATA0 PID. Применимо только для конечных точек interrupt/bulk OUT. Запись в это поле установит поле PID (DPID) данных конечной точки в этом регистре на DATA0.

SEVNFRM (бит 28): Set EVeN FRaMe. Применимо только к конечным точкам isochronous OUT. Запись в это поле установит поле фрейма Even/Odd (EONUM) в четный (even) фрейм.

SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. С использованием этого бита приложение может управлять передачей отрицательными подтверждениями NAK на конечной точке. Ядро также может установить этот бит для конечных точек OUT на прерывание завершения транзакции, или после приема на этой конечной точке пакета SETUP.

CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для этой конечной точки.

Биты 25:22 зарезервированы и должны сохраняться в состоянии сброса (все нули).

STALL (бит 21): STALL handshake. Применимо только для не управляющих, не изохронных конечных точек OUT (тип доступа rw, чтение и запись). Приложение устанавливает этот бит для приостановки всех токенов от хоста USB к этой конечной точке. Если вместе с этим битом установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет. Очистить этот бит может только приложение, но не ядро.

SNPM (бит 20): SNooP Mode. Этот бит конфигурирует конечную точку в режиме слежения (Snoop mode). В этом режиме ядро не проверяет корректность пакетов OUT перед передачей их в память приложения.

EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. Здесь указывается тип транзакции, поддерживаемый этой логической конечной точкой.

00: Control
01: Isochronous
10: Bulk
11: Interrupt

NAKSTS (бит 17): NAK STatuS. Означает следующее:

0: ядро передает не-NAK подтверждения, базируясь на статусе FIFO.
1: ядро передает отрицательные подтверждения NAK для этой конечной точки.

Когда либо приложение, либо ядро установит этот бит: ядро прекращает принимать любые данные на конечной точке OUT, даже если в RxFIFO есть свободное место для сохранения поступившего пакета.

Независимо от состояния этого бита ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP.

EONUM (бит 16): Even/Odd frame NUMber. Применимо только к конечным точкам isochronous IN и OUT. Показывает номер пакета, в котором ядро передает/принимает изохронные данные для этой конечной точки. Приложение должно запрограммировать это поле четным/нечетным (even/odd) номером фрейма, в котором намереваются передать/принять изохронные данные для этой конечной точки, используя поля SEVNFRM и SODDFRM в этом регистре.

0: четный (even) фрейм
1: нечетный (odd) фрейм

DPID (бит 16): Endpoint Data PID. Применимо только для конечных точек interrupt/bulk OUT. Содержит PID пакета для приема или передачи на этой конечной точке. Приложение должно запрограммировать PID первого пакета для передачи или приема на этой конечной точке после того, как конечная точка активирована. Приложение использует поле SD0PID регистра для программирования либо DATA0, либо DATA1 PID.

0: DATA0
1: DATA1

USBAEP (бит 15): USB Active EndPoint. Показывает, активна ли эта конечная точка в текущей конфигурации и на текущем интерфейсе. Ядро очищает этот бит для всех конечных точек (отличающихся от EP0) после детектирования USB reset. После получения команд SetConfiguration и SetInterface, приложение должно правильно запрограммировать регистры конечных точек и установить этот бит.

Биты 14:11 зарезервированы и должны сохраняться в состоянии сброса (все нули).

MPSIZ (биты 10:0): Maximum Packet SIZe. Приложение должно установить в это поле максимальный размер пакета для текущей логической конечной точки. Значение указывается в байтах.

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса: 0x908 + 0x20 * x
Значение сброса: 0x00000080

Этот регистр показывает статус конечной точки по отношению к событиям USB и AHB. Это показано на рис. 414. Приложение должно читать этот регистр, когда установлен бит прерываний конечной точки IN в регистре прерываний ядра (бит IEPINT в регистре OTG_HS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_HS_DAINT), чтобы получить точный номер конечной точки для регистра прерываний конечной точки x устройства. Чтобы очистить соответствующие биты в регистрах OTG_HS_DAINT и OTG_HS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_HS_DIEPINTx.

Примечание: регистр OTG_HS_DIEPINTx отличается от аналогичного по функциям регистра OTG_FS_DIEPINTx контроллера OTG_FS: добавился бит TXFIFOUDRN.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано NAK
rc_w1
зарез. PKTDRPSTS
rc_w1
зарезерв.
TXFIFOUDRN
rc_w1
TXFE
r
INEPNE
rc_w1
INEPNM
rc_w1
ITTXFE
rc_w1
TOC
rc_w1
зарез. EPDISD
rc_w1
XFRC
rc_w1

Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NAK (бит 13): NAK input. Ядро генерирует это прерывание, когда устройством передается или принимается NAK. В случае изохронных конечных точек IN прерывание генерируется, когда передается пакет нулевой длины (zero length packet) из-за отсутствия данных в TxFIFO.

Бит 12 зарезервирован и должен сохраняться в состоянии сброса (0).

PKTDRPSTS (бит 11): PacKeT DRoPped STatuS. Этот бит показывает приложению, что был отброшен пакет ISOC OUT. У этого бита нет связанного бита маски, и он не генерирует прерывание.

Биты 10:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

TXFIFOUDRN (бит 8): Transmit Fifo Underrun (Txf ifoUndrn). Ядро генерирует это прерывание, когда детектирует недогрузку (underrun) TxFIFO для этой конечной точки. Зависимость: это прерывание допустимо только когда разрешена функция порога.

TXFE (бит 7): Transmit FIFO Empty. Это прерывание выставляется, когда TxFIFO для этой конечной точки пуст либо наполовину, либо полностью. Наполовину ил полностью - определяется битом уровня опустошенности стека передачи TxFIFO Empty Level (бит TXFELVL) в регистре OTG_HS_GAHBCFG.

INEPNE (бит 6): IN EndPoint NAK Effective. Этот бит может быть очищен, когда приложение очищает IN endpoint NAK записью бита CNAK в регистре OTG_HS_DIEPCTLx.

Это прерывание показывает, что ядро получило настройку бита NAK (установленную либо приложением, либо самим ядром). Прерывание показывает, что настройка IN endpoint NAK, установленная приложением, вступила для ядра в силу.

Это прерывание не гарантирует, что отрицательное подтверждение NAK отправлено через USB. Бит STALL имеет приоритет над битом NAK.

INEPNM (бит 5): IN token received with EP Mismatch. Показывает, что данные на вершине непериодического TxFIFO принадлежат конечной точке, отличающейся от той, для которой был получен токен IN. Это прерывание выставляется на той конечной точке, на которой был получен токен IN.

ITTXFE (бит 4): IN Token received when TxFIFO is Empty. Применимо только для не периодических конечных точек IN. Показывает, что токен IN был принят, когда связанный TxFIFO (периодический / не периодический) был пуст. Это прерывание выставляется на той конечной точке, для которой был принят токен IN.

TOC (бит 3): TimeOut Condition. Применимо только к конечным точкам Control IN. Показывает, что ядро определило событие таймаута на USB для последнего токена IN на этой конечной точке.

Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0).

EPDISD (бит 1): EndPoint DISableD interrupt. Этот бит показывает, что конечная точка запрещена по запросу приложения.

XFRC (бит 0): Transfer Completed interrupt. Показывает, что запрограммированная для этой конечной точки транзакция завершена как на AHB, так и на USB.

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса: 0xB08 + 0x20 * x
Значение сброса: 0x00000080

Этот регистр показывает статус конечной точки по отношению к событиям USB и AHB. Это показано на рис. 414. Приложение должно читать этот регистр, когда установлен бит прерываний конечной точки OUT в регистре прерываний ядра (бит OEPINT в регистре OTG_HS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_HS_DAINT), чтобы получить точный номер конечной точки для регистра прерываний конечной точки x устройства OTG_HS_DOEPINTx. Чтобы очистить соответствующие биты в регистрах OTG_HS_DAINT и OTG_HS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_HS_DOEPINTx.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. NYET
rc_w1
NAK
rc_w1
BERR
rc_w1
зарезервировано OUTPKTERR
rc_w1
зарез. B2BSTUP
rc_w1
зарез. OTEPDIS
rc_w1
STUP
rc_w1
AHBERR
rc_w1
EPDISD
rc_w1
XFRC
rc_w1

Биты 31:15 зарезервированы и должны сохраняться в состоянии сброса (все нули).

NYET (бит 14): NYET interrupt. Ядро генерирует это прерывание, когда передается ответ NYET для не изохронной конечной точки OUT.

NAK (бит 13): NAK input. Ядро генерирует это прерывание, когда устройством передается или принимается NAK. В случае изохронных конечных точек IN прерывание генерируется, когда передается пакет нулевой длины (zero length packet) из-за отсутствия данных в TxFIFO.

BERR (бит 12): Babble ERRor interrupt. Ядро генерирует это прерывание, тогда для этой конечной точки получен помехообразный сигнал (babble).

Биты 11:9 зарезервированы и должны сохраняться в состоянии сброса (все нули).

OUTPKTERR (бит 8): OUT PacKeR ERRor. Это прерывание выставляется, когда ядро детектирует переполнение или ошибку CRC для пакета OUT. Это прерывание допустимо только когда разрешена пороговая обработка (thresholding).

Бит 7 зарезервирован и должен сохраняться в состоянии сброса (1).

B2BSTUP (бит 6): приняты пакеты Back-to-back SETUP. Применимо только к конечной точке Control OUT. Этот бит показывает, что ядро приняло больше чем 3 пакета back-to-back SETUP для этой отдельной конечной точки.

Бит 5 зарезервирован и должен сохраняться в состоянии сброса (0).

STSPHSRX (бит 5): STatuS PHaSe Received for control write. Это прерывание генерируется только после того, как ядро передало все данные в буфер системной памяти, когда хост передал всю полезную нагрузку на фазе данных транзакции control write. Прерывание показывает приложению, что хост переключился с фазы данных на фазу статуса транзакции control write. Приложение может использовать это прерывание, чтобы положительно подтвердить через ACK или подтвердить остановкой STALL фазу статуса, после того как оно декодировало фазу данных.

OTEPDIS (бит 4): OUT Token received when EndPoint DISabled. Применимо только к конечным точкам control OUT. Показывает, что был принят токен OUT, когда конечная точка еще не была разрешена. Это прерывание выставляется на той конечной точке, для которой был принят токен OUT.

STUP (бит 3): SETUP phase done. Применимо только к конечным точкам control OUT. Показывает, что фаза SETUP управляющей конечной точки (control endpoint) завершена и для текущей передачи управления больше не были получены пакеты установки с обратной передачей (back-toback SETUP packets). На этом прерывании приложение может декодировать принятый пакет данных SETUP.

AHBERR (бит 2): AHB error. Этот бит генерируется только в режиме internal DMA, когда произошла ошибка AHB в процессе чтения/записи AHB. Приложение может прочитать соответствующий регистр адреса DMA конечной точки, чтобы определить адрес, где произошла ошибка.

EPDISD (бит 1): EndPoint DISableD interrupt. Этот бит показывает, что конечная точка запрещена по запросу приложения.

XFRC (бит 0): Transfer Completed interrupt. Это поле показывает, что для этой конечной точки завершена запрограммированная транзакция как на AHB, так и на USB.

Смещение адреса: 0x910
Значение сброса: 0x00000000

Приложение должно изменять этот регистр перед разрешением конечной точки 0. Как только конечная точка 0 разрешена соответствующим битом в регистре управления конечной точкой 0 (бит EPENA в регистре OTG_HS_DIEPCTL0), этот регистр модифицирует ядро. Приложение может только читать этот регистр, как только ядро очистило бит разрешения конечной точки.

Ненулевые конечные точки 1 .. 15 используют другие регистры.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано PKTCNT
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано XFRSIZ
rw

Биты 31:21 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTCNT (биты 20:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) данных для конечной точки 0. Это поле декрементируется каждый раз, когда пакет (максимального размера или короче) прочитан из TxFIFO.

Биты 18:7 зарезервированы и должны сохраняться в состоянии сброса (все нули).

XFRSIZ (биты 6:0): Transfer size. Показывает размер транзакции в байтах для конечной точки 0. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет перемещается из внешней памяти в TxFIFO.

Смещение адреса: 0xB10
Значение сброса: 0x00000000

Как только конечная точка 0 разрешена соответствующим битом в регистре управления конечной точкой 0 (бит EPENA в регистре OTG_HS_DIEPCTL0), этот регистр модифицирует ядро. Приложение может только читать этот регистр, как только ядро очистило бит разрешения конечной точки.

Ненулевые конечные точки 1 .. 15 используют другие регистры.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. STUPCNT
rw
зарезервировано PKTCNT
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано XFRSIZ
rw

Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0).

STUPCNT (бит 30:29): SETUP Packet CouNT. Это поле задает количество пакетов данных back-to-back SETUP, которое может принять конечная точка.

01: 1 пакет
10: 2 пакета
11: 3 пакета

Биты 28:20 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PKTCNT (бит 19): PacKeT CouNT. Это поле декрементируется до нуля после того, как пакет записывается в RxFIFO.

Биты 18:7 зарезервированы и должны сохраняться в состоянии сброса (все нули).

XFRSIZ (биты 6:0): Transfer size. Показывает размер транзакции в байтах для конечной точки 0. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается в TxFIFO и перемещается во внешнюю память.

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса: 0x910 + 0x20 * x
Значение сброса: 0x00000000

Приложение должно менять этот регистр перед тем, как разрешит эту конечную точку. Как только конечная точка разрешена соответствующим битом (бит EPENA в регистре OTG_HS_DIEPCTLx), этот регистр модифицирует ядро. Приложение может только читать этот регистр, ккогда ядро очистит бит разрешения конечной точки.

Примечание: регистр OTG_HS_DIEPTSIZx отличается от аналогичного регистра OTG_FS_DIEPTSIZx контроллера OTG_FS: добавлено битовое поле MCNT.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. MCNT
rw
PKTCNT
rw
XFRSIZ[18:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XFRSIZ[15:0]
rw

Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0).

MCNT (биты 30:29): Multi CouNT. Для периодических конечных точек IN это поле показывает количество пакетов, которое должно быть передано на фрейм через USB. Ядро использует это поле, чтобы вычислить data PID для изохронных конечных точек IN.

01: 1 пакет
10: 2 пакета
11: 3 пакета

PKTCNT (биты 28:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) объема данных для этой конечной точки.

Это поле декрементируется всякий раз, когда пакет (максимального размера или меньше) считывается из TxFIFO.

XFRSIZ (биты 18:0): Transfer size. Показывает размер транзакции в байтах для текущей конечной точки. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается из внешней памяти и перемещается в TxFIFO.

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса: 0x918 + 0x20 * x

Это регистр только для чтения, содержащий информацию свободного пространства TxFIFO для конечной точки Device IN.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
INEPTFSAV
r

Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса.

INEPTFSAV (биты 15:0): IN EndPoint TxFIFO Space AVailable. Показывает количество свободного пространства, доступного в TxFIFO конечной точки. Значение указывается в 32-битных словах:

0x0000: TxFIFO конечной точки заполнен.
0x0001: есть место для 1 слова.
0x0002: есть место для 2 слов.
n: есть место для n слов (0 < n < 512).
Другие значения: зарезервировано.

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса: 0xB10 + 0x20 * x
Значение сброса: 0x00000000

Приложение должно модифицировать этот регистр перед разрешением конечной точки. Как только конечная точка разрешена соответствующим битом (бит EPENA в регистре OTG_HS_DOEPCTLx), этот регистр модифицирует ядро. Приложение может только считывать этот регистр, когда ядро очистит бит разрешения конечной точки.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарез. RXDPID/
STUPCNT

r/rw
PKTCNT
rw
XFRSIZ[18:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
XFRSIZ[15:0]
rw

Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0).

RXDPID (биты 30:29): Received Data PID. Применимо только к конечным точкам isochronous OUT. Это PID данных, принятый в последнем пакете для этой конечной точки.

00: DATA0
01: DATA2
10: DATA1
11: MDATA

STUPCNT (биты 30:29): SETUP packet CouNT. Применимо только к конечным точкам control OUT. Это поле задает количество пакетов данных back-to-back SETUP, которое может принять конечная точка.

01: 1 пакет
10: 2 пакета
11: 3 пакета

PKTCNT (биты 28:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) объема данных для этой конечной точки.

Это поле декрементируется всякий раз, когда пакет (максимального размера или меньше) записывается в RxFIFO.

XFRSIZ (биты 18:0): Transfer size. Показывает размер транзакции в байтах для текущей конечной точки. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается из RxFIFO и перемещается во внешнюю память.

Здесь x это номер конечной точки от 1 до 5.

Смещение адреса для конечных точек IN: 0x914 + 0x20 * x
Значение сброса: 0xXXXXXXXX
Смещение адреса для конечных точек IN: 0xB14 + 0x20 * x
Значение сброса: 0xXXXXXXXX

Это регистр только для чтения, содержащий информацию свободного пространства TxFIFO для конечной точки Device IN.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DMAADDR[31:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
DMAADDR[15:0]
rw

DMAADDR (биты 31:0): DMA ADDRess. Это поле хранит начальный адрес внешней памяти, куда сохраняются или откуда выбираются данные конечной точки.

Примечание: для конечных точек управления (control endpoint) это поле хранит адрес данных пакетов control OUT, а также данных пакетов транзакции SETUP. Когда больше 3 пакетов SETUP принято по принципу back-to-back, пакет данных SETUP в памяти перезаписывается. Этот регистр инкрементируется на каждой транзакции AHB. Приложение может предоставить только адрес, выровненный на размер слова (байтовый адрес должен нацело делиться на 4).

Примечание: регистры OTG_HS_DIEPDMAx / OTG_HS_DOEPDMAx появились в контроллере OTG_HS, в регистре OTG_FS этих регистров нет.

Смещение адреса: 0xE00
Значение сброса: 0x00000000

Регистр управления питанием и тактированием, он доступен в режиме хоста USB и в режиме устройства USB.

   31       30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарезервировано PHYSUSP
rw
зарезерв. GATEHCLK
rw
STPPCLK
rw

Биты 31:5 зарезервированы и должны сохраняться в состоянии сброса (все нули).

PHYSUSP (бит 4): PHY SUSPended. Показывает, что PHY был приостановлен. Этот бит обновляется, как только PHY приостановлен после того, как приложение установило бит STPPCLK (бит 0 этого регистра).

Биты 3:2 зарезервированы и должны сохраняться в состоянии сброса (все нули).

GATEHCLK (бит 1): Gate HCLK. Приложение установит этот бит, чтобы подать HCLK на модули, отличающиеся от AHB Slave и Master и логики пробуждения (wakeup logic), когда USB приостанавливается, или сессия неправильная. Приложение очищает этот бит, когда USB возобновляет работу, или когда начинается новая сессия.

STPPCLK (бит 0): SToP PHY CLocK. Приложение установит этот бит для остановки тактов PHY, когда USB приостанавливается, сессия неправильная, или когда устройство отключается. Приложение очищает этот бит, когда USB возобновляет работу, или когда начинается новая сессия.

Смещения адресов регистров OTG_HS в адресном пространстве STM32F4xx отсчитываются относительно адреса 0x40040000 (см. таблицу 1 в даташите [1]).

STM32F4 OTG HS register map

[Модель программирования OTG_HS]

Инициализация ядра. Приложение должно выполнить последовательность инициализации ядра. Если при включении питания кабель подключен, то бит текущего режима работы (бит CMOD в регистре OTG_HS_GINTSTS) показывает, как работает ядро - как хост или как устройство USB. Контроллер OTG_HS входит в режим хоста, когда подключен коннектор "A", или в режим устройства, когда подключен коннектор "B".

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

1. Запрограммируйте следующие поля в регистре OTG_HS_GAHBCFG:

- Бит режима DMA.
- Поле длины пакета AHB (AHB burst).
– Бит глобальной маски прерываний (Global interrupt mask bit) GINTMSK = 1.
– RxFIFO non-empty (бит RXFLVL в регистре OTG_HS_GINTSTS).
– Уровень опустошенности периодического стека передачи (Periodic TxFIFO empty level).

2. Запрограммируйте следующие поля в регистре OTG_HS_GUSBCFG:

– Бит разрешения функции смены ролей хост-устройство (HNP capable bit).
– Бит разрешения управления питанием порта USB (SRP capable bit).
– Поле калибровки таймаута полной скорости (FS timeout calibration).
– Поле срока обработки (USB turnaround time).

3. Программа должна демаскировать следующие биты в регистре OTG_HS_GINTMSK:

- Маска прерывания OTG.
- Маска прерывания несоответствия режима (Mode mismatch).

4. Программа может прочитать бит CMOD в регистре OTG_HS_GINTSTS, чтобы определить, в каком режиме работает контроллер OTG_HS - в режиме хоста или в режиме устройства USB.

Инициализация хоста USB. Чтобы инициализировать ядро как хост, приложение должно выполнить следующие шаги:

1. Запрограммировать HPRTINT в регистре OTG_HS_GINTMSK, чтобы демаскировать это прерывание.

2. Запрограммировать регистр OTG_HS_HCFG, чтобы выбрать full-speed (FS) хост.

3. Запрограммировать бит PPWR регистра OTG_HS_HPRT в лог. 1. Это включит VBUS на USB.

4. Подождать прерывания PCDET в регистре OTG_HS_HPRT0. Оно покажет, что устройство USB подключено к порту.

5. Запрограммировать бит PRST регистра OTG_HS_HPRT в лог. 1. Это начнет процесс сброса по шине USB (USB reset).

6. Подождать как минимум 10 мс, чтобы завершился USB reset.

7. Запрограммировать бит PRST регистра OTG_HS_HPRT в лог. 0.

8. Подождать прерывания PENCHNG в регистре OTG_HS_HPRT.

9. Прочитать бит PSPD регистра OTG_HS_HPRT, чтобы получить скорость, с которой прошла энумерация.

10. Запрограммировать регистр HFIR значением, соответствующим выбранной PHY clock 1.

11. Запрограммировать поле FSLSPCS в регистре OTG_HS_HCFG в соответствии со скоростью, которая была определена на шаге 9. Если FSLSPCS было изменено, то должен быть выполнен сброс порта.

12. Запрограммировать регистр OTG_HS_GRXFSIZ для выбора размера FIFO приема.

13. Запрограммировать регистр OTG_HS_HNPTXFSIZ для выбора размера и начального адреса не периодического FIFO передачи для непериодических транзакций.

14. Запрограммировать регистр OTG_HS_HPTXFSIZ для выбора размера и начального адреса периодического FIFO для периодических транзакций.

Чтобы обмениваться данными с устройствами, системное ПО должно инициализировать и разрешить как минимум один канал.

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

1. Запрограммируйте следующие поля в регистре OTG_HS_DCFG:

– Скорость устройства (Device speed).
– Статус ненулевой длины подтверждения OUT (Non-zero-length status OUT handshake).

2. Запрограммируйте регистр OTG_HS_GINTMSK для демаскирования следующих прерываний:

– Сброс по шине (USB reset).
– Завершение энумерации (Enumeration done).
– Ранняя приостановка (Early suspend).
– Приостановка шины (USB suspend).
– Начало фрейма (SOF).

3. Запрограммируйте бит VBUSBSEN в регистре OTG_HS_GCCFG, чтобы разрешить анализ уровня VBUS в режиме "B" устройства, и подачи 5V через верхний подтягивающий резистор (pull-up) линии данных D+ (DP).

4. Подождите прерывания USBRST в регистре OTG_HS_GINTSTS. Это показывает, что был определен сброс по шине USB длительностью около 10 мс или больше.

Потом нужно подождать прерывания ENUMDNE в регистре OTG_HS_GINTSTS. Это прерывание показывает окончание сброса по шине USB. При получении этого прерывания, приложение должно прочитать регистр OTG_HS_DSTS, чтобы определить скорость энумерации и выполнить шаги, перечисленные далее в секции "Инициализация конечной точки по завершению энумерации".

Начиная с этого момента устройство готово принять пакеты SOF и выполнить управляющие передачи на конечной точке 0.

Режим DMA. Хост OTG использует интерфейс AHB master для выборки данных пакетов (перемещение данных от AHB к USB) и приема обновленных данных (от USB к AHB). AHB master использует запрограммированный адрес DMA (регистр HCDMAx в режиме хоста USB и регистр DIEPDMAx/DOEPDMAx в режиме устройства USB) для доступа к буферам данных.

[Модель программирования хоста USB]

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

1. Запрограммируйте регистр OTG_HS_GINTMSK, чтобы демаскировать следующее:

2. Прерывание канала.

– Прерывание опустошения не периодического FIFO передачи для транзакций OUT (применимо при работе на конвейерном уровне транзакции с полем подсчета пакетов, запрограммированным на более чем один пакет).
– Прерывание опустошения наполовину непериодического FIFO передачи для транзакций OUT (применимо при работе на конвейерном уровне транзакции с полем подсчета пакетов, запрограммированным на более чем один пакет).

3. Запрограммируйте регистр OTG_HS_HAINTMSK для демаскирования выбранных прерываний каналов.

4. Запрограммируйте регистр OTG_HS_HCINTMSK для демаскирования интересующих прерываний, связанных с транзакциями, заданных в регистре каналов прерываний хоста.

5. Запрограммируйте в регистр OTG_HS_HCTSIZx выбранных каналов общий размер транзакции, в байтах, и ожидаемое количество пакетов, включая короткие пакеты. Приложение должно запрограммировать поле PID начальным PID данных (для использования на первой транзакции OUT, или ожидаемым от первой транзакции IN).

6. Запрограммируйте выбранные каналы в регистре (регистрах) OTG_HS_HCSPLTx адресами хаба и порта (только для разделенных транзакций).

7. Запрограммируйте выбранные каналы в регистре (регистрах) HCDMAx начальным адресом буфера.

8. Запрограммируйте регистр OTG_HS_HCCHARx выбранного канала характеристиками конечной точки устройства, такими как тип, скорость, направление, и т. д. (канал может быть разрешен установкой в 1 бита разрешения канала только когда приложение готово передавать или принимать какой-либо пакет).

Остановка (halt) канала. Приложение может запретить любой канал программированием регистра OTG_HS_HCCHARx с установкой в 1 бит CHDIS и CHENA. Это разрешает хосту OTG_HS сбросить (flush) выставленные запросы (если они есть) и сгенерировать прерывание остановки канала (channel halted interrupt). Приложение должно подождать прерывания CHH в OTG_HS_HCINTx перед повторным выделением канала для других транзакций. Хост OTG_HS не прерывает транзакции, которые уже запущены по USB.

Для запрета канала в режиме использования DMA приложению не нужно проверять место в очереди запросов. Хост OTG_HS host проверяет место для записи запроса запрета на запрещенном канале во время арбитража. Между тем, все размещенные запросы удаляются из очереди запросов, когда бит CHDIS в HCCHARx установлен в 1.

Перед запретом канала приложение должно убедиться в наличии хотя бы одного свободного места в очереди не периодических запросов (когда запрещается не периодический канал) или в очереди периодических запросов (когда запрещается периодический канал). Приложение может просто сбросить (flush) выставленные запросы в очереди запросов (перед запретом канала) путем программирования регистра OTG_HS_HCCHARx с битом CHDIS, установленным в 1, и бита CHENA, очищенным в 0.

Ожидается, что приложение запрещает канал при любом из следующих условий:

1. Когда получено прерывание XFRC в OTG_HS_HCINTx во время не периодической транзакции IN или широкополосной транзакции interrupt IN (только режим Slave).

2. Когда для канала IN или OUT получено прерывание STALL, TXERR, BBERR или DTERR в регистре OTG_HS_HCINTx (только режим Slave). Для широкополосных interrupt IN в режиме Slave, как только приложение получило прерывание DTERR, оно должно запретить канал и ждать прерывания остановки канала. Приложение должно быть в состоянии принять другие прерывания (DTERR, Nak, Data, TXERR) на том же канале пред получением остановки (halt).

3. Когда получено прерывание DISCINT (Disconnect Device, отключение устройства) в регистре OTG_HS_GINTSTS (ожидается, что приложение запретит все разрешенные каналы).

4. Когда приложение обрывает транзакцию перед её нормальным завершением.

Протокол ping. Когда хост OTG_HS работает в режиме высокой скорости (high speed, HS), приложение должно инициировать протокол ping, когда осуществляет обмен с высокоскоростными конечными точками OUT bulk или control (стадия data и status).

Приложение должно инициировать протокол ping, когда получает прерывание NAK/NYET/TXERR. Когда хост OTG_HS получает одно из этих ответов, он не должен продолжать какую-либо транзакцию для определенной конечной точки, отбросить все поставленные в очередь или захваченные из очереди запросы OUT, и сбросить (flush) соответствующие данные (из TxFIFO).

Это допустимо только в подчиненном режиме (slave mode). В режиме Slave приложение может отправить токен ping либо установкой бита DOPING в регистре HCTSIZx перед разрешением канала, либо простой записью регистра HCTSIZx с установленным битом DOPING, когда канал уже разрешен. Это разрешает хосту OTG_HS записывать элемент запроса ping в очередь запросов. Приложение должно подождать ответа на токен ping (прерывания NAK, ACK или TXERR) перед тем, как продолжить транзакцию или отправкой другого токена ping. Приложение может продолжить транзакцию данных только после получения ACK от конечной точки OUT на запрошенный ping. В режиме работы с использованием DMA приложению не нужно устанавливать бит DOPING в регистре HCTSIZx для ответа NAK/NYET в случае Bulk/Control OUT. Хост OTG_HS автоматически установит бит DOPING в регистре HCTSIZx, и выдаст токены ping для Bulk/Control OUT. Хост OTG_HS продолжит отправлять токены ping, пока не получит ACK, и затем автоматически переключится на транзакцию данных.

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

• Запись в передающий FIFO (TxFIFO)

Хост OTG_HS автоматически записывает элемент (запрос OUT) в очередь периодических / непериодических запросов, вместе с последним словом записи пакета. Приложение должно гарантировать, что доступно как минимум одна свободная ячейка в очереди периодических / непериодических запросов перед тем, как начать записывать в FIFO передачи. Приложение всегда должно записывать в FIFO слова (32-битный доступ). Если размер в байтах пакета не делится нацело на 4, то приложение должно дополнить пакет данными (обычно нулевыми, или заранее известного значения). Хост OTG_HS определяет реальный размер пакета, базируясь на запрограммированном максимальном размере пакета и размере транзакции.

STM32F4 OTG HS Transmit FIFO write task fig416

Рис. 416. Задача записи в TxFIFO.

Примечание: MPS Maximum packet size (максимальный размер пакета), LPS Last packet size (размер последнего пакета).

• Чтение FIFO приема (RxFIFO)

Приложение должно игнорировать все состояния пакета, отличающиеся от IN data packet (0010b).

STM32F4 OTG HS Receive FIFO read task fig417

Рис. 417. Задача чтения из RxFIFO.

• Транзакции bulk и control OUT/SETUP

Типовые конвейеризированные операции bulk или control OUT/SETUP на уровне транзакции показаны на рис 418. См. channel 1 (ch_1). Передается два пакета bulk OUT. Транзакция control SETUP работает так же, однако имеет только один пакет. Предположения следующие:

– Приложение пытается отправить 2 пакета максимального размера (размер транзакции transfer size = 1024 байта).
– Не периодический TxFIFO может хранить 2 пакета (128 байт для FS).
– Глубина очереди не периодических запросов = 4.

STM32F4 OTG HS normal bulk control OUT SETUP and bulk control IN DMA fig418

Рис. 418. Нормальные транзакции bulk/control OUT/SETUP и bulk/control IN в режиме DMA.

• Обычные операции bulk и control OUT/SETUP

Последовательность операции (channel 1) следующая:

a) Инициализация канала 1 (channel 1).
b) Запись первого пакета для 1.
c) Вместе с записью последнего слова ядро записывает элемент в очередь не периодических запросов.
d) Как только не периодическая очередь окажется не пустой, ядро попытается отправить токен OUT в текущем фрейме.
e) Запись второго (последнего) пакета для channel 1.
f) Ядро генерирует прерывание XFRC, как только последняя транзакция успешно завершится.
g) В ответ на прерывание XFRC производится отмена выделения канала для других транзакций.
h) Обработка не-ACK ответов.

STM32F4 OTG HS normal bulk control OUT SETUP and bulk control IN Slave fig419

Рис. 419. Нормальные транзакции bulk/control OUT/SETUP и bulk/control IN в режиме Slave.

В следующих примерах на псевдокоде показаны обработчики прерывания (interrupt service routine, ISR) для транзакций bulk и control OUT/SETUP.

• ISR для транзакций bulk/control OUT/SETUP и bulk/control IN

a) Bulk/Control OUT/SETUP

Демаскирование (NAK/TXERR/STALL/XFRC)
if (XFRC)
{
   Сброс счетчика ошибок
   Маскирование ACK
   Отмена выделения канала
}
else if (STALL)
{
   Transfer Done = 1
   Демаскирование CHH
   Запрет канала
}
else if (NAK or TXERR )
{
   Возврат указателей буфера (Rewind Buffer Pointers)
   Демаскирование CHH
   Запрет канала
   if (TXERR)
   {
      Инкремент счетчика ошибок
      Демаскирование ACK
   }
   else
   {
      Сброс счетчика ошибок
   }
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}

Приложение ожидает записи пакетов данных в TxFIFO, когда появится свободное место в TxFIFO и очереди запросов. Приложение может использовать прерывание NPTXFE в OTG_HS_GINTSTS, чтобы найти пространство в TxFIFO.

b) Bulk/Control IN

Демаскирование (TXERR/XFRC/BBERR/STALL/DTERR)
if (XFRC)
{
   Сброс счетчика ошибок
   Демаскирование CHH
   Запрет канала
   Сброс счетчика ошибок
   Маскирование ACK
}
else if (TXERR or BBERR or STALL)
{
   Демаскирование CHH
   Запрет канала
   if (TXERR)
   {
      Инкремент счетчика ошибок
      Демаскирование ACK
   }
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}
else if (DTERR)
{
   Сброс счетчика ошибок
}

Приложение ожидает записи запросов, когда появится место в очереди запросов, и пока не будет получено прерывание XFRC.

• Транзакции bulk и control IN

Типовые операции уровня транзакции для bulk или control IN показаны на рис. 399. See channel 2 (ch_2). Предположения следующие:

– Приложение пытается принять 2 пакета максимального размера (размер транзакции transfer size = 1024 байта).
– RxFIFO может содержать как минимум один пакет максимального размера и два слова статуса на пакет (72 байта для FS).
– Глубина очереди не периодических запросов = 4.

STM32F4 OTG HS bulk control IN transactions DMA fig420

Рис. 420. Транзакции bulk/control IN в режиме DMA.

STM32F4 OTG HS bulk control IN transactions Slave fig421

Рис. 421. Транзакции bulk/control IN в режиме Slave.

Последовательность операций следующая:

a) Инициализация канала 2.
b) Установка бита CHENA в HCCHAR2 для записи запроса IN в очередь не периодических запросов.
c) Ядро пытается отправить токен IN после завершения текущей транзакции OUT.
d) Ядро генерирует прерывание RXFLVL, как только принятый пакет записан в RxFIFO.
e) В ответ на прерывание RXFLVL маскируется прерывание RXFLVL и считывается статус пакета, чтобы определить количество принятых байт, затем соответственно считывается RxFIFO. После этого демаскируется прерывание RXFLVL.
f) Ядро генерирует прерывание RXFLVL для элемента статуса завершения транзакции в RxFIFO.
g) Приложение должно прочитать и проигнорировать статус принятого пакета, если это не IN data packet (PKTSTS в GRXSTSR != 0010b).
h) Ядро генерирует прерывание XFRC, как только прочитан статус принятого пакета.
i) В ответ на прерывание XFRC запрещается канал и останавливается запись регистра OTG_HS_HCCHAR2 для будущих передач. Ядро записывает запрос запрета канала в очередь не периодических запросов как только записан регист OTG_HS_HCCHAR2.
j) Ядро генерирует прерывание RXFLVL, как только в RxFIFO записан статус останова (halt status).
k) Чтение и игнорирование статуса принятого пакета.
l) Ядро генерирует прерывание CHH, как только halt status извлекается из RxFIFO.
m) В ответ на прерывание CHH отменяется выделение канала для других транзакций.
n) Обработка ответов не-ACK.

• Транзакции управления (control transfer) в режиме Slave.

Стадии Setup, Data и Status транзакции управления должны быть выполнены как три отдельные транзакции. Транзакции OUT стадий Setup, Data или Status выполняются подобно транзакциям bulk OUT, описанным выше. Транзакции IN стадий Data или Status также выполняются подобно транзакциям bulk IN, описанным выше. Для всех трех стадий приложение ожидает установки значения Control в поле EPTYP регистра OTG_HS_HCCHAR1. Во время стадии Setup приложение ожидает установки значения SETUP в поле PID регистра OTG_HS_HCTSIZ1.

• Транзакции Interrupt OUT

Типовая операция interrupt OUT показана на рис. 422. Предположения следующие:

– Приложение пытается отправить один пакет в каждом фрейме (до одного пакета максимального размера), начиная с нечетного фрейма (transfer size = 1024 байта).
– Периодический TxFIFO может содержать 1 пакет (1 килобайт).
– Глубина очереди периодических запросов = 4.

STM32F4 OTG HS normal interrupt OUT IN transactions DMA fig422

Рис. 422. Нормальные транзакции interrupt OUT/IN в режиме DMA.

STM32F4 OTG HS normal interrupt OUT IN transactions Slave fig423

Рис. 423. Нормальные транзакции interrupt OUT/IN в режиме Slave.

Последовательность операций следующая:

a) Инициализация и разрешение канала 1 (channel 1). Приложение должно установить бит ODDFRM в регистре OTG_HS_HCCHAR1.
b) Запись первого пакета для channel 1. Для широкополосной транзакции interrupt приложение должно записать последующие пакеты до MCNT (максимальное количество пакетов для передачи в следующих интервалах фрейма) перед переключением на другой канал.
c) Вместе с записью последнего слова каждого пакета хост OTG_HS записывает элемент в очередь периодических запросов.
d) Хост OTG_HS пытается отправить токен OUT в следующем (нечетном) фрейме.
e) Хост OTG_HS генерирует прерывание XFRC, как только был успешно передан последний пакет.
f) В ответ на прерывание XFRC канал переинициализируется для следующей транзакции.

• ISR для транзакций interrupt OUT/IN

a) Interrupt OUT

Демаскирование (NAK/TXERR/STALL/XFRC/FRMOR)
if (XFRC)
{
   Сброс счетчика ошибок
   Маскирование ACK
   Отмена выделения канала
}
else if (STALL or FRMOR)
{
   Маскирование ACK
   Демаскирование CHH
   Запрет канала
   if (STALL)
   {
      Transfer Done = 1
   }
}
else if (NAK or TXERR)
{
   Возврат состояния указателей на буферы (Rewind Buffer Pointers)
   Сброс счетчика ошибок
   Маскирование ACK
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала (в следующем b_interval - 1 фрейме)
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}

Приложение ожидает записи пакетов данных в TxFIFO, когда доступно место в TxFIFO и запроса в очереди до количества, указанного в поле MCNT перед тем, как переключиться на другой канал. Приложение использует прерывание NPTXFE в OTG_HS_GINTSTS, чтобы найти пространство в TxFIFO.

b) Interrupt IN

Демаскирование (NAK/TXERR/XFRC/BBERR/STALL/FRMOR/DTERR)
if (XFRC)
{
   Сброс счетчика ошибок
   Маскирование ACK
   if (OTG_FS_HCTSIZx.PKTCNT == 0)
   {
      Отмена выделения канала
   }
   else
   {
      Transfer Done = 1
      Демаскирование CHH
      Запрет канала
   }
}
else if (STALL or FRMOR or NAK or DTERR or BBERR)
{
   Маскирование ACK
   Демаскирование CHH
   Запрет канала
   if (STALL or BBERR)
   {
      Сброс счетчика ошибок
      Transfer Done = 1
   }
   else if (!FRMOR)
   {
      Сброс счетчика ошибок
   }
}
else if (TXERR)
{
   Инкремент счетчика ошибок
   Демаскирование ACK
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала (в следующем b_interval - 1 / Frame)
   }
}
else if (ACK)
{
   Сброс счетчика ошибок
   Маскирование ACK
}

• Транзакции Interrupt IN

Предположения следующие:

– Приложение пытается принять один пакет (до одного пакета максимального размера) в каждом фрейме, начиная с нечетного (размер транзакции transfer size = 1024 байта).
– RxFIFO может хранить как минимум 1 пакет максимального размера и 2 слова статуса на пакет (1031 байт).
– Глубина очереди периодических запросов = 4.

• Нормальное функционирование interrupt IN

Последовательность операций следующая:

a) Инициализация канала 2 (channel 2). Приложение должно установить бит ODDFRM в регистре OTG_HS_HCCHAR2.
b) Установка бита CHENA в регистре OTG_HS_HCCHAR2, чтобы записать запрос IN в очередь периодических запросов. Для широкополосной транзакции interrupt приложение должно записать регистр OTG_HS_HCCHAR2 значением MCNT (максимальное количество ожидаемых пакетов в следующих интервалах фрейма) перед переключением на другой канал.
c) Хост OTG_HS записывает запрос IN в очередь периодических запросов для каждой записи регистра OTG_HS_HCCHAR2 с установленным битом CHENA.
d) Хост OTG_HS пытается отправить токен IN в следующем (нечетном) фрейме.
e) Как только принят пакет IN и записан в RxFIFO, хост OTG_HS генерирует прерывание RXFLVL.
f) В ответ на прерывание RXFLVL считывается статус принятого пакета, чтобы определить количество принятых байт, и соответственно происходит чтение RxFIFO. Приложение должно маскировать прерывание RXFLVL перед чтением RxFIFO, и демаскировать после полного чтения пакета.
g) Ядро генерирует прерывание RXFLVL для элемента завершения транзакции в RxFIFO. Приложение должно прочитать и проигнорировать статус принятого пакета, когда принятый статус пакета не соответствует IN data packet (PKTSTS в GRXSTSR != 0010b).
h) Ядро генерирует прерывание XFRC, как только прочитан статус принятого пакета.
i) В ответ на прерывание XFRC, считывается поле PKTCNT в регистре OTG_HS_HCTSIZ2. Если бит PKTCNT в регистре OTG_HS_HCTSIZ2 не равен 0, запрещается канал перед повторной инициализацией канала для следующей транзакции (если она есть). Если бит PKTCNT в регистре OTG_HS_HCTSIZ2 равен 0, переинициализируется канал для следующей транзакции. На этот раз приложение должно сбросить бит ODDFRM в регистре OTG_HS_HCCHAR2.

• Транзакции isochronous OUT

Типовая операция isochronous OUT показана на рис. 424. Предположения следующие:

– Приложение пытается отправить 1 пакет на каждый фрейм (до одного пакета максимального размера), начиная с нечетного фрейма (размер транзакции transfer size = 1024 байта).
– Периодический TxFIFO может хранить один пакет (1 килобайт).
– Глубина очереди периодических запросов = 4.

Последовательность операций следующая:

a) Инициализация и разрешение канала 1 (channel 1). Приложение должно установить бит ODDFRM в регистре OTG_HS_HCCHAR1.
b) Запись первого пакета для channel 1. Для широкополосной транзакции interrupt приложение должно записать регистр OTG_HS_HCCHAR1 значением MCNT (максимальное количество ожидаемых пакетов в следующих интервалах фрейма) перед переключением на другой канал.
c) Вместе с записью последнего слова каждого пакета хост OTG_HS записывает элемент в очередь периодических запросов.
d) Хост OTG_HS пытается отправить токен OUT в следующем фрейме (нечетном).
e) Хост OTG_HS генерирует прерывание XFRC, как только был успешно передан последний пакет.
f) В ответ на прерывание XFRC переинициализируется канал для следующей транзакции.
g) Обработка не-ACK ответов.

STM32F4 OTG HS normal isochronous OUT IN transactions DMA fig424

Рис. 424. Нормальные транзакции isochronous OUT/IN в режиме DMA.

STM32F4 OTG HS normal isochronous OUT IN transactions Slave fig425

Рис. 425. Нормальные транзакции isochronous OUT/IN в режиме Slave.

• ISR для транзакций isochronous OUT/IN

Пример кода для Isochronous OUT:

Демаскирование (FRMOR/XFRC)
if (XFRC)
{
   Отмена выделения канала
}
else if (FRMOR)
{
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   Отмена выделения канала
}
Пример кода для Isochronous IN:
Демаскирование (TXERR/XFRC/FRMOR/BBERR)
if (XFRC or FRMOR)
{
   if (XFRC и (OTG_FS_HCTSIZx.PKTCNT == 0))
   {
      Сброс счетчика ошибок
      Отмена выделения канала
   }
   else
   {
      Демаскирование CHH
      Запрет канала
   }
}
else if (TXERR or BBERR)
{
   Инкремент счетчика ошибок
   Демаскирование CHH
   Запрет канала
}
else if (CHH)
{
   Маскирование CHH
   if (Transfer Done или (Error_count == 3))
   {
      Отмена выделения канала
   }
   else
   {
      Повторная инициализация канала
   }
}

• Транзакции isochronous IN

Предположения следующие:

– Приложение пытается принять один пакет (до одного пакета максимального размера) в каждом фрейме, начиная со следующего нечетного фрейма (размер транзакции transfer size = 1024 байта).
– RxFIFO может хранить как минимум один пакет максимального размера и 2 слова статуса на пакет (1031 байт).
– Глубина очереди периодических запросов = 4.

Последовательность операций следующая:

a) Инициализация канала 2 (channel 2). Приложение должно установить бит ODDFRM в регистре OTG_HS_HCCHAR2.
b) Установка бита CHENA в регистре OTG_HS_HCCHAR2, чтобы записать запрос IN в очередь периодических запросов. Для широкополосной транзакции interrupt приложение должно записать регистр OTG_HS_HCCHAR2 значением MCNT (максимальное количество ожидаемых пакетов в следующих интервалах фрейма) перед переключением на другой канал.
c) Хост OTG_HS записывает запрос IN в очередь периодических запросов для каждой записи регистра OTG_HS_HCCHAR2 с установленным битом CHENA.
d) Хост OTG_HS пытается отправить токен IN в следующем нечетном фрейме.
e) Как только принят и записан в RxFIFO пакет IN, хост OTG_HS генерирует прерывание RXFLVL.
f) В ответ на прерывание RXFLVL считывается статус принятого пакета, чтобы определить количество принятых байт, затем соответственно читается RxFIFO. Приложение должно маскировать прерывание RXFLVL перед чтением RxFIFO, и демаскировать его после чтения всего пакета.
g) Ядро генерирует прерывание RXFLVL для элемента статуса завершения транзакции в RxFIFO. Теперь приложение должно причитать и проигнорировать статус принятого пакета, когда он не соответствует IN data packet (биты PKTSTS в OTG_HS_GRXSTSR != 0010b).
h) Ядро генерирует прерывание XFRC, как только прочитан статус принятого пакета.
i) В ответ на прерывание XFRC считывается поле PKTCNT в регистре OTG_HS_HCTSIZ2. Если PKTCNT != 0 в регистре OTG_HS_HCTSIZ2, запрещается канал перед повторной инициализацией канала для следующей передачи, если она есть. Если PKTCNT = 0 в OTG_HS_HCTSIZ2, переинициализируется канал для следующей передачи. На этот раз приложение должно сбросить бит ODDFRM в регистре OTG_HS_HCCHAR2.

• Выбор глубины очереди

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

Глубина очереди непериодических запросов влияет на производительность не периодических транзакций. Чем глубже очередь (при условии достаточного пространства в FIFO), тем чаще ядро может запланировать конвейеризацию транзакций не периодических передач. Если размер очереди мал, то ядро может помещать в неё новые запросы только по мере освобождения ячеек в очереди.

Глубина очереди периодических запросов является критической для выполнения запланированных периодических транзакций. Выберите глубину периодической очереди на основе количества периодических передач, запланированных в микрофрейме. Однако в режиме Slave приложение также должно учитывать элемент запрета, который должен быть помещен в очередь. Таким образом, если имеются 2 не широкополосные периодические конечные точки, то глубина периодической очереди должна быть как минимум 4 элемента. Если поддерживается как минимум одна широкополосная конечная точка, глубина очереди должна быть 8. Если глубина периодической очереди меньше, чем периодические транзакции, запланированные в микрофрейме, то произойдет событие недогрузки фрейма (frame overrun).

• Обработка событий помехообразного сигнала (babble)

Контроллер OTG_HS обрабатывает 2 случая подобной ошибки: packet babble и port babble. Packet babble произойдет, если устройство отправило больше данных, чем максимальный размер пакета на канале. Port babble произойдет, если ядро продолжает получать данные от устройства на EOF2 (окончание фрейма 2, очень близко к SOF).

Когда контроллер OTG_HS детектирует packet babble, он прекращает записывать данные в буфер Rx, и ждет окончания пакета (end of packet, EOP). Когда контроллер определил EOP, он сбрасывает (flush) уже записанные в буфер Rx данные, и генерирует прерывание Babble.

Когда контроллер OTG_HS детектирует port babble, он сбрасывает (flush) RxFIFO и запрещает порт. Затем ядро генерирует прерывание запрета порта (Port disabled, бит HPRTINT в регистре OTG_HS_GINTSTS, бит PENCHNG в регистре OTG_HS_HPRT). При получении этого прерывания приложение должно определить, что оно произошло не из-за перегрузки по току (overcurrent condition, это еще одна причина прерывания Port Disabled) путем проверки POCA в регистре OTG_HS_HPRT, затем должно выполнить программный сброс (soft reset). Ядро не отправляет больше никаких токенов после того, как оно детектирует событие port babble.

• Транзакции bulk и control OUT/SETUP в режиме DMA

Последовательность операций следующая:

a) Инициализировать и разрешить channel 1, как объяснялось в секции "Инициализация канала".
b) Хост OTG_HS начинает выборку первого пакета, как только канал был разрешен. Для внутреннего режима DMA хост OTG_HS использует запрограммированный адрес DMA для выборки пакета.
c) После выборки последнего слова второго (последнего) пакета, хост OTG_HS внутренне маскирует channel 1 для дальнейшего арбитража.
d) Хост OTG_HS генерирует прерывание CHH, как только был отправлен последний пакет.
e) В ответ на прерывание CHH отменяется выделение канала, чтобы освободить его для других транзакций.

• Обработка NAK и NYET с внутренним DMA

a) Хост OTG_HS отправляет транзакцию bulk OUT.
b) Устройство отвечает NAK или NYET.
c) Если у приложения демаскированы NAK или NYET, то ядро генерирует соответствующее прерывание (или прерывания). Приложению не требуется обрабатывать эти прерывания, поскольку само ядро заботится о том, чтобы откатить обратно указатели на буферы и переинициализировать канал без вмешательства приложения.
d) Ядро автоматически выдает токен ping.
e) Когда устройство вернет ACK, ядро продолжит транзакцию. Опционально приложение может задействовать эти прерывания, тогда прерывание NAK или NYET маскируется приложением. Ядро не генерирует отдельное прерывание, когда NAK или NYET получены функциональностью хоста.

• Транзакции bulk и control IN в режиме DMA

Последовательность операций следующая:

a) Инициализируется и разрешается используемый канал (channel x), как объясняется в секции "Инициализация канала".
b) Хост OTG_HS записывает запрос IN в очередь запросов, как только канал получает грант от арбитра (арбитраж выполняется по кольцевому алгоритму, roundrobin).
c) Хост OTG_HS начинает записывать принятые данные в системную память, как только без ошибок был принят последний бaйт.
d) Когда принят последний пакет, хост OTG_HS установит внутренний флаг, чтобы удалить любые дополнительные запросы IN из очереди запросов.
e) Хост OTG_HS сбрасывает (flush) дополнительные запросы.
f) В очередь запросов записывается последний запрос для запрета channel x. В этот момент channel 2 внутренне маскируется для будущего арбитража.
g) Хост OTG_HS генерирует прерывание CHH, как только запрос запрета окажется на вершине очереди.
h) В ответ на прерывание CHH отменяется выделение канала для других транзакций.

• Interrupt OUT transactions in DMA mode

a) Инициализация и разрешение channel x, как было объяснено в секции "Инициализация канала".
b) Хост начнет выбирать OTG_HS первый пакет, как только канал был разрешен, и запишет запрос OUT вместе с выборкой последнего слова. В широкополосных транзакциях хост OTG_HS продолжает выборку следующего пакета (до значения, указанного в поле MC) перед переключением на следующий канал.
c) Хост OTG_HS пытается отправить токен OUT в начале следующего нечетного фрейма / микрофрейма.
d) После успешной передачи пакета хост OTG_HS генерирует прерывание CHH.
e) В ответ на прерывание CHH канал заново инициализируется для следующей транзакции.

• Транзакции interrupt IN в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x, как описано в секции "Инициализация канала".
b) Хост OTG_HS записывает запрос IN в очередь запросов, как только канал channel x получил грант от арбитра (справедливый алгоритм round-robin). В широкополосных транзакциях хост OTG_HS делает последовательные записи до MC раз.
c) Хост OTG_HS пытается отправить токен IN в начале следующего (нечетного) фрейма / микрофрейма.
d) Как только был принят пакет и записан в RxFIFO, хост OTG_HS генерирует прерывание CHH.
e) В ответ на прерывание CHH канал заново инициализируется для следующей транзакции.

• Изохронные транзакции OUT в режиме DMA

a) Инициализировать и разрешить channel x, как описано в секции "Инициализация канала".
b) Хост OTG_HS начинает выборку первого пакета, как только разрешен канал, и записывает запрос OUT вместе с последним выбранным словом. В широкополосных транзакциях хост OTG_HS продолжает выборку следующего пакета (до значения, указанного в поле MC) перед переключением на следующий канал.
c) Хост OTG_HS пытается отправить токен OUT в начале следующего (нечетного) фрейма / микрофрейма.
d) После успешной передачи пакета хост OTG_HS генерирует прерывание CHH.
e) В ответ на прерывание CHH канал заново инициализируется для следующей транзакции.

• Изохронные транзакции IN в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x, как описано в секции "Инициализация канала".
b) Хост OTG_HS записывает запрос IN в очередь запросов, как только channel x получит грант от арбитра (справедливый алгоритм round-robin). В широкополосных транзакциях хост OTG_HS делает последовательные записи до MC раз.
c) Хост OTG_HS пытается отправить токен IN в начале следующего (нечетного) фрейма / микрофрейма.
d) Как только был принят пакет и записан в RxFIFO, хост OTG_HS генерирует прерывание CHH.
e) В ответ на прерывание CHH канал заново инициализируется для следующей транзакции.

• Разделенные (split) транзакции bulk и control OUT/SETUP в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x для старта split, как описано в секции "Инициализация канала".
b) Хост OTG_HS начинает выборку первого пакета, как только канал был разрешен, и записывает запрос OUT вместе с выборкой последнего слова.
c) После успешной передачи start split, хост OTG_HS генерирует прерывание CHH.
d) В ответ на прерывание CHH, устанавливается бит COMPLSPLT в регистре HCSPLT1, чтобы отправить полный split.
e) После успешной отправки полного split хост OTG_HS генерирует прерывание CHH.
f) В ответ на прерывание CHH отменяется выделение канала.

• Разделенные (split) транзакции Bulk/Control IN в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x, как описано в секции "Инициализация канала".
b) Хост OTG_HS записывает запрос start split в непериодический запрос после получения гранта от арбитра. Хост OTG_HS внутренне маскирует channel x для арбитража после записи запроса.
c) Как только был передан токен IN, хост OTG_HS генерирует прерывание CHH.
d) В ответ на прерывание CHH устанавливается бит COMPLSPLT в регистре HCSPLT2 и заново разрешается канал для отправки токена complete split. Это демаскирует channel x для арбитража.
e) Хост OTG_HS записывает запрос complete split в непериодический запрос после получения гранта от арбитра.
f) Хост OTG_HS начинает записывать пакет в системную память после успешного получения пакета.
g) Как только принятый пакет записан в системную память, хост OTG_HS генерирует прерывание CHH.
h) В ответ на прерывание CHH отменяется выделение канала.

• Разделенные (split) транзакции Interrupt OUT в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel 1, как описано в секции "Инициализация канала". Приложение должно установить бит ODDFRM в регистре HCCHAR1.
b) Хост OTG_HS начинает читать пакет.
c) Хост OTG_HS пытается отправить транзакцию start split.
d) После успешной передачи start split хост OTG_HS генерирует прерывание CHH.
e) В ответ на прерывание CHH устанавливается бит COMPLSPLT в регистре HCSPLT1, чтобы отправить complete split.
f) После успешного завершения транзакции complete split , хост OTG_HS генерирует прерывание CHH.
g) В ответ на прерывание CHH отменяется выделение канала.

• Разделенные (split) транзакции Interrupt IN в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x для start split, как описано в секции "Инициализация канала".
b) Хост OTG_HS записывает запрос IN в очередь запросов, как только channel x получит грант от арбитра.
c) Хост OTG_HS пытается отправить токен start split IN в начале следующего нечетного микрофрейма.
d) Хост OTG_HS генерирует прерывание CHH после успешной передачи токена start split IN.
e) В ответ на прерывание CHH устанавливается бит COMPLSPLT в регистре HCSPLT2, чтобы отправить complete split.
f) Как только был успешно принят пакет, хост OTG_HS начинает записывать данные в системную память.
g) Хост OTG_HS генерирует прерывание CHH после перемещения принятых данных в системную память.
h) В ответ на прерывание CHH, отменяется выделение канала или он инициализируется заново для следующего start split.

• Разделенные (split) транзакции Isochronous OUT в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x для start split (begin), как описано в секции "Инициализация канала". Приложение должно установить бит ODDFRM в регистре HCCHAR1 и запрограммировать поле MPS.
b) Хост OTG_HS начинает читать пакет.
c) После успешной передачи start split (begin), хост OTG_HS генерирует прерывание CHH.
d) В ответ на прерывание CHH заново инициализируются регистры для отправки start split (end).
e) После успешной передачи start split (end) хост OTG_HS генерирует прерывание CHH.
f) В ответ на прерывание CHH отменяется выделение канала.

• Разделенные (split) транзакции Isochronous IN в режиме DMA

Последовательность операций (channel x) следующая:

a) Инициализировать и разрешить channel x для start split, как описано в секции "Инициализация канала".
b) Хост OTG_HS записывает запрос IN в очередь запросов, как только channel x получит грант от арбитра.
c) Хост OTG_HS пытается отправить токен start split IN в начале следующего нечетного микрофрейма.
d) Хост OTG_HS генерирует прерывание CHH после успешной передачи токена start split IN.
e) В ответ на прерывание CHH устанавливается бит COMPLSPLT в регистре HCSPLT2, чтобы отправить complete split.
f) Как только был успешно принят пакет, хост OTG_HS начинает записывать данные в системную память.
g) Хост OTG_HS генерирует прерывание CHH после перемещения принятых данных в системную память.
h) В ответ на прерывание CHH, отменяется выделение канала или он инициализируется заново для следующего start split.

[Модель программирования устройства USB]

Инициализация конечной точки при USB reset:

1. Установка бита NAK для всех конечных точек OUT: SNAK = 1 в регистре OTG_HS_DOEPCTLx (для всех конечных точек OUT, x это номер конечной точки).

2. Демаскирование следующих бит прерывания:

INEP0 = 1 в регистре OTG_HS_DAINTMSK (control 0 IN endpoint)
OUTEP0 = 1 в регистре OTG_HS_DAINTMSK (control 0 OUT endpoint)
STUP = 1, XFRC = 1 в регистре DOEPMSK
XFRC = 1, TOC = 1 в регистре DIEPMSK

3. Настройка Data FIFO RAM для каждого FIFO:

- Запрограммируйте регистр OTG_HS_GRXFSIZ, чтобы иметь возможность принять данные control OUT и данные setup. Если порог не разрешен, то на минимуме он должен быть равным 1 пакету максимального размера control endpoint 0 плюс 2 слова (для статуса пакета данных control OUT) плюс 10 слов (для пакетов setup).
– Запрограммируйте регистр OTG_HS_TX0FSIZ (в зависимости от выбранного количества FIFO), чтобы иметь возможность передавать данные control IN. Как минимум, это должно быть равно 1 пакету максимального размера control endpoint 0.

4. Запрограммируйте следующие поля в регистрах, относящихся к конечной точке control OUT endpoint 0, чтобы принять пакет SETUP: STUPCNT = 3 в регистре OTG_HS_DOEPTSIZ0 (чтобы принять до 3 пакетов back-to-back SETUP).

5. В режиме DMA регистр DOEPDMA0 должен быть настроен на достоверный адрес, чтобы сохранить любой принятый пакет SETUP.

На этом этапе выполнена вся требуемая инициализация для приема пакетов SETUP.

Инициализация конечной точки по завершению энумерации:

1. На прерывании Enumeration Done (завершение энумерации, бит ENUMDNE в регистре OTG_HS_GINTSTS), прочитайте регистр OTG_HS_DSTS, чтобы определить скорость энумерации.

2. Запрограммируйте поле MPSIZ в регистре OTG_HS_DIEPCTL0, чтобы установить максимальный размер пакета. Этот шаг конфигурирует control endpoint 0. Максимальный размер пакета для control endpoint зависит от скорости энумерации.

3. В режиме DMA запрограммируйте регистр DOEPCTL0, чтобы разрешить control OUT endpoint 0 для приема пакета SETUP: EPENA = 1 в регистре DOEPCTL0.

На этом этапе устройство готово принять пакеты SOF и оно сконфигурировано для выполнения управляющих транзакций на control endpoint 0.

Инициализация конечной точки на команде SetAddress. Здесь описывается, что должно делать приложение, когда оно получает команду SetAddress в пакете SETUP.

1. Запрограммировать регистр OTG_HS_DCFG адресом устройства, полученным в команде SetAddress.

2. Запрограммировать ядро для отправки пакета IN статуса.

Инициализация конечной точки на команде SetConfiguration/SetInterface. Здесь описывается, что должно делать приложение, когда оно получает команду SetConfiguration или SetInterface в пакете SETUP.

1. Когда получена команда SetConfiguration, приложение должно запрограммировать регистры конечной точки, чтобы сконфигурировать в ней характеристики правильной конечной точки в новой конфигурации.

2. Когда принята команда SetInterface, приложение должно запрограммировать регистры конечной точки на тех конечных точках, на которые влияет команда установки интерфейса.

3. Некоторые конечные точки, которые были активными в предыдущей конфигурации или на альтернативной настройке, могут быть недопустимы в новой конфигурации, и тогда они должны быть деактивированы.

4. Демаскировать прерывание для каждой активной конечной точки, и замаскировать прерывания для всех не активных конечных точек в регистре OTG_HS_DAINTMSK.

5. Настроить Data FIFO RAM для каждого FIFO.

6. После того, как все требуемые конечные точки сконфигурированы, приложение должно запрограммировать ядро для отправки пакета status IN.

На этом этапе ядро устройства сконфигурировано для приема и передачи пакета данных любого типа.

Активация конечной точки. Здесь описываются шаги, которые требуются для активации конечной точки устройства или для конфигурирования существующей конечной точки устройства на новый тип.

1. Запрограммировать характеристики требуемой конечной точки в следующие поля регистра OTG_HS_DIEPCTLx (для конечных точек IN или двунаправленных конечных точек) или регистра OTG_HS_DOEPCTLx (для конечных точек OUT или двунаправленных конечных точек):

– максимальный размер пакета
– USB active endpoint = 1
– start data toggle (для конечных точек interrupt и bulk)
– Тип конечной точки
– номер TxFIFO

2. Как только конечная точка активирована, ядро начинает декодировать токены, адресованные этой конечной точке и отправлять правильное подтверждение (valid handshake) для каждого правильного токена этой конечной точки.

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

1. В деактивируемой конечной точке очистите бит USB active endpoint в регистре OTG_HS_DIEPCTLx (для конечных точек IN или двунаправленных конечных точек) или регистр OTG_HS_DOEPCTLx (для конечных точек OUT или двунаправленных конечных точек).

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

Примечание: приложение должно удовлетворять следующим условиям для настройки ядра, чтобы обрабатывать трафик: должны быть очищены биты NPTXFEM и RXFLVLM в регистре OTG_HS_GINTMSK.

[Транзакции SETUP и data OUT]

В этой секции описан внутренний поток данных и операции на уровне приложения во время транзакций data OUT и транзакций SETUP.

• Чтение пакета

Здесь описывается, как читать пакеты (data OUT и SETUP) из RxFIFO в режиме Slave.

1. При перехвате прерывания RXFLVL (в регистре OTG_HS_GINTSTS) приложение должно прочитать регистр выборки статуса приема (OTG_HS_GRXSTSP).

2. Приложение может маскировать прерывание RXFLVL (в регистре OTG_HS_GINTSTS) путем записи RXFLVL = 0 (в регистре OTG_HS_GINTMSK), пока оно не прочитает пакет из из RxFIFO.

3. Если количество байт принимаемого пакета не равно 0, то количество байт счетчика данных извлекается из принимаемого FIFO данных и сохраняется в памяти. Если количество байт принятого пакета равно 0, то данные не извлекаются из данных FIFO приема.

4. Считываемая информация статуса пакета RxFIFO показывает одно из следующего:

a) Глобальный шаблон OUT NAK: PKTSTS = Global OUT NAK, BCNT = 0x000, EPNUM = Don’t Care (0x0), DPID = Don’t Care (00b). Эти данные показывают, что вступил в силу бит global OUT NAK.
b) Шаблон пакета SETUP: PKTSTS = SETUP, BCNT = 0x008, EPNUM = Control EP Num, DPID = D0. Эти данные показывают, что в RxFIFO сейчас доступен для чтения пакет SETUP указанной конечной точки.
c) Шаблон завершения стадии настройки (setup stage done): PKTSTS = Setup Stage Done, BCNT = 0x0, EPNUM = Control EP Num, DPID = Don’t Care (00b). Эти данные показывают, что завершена стадия Setup для указанной конечной точки, и началась стадия Data. После того, как этот элемент был выбран из RxFIFO, ядро выставит прерывание Setup на указанной конечной точке control OUT.
d) Шаблон пакета Data OUT: PKTSTS = DataOUT, BCNT = размер данных принятого пакета data OUT (0 ≤ BCNT ≤ 1024), EPNUM = номеру конечной точки, на которой пакет был принят, DPID = Actual Data PID.
e) Шаблон завершения транзакции данных: PKTSTS = Data OUT Transfer Done, BCNT = 0x0, EPNUM = номеру конечной точки OUT, на которой завершена транзакция данных, DPID = Don’t Care (00b). Эти данные показывают, что была завершена транзакция OUT data для указанной конечной точки OUT. После того, как эта запись была извлечена из RxFIFO, ядро выставляет прерывание Transfer Completed на указанной конечной точке OUT.

5. После того, как полезная нагрузка данных была извлечена из RxFIFO, должно быть демаскировано прерывание RXFLVL (в регистре OTG_HS_GINTSTS).

6. Шаги 1–5 повторяются каждый раз, когда приложение детектирует установку линии прерывания из-за RXFLVL в OTG_HS_GINTSTS. Чтение пустого RxFIFO может привести к непредсказуемому поведению ядра.

Рис. 426 показывает алгоритм вышеописанной процедуры.

STM32F4 OTG HS Receive FIFO packet read in slave mode fig426

Рис. 426. Чтение пакета из RxFIFO в режиме Slave.

[Транзакции SETUP]

В этой секции описывается, как ядро обрабатывает пакеты SETUP и последовательность действий приложения для обработки транзакций SETUP.

• Требования приложения:

1. Чтобы принять пакет SETUP, должно быть запрограммировано в ненулевое значение поле STUPCNT (в регистре OTG_HS_DOEPTSIZx) контрольной точки control OUT. Когда приложение программирует поле STUPCNT в ненулевое значение, ядро принимает пакеты SETUP и записывает их в RxFIFO, независимо от статуса NAK и настройки бита EPENA в регистре OTG_HS_DOEPCTLx. Поле STUPCNT декрементируется всякий раз, когда управляющая конечная точка (control endpoint) получает пакет SETUP. Если поле STUPCNT не запрограммировано в правильное значение перед приемом пакета SETUP, ядро все еще принимает пакет SETUP и декрементирует поле STUPCNT, однако возможно, что приложение не сможет определить корректное количество принятых пакетов на стадии Setup транзакции управления.

STUPCNT = 3 в регистре OTG_HS_DOEPTSIZx

2. Приложение должно всегда выделять некоторое дополнительное пространство данных в RxFIFO, чтобы иметь возможность принять до 3 пакетов SETUP на конечной точке управления (control endpoint).

– Резервируемое пространство составляет 10 слов. 3 слова требуется для первого пакета SETUP, 1 слово требуется для завершения стадии Setup, и 6 слов для сохранения 2 дополнительных пакетов SETUP между всеми конечными точками управления.
– 3 слова на пакет SETUP требуются для сохранения 8 байт SETUP data и 4 байт статуса SETUP (шаблон пакета Setup). Ядро резервирует это пространство в RxFIFO данных чтобы записать только SETUP data, и никогда не использует это пространство для пакетов данных.

3. Приложение должно прочитать 2 слова пакета SETUP для RxFIFO.

4. Приложение должно прочитать из RxFIFO слово Setup stage done и отбросить его.

• Внутренний поток данных

1. Когда принят пакет SETUP, ядро записывает принятые данные в RxFIFO, без проверки доступного пространства в RxFIFO, и независимо от настроек бит NAK и STALL конечной точки. Ядро внутренне устанавливает биты IN NAK и OUT NAK для конечных точек control IN/OUT, на которых был принят пакет SETUP.

2. Для каждого пакета SETUP, принятого через USB, в RxFIFO записываются 3 слова данных, и поле STUPCNT декрементируется на 1.

– Первое слово содержит информацию управления, используемую внутри ядра.
– Второе слово содержит первые 4 байта команды SETUP.
– Третье слово содержит последние 4 байта команды SETUP.

3. Когда стадия Setup меняется на стадию Data IN/OUT, ядро записывает элемент (слово Setup stage done) в RxFIFO, показывая тем самым завершение стадии Setup.

4. На стороне AHB пакеты SETUP опустошаются (извлекаются) приложением.

5. Когда приложение извлекает слово Setup stage done из RxFIFO, срабатывает прерывание STUP (в регистре OTG_HS_DOEPINTx), показывая приложению, что оно может обработать принятый пакет SETUP. Ядро очищает бит разрешения конечной точки для конечных точек control OUT.

• Последовательность программирования приложения:

1. Программируется регистр OTG_HS_DOEPTSIZx: STUPCNT = 3.

2. Ожидание прерывания RXFLVL (в регистре OTG_HS_GINTSTS) и извлекаются пакеты данных из RxFIFO.

3. Срабатывание прерывания STUP (OTG_HS_DOEPINTx) помечает успешное завершение транзакции SETUP Data. На этом прерывании приложение должно прочитать регистр OTG_HS_DOEPTSIZx, чтобы определить количество принятых пакетов SETUP, и обработать последний принятый пакет SETUP.

STM32F4 OTG HS processing SETUP packet fig427

Рис. 427. Обработка пакета SETUP.

• Обработка более 3 пакетов back-to-back SETUP

В спецификации USB 2.0 определена нормальная ситуация, когда во время ошибки пакета SETUP, хост не посылает больше 3 пакетов back-to-back SETUP в одну и ту же конечную точку. Однако спецификация USB 2.0 не ограничивает количество пакетов back-to-back SETUP, которое хост может отправить в одну и ту же конечную точку. Когда имеет место это событие, контроллер OTG_HS генерирует прерывание (бит B2BSTUP в регистре OTG_HS_DOEPINTx).

• Установка глобального OUT NAK

Внутренний поток данных:

1. Когда приложение устанавливает Global OUT NAK (бит SGONAK в регистре OTG_HS_DCTL), ядро останавливает запись в RxFIFO данных, кроме пакетов SETUP. Независимо от от доступного пространства в RxFIFO, не изохронные токены OUT получают ответ отрицательного подтверждения NAK, и ядро игнорирует изохронные пакеты данных OUT.

2. Ядро записывает шаблон Global OUT NAK в RxFIFO. Приложение должно зарезервировать достаточно пространства в RxFIFO, чтобы записать этот шаблон данных.

3. Когда приложение извлекает шаблон Global OUT NAK из RxFIFO, ядро установит прерывание GONAKEFF (регистр OTG_HS_GINTSTS).

4. Как только приложение детектирует это прерывание, оно может предполагать, что ядро находится в режиме Global OUT NAK. Приложение может очистить это прерывание путем очистки бита в SGONAK в регистре OTG_HS_DCTL.

Последовательность программирования приложения:

1. Чтобы остановить прием любого вида данных в RxFIFO, приложение должно установить бит Global OUT NAK путем программирования поля: SGONAK = 1 в регистре OTG_HS_DCTL.

2. Ожидание прерывания GONAKEFF в регистре OTG_HS_GINTSTS. Когда это прерывание сработало, оно показывает, что ядро остановило прием любого типа данных, кроме пакетов SETUP.

3. Приложение может принимать правильные пакеты OUT после того, как оно установлено бит SGONAK в регистре OTG_HS_DCTL и перед тем, как ядро выставляет прерывание GONAKEFF (в регистре OTG_HS_GINTSTS).

4. Приложение может временно замаскировать это прерывание путем записи бита GINAKEFFM в регистре OTG_HS_GINTMSK: GINAKEFFM = 0.

5. Всякий раз, когда приложение готово выйти из режима Global OUT NAK, оно должно очистить бит SGONAK в регистре OTG_HS_DCTL. Это также очистит прерывание GONAKEFF (в регистре OTG_HS_GINTSTS): CGONAK = 1 в регистре OTG_HS_DCTL.

6. Если приложение ранее замаскировало это прерывание, то оно должно демаскировать его следующим образом: GINAKEFFM = 1 в регистре GINTMSK.

• Запрет конечной точки OUT

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

1. Перед запретом любой конечной точки OUT приложение должно разрешить в ядре режим Global OUT NAK: SGONAK = 1 в регистре OTG_HS_DCTL.

2. Ожидание прерывания GONAKEFF (регистр OTG_HS_GINTSTS).

3. Запрет требуемой конечной точки OUT путем программирования следующих полей в регистре OTG_HS_DOEPCTLx (x это номер конечной точки): EPDIS = 1, SNAK = 1.

4. Ожидание прерывания EPDISD (в регистре OTG_HS_DOEPINTx), которое показывает, что конечная точка OUT полностью запрещена. Когда выставлено прерывание EPDISD, ядро также очистит следующие биты в регистре OTG_HS_DOEPCTLx: EPDIS = 0, EPENA = 0.

5. Приложение должно очистить бит Global OUT NAK чтобы запустить прием данных и других не запрещенных конечных точек OUT: SGONAK = 0 в регистре OTG_HS_DCTL.

• Программирование остановки транзакции для конечных точек OUT

Приложение должно использовать следующую последовательность операций, чтобы остановить любые транзакции (из-за обрыва со стороны хоста, обычно из-за сброса):

1. Разрешение всех конечных точек OUT установкой EPENA = 1 во всех регистрах OTG_HS_DOEPCTLx.

2. Сброс (flush) RxFIFO следующим образом:

– Опрос OTG_HS_GRSTCTL.AHBIDL, пока он не установится в 1. Это покажет, что AHB master в состоянии ожидания (idle).
– Выполнение операции чтение-модификация-запись (read modify write) на OTG_HS_GRSTCTL.RXFFLSH = 1.
– Опрос OTG_HS_GRSTCTL.RXFFLSH, пока он не сбросится в 0, однако также используя таймаут менее 10 мс (соответствующий минимальной длительности сигнализации reset). Если 0 стал виден до таймаута, то RxFIFO был успешен. Если же произошел таймаут, когда все еще RXFFLSH == 1 (это может быть из-за того, что от хоста пришел пакет на EP0) то вернуться обратно (только однократно) на предыдущий шаг (выполнение операции чтение-модификация-запись).

3. Перед запретом любой конечной точки OUT, приложение должно разрешить в ядре режим Global OUT NAK, в соответствии с показанными выше инструкциями "Установка глобального OUT NAK". Это гарантирует, что данные в RxFIFO были успешно отправлены в приложение. Установка SGONAK = 1 в регистре OTG_HS_DCTL.

4. Ожидание прерывания GONAKEFF (в регистре OTG_HS_GINTSTS).

5. Запрет всех активных конечных точек OUT путем программирования следующих бит в регистре OTG_HS_DOEPCTLx: EPDIS = 1, SNAK = 1.

6. Ожидание прерывания EPDIS в регистре OTG_HS_DOEPINTx для каждой конечной точки OUT, запрограммированной на предыдущем шаге. Прерывание EPDIS показывает, что соответствующая конечная точка OUT полностью запрещена. Когда выставлено прерывание EPDIS, очищаются следующие биты в регистре OTG_HS_DOEPCTLx: EPENA = 0, EPDIS = 0, SNAK = 0.

• Традиционные (Generic) не изохронные транзакции данных OUT

В этой секции описаны обычные не изохронные транзакции OUT data (control, bulk или interrupt). Требования приложения:

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

2. Для пакетов OUT, поле размера транзакции в регистре размера транзакции конечной точки должно быть установлено кратным максимальному размеру пакета конечной точки, выровненным по границе слова (т. е. размер в байтах должен нацело делиться на 4):

transfer size[EPNUM] = n x (MPSIZ[EPNUM] + 4 – (MPSIZ[EPNUM] mod 4))
packet count[EPNUM] = n
n > 0

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

– Размер полезной нагрузки в памяти = начальному размеру транзакции, запрограммированному приложением – обновленный ядром конечный размер транзакции.
– Количество пакетов USB, к которых была принята эта полезная нагрузка = начальному счетчику пакетов, запрограммированному приложением – обновленный ядром конечный счетчик пакетов.

Внутренний поток данных:

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

2. Как только бит NAK очищен, ядро начинает принимать данные и записывать их в RxFIFO, пока есть место в RxFIFO. Для каждого пакета данных, принятого через USB, его данные и статус записываются в RxFIFO. Каждый пакет (пакет максимального размера или короткий пакет) записываемый в RxFIFO декрементирует на 1 поле счетчика пакетов для каждой конечной точки.

– Принятые пакеты данных OUT с неправильной CRC автоматически сбрасываются из RxFIFO.
– После отправки ACK для пакета через USB, ядро отбрасывает не изохронные пакеты данных OUT, к которым хост не смог определить ACK и отправил повторно. Приложение не детектирует несколько back-to-back пакетов данных OUT на одной и той же конечной точке с одним и тем же data PID. В этом случае счетчик пакетов не декрементируется.
– Если нет места в RxFIFO, изохронные и не изохронные пакеты данных игнорируются и не записываются в RxFIFO. Дополнительно не изохронные токены OUT получают ответ отрицательного подтверждения NAK.
– Во всех трех вышеприведенных случаях счетчик пакетов не декрементируется, потому что никакие данные не записаны в RxFIFO.

3. Когда счетчик пакетов становится равным 0, или когда на конечной точке принят короткий пакет, устанавливается бит NAK для этой конечной точки. Как только бит NAK установлен, изохронные и не изохронные пакеты данных игнорируются и не записываются в RxFIFO, и не изохронные токены OUT получают в ответ отрицательные подтверждения NAK.

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

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

6. Шаблон завершения транзакции данных OUT для конечной точки записывается в RxFIFO при одном из следующих условий:

– Размер транзакции 0 и счетчик пакетов 0.
– Последний записанный пакет данных в RxFIFO это короткий пакет (0 ≤ размер пакета < максимальный размер пакета).

7. Когда приложение извлекает эту запись (транзакция данных OUT завершена), генерируется прерывание завершения транзакции для конечной точки, и очищается разрешение конечной точки.

Последовательность действий приложения:

1. Запрограммировать регистр OTG_HS_DOEPTSIZx размером транзакции и соответствующим счетчиком пакетов.

2. Запрограммировать регистр OTG_HS_DOEPCTLx характеристиками конечной точки, и установить в нем биты EPENA и CNAK: EPENA = 1, CNAK = 1.

3. Подождать прерывания RXFLVL (в регистре OTG_HS_GINTSTS) и извлечь пакеты из RxFIFO (опустошить стек приема). Этот шаг может быть повторен несколько раз, в зависимости от размера транзакции.

4. Выставление прерывания XFRC (в регистре OTG_HS_DOEPINTx) помечает успешное завершение не изохронной транзакции данных OUT.

5. Прочитать регистр OTG_HS_DOEPTSIZx, чтобы определить размер принятой полезной нагрузки данных.

• Традиционная (Generic) изохронная транзакция данных OUT

В этой секции описывается обычная изохронная транзакция данных OUT. Требования приложения:

1. Все требования приложения для не изохронных транзакций данных OUT также применимы и к изохронным транзакциям данных OUT.

2. Для изохронных транзакций данных OUT поля размера транзакции и счетчика пакетов должны всегда быть установлены на максимальный размер пакета, которые могут быть приняты в одном фрейме и не более. Изохронные транзакции данных OUT не могут распространяться больше чем на 1 фрейм.

3. Приложение должно прочитать все изохронные пакеты данных OUT из RxFIFO (данные и статус) перед окончанием периодического фрейма (прерывание EOPF в регистре OTG_HS_GINTSTS).

4. Для приема данных в следующем фрейме должна быть разрешена изохронная конечная точка OUT после EOPF (OTG_HS_GINTSTS) и перед SOF (OTG_HS_GINTSTS).

Внутренний поток данных:

1. Внутренний поток данных для изохронных конечных точек OUT тот же самый, что и для не изохронных конечных точек OUT, но с некоторыми отличиями.

2. Когда изохронная конечная точка разрешена установкой бита Endpoint Enable и очисткой бита NAK, также соответственно должен быть установлен бит четного/нечетного фрейма (Even/Odd frame). Ядро принимает данные на изохронной конечной точке OUT только в отдельном фрейме, если удовлетворяется условие: EONUM (в регистре OTG_HS_DOEPCTLx) = SOFFN[0] (в регистре OTG_HS_DSTS).

3. Когда приложение полностью прочитало пакет данных isochronous OUT (данные и статус) из RxFIFO, ядро обновляет поле RXDPID в регистре OTG_HS_DOEPTSIZx значением data PID последнего изохронного пакета данных OUT, прочитанного из RxFIFO.

Последовательность действий приложения:

1. Запрограммировать регистр OTG_HS_DOEPTSIZx размером транзакции и соответствующим счетчиком пакетов.

2. Запрограммировать регистр OTG_HS_DOEPCTLx характеристиками конечной точки и установить в нем биты Endpoint Enable, ClearNAK и Even/Odd frame (четный/нечетный фрейм): EPENA = 1, CNAK=1, EONUM = (0: четный/1: нечетный).

3. Подождать прерывание RXFLVL (в регистре OTG_HS_GINTSTS) и выбрать пакеты данных из RxFIFO (опустошить стек приема). Этот шаг может быть повторен несколько раз, в зависимости от размера транзакции.

4. Выставляется прерывание XFRC (в регистре OTG_HS_DOEPINTx), что помечает завершение изохронной транзакции данных OUT. Это прерывание не обязательно означает, что данные в памяти хорошие.

5. Это прерывание не всегда может быть детектировано для изохронных транзакций OUT. Вместо этого приложение может детектировать прерывание IISOOXFRM в регистре OTG_HS_GINTSTS.

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

– RXDPID = D0 (в регистре OTG_HS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 1.
– RXDPID = D1 (в регистре OTG_HS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 2.
– RXDPID = D2 (в регистре OTG_HS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 3.

Количество пакетов USB, в которых была принята эта полезная нагрузка = начальному счетчику пакетов, запрограммированному приложением – обновленному ядром конечному счетчику пакетов.

Приложение может отбросить неправильные пакеты данных.

• Незавершенные изохронные транзакции данных OUT

Эта секция описывает последовательность действий приложения, когда изохронные пакеты данных OUT отбрасываются внутри ядра.

Внутренний поток данных:

1. Для изохронных конечных точек OUT не всегда может быть выставлено прерывание XFRC (в регистре OTG_HS_DOEPINTx). Если ядро отбросит изохронные пакеты данных OUT, приложение может не определить прерывание XFRC в следующих условиях:

– Когда RxFIFO не может принять полный пакет данных ISO OUT, ядро отбрасывает принятые данные ISO OUT.
– Когда принят изохронный пакет данных OUT с ошибками CRC.
– Когда поврежден принятый ядром изохронный токен OUT.
– Когда приложение очень медленно читает данные из RxFIFO.

2. Когда ядро детектирует окончание периодического фрейма перед завершением транзакции для всех изохронных конечных точек OUT, оно выставляет прерывание незавершенных изохронных данных OUT (бит IISOOXFRM в регистре OTG_HS_GINTSTS). Это показывает, что прерывание XFRC (в регистре OTG_HS_DOEPINTx) не выставлено на по крайней мере одной из изохронных конечных точках OUT. В этот момент конечная точка с незавершенной транзакцией остается разрешенной, но на USB активные транзакции на этой конечной точке не выполняются.

Последовательность действий приложения:

1. Выставление прерывания IISOOXFRM (в регистре OTG_HS_GINTSTS) показывает, что в текущем фрейме как минимум одна изохронная конечная точка OUT имеет незавершенную транзакцию.

2. Если это произошло из-за того, что изохронные данные OUT не были полностью извлечены из конечной точки, приложение должно гарантировать, что перед продолжением извлекло из RxFIFO все относящееся к изохронным конечным точкам OUT (их данные и статус). Когда все данные извлечены из RxFIFO, приложение может детектировать прерывание XFRC (в регистре OTG_HS_DOEPINTx). В этом случае приложение должно заново разрешить конечную точку для приема изохронных данных OUT в следующем фрейме.

3. Когда получено прерывание IISOOXFRM (в регистре OTG_HS_GINTSTS), прерывание должно прочитать регистры управления всех изохронных конечных точек OUT (в регистре OTG_HS_GINTSTS), чтобы определить, у какой конечной точки есть незавершенная транзакция в текущем микрофрейме. Транзакция конечной точки незавершенная, если удовлетворены оба следующих условия:

– бит EONUM (в регистре OTG_HS_DOEPCTLx) = SOFFN[0] (в регистре OTG_HS_DSTS).
– бит EPENA = 1 (в регистре OTG_HS_DOEPCTLx).

4. Предыдущий шаг может быть повторен перед детектированием прерывания SOF (в регистре OTG_HS_GINTSTS), чтобы гарантировать, что текущий номер фрейма не поменялся.

5. Для изохронных конечных точек OUT с незавершенными транзакциями приложение должно отбросить данные в памяти и запретить конечную точку установкой бита EPDIS в регистре OTG_HS_DOEPCTLx.

6. Подождать прерывания EPDIS (в регистре OTG_HS_DOEPINTx) и разрешить конечную точку для приема новых данных в следующем фрейме. Из-за того, что приложению нужно некоторое время для запрета конечной точки, приложение может не получить данные в следующем фрейме после приема неправильных изохронных данных.

• Приостановка (stalling) не изохронных конечных точек OUT

Эта секция описывает, как приложение может приостановить (stall) неизохронную конечную точку.

1. Поместить ядро в режим глобального отрицательного подтверждения (Global OUT NAK mode).

2. Запретить нужную конечную точку. Когда конечная точка запрещается, вместо установки бита SNAK в регистре OTG_HS_DOEPCTL нужно установить STALL = 1 (в регистре OTG_HS_DOEPCTL). Бит STALL всегда имеет приоритет перед битом NAK.

3. Когда приложение готово завершить подтверждение приостановки (STALL handshake) для конечной точки, бит STALL (в регистре OTG_HS_DOEPCTLx) должен быть очищен.

4. Если приложение устанавливает или очищает STALL для конечной точки из-за команды SetFeature.Endpoint Halt или ClearFeature.Endpoint Halt, бит STALL должен быть установлен или очищен перед тем, как приложение настроит транзакцию стадии Status на конечной точке управления (control endpoint).

[Примеры]

В этой секции показаны примеры и сценарии транзакций некоторых фундаментальных типов.

• Транзакция Bulk OUT режима Slave

На рис. 428 показан прием одиночного пакета Bulk OUT Data через USB и передача его на AHB, и описываются события, возникающие при этом процессе.

STM32F4 OTG HS Slave mode bulk OUT transaction fig428

Рис. 428. Транзакция Bulk OUT режима Slave.

После команды SetConfiguration/SetInterface, приложение инициализирует все конечные точки OUT установкой CNAK = 1 и EPENA = 1 (в регистре OTG_HS_DOEPCTLx), и устанавливает подходящие значения XFRSIZ и PKTCNT в регистре OTG_HS_DOEPTSIZx.

1. Хост пытается отправить данные (токен OUT) в конечную точку.

2. Когда ядро принимает токен OUT через USB, оно сохраняет пакет в RxFIFO, потому что там есть свободное место.

3. После записи полного пакета в RxFIFO, ядро выставляет прерывание RXFLVL (в регистре OTG_HS_GINTSTS).

4. При приеме PKTCNT количества USB-пакетов ядро внутри себя установит бит NAK для этой конечной точки, чтобы предотвратить прием любых дополнительных пакетов.

5. Приложение обрабатывает прерывание и вычитывает данные из RxFIFO.

6. Когда приложение прочитало все данные (эквивалентно размеру транзакции XFRSIZ), ядро генерирует прерывание XFRC (в регистре OTG_HS_DOEPINTx).

7. Приложение обрабатывает прерывание и использует установку бита прерывания завершения транзакции XFRC (в регистре OTG_HS_DOEPINTx) чтобы определить, что предполагаемая транзакция завершена.

Транзакции данных IN

• Запись пакета

В этой секции описывается, как приложение записывает пакет данных в FIFO конечной точки, когда разрешены выделенные TxFIFO.

1. Приложение может выбрать либо режим опроса состояния (polling), либо режим прерываний.

- В режиме опроса приложение отслеживает статус данных TxFIFO конечной точки путем чтения регистра OTG_HS_DTXFSTSx, чтобы определить, есть ли доступное место для данных в TxFIFO.
– В режиме прерываний приложение ждет прерывания TXFE (в регистре OTG_HS_DIEPINTx), и затем читает регистр OTG_HS_DTXFSTSx, чтобы определить наличие достаточного места в TxFIFO.
– Чтобы записать один пакет данных ненулевой длины (non-zero length data packet), в TxFIFO данных должно быть место для записи пакета полностью.
– Чтобы записать пакет нулевой длины (zero length packet) приложение не должно смотреть на свободное место в FIFO.

2. Используя один из вышеупомянутых методов, когда приложение определяет, что есть достаточно места для записи передаваемого пакета, одно должно сначала записать регистр управления конечной точки перед записью данных в FIFO. Обычно приложение должно выполнить операцию чтение-модификация-запись на регистре OTG_HS_DIEPCTLx, чтобы избежать любой модификации содержимого этого регистра, кроме установки бита Endpoint Enable.

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

• Установка NAK конечной точки IN

Внутренний поток данных:

1. Когда приложение устанавливает IN NAK для определенной конечной точки, ядро останавливает передачу данных на этой конечной точке, независимо от доступности данных в TxFIFO конечной точки.

2. Не изохронные токены IN получают в ответ отрицательное подтверждение NAK. Изохронные токены IN получают в ответ пакеты нулевой длины (zero-data-length packet).

3. Ядро выставляет прерывание INEPNE (IN endpoint NAK effective) в регистре OTG_HS_DIEPINTx в ответ на бит SNAK в регистре OTG_HS_DIEPCTLx.

4. Как только приложение увидел это прерывание, приложение может предполагать, что эта конечная точка IN находится в режиме отрицательных подтверждений (IN NAK mode). Это прерывание может быть очищено приложением установкой бита CNAK в регистре OTG_HS_DIEPCTLx.

Последовательность действий приложения:

1. Для остановки передачи любых данных в определенную конечную точку IN, приложение должно установить бит IN NAK. Для установки этого бита в регистре OTG_HS_DIEPCTLx должен быть установлен бит SNAK = 1.

2. Ожидание выставления прерывания INEPNE в регистре OTG_HS_DIEPINTx. Это прерывание показывает, что ядро остановило передачу данных на этой конечной точке.

3. Ядро может передать правильные данные IN на конечной точке после установки приложением бита NAK, но перед выставлением прерывания NAK Effective.

4. Приложение может временно замаскировать (запретить) это прерывание записью бита INEPNEM в регистре DIEPMSK: INEPNEM = 0.

5. Чтобы выйти из режима Endpoint NAK, приложение должно очистить бит статуса NAK (NAKSTS) в регистре OTG_HS_DIEPCTLx (CNAK = 1). Это также очистит прерывание INEPNE (в регистре OTG_HS_DIEPINTx).

6. Если приложение ранее замаскировало это прерывание, то оно должно демаскировать его следующим образом: INEPNEM = 1 в регистре DIEPMSK.

• Разрешение конечной точки IN.

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

Последовательность действий приложения:

1. Приложение должно прекратить записывать данные на AHB для запрещаемой конечной точки IN.

2. Приложение должно установить конечную точку в режим NAK: SNAK = 1 в регистре OTG_HS_DIEPCTLx.

3. Подождать прерывания INEPNE в регистре OTG_HS_DIEPINTx.

4. Установить следующие биты в регистре OTG_HS_DIEPCTLx конечной точки, которая должна быть запрещена: EPDIS = 1, SNAK = 1.

5. Выставление прерывания EPDISD в регистре OTG_HS_DIEPINTx покажет, что ядро полностью запретило указанную конечную точку. Вместе с выставлением этого прерывания также ядро очистит следующие биты в регистре OTG_HS_DIEPCTLx: EPENA = 0, EPDIS = 0.

6. Приложение должно прочитать регистр OTG_HS_DIEPTSIZx для периодической конечной точки IN, чтобы вычислить, сколько данных на конечной точке было передано через USB.

7. Приложение должно сбросить (flush) данные в TxFIFO конечной точки, путем установки следующих полей в регистре OTG_HS_GRSTCTL: TXFNUM = номеру TxFIFO конечной точки, TXFFLSH = 1.

Приложение должно опрашивать регистр OTG_HS_GRSTCTL, пока ядром не будет очищен бит TXFFLSH, что показывает окончание операции сброса данных (flush). Теперь для передачи новых данных на этой конечной точке приложение должно заново разрешить эту конечную точку.

• Программирование остановки транзакции для конечных точек IN

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

Последовательность операций:

1. Запрет конечной точки IN установкой EPDIS = 1 во всех регистрах OTG_HS_DIEPCTLx.

2. Подождать прерывание EPDIS в регистре OTG_HS_DIEPINTx, которое показывает, что конечная точка IN полностью запрещена. Когда прерывание EPDIS выставлено, очищаются следующие биты в регистре OTG_HS_DIEPCTLx: EPDIS = 0, EPENA = 0.

3. Сбросить TxFIFO программированием следующих бит в регистре OTG_HS_GRSTCTL: TXFFLSH = 1, TXFNUM = номер FIFO, специфический для конечной точки.

4. Приложение может начать опрос регистра OTG_HS_GRSTCTL, пока в нем не сбросится бит TXFFLSH. Когда этот бит очистится, то это гарантирует, что в TxFIFO не осталось данных.

• Обычные не периодические транзакции данных IN

Требования приложения:

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

2. Для транзакций IN, поле размера транзакции (Transfer Size) в регистре размера транзакции конечной точки обозначает полезную нагрузку, которая состоит из нескольких пакетов максимального размера и одного короткого пакета. Этот короткий пакет передается как сигнал окончания транзакции.

– Для передачи нескольких пакетов максимального размера и короткого пакета для окончания транзакции: Transfer size[EPNUM] = n x MPSIZ[EPNUM] + sp. Если (sp > 0), то Packet count[EPNUM] = n + 1. Иначе Packet count[EPNUM] = n.
– Для передачи одного пакета нулевой длины (zero-length data packet): Transfer size[EPNUM] = 0, Packet count[EPNUM] = 1.
– Для передачи нескольких пакетов максимальной длины и пакета нулевой длины в конце транзакции, приложение должно разделить транзакцию на 2 части. В первой части отправляются пакеты максимальной длины, и во второй части отправляется один пакет нулевой длины. Первая часть транзакции: transfer size[EPNUM] = n x MPSIZ[epnum]; packet count = n. Вторая часть транзакции: transfer size[EPNUM] = 0; packet count = 1;

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

4. Данные, взятые в TxFIFO = (transfer size, изначально запрограммированный приложением – обновленный ядром конечный transfer size).

- Данные, переданные через USB = (packet count, изначально запрограммированный приложением – обновленный ядром конечный packet count) x MPSIZ[EPNUM].
– Данные, еще не переданные через USB = (transfer size, изначально запрограммированный приложением – данные, переданные через USB).

Внутренний поток данных:

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

2. Приложение должно также записать требуемые данные в TxFIFO этой конечной точки.

3. Каждый раз, когда пакет записан приложением в TxFIFO, размер транзакции для этой конечной точки декрементируется на размер пакета. Данные, извлекаются из памяти приложением до тех пор, пока размер транзакции для конечной точки не станет равным 0. После записи данных в FIFO, счетчик "количества пакетов в FIFO" инкрементируется (это 3-разрядный счетчик, внутренне поддерживаемый ядром для каждого TxFIFO конечной точки IN. Максимальное количество пакетов, всегда поддерживаемых ядром в FIFO конечной точки IN, равно 8). Для пакетов нулевой длины для каждого FIFO устанавливается отдельный флаг, без каких-либо данных в FIFO.

4. Как только данные были записаны в TxFIFO, ядро считывает их при получении от хоста токена IN. Для каждого не изохронного пакета данных IN, переданного с положительным подтверждением ACK, счетчик пакетов декрементируется на 1, пока счетчик пакетов не достигнет 0. Счетчик пакетов не декрементируется при таймауте.

5. Для пакетов нулевой длины (показанных внутренним флагом zero length), ядро отправляет пакет нулевой длины (zero-length packet) для токена IN, и декрементирует поле счетчика пакетов.

6. Если нет данных в FIFO для принятого токена IN и поле счетчика пакетов для этой конечной точки равно 0, ядро генерирует прерывание "получен токен IN, когда TxFIFO пуст" (ITTXFE) для этой конечной точки. Это прерывание предоставляется, когда бит NAK конечной точки не установлен. Ядро отвечает отрицательным подтверждением NAK для не изохронных конечных точек на USB.

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

8. Когда размер транзакции (transfer size) равен 0, и счетчик пакетов (packet count) также равен 0, для конечной точки генерируется прерывание завершения транзакции (transfer complete, XFRC), и очищается разрешение конечной точки.

Последовательность действий приложения:

1. Запрограммировать регистр OTG_HS_DIEPTSIZx размером транзакции (transfer size) и соответствующим счетчиком пакетов (packet count).

2. Запрограммировать регистр OTG_HS_DIEPCTLx характеристиками конечной точки и установить биты CNAK и EPENA (Endpoint Enable).

3. Когда передается пакет не нулевой длины, приложение должно опрашивать регистр OTG_HS_DTXFSTSx (здесь x это номер FIFO, связанный с этой конечной точкой), чтобы определить, есть ли достаточно места в FIFO данных. Приложение может опционально использовать TXFE (в регистре OTG_HS_DIEPINTx) перед записью данных.

• Обычные периодические транзакции данных IN

Эта секция описывает типичные периодические транзакции данных IN.

Требования приложения:

1. Требования приложения 1, 2, 3 и 4 обычных не периодических транзакций IN (см. выше "Обычные не периодические транзакции данных IN") также применяются и для периодических транзакций данных IN, с незначительными модификациями требования 2.

– Приложение может передать только несколько пакетов максимального размера, или несколько пакетов максимального размера плюс короткий пакет в конце. Для передачи нескольких пакетов максимального размера плюс короткий пакет в конце транзакции, должны быть удовлетворены следующие условия: transfer size[EPNUM] = n x MPSIZ[EPNUM] + sp (здесь n это целое число => 0, и 0 ? sp < MPSIZ[EPNUM]). Если (sp > 0), packet count[EPNUM] = x + 1, иначе packet count[EPNUM] = n. Также должно выполняться MCNT[EPNUM] = packet count[EPNUM].
– Приложение не может передать пакет данных нулевой длины в конце транзакции. Оно может отправить один пакет нулевой длины отдельно. Для передачи одного пакета данных нулевой длины: transfer size[EPNUM] = 0, packet count[EPNUM] = 1, MCNT[EPNUM] = packet count[EPNUM].

2. Приложение может планировать передачу данных только по одному фрейму за раз.

– (MCNT – 1) x MPSIZ ≤ XFERSIZ ≤ MCNT x MPSIZ
– PKTCNT = MCNT (в регистре OTG_HS_DIEPTSIZx)
– Если XFERSIZ < MCNT x MPSIZ, то последний пакет данных транзакции это короткий пакет.

Имейте в виду, что поле MPSIZ находится в регистре OTG_HS_DIEPCTLx, а поля MCNT, PKTCNT и XFERSIZ в регистре OTG_HS_DIEPTSIZx.

3. Полностью передаваемые во фрейме данные должны быть записаны приложением в TxFIFO перед получением токена IN. Даже когда 1 слово данных для передачи пропущено в TxFIFO, когда получен токен IN, ядро ведет себя как если бы TxFIFO был пуст. Когда TxFIFO пуст:

– Для изохронных конечных точек IN через USB передается пакет нулевой длины.
– Для конечных точек interrupt IN передается отрицательное подтверждение NAK.

4. Для широкополосных конечных точке с тремя пакетами во фрейме приложение может может запрограммировать размер FIFO конечной точки на 2 x max_pkt_size, и загружать третий пакет после того, как первый пакет был передан черезUSB.

Внутренний поток данных:

1. Приложение должно установить поля размера транзакции и количества пакетов в регистрах, специфических для конечной точки, разрешить конечную точк для передачи данных.
2. Приложение также должно записать требуемые данные в связанный TxFIFO для конечной точки.
3. Каждый раз, когда приложение записывает пакет в TxFIFO, размер транзакции для этой конечной точки декрементируется на размер пакета. Данные вычитываются из памяти приложения, пока размер транзакции для конечной точки не станет равным 0.
4. Когда принят токен IN для периодической конечной точки, ядро передает в FIFO, если они доступны. Если полная полезная нагрузка данных (полный пакет, в режиме выделенного FIFO) для фрейма не представлена в FIFO, то ядро генерирует токен IN, когда принято прерывание TxFIFO для конечной точки.

– Пакет нулевой длины передается через USB для изохронных конечных точек IN.
– Отрицательное подтверждение NAK передается через USB для конечных точек interrupt IN.

5. Счетчик пакетов для конечной точки декрементируется на 1 в следующих условиях:

– Для изохронных конечных точек, когда передается пакет нулевой или ненулевой длины.
– Для конечных точек interrupt, когда передается положительное подтверждение ACK.
– когда размер транзакции и счетчик пакетов оба стали 0, генерируется прерывание завершения транзакции, и очищается бит разрешения конечной точки.

6. На интервале периодического фрейма ("Periodic frame Interval", управляемый PFIVL в регистре OTG_HS_DCFG), когда ядро обнаружит не пустые FIFO изохронной конечной точки IN, запланированной для текущего не пустого фрейма, генерируется прерывание IISOIXFR в регистре OTG_HS_GINTSTS.

Последовательность действий приложения:

1. Запрограммировать OTG_HS_DIEPCTLx регистр характеристиками конечной точки, и установить биты CNAK и EPENA.

2. Записать в TxFIFO данные для передачи в следующем фрейме.

3. Выставление прерывания ITTXFE (в регистре OTG_HS_DIEPINTx) показывает, что приложение пока не записало в TxFIFO все данные для передачи.

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

5. Выставление прерывания XFRC (в регистре OTG_HS_DIEPINTx) без прерывания ITTXFE в регистре OTG_HS_DIEPINTx показывает успешное завершение изохронной транзакции IN. Чтение регистра OTG_HS_DIEPTSIZx должно дать transfer size = 0 и packet count = 0, что покажет передачу всех данных через USB.

6. Выставление прерывания XFRC (в регистре OTG_HS_DIEPINTx), с прерыванием ITTXFE или без него (бит ITTXFE в регистре OTG_HS_DIEPINTx) показывает успешное завершение транзакции interrupt IN. Чтение регистра OTG_HS_DIEPTSIZx должно дать transfer size = 0 и packet count = 0, что показывает передачу всех данных через USB.

7. Выставление прерывания незавершенной транзакции isochronous IN (IISOIXFR) в регистре OTG_HS_GINTSTS ни с одним из вышеупомянутых прерываний показывает, что ядро не приняло как минимум 1 периодический токен IN в текущем фрейме.

• Незавершенные изохронные транзакции данных IN

В этой секции описывается, что должно делать приложение на незавершенной транзакции данных isochronous IN.

Внутренний поток данных:

1. Изохронная транзакция IN считается незавершенной, если присутствует одно из следующих условий:

a) Ядро приняло поврежденный токен isochronous IN на как минимум одной конечной точке isochronous IN. В этом случае приложение детектирует прерывание незавершенной изохронной транзакции IN (IISOIXFR в регистре OTG_HS_GINTSTS).
b) Приложение слишком медленно записывает данные полезной нагрузки в TxFIFO, и токен IN был принят до того, как вся полезная нагрузка была записана в TxFIFO. В этом случае приложение детектирует прерывание получения токена IN при пустом TxFIFO в регистре OTG_HS_DIEPINTx. Приложение может игнорировать это прерывание, поскольку это в конечном счете приводит к прерыванию незавершенной транзакции isochronous IN (бит IISOIXFR в регистре OTG_HS_GINTSTS) по окончанию периодического фрейма.

Ядро передает через USB пакет нулевой длины в ответ на принятый токен IN.

2. Приложение должно прекратить запись данных полезной нагрузки в TxFIFO, как только это становится возможным.

3. Приложение должно установить бит NAK и бит запрета для конечной точки.

4. Ядро запрещает конечную точку, очищает бит запрета, и выставляет прерывание Endpoint Disable для этой конечной точки.

Последовательность действий приложения:

1. Приложение может игнорировать принятый токен IN, когда на любой изохронной конечной точке IN есть прерывание пустого TxFIFO в регистре OTG_HS_DIEPINTx, поскольку в конечном итоге это приведет к прерыванию неполной isochronous IN транзакции (в регистре OTG_HS_GINTSTS).

2. Выставление прерывания неполной изохронной транзакции IN (в регистре OTG_HS_GINTSTS) показывает незавершенную транзакцию isochronous IN на как минимум одной изохронной конечной точке IN.

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

4. Приложение должно прекратить записывать данные в периодические TxFIFO, связанные с этими конечными точками на AHB.

5. Для запрета конечной точки запрограммировать следующие поля в регистре OTG_HS_DIEPCTLx: SNAK = 1, EPDIS = 1.

6. Выставление прерывания Endpoint Disabled в регистре OTG_HS_DIEPINTx показывает, что ядро запретило конечную точку. В этот момент приложение должно сбросить (flush) данные в связанном TxFIFO, или перезаписать существующие данные в FIFO путем разрешения конечной точки для новой транзакции в следующем микрофрейме. Чтобы сбросить (flush) данные, приложение должно использовать регистр OTG_HS_GRSTCTL.

• Приостановка (stalling) не изохронных конечных точек IN

Эта секция описывает, как приложение должно приостановить (stall) не изохронную конечную точку.

Последовательность действий приложения:

1. Запретить конечную точку IN, которая должна быть приостановлена. Также установить бит STALL.

2. EPDIS = 1 в регистре OTG_HS_DIEPCTLx, когда конечная точка уже разрешена. STALL = 1 в регистре OTG_HS_DIEPCTLx. Бит STALL всегда имеет приоритет над битом NAK.

3. Выставление прерывания Endpoint Disabled (в регистре OTG_HS_DIEPINTx) покажет приложению, что ядро запретило указанную конечную точку.

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

5. Всякий раз, когда приложение готово прекратить отправлять подтверждения STALL на конечной точке, оно должно очистить бит STALL в регистре OTG_HS_DIEPCTLx.

6. Если приложение установит или очистит бит STALL для конечной точки из-за команды SetFeature.Endpoint Halt или ClearFeature.Endpoint Halt, бит STALL должен быть установлен или очищен перед тем, как приложение настроит стадию Status транзакции на конечной точке управления (control endpoint).

Специальный случай: приостановка (stall) конечной точки control OUT

Ядро должно приостановить (stall) токены IN/OUT, если во время стадии данных транзакции управления (control transfer) хост отправил больше токенов IN/OUT, чем указано в пакете SETUP. В этом случае приложение должно разрешить прерывание ITTXFE в регистре OTG_HS_DIEPINTx и прерывание OTEPDIS в регистре OTG_HS_DOEPINTx во время стадии данных транзакции управления, после того, как ядро передало объем данных, указанный в пакете SETUP. Затем, когда приложение получит это прерывание, оно должно установить бит STALL в соответствующем регистре управления конечной точки, и очистить это прерывание.

[Наихудшее время отклика устройства USB]

Когда контроллер OTG_HS работает как устройство USB, существует наихудшее время отклика для любых токенов, которые следуют за isochronous OUT. Наихудшее время отклика зависит от тактовой частоты AHB.

Регистры ядра находятся в домене тактов AHB, и ядро не принимает никакие другие токены до того, как обновятся значения в этом регистре. Самый худший случай будет для любого токена, следующего за isochronous OUT, потом что для изохронной транзакции нет подтверждения (no handshake), и следующий токен может прийти раньше. Это самое худшее значение составляет 7 тактов PHY, когда тактовая частота AHB такая же, как и тактовая частота PHY. Когда тактовая частота AHB выше, это значение будет меньше.

Если такое условие наихудшего значения произойдет, то ядро отвечает на токены bulk/interrupt отрицательным подтверждением NAK и отбрасывает изохронные токены и токены SETUP. Хост интерпретирует это как событие таймаута для SETUP и пытается повторно передать пакет SETUP. Для изохронных передач прерывание незавершенной изохронной транзакции IN (IISOIXFR) и прерывание незавершенной изохронной транзакции OUT (IISOOXFR) оповещают приложение, что пакеты isochronous IN/OUT были отброшены.

Выбор значения TRDT в регистре OTG_HS_GUSBCFG. Значение TRDT это время, необходимое для MAC, в единицах тактов PHY после получения токена IN, чтобы получить статус FIFO, и таким образом первые данные из блока PFC. Это время включает в себя задержку между тактами PHY и AHB. Наихудшая задержка для этого - когда тактовая частота AHB такая же, как и тактовая частота PHY. Тогда задержка составит 5 тактов.

Как только MAC принял токен IN, эта информация (что токен принят) синхронизирована с тактовой частотой AHB через PFC (PFC работает на тактовой частоте AHB). Затем PFC считывает данные из SPRAM, и записывает их в двухпортовый буфер (тактируемый от двух тактовых частот). Затем MAC считывает данные из буфера-источника (глубиной 4 ячейки).

Если AHB работает на частоте выше, чем у PHY, то приложение может использовать меньшее значение для TRDT (в регистре OTG_HS_GUSBCFG).

На рис. 429 есть следующие сигналы:

• tkn_rcvd: информация для PFC от MAC о приеме токена.
• dynced_tkn_rcvd: удвоенная синхронизация tkn_rcvd, от домена PCLK к домену HCLK.
• spr_read: чтение в SPRAM.
• spr_addr: адрес для SPRAM.
• spr_rdata: чтение данных из SPRAM.
• srcbuf_push: проталкивание данных в буфер-источник.
• srcbuf_rdata: чтение данных из буфера-источника. Данные увидит MAC.

См. выше таблицу 213: значения TRDT в зависимости от тактовой частоты AHB во врезке "OTG_HS USB configuration register (OTG_HS_GUSBCFG)".

STM32F4 OTG HS TRDT max timing case fig429

Рис. 429. Случай максимального тайминга TRDT.

[Модель программирования OTG]

Контроллер OTG_HS это устройство OTG, поддерживающее протоколы HNP и SRP. Когда ядро подключено к коннектору типа "A", то оно называется как A-устройство (хост USB). Когда ядро подключено к коннектору типа "B", то оно работает как B-устройство (устройство USB). В режиме хоста контроллер OTG_HS выключает VBUS для экономии энергии питания. SRP это метод, с помощью которого B-устройство сигнализирует A-устройству включить питание VBUS. A-устройство должно сформировать импульс как на линии данных, так и на линии VBUS, однако хост может детектировать для SRP либо импульс линии данных, либо импульс VBUS. HNP это метод, с помощью которого B-устройство договаривается с хостом о смене ролей - чтобы оно стало хостом USB, а хост стал устройством USB. В согласованном режиме (Negotiated mode) после HNP B-устройство приостанавливает шину, и возвращается обратно к роли устройства USB.

Протокол запроса сессии A-устройства. Приложение должно установить бит управления функцией SRP в регистре конфигурации ядра USB. Это разрешит контроллеру OTG_HS детектировать SRP в качестве A-устройства.

STM32F4 OTG HS A device SRP fig430

Рис. 430. A-device SRP.

DRV_VBUS = сигнал управления VBUS для PHY
VBUS_VALID = сигнал допустимости уровня VBUS от PHY
A_VALID = сигнал A-периферии допустимости уровня VBUS для PHY
D+ = сигнал данных DP интерфейса USB
D- = сигнал данных DM интерфейса USB

1. Для экономии питания приложение приостанавливает и выключает порт, когда шина находится в состоянии ожидания, путем записи бит port suspend и port power в регистре управления и статуса порта.

2. PHY показывает выключение питания порта снятием сигнала VBUS_VALID.

3. Устройство должно детектировать SE0 в течение по крайней мере 2 мс, чтобы запустить SRP, когда питание VBUS выключено.

4. Для инициации SRP, устройство USB включает свой верхний подтягивающий резистор на линии данных (pull-up) на время от 5 до 10 мс. Контроллер OTG_HS детектирует импульс на линии данных.

5. Устройство USB переводит VBUS на уровень выше A-device session valid (2.0V минимум), чтобы сгенерировать импульс VBUS. Контроллер OTG_HS генерирует прерывание для приложения при детектировании SRP. Установится бит определения запроса сессии (Session request detected) в регистре глобального статуса прерываний (установится бит SRQINT в регистре OTG_HS_GINTSTS).

6. Приложение должно обработать прерывание запроса сессии и включить питание порта путем записи бита питания порта (power bit) в регистре управления и статуса порта. PHY показывает включение питания порта выставлением сигнала VBUS_VALID.

7. Когда на USB подано питание, устройство подключается, завершая тем самым процесс SRP.

Протокол запроса сессии B-устройства. Приложение должно установить бит управления функцией SRP в регистре конфигурации ядра USB. Это разрешит контроллеру OTG_HS инициировать SRP в качестве B-устройства. SRP является средством, через которое контроллер OTG_HS может запросить новую сессию у хоста USB.

STM32F4 OTG HS B device SRP fig431

Рис. 431. B-device SRP.

VBUS_VALID = сигнал допустимости уровня VBUS от PHY
B_VALID = сигнал B-периферии допустимой сессии для PHY
DISCHRG_VBUS = сигнал разряда для PHY
SESS_END = сигнал завершения сессии для PHY
CHRG_VBUS = сигнал заряда VBUS для PHY
DP = сигнал данных D+ интерфейса USB
DM = сигнал данных D- интерфейса USB

1. Чтобы экономить питание, хост приостанавливает и выключает питание порта, когда шина находится в состоянии ожидания. Контроллер OTG_HS установит бит ранней приостановки (early suspend bit) в регистре управления ядра после 3 мс нахождения шины в состоянии ожидания. После этого контроллер OTG_HS установит бит приостановки USB в регистре прерываний ядра. Контроллер OTG_HS информирует PHY разрядить VBUS.

2. PHY покажет для устройства завершение сессии. Это начальное условие для SRP. Контроллер OTG_HS требует 2 мс SE0 перед инициированием SRP. Для последовательного трансивера USB 1.1 full-speed, приложение должно подождать, пока VBUS разрядится до 0.2V после снятия BSVLD (в регистре OTG_HS_GOTGCTL). Это время разряда может быть получено от производителя трансивера, и оно может меняться в зависимости от производителя.

3. Ядро USB OTG информирует PHY, чтобы ускорить разряд VBUS.

4. Приложение инициирует SRP записью бита запроса сессии в регистре управления и статус OTG. Контроллер OTG_HS формирует импульс линии данных, затем импульс VBUS.

5. Хост детектирует SRP по импульсу либо от линии данных, либо от VBUS, и включает VBUS. PHY показывает для устройства включение VBUS.

6. Контроллер OTG_HS выполняет пульсацию VBUS. Хост запускает новую сессию включением VBUS, показывая успех SRP. Контроллер OTG_HS выставляет прерывание в приложение установкой бита успешного изменения состояния статуса запроса сессии в регистре статуса прерываний OTG. Приложение считывает бит успеха запроса сессии в регистре управления и статуса OTG.

7. Когда на USB подано питание, подключается контроллер OTG_HS, завершая процесс SRP.

Протокол хоста согласования A-устройства. HNP переключает роль хоста USB от A-устройства к B-устройству. Приложение должно установить бит разрешения функции HNP в регистре конфигурации ядра USB, чтобы разрешить контроллеру OTG_HS выполнять протокол HNP в качестве A-устройства.

STM32F4 OTG HS A device HNP fig432

Рис. 432. A-device HNP.

DPPULLDOWN = сигнал от ядра к PHY, чтобы разрешить/запретить подтягивающий вниз резистор (pull-down) на линии DP внутри PHY.
DMPULLDOWN = сигнал от ядра к PHY, чтобы разрешить/запретить подтягивающий вниз резистор (pull-down) на линии DM внутри PHY.

1. Контроллер OTG_HS отправляет дескриптор B-device SetFeature b_hnp_enable, чтобы разрешить поддержку HNP. Ответ ACK B-устройства показывает, что B-устройство поддерживает HNP. Приложение должно установить бит разрешения HNP хоста в регистре управления и статуса OTG, чтобы показать контроллеру OTG_HS, что B-устройство поддерживает HNP.

2. По завершении использования шины USB приложение приостанавливается путем записи бита приостановки порта в регистр управления и состояния порта хоста.

3. Когда B-устройство увидело приостановку USB, оно отключается, с указанием начального состояния HNP. B-устройство инициирует HNP только когда оно должно переключиться на роль хоста USB; иначе шина продолжает свою приостановку. Контроллер OTG_HS установит прерывание детектирования согласования хоста (host negotiation detected) в регистре статуса прерываний OTG, показывая старт HNP. Контроллер OTG_HS снимает DM pull-down и DM pull-down в PHY, чтобы показать роль устройства. PHY разрешает резистор OTG_HS_DP, чтобы показать подключение к B-устройству. Приложение должно прочитать бит текущего режима в регистре управления и статуса OTG, для определения режима работы устройства.

4. B-устройство детектирует подключение, выдает сброс USB, и выполняет энумерацию контроллера OTG_HS для трафика данных.

5. B-устройство продолжает свою роль хоста, инициирует трафик, и приостанавливает работу шины. Контроллер OTG_HS устанавливает бит ранней приостановки (early suspend) в регистре прерываний ядра после 3 мс ожидания шины. После этого контроллер OTG_HS устанавливает бит приостановки USB (USB Suspend) в регистре прерываний ядра.

6. В согласованном режиме (Negotiated mode) контроллер OTG_HS детектирует приостановку, отключается и переключается обратно на роль хоста. Контроллер OTG_HS выставляет DM pull-down и DM pull-down в PHY, чтобы показать, что он принимает на себя роль хоста USB.

7. Контроллер OTG_HS установит прерывание изменения статуса линии идентификации на коннекторе (Connector ID status change) в регистре статуса прерываний OTG. Приложение должно прочитать статус connector ID в регистре управления и статуса OTG, чтобы определить работу контроллера OTG_HS как A-устройства. Это покажет для приложения завершение HNP. Приложение должно прочитать бит текущего режима в регистре управления и статуса OTG, чтобы определить режим работы хоста.

8. B-устройство подключается, завершая процесс HNP.

Протокол согласования хоста B-устройства. HNP переключает роль хоста от B-устройства к A-устройству. Приложение должно установить бит разрешения функции HNP в регистре конфигурации ядра, чтобы разрешить контроллер OTG_HS выполнить протокол HNP в качестве B-устройства.

STM32F4 OTG HS B device HNP fig433

Рис. 433. B-device HNP.

DPPULLDOWN = сигнал от ядра к PHY чтобы разрешить/запретить pull-down на линии DP внутри PHY.
DMPULLDOWN = сигнал от ядра к PHY чтобы разрешить/запретить pull-down на линии DM внутри PHY.

1. A-устройство отправляет дескриптор SetFeature b_hnp_enable для разрешения поддержки HNP. Контроллер OTG_HS выдает положительное подтверждение ACK, показывающее, что он поддерживает HNP. Приложение должно установить бит разрешения устройства HNP в регистре управления и статуса OTG, чтобы показать поддержку HNP. Приложение установит бит запроса HNP в регистре управления и статуса OTG, чтобы показать контроллеру OTG_HS инициировать HNP.

2. По завершении использования шины A-устройство приостанавливается путем записи бита приостановки бита приостановки порта в регистре управления и статуса порта. Контроллер OTG_HS установит бит ранней приостановки (Early suspend) в регистре прерываний ядра при 3 мс состояния ожидания шины. После этого контроллер OTG_HS установит бит приостановки USB (USB suspend) в регистре прерываний ядра. Контроллер OTG_HS отключается и A-устройство детектирует SE0 на шине, показывающее HNP. Контроллер OTG_HS выставит DP pull-down и DM pull-down в PHY, чтобы показать, что он принимает на себя роль хоста USB. A-устройство ответит активацией своего OTG_HS_DP pull-up резистора в течение 3 мс после обнаружения SE0. Контроллер OTG_HS детектирует это как подключение. Контроллер OTG_HS установит прерывание изменения статуса успешного согласования хоста в регистре статуса прерываний OTG, показывая статус HNP. Приложение должно прочитать бит успеха согласования хоста в регистре управления и статуса OTG, чтобы определить успех согласования хоста. Приложение должно прочитать бит текущего режима в регистре прерываний ядра (OTG_HS_GINTSTS), чтобы определить режим работы хоста.

3. Приложение устанавливает бит сброса (PRST в регистре OTG_HS_HPRT), и контроллер OTG_HS выдает на шину USB reset, и выполняет энумерацию A-устройства для трафика данных.

4. Контроллер OTG_HS продолжает свою роль хоста при инициировании трафика, и по завершении приостанавливает шину записью бита приостановки порта в регистре управления и статуса порта.

5. В согласованном режиме (Negotiated mode), когда A-устройство определит приостановку, оно отключается и переключается обратно на роль хоста. Контроллер OTG_HS снимает DP pull-down и DM pull-down в PHY, чтобы показать назначение своей роли устройства USB.

6. Приложение должно прочитать бит текущего режима в регистре прерываний ядра (OTG_HS_GINTSTS), чтобы определить режим работы хоста.

7. Контроллер OTG_HS подключается, завершая процесс HNP.

[Ссылки]

1. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com.
2STM32: аббревиатуры и термины.
3. On-The-Go Supplement to the USB 2.0 Specification site:softelectro.ru.
4. Universal Serial Bus Revision 2.0 Specification.
5. 200121USBdoc.zip - pdf-файлы документации [3, 4].
6. STM32: контроллер USB OTG full-speed.
7. ULPI: стандарт для высокоскоростных USB PHY.