STM32: контроллер USB OTG full-speed |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Эта часть документации (перевод главы "USB on-the-go full-speed (OTG_FS)" [1]) относится к MCU семейства STM32F4xx, если не указано нечто иное. В STM32F4xx имеется два раздельных контроллера USB OTG: OTG_FS и OTG_HS. В этой статье описывается архитектура и модель программирования контроллера OTG_FS (описание OTG_HS см. в статье [6]). Все непонятные термины и сокращения см. в Словарике [2]. Также см. документы [3, 4, 5]. OTG_FS это контроллер устройства, выполняющего двойную роль (dual-role device, DRD) в архитектуре USB, т. е. поддерживает в зависимости от внешних условий как устройство USB, так и хост USB. Контроллер OTG_FS полностью совместим со спецификацией On-The-Go Supplement USB 2.0. Он может также быть сконфигурирован либо только как контроллер хоста, либо только как контроллер устройства USB, полностью совместимо со спецификацией USB 2.0. В режиме хоста OTG_FS поддерживает скорости full-speed (FS, 12 мегабит/сек) и low-speed (LS, 1.5 мегабит/сек), в то время как в режиме устройства поддерживаются только транзакции full-speed (FS, 12 мегабит/сек). OTG_FS поддерживает два новых протокола HNP и SRP. Единственный необходимый внешний компонент в режиме хоста - верхний ключ заряда (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 без питания, что увеличит время работы от батареи. • Сертифицирован USB-IF для Universal Serial Bus Specification Rev 2.0 [4, 5]. • Включает полную поддержку (PHY) для опционального протокола On-The-Go (OTG), описанного в спецификации On-The-Go Supplement Rev 1.3 [3, 5]. – Интегрированная поддержка идентификации устройств (A-B Device Identification, линия ID). • Программное конфигурирование для работы в качестве: – поддержки SRP как периферийное устройство USB FS (B-устройство). • Поддерживается FS SOF и LS импульсы для поддержания работоспособности (Keep-alive): – импульс SOF соединения PAD (OTG_FS_SOF). • Поддерживаются функции пониженного энергопотребления, такие как остановка системы во время USB Suspend, внутреннее выключение доменов тактов для цифрового ядра, управление питанием PHY и DFIFO. • Выделенное RAM на 1.25 килобайта для продвинутого управления FIFO: – Конфигуриуемое разделение пространства RAM на разные стеки FIFO для гибкого и эффективного использования RAM. • Гарантируется максимальная полоса пропускания USB до 1 фрейма (1 мс) без вмешательства системы. [Функции режима хоста USB] • Внешняя схема управления (charge pump) для генерации напряжения VBUS. • До 8 каналов хоста (pipe): каждый канал динамически может переконфигурироваться, чтобы выделить любой тип транзакции USB. • Встроенные аппаратный планировщик, обслуживающий: – до 8 interrupt запросов транзакций плюс isochronous запросов транзакций в периодической аппаратной очереди. • Управление общим RxFIFO, периодическим TxFIFO и непериодическим TxFIFO для эффективного использования RAM данных USB. [Функции режима устройства USB] • 1 двунаправленная конечная точка управления 0 (control endpoint0), или она же контрольная точка по умолчанию (default endpoint). • 3 конечные точки IN (далее конечные точки сокращенно обозначаются EP), конфигурируемые для поддержки транзакций Bulk, Interrupt или Isochronous. • 3 EP OUT, конфигурируемые для поддержки транзакций Bulk, Interrupt или Isochronous. • Управление общим RxFIFO и TxFIFO для эффективного использования RAM данных USB. • Управление до 4 выделенных стеков Tx-IN FIFO (по одному для каждой активной IN EP), для уменьшения нагрузки на процессор и приложение. • Поддержка функции программного отключения. Основные отличия контроллеров сведены в таблицу:
Новые функции OTG_HS потребовали дополнительных бит в регистрах (они были вставлены на места зарезервированных бит в регистрах контроллера OTG_FS) и даже потребовали добавления новых регистров. Во врезках статьи [6], в описаниях регистров высокоскоростного контроллера OTG_HS, дополнительные биты помечены оранжевым цветом. Рис. 386. Блок-схема OTG full-speed. Таблица 196. Ножки ввода/вывода OTG_FS.
Ядро OTG full-speed. USB OTG FS получает частоту тактов 48 МГц ±0.25% от контроллера сброса и тактирования (reset and clock controller, RCC), которая синтезируется от частоты внешнего кварца. Такты USB используются для домена 48 МГц на полной скорости (12 мегабит/сек) и эта тактовая частота должна быть разрешена перед конфигурированием ядра OTG FS core. CPU читает из ядра OTG FS и записывает в него через шину периферийных устройств AHB. CPU информируется о событиях USB через одну линию прерывания USB OTG, которая описана в секции "Прерывания OTG_FS". CPU передает данные через USB записью 32-битных слов в выделенные для этого ячейки OTG_FS (push-регистры). Эти данные автоматически сохраняются в стеки Tx-data FIFO, сконфигурированные из RAM данных USB. Здесь есть один Tx-FIFO push-регистр для каждой конечной точки IN (в режиме устройства USB) или канала OUT (в режиме хоста USB). CPU принимает данные от USB чтением 32-битных слов из выделенных адресов OTG_FS (pop-регистры). Эти данные автоматически попадают в общие стеки Rx-FIFO, сконфигурированные в 1.25 килобайтах RAM данных USB. Здесь есть один Rx-FIFO pop-регистр для каждой конечной точки OUT или канала IN. Слой протокола USB обслуживается подсистемой Serial Interface Engine (SIE), и поток данных преобразуется в последовательные биты USB FS/LS трансивером чипа MCU, формируя физический слой (PHY) шины USB. Встроенный full-speed OTG PHY управляется ядром OTG FS, и передает сигналы управления и данные USB через полноскоростное подмножество шины UTMI+ (UTMIFS). Это обеспечивает физическую поддержку подключения USB. Full-speed OTG PHY включает следующие компоненты: • Модуль трансивера FS/LS, который используется и хостом USB, и устройством USB. Он напрямую вырабатывает сигналы передачи и считывает сигналы приема на линиях DP/DM (или D+ и D-) USB. Внимание! Чтобы гарантировать правильную работу периферийного устройства USB OTG FS, частота AHB должна быть выше 14.2 МГц. [Устройство двойной роли (OTG dual role device, DRD] Рис. 387. Подключение устройства OTG A-B. Примечания: 1. Внешний регулятор напряжения нужен только когда делается устройство USB с питанием от шины VBUS. Детектирование линии ID. Роль устройства USB (по умолчанию) или хоста USB распознается по ножке входа ID (OTG_FS_ID). Состояние сигнала ID определяется при подключении USB, в зависимости на какой стороне кабеля находится подключаемый коннектор-мама micro-AB: • Если B-сторона кабеля USB подключена к плавающему проводу ID, то встроенный pull-up резистор определит высокий уровень ID, и по умолчанию будет назначена роль устройства USB. В этой конфигурации OTG_FS соответствует стандартной FSM, описанной в секции 6.8.2 On-The-Go B-device of the On-The-Go Specification Rev1.3 supplement to the USB2.0 [3, 5]. HNP устройства двойной роли. Бит настройки функционала HNP в регистре глобальной конфигурации (регистр OTG_FS_GUSBCFG, бит HNPCAP) разрешает ядру OTG_FS динамически менять свою роль от A-хоста до A-периферийного устройства USB и обратно, или от B-периферийного устройства до B-хоста и обратно, по протоколу host negotiation protocol (HNP). Текущее состояние можно прочитать по комбинированным значениям бита Connector ID Status в регистре глобального статуса и управления OTG (бит CIDSTS в регистре OTG_FS_GOTGCTL) и биту текущего режима работы регистра глобальных прерываний и статуса (бит CMOD в регистре OTG_FS_GINTSTS). Модель программирования HNP подробно описана далее в секции "Модель программирования OTG_FS". SRP устройства двойной роли. Бит настройки функционала SRP в регистре глобальной конфигурации (регистр OTG_FS_GUSBCFG, бит SRPCAP) разрешает ядру OTG_FS выключать генерацию VBUS для A-устройства, чтобы экономить энергию. Обратите внимание, что A-устройство всегда управляет VBUS, независимо от роли OTG_FS - хост или периферийное устройство. Модель программирования SRP A/B-устройства подробно описано далее в секции "Модель программирования OTG_FS". [Периферийное устройство USB] В этом разделе приведено функциональное описание OTG_FS в режиме периферийного устройства USB. OTG_FS работает как устройство USB в следующих условиях: • OTG B-устройство. Это состояние по умолчанию, если подключена B-сторона кабеля USB. Примечание: чтобы создать устройство с питанием от шины в случае B-устройства или конфигурации только разрешенного устройства USB, должен быть добавлен внешний регулятор, создающий напряжение питания VDD микроконтроллера из напряжения VBUS. Вывод VBUS может быть освобожден запретом опции анализа уровня VBUS. Это осуществляется установкой бита NOVBUSSENS в регистре OTG_FS_GCCFG. В этом случае VBUS считается внутри микроконтроллера, что у него всегда допустимый уровень для VBUS (5V).
Рис. 388. Подключение только как устройства USB. Устройство с функцией SRP. Бит управления функцией SRP в регистре глобальной конфигурации (бит SRPCAP в регистре OTG_FS_GUSBCFG) разрешает OTG_FS поддерживать протокол запроса сессии session request protocol (SRP). Этот метод позволяет экономить питание, подаваемое на A-устройство путем выключения VBUS, когда приостанавливается сессия USB. Подробно программная модель управления SRP описана ниже в секции "Протокол запроса сессии B-устройства". Powered (запитано). Вход VBUS определяет допустимое напряжение B-сессии, при котором устройству USB разрешено войти в состояние powered (см. [4, 5], параграф "9.1 USB Device States"). Тогда OTG_FS автоматически подключит DP pull-up резистор, чтобы сигнализировать о подключении к хосту full-speed устройства, и генерирует прерывание запроса сессии (бит SRQINT в регистре OTG_FS_GINTSTS), чтобы оповестить MCU о состоянии powered. Вход VBUS также гарантирует, что хостом поданы допустимые уровни VBUS во время операций USB. Если было определено, что уровень напряжения VBUS упал ниже допустимого для B-сессии (например из-за нарушения питания, или если порт хоста был выключен), то OTG_FS автоматически отключится, и детектируется окончание сессии с прерыванием (бит SEDET в регистре OTG_FS_GOTGINT), чтобы оповестить MCU о том, что OTG_FS вышел из состояния powered. В состоянии powered OTG_FS ожидает получения некоторой сигнализации сброса от хоста. Никакие другие операции USB невозможны. Когда получен сигнал сброса, генерируется прерывание reset (бит USBRST в регистре OTG_FS_GINTSTS). Когда сигнал сброса завершится, генерируется прерывание завершения энумерации (бит ENUMDNE в регистре OTG_FS_GINTSTS), и OTG_FS входит в состояние по умолчанию (Default state). Soft disconnect (программное отключение от шины). Из состояния powered можно выйти программно. Резистор DP pull-up отключается путем установки бита soft disconnect (бит SDIS в регистре OTG_FS_DCTL), что приводит к прерыванию отключения устройства на стороне хоста, даже если кабель USB устройства не был физически извлечен из порта хоста. Состояние по умолчанию (Default state). В этом состоянии OTG_FS ожидает приема команды SET_ADDRESS от хоста. Никакие другие операции USB невозможны. Когда на шине USB была определена правильная команда SET_ADDRESS, программа MCU записывает соответствующий номер в поле адреса регистра конфигурации устройства (DAD в регистре OTG_FS_DCFG). После этого устройство входит в состояние адресованности (address state), и оно готово отвечать на транзакции хоста по сконфигурированному адресу USB. Suspended (приостановка). Блок OTG_FS постоянно мониторит активность на шине USB. После 3 мс отсутствия активности (USB idleness) выдается прерывание предварительной приостановки (early suspend interrupt, бит ESUSP в регистре OTG_FS_GINTSTS), и это подтверждается на 3 мс позже, если это необходимо, прерыванием suspend (бит USBSUSP в регистре OTG_FS_GINTSTS). Тогда автоматически установится бит приостановки устройства в регистре статуса устройства (бит SUSPSTS в регистре OTG_FS_DSTS), и OTG_FS входит в состояние suspended. Из состояния suspended может быть осуществлен выход по инициативе самого устройства. В этом случае программа MCU устанавливает бит сигнализации remote wakeup (бит RWUSIG в регистре OTG_FS_DCTL), и очистит его в интервале от 1 до 15 мс. Когда был детектирован сигнал возобновления от хоста (resume signaling), генерируется resume interrupt (бит WKUPINT в регистре OTG_FS_GINTSTS), и автоматически очистится бит приостановки устройства. Ядро OTG_FS устанавливает следующие конечные точки USB: • Control endpoint 0 (EP0). Эта конечная точка двунаправленная, и обрабатывает только сообщения управления. Имеется отдельный набор регистров для обработки транзакций IN и OUT. Имеются соответствующие регистры управления (OTG_FS_DIEPCTL0/OTG_FS_DOEPCTL0), конфигурации транзакции (OTG_FS_DIEPTSIZ0/OTG_FS_DIEPTSIZ0) и статуса-прерывания (OTG_FS_DIEPINTx/OTG_FS_DOEPINT0). Биты, доступные внутри регистров управления и размеров транзакции, незначительно отличаются от других конечных точек. • 3 конечные точки IN. – Каждая из них может быть сконфигурирована для поддержки типов транзакций isochronous, bulk или interrupt. • 3 конечные точки OUT. – Каждая из них может быть сконфигурирована для поддержки типов транзакций isochronous, bulk или interrupt. Доступно управление следующими функциями конечной точки x через регистр управления IN/OUT (DIEPCTLx/DOEPCTLx): • Разрешение/запрет конечной точки. Регистры размера транзакции конечной точки x (DIEPTSIZx/DOEPTSIZx) позволяют приложению запрограммировать параметры размера транзакции и прочитать статус транзакции. Операция программирования должна быть выполнена перед установкой бита разрешения конечной точки в регистре управления конечной точкой. Как только конечная точка разрешена, эти поля становятся только для чтения, поскольку ядро OTG_FS обновляет их текущим статусом транзакции. Могут быть запрограммированы следующие параметры транзакции: • Размер транзакции в байтах. Регистры прерывания конечной точки x устройства (DIEPINTx/DOPEPINTx) показывают статус конечной точки по отношению к событиям USB и AHB. Приложение должно прочитать эти регистры, когда установлен бит прерывания OUT или IN endpoint в регистре прерываний ядра (бит OEPINT в регистре OTG_FS_GINTSTS или бит IEPINT в регистре OTG_FS_GINTSTS, соответственно). Перед тем, как приложение может читать эти регистры, оно должно сначала прочитать регистр прерывания всех конечных точек (OTG_FS_DAINT), чтобы узнать точный номер регистра прерывания конечной точки X устройства. Приложение должно очистить подходящие биты в этом регистре, чтобы очистить соответствующие биты в регистрах DAINT и GINTSTS. Ядро USB предоставляет следующие проверки статуса и генерации прерывания: • Прерывание завершения транзакции, показывающее, что перемещение данных завершено с обоих сторон - приложение (AHB) и аппаратура (USB). [Хост USB] В этом разделе приведено функциональное описание работы блока OTG_FS в режиме хоста USB. OTG_FS работает как хост USB в следующих условиях: • OTG A-хост. Состояние по умолчанию OTG A-устройства, когда подключена A-сторона кабеля USB. Примечание: генерация 5V VBUS внутри чипа MCU не поддерживается. По этой причине, если на плате доступно напряжение 5V или стабилизатор, то должен быть добавлен силовой ключ, чтобы управлять 5V шины VBUS. Внешний ключ или управляемый стабилизатор может управляться от любой выходной ножки GPIO. Это необходимо для конфигураций OTG A-хоста, A-устройства и режима "только хост". Вход VBUS обеспечивает проверку допустимых уровней VBUS, предоставленных ключом или стабилизатором во время нормальных операций USB, в то время как выходной сигнал перегрузки по току может приходить на любой вход GPIO, сконфигурированный для генерации прерываний порта. ISR перегрузки по току должен быстро запретить генерацию VBUS. Вывод VBUS может быть освобожден путем запрета опции анализа уровня VBUS (VBUS sensing). Это реализуется установкой бита NOVBUSSENS в регистре OTG_FS_GCCFG. В этом случае внутри чипа MCU считается, что на VBUS всегда допустимый уровень (5V). Рис. 389. Соединение только для хоста USB. Примечания: 1. STMPS2141STR необходим только если приложение должно поддерживать устройство USB с питанием от шины (VBUS powered device). Базовый ключ питания может использоваться, если 5V доступны на плате приложения. Хост с поддержкой SRP. Поддержка SRP доступна через бит опции SRP (бит SRPCAP в регистре OTG_FS_GUSBCFG). Когда функция SRP разрешена, хост может экономить энергию путем выключения напряжения VBUS, когда сессия USB приостановлена. Подробно программная модель хоста для управления SRP описана ниже в секции "Протокол запроса сессии A-устройства". Питание порта USB. Встроенная в MCU генерация 5V VBUS не поддерживается. По этой причине должна быть добавлена схема стабилизатора 5V (charge pump) или, если на плате приложения присутствует 5V, должен быть добавлен обычный силовой ключ, чтобы управлять уровнем 5V линии VBUS. Внешний стабилизатор (или ключ) может управляться любым выходом GPIO. Когда приложение хоста решает выдать питание на VBUS, используя выбранную ножку порта GPIO, оно также должно установить бит питания порта в регистре управления и статуса хоста (бит PPWR в регистре OTG_FS_HPRT). Допустимость уровня VBUS. Когда функции HNP или SRP разрешены, то ножка входа для анализа уровня VBUS (VBUS sensing pin, PA9) должна быть подключена к VBUS. Вход VBUS гарантирует, что допустимые уровни VBUS подаются на устройство USB во время рабочих операций. Любое непредвиденное падение напряжения VBUS ниже порога допустимости (4.25V) приведет к генерации прерывания OTG от бита детектирования завершения сессии (бит SEDET в регистре OTG_FS_GOTGINT). Тогда приложению нужно снять питание VBUS и очистить бит питания порта (бит PPWR в регистре OTG_FS_HPRT). Когда обе функции HNP и SRP запрещены, ножка детектирования уровня VBUS (PA9) не должна подключаться к VBUS. Она освобождается, и может использоваться как GPIO для любых целей. Также используется флаг перегрузки по току стабилизатора (charge pump overcurrent flag) для предотвращения электрического повреждения системы питания VBUS. Подсоедините выход сигнала перегрузки по току к любому входу порта GPIO и сконфигурируйте его на генерацию прерывания при активном уровне. Обработчик прерывания перегрузки по току (overcurrent ISR) должен немедленно запретить генерацию VBUS и очистить бит питания порта (бит PPWR в регистре OTG_FS_HPRT). Детектирование подключения периферийного устройства. Если разрешена функция SRP или HNP, то даже если периферийное устройство USB или B-устройства могут быть подключены в любой момент, OTG_FS не будет детектировать любое подключение к шине, пока на VBUS не окажется допустимый уровень (выше 4.75V). Когда VBUS на допустимом уровне, и подключено B-устройство, ядро OTG_FS выдает прерывание порта хоста, вызванное битом подключения устройства в регистре управления и статуса хоста (бит PCDET в регистре OTG_FS_HPRT). Когда обе функции HNP и SRP запрещены, периферийные устройства USB или B-устройства, как только они были подключены. Ядро OTG_FS выдает прерывание порта хоста, вызванное битом подключения устройства в регистре управления и статуса хоста (бит PCDET в регистре OTG_FS_HPRT). Детектирование отключения периферийного устройства. Событие отключения устройства USB приводит к срабатыванию прерывания отключения (disconnect detected interrupt, бит DISCINT в регистре OTG_FS_GINTSTS). Энумерация хоста. После того, как хостом было детектировано подключение периферийного устройства, хост должен запустить процесс энумерации USB отправкой новому устройству команды сброса (USB reset) и команд конфигурирования. Перед тем, как начать выдачу USB reset, приложение ждет прерывания OTG, вызванное битом окончания дребезга(debounce done, бит DBCDNE в регистре OTG_FS_GOTGINT), который показывает, что шина стала стабильной после электрических помех на pull-up резисторе DP (FS) или DM (LS), вызванных физическим подключением устройства USB к шине. Приложение выдает сигнализацию USB reset (single-ended zero, несимметричный нуль) через шину путем удержания бита сброса порта в регистре управления и статуса порта (бит PRST в регистре OTG_FS_HPRT) на время минимум 10 мс и максимум 20 мс. Приложение заботится об отсчете этого времени, и затем очищает бит сброса порта. Как только последовательность USB reset завершена, срабатывает прерывание порта хоста из-за изменения бита разрешения/запрета порта (бит PENCHNG в регистре OTG_FS_HPRT). Это оповещает приложение, что скорость прошедшего энумерацию устройства может быть прочитана из поля скорости порта в регистре управления и статуса хоста (бит PSPD в регистре OTG_FS_HPRT), и хост начинает выдавать сигналы начала фрейма SOF (FS) или сигналы "поддержания жизни" Keep alive (LS). Хост теперь готов завершить энумерацию периферийного устройства отправкой команд конфигурирования. Приостановка хоста (Host Suspend). Приложение принимает решение приостановить активность USB установкой бита приостановки порта в регистре управления и статуса порта (бит PSUSP в регистре OTG_FS_HPRT). Ядро OTG_FS останавливает отправку сигналов SOF и входит в состояние suspended. Из состояния suspended можно опционально выйти по инициативе подключенного устройства USB (remote wakeup). В этом случае при определении сигнала удаленного пробуждения генерируется прерывание remote wakeup (битом WKUPINT в регистре OTG_FS_GINTSTS), автоматически установится бит возобновления работы порта в регистре управления и статуса порта хоста (port resume, бит PRES в регистре OTG_FS_HPRT), и через USB автоматически передается сигнализация возобновления работы (resume signaling). Приложение должно выждать окно возобновления, и затем очистить бит возобновления порта, чтобы выйти из состояния suspended и перезапустить SOF. Если из состояния suspended произошел выход по инициативе хоста, то приложение должно установить бит возобновления порта (port resume bit), чтобы запустить сигнализацию возобновления на порту хоста, выждать окно времени возобновления и в завершении очистить бит возобновления порта. Ядро OTG_FS инстанциирует 8 каналов хоста. Каждый канал хоста поддерживает транзакцию хоста USB (USB pipe). Хост не может одновременно поддерживать больше 8 запросов транзакций. Если от приложения было выдано больше 8 запросов на транзакцию, то драйвер контроллера хоста (host controller driver, HCD) должен заново выделить каналы, когда они станут доступны после предыдущей активности, т. е. после получения прерываний завершения транзакции и приостановки канала. Каждый канал хоста может быть сконфигурирован для поддержки направления IN/OUT и любого типа периодической или не переодической транзакции. Каждый канал хоста обеспечивает надлежащие регистры управления (HCCHARx), конфигурации транзакции (HCTSIZx) и статуса/прерывания (HCINTx) вместе со связанными регистрами маски (HCINTMSKx). Управление каналом хоста. Для приложения доступны следующие опции управления каналом x через регистр характеристик канала (HCCHARx): – Разрешение/запрет канала. Транзакция канала хоста. Регистры размера транзакции канала (HCTSIZx) позволяют приложению запрограммировать размеры транзакции и прочитать статус транзакции. Программирование должно быть выполнено перед установкой бита разрешения канала в регистре характеристик канала. Как только конечная точка разрешена, поле счетчика пакетов становится read-only, поскольку ядро OTG_FS обновляет его в соответствии с текущим статусом транзакции. Можно запрограммировать следующие параметры: – Размер транзакции в байтах. Статус/прерывание канала хоста. Регистр прерывания канала x хоста (HCINTx) показывает состояние конечной точки, относящиеся к событиям USB и AHB. Приложение должно прочитать этот регистр, когда установится бит прерывания каналов хоста в регистре прерываний ядра (бит HCINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать эти регистры, оно должно сначала прочитать регистр прерывания всех каналов (HCAINT), чтобы получить точный номер канала для регистра прерывания канала x хоста. Приложение должно очистить подходящий бит в этом регистре, чтобы очистить соответствующие биты в регистрах HAINT и GINTSTS. Также доступны биты маски для каждого источника прерывания каждого канала в регистре OTG_FS_HCINTMSKx. Ядро хоста предоставляет следующие проверки статуса и генерацию прерывания: – Прерывание завершения транзакции, которое показывает завершение перемещения данных с обоих сторон - приложение (AHB) и аппаратура (USB). В ядро хоста встроен аппаратный планировщик, который может автономно изменять порядок выполнения запросов USB-транзакций, которые выдало приложение, и управлять ими. В начале каждого фрейма хост сначала выполняет периодические транзакции (isochronous и interrupt), за которыми идут не периодические (control и bulk) транзакции, чтобы достичь более высокого приоритета для типов транзакций isochronous и interrupt - в соответствии со спецификацией USB. Хост обрабатывает транзакции USB через очереди запросов (одна для периодических, другая для непериодических транзакций). Каждая очередь запросов может хранить в себе до 8 элементов. Каждый элемент очереди представляет запрос транзакции от приложения, и в нем хранится номер канала IN или OUT вместе с другой информацией, чтобы выполнять транзакции по шине USB. Порядок, в котором эти запросы были записаны в очередь, определяет последовательность выдачи транзакций через интерфейс USB. В начале каждого фрейма хост сначала обрабатывает очередь периодических запросов, затем очередь непериодических запросов. Хост выдает прерывание незавершенной периодической транзакции (incomplete periodic transfer interrupt, бит IPXFR в регистре OTG_FS_GINTSTS), если в конце фрейма все еще ожидает обработки isochronous или interrupt транзакция, запланированная для текущего фрейма. Ядро OTG_FS полностью отвечает за обслуживание периодических и не периодических очередей запросов. Регистр периодического TxFIFO и статуса очереди (HPTXSTS) и регистр не периодического TxFIFO и статуса очереди (HNPTXSTS) предназначены только для чтения, и могут использоваться приложением для чтения статуса каждой очереди запросов. Они содержат: • Количество свободных элементов в периодической (или не периодической) очереди запросов (всего может быть 8 максимум). Поскольку очереди запросов могут хранить максимум 8 элементов каждая, приложение может заранее планировать операции с хостом в отношении того момента, когда они физически достигают SB, максимум для 8 ожидающих периодических транзакций плюс 8 ожидающих непериодических транзакций. Для проталкивания запроса транзакции планировщику хоста (постановки запроса в очередь) приложение должно проверить, что в периодической (не периодической) очереди доступно как минимум одно свободное место, путем чтения бит PTXQSAV в регистре OTG_FS_HNPTXSTS или бит NPTQXSAV в регистре OTG_FS_HNPTXSTS. [Триггер SOF] Ядро OTG_FS предоставляет способ мониторить, отслеживать и конфигурировать кадры SOF в хосте и периферийном устройстве USB, также как и функцию вывода импульса SOF. Такие утилиты особенно полезны для техник адаптивной генерации тактов аудио, где периферийное аудиоустройство нуждается в синхронизации по изохронному потоку, предоставляемому PC, или хосту нужно обрезать свою частоту кадров в соответствии с требованиями периферийного аудиоустройства. SOF хоста. В режиме хоста программируется количество тактов PHY, происходящих между генерацией двух идущих друг за другом токена SOF (FS) или Keep-alive (LS). Это программируется в регистре интервалов фрейма хоста (OTG_FS_HFIR), что дает возможность приложению управлять периодом фреймов SOF. Генерируется прерывание в начале любого фрейма (бит SOF в регистре OTH_FS_GINTSTS). Текущий номер фрейма и оставшееся время до следующего SOF отслеживается в регистре номера фрейма хоста (OTG_FS_HFNUM). Сигнал импульса SOF длительностью 20 тактов HCLK, генерируемый на любом стартовом токене SOF, может быть выведен наружу через вывод OTG_FS_SOF с использованием бита SOFOUTEN в главном регистре конфигурации ядра (OTG_FS_GCCFG). Импульс SOF также внутри соединяется со входом триггера таймера 2 (TIM2), так что функции захвата по входу (input capture), сравнения по выходу (output compare) и сам таймер могут срабатывать по импульсу SOF. Соединение TIM2 разрешается битами ITR1_RMP регистра опций таймера 2 (TIM2_OR). Рис. 390. Соединение SOF. SOF периферийного устройства. В режиме устройства USB прерывание начала фрейма (start of frame, SOF) генерируется всякий раз, когда по шине USB принят токен SOF (бит SOF в регистре OTH_FS_GINTSTS). Соответствующий номер фрейма может быть прочитан в регистре статуса устройства (бит FNSOF регистра OTG_FS_DSTS). Также генерируется сигнал импульса SOF шириной 20 тактов HCLK, и он может быть доступен снаружи на выводе OTG_FS_SOF, если использовать бит разрешения выхода SOF в регистре основной конфигурации ядра (бит SOFOUTEN в регистре OTG_FS_GCCFG). Импульс SOF также внутри соединяется со входом триггера таймера 2 (TIM2), так что функции захвата по входу (input capture), сравнения по выходу (output compare) и сам таймер могут срабатывать по импульсу SOF. Соединение TIM2 разрешается битами ITR1_RMP регистра опций таймера 2 (TIM2_OR). Прерывание завершения периодического фрейма (GINTSTS/EOPF) используется для оповещения приложения, когда истекают 80%, 85%, 90% или 95% интервала фрейма, в зависимости от поля интервала в регистре конфигурации устройства (бит PFIVL в регистре OTG_FS_DCFG). Эта функция может использоваться, чтобы определить, завершен ли весь изохронный трафик для этого фрейма. [Режимы пониженного энергопотребления OTG] Таблица 197 определяет режимы пониженного потребления энергии STM32 (low power modes) и их совместимость с OTG. Таблица 197. Совместимость режимов STM32 low power с OTG.
Примечание (1): в режиме Stop возможны различные настройки. Также могут существовать различные ограничения, см. секцию 5 "Power controller (PWR)" [1] для получения представления, какие накладываются ограничения (если они есть) при использовании OTG. Потребление энергии блоком OTG PHY управляется тремя битами в основном регистре конфигурации ядра: • PHY power down (GCCFG/PWRDWN). Он включает/выключает модуль полноскоростного трансивера PHY. Он должен быть предварительно установлен, чтобы была возможна любая операция USB. Доступны техники снижения потребления энергии, когда USB находится в состоянии приостановки (suspended state), если сессия USB пока не работает, или устройство не подключено. • Stop PHY clock (STPPCLK bit in OTG_FS_PCGCCTL). Когда установлен бит остановки тактирования PHY в регистре управления тактированием, функцией управления тактами (clock gating) выключается большая часть домена тактов 48 МГц внутреннего полноскоростного ядра OTG. Урезается динамическое энергопотребление из-за активности переключения тактов USB, даже если приложение удерживает в работе вход тактов 48 МГц. Большая часть трансивера также запрещена, и остается в работе только часть, отвечающая за определение асинхронного возобновления или события удаленного пробуждения (remote wakeup event). Для снижения динамического энергопотребления USB data FIFO тактируется только когда к нему обращается ядро OTG_FS. [Динамическое обновление регистра OTG_FS_HFIR] Ядро USB обеспечивает возможность динамического обрезания периода фрейма SOF в режиме хоста, что позволяет синхронизировать внешнее устройство по фреймам SOF. Когда регистр OTG_FS_HFIR меняется в пределах текущего фрейма SOF, в следующем фрейме применяется период коррекции SOF, как это показано на рис. 391. Рис. 391. Динамическое обновление OTG_FS_HFIR. [USB data FIFO] В подсистеме USB применена 1.25 килобайт выделенной RAM с продвинутым механизмом управления FIFO. Модуль пакетного контроллера FIFO в ядре OTG_FS организует это пространство RAM в стеки Tx-FIFO, куда приложение проталкивает данные, где они временно хранятся до момента реальной передачи через USB. Также в этой RAM организуется один RxFIFO, куда данные принимаются через USB, и где они временно сохраняются до момента, когда их прочитает (извлечет) приложение. Количество FIFO и как они организованы внутри RAM, зависит от роли устройства. В режиме периферийного устройства для каждой активной конечной точки IN организуется дополнительный Tx-FIFO. Любой размер FIFO конфигурируется программно, чтобы лучше удовлетворить требованиям приложения. [Архитектура FIFO устройства USB] Рис. 392. Отображение адресов FIFO в режиме устройства и отображение доступа AHB FIFO. RxFIFO. Периферия OTG использует один FIFO приема, который получает данные, направляемые во все конечные точки OUT. Принятые пакеты укладываются друг на друга, пока в Rx-FIFO есть свободное место. Статус принятого пакета (где содержится номер конечной точки назначения OUT, количество байт, data PID и достоверность принятых данных) также сохраняется ядром поверх полезной нагрузки данных. Когда больше нет свободного места, транзакции хоста отклоняются выдачей NACK, и на адресованной конечной точке генерируется прерывание. Размер FIFO приема конфигурируется в регистре GRXFSIZ. Архитектура одиночного FIFO приема повышает эффективность заполнения буфера приема RAM устройства USB: • Все конечные точки OUT используют общий буфер RAM (общий FIFO). Приложение получает прерывание заполненности приема (Rx-FIFO non-empty, бит RXFLVL в регистре OTG_FS_GINTSTS), пока имеется как минимум 1 пакет, доступный для выборки из FIFO. Приложение считывает информацию о пакете из регистра статуса чтения и выборки (GRXSTSP) и в завершение извлекает данные из FIFO приема путем чтения по соответствующему адресу выборки определенной конечной точки. TxFIFO. У ядра есть выделенный стек FIFO для каждой конечной точки IN. Приложение конфигурирует размеры FIFO записью в регистр размера FIFO не периодических передач (OTG_FS_TX0FSIZ) для IN endpoint0 и в регистры размера FIFOx конечных точек IN (DIEPTXFx) для конечной точки IN с номером x. [Архитектура FIFO хоста USB] Рис. 393. Отображение адресов FIFO в режиме хоста и отображение доступа AHB FIFO. RxFIFO. Хост использует один FIFO приема для всех периодических и не периодических транзакций. Этот FIFO используется как буфер приема, чтобы хранить принятые данные (полезную нагрузку принятого пакета) от USB до тех пор, пока они не будут перемещены в память системы. Пакеты, принятые от любой конечной точки remote IN, укладываются в стек друг на друга, пока есть для этого свободное место. В FIFO также сохраняется статус каждого принятого пакета с каналом назначения хоста, количеством байт, data PID и достоверностью принятых данных. Размер FIFO приема конфигурируется в регистре (GRXFSIZ). Архитектура одиночного FIFO приема значительно повышает эффективность заполнения буфера приема данных хоста USB: • Все каналы хоста, сконфигурированные как IN, используют общий буфер RAM (общий FIFO). Приложение получает прерывание заполненности приема (RxFIFO not-empty), пока имеется как минимум 1 пакет, доступный для выборки из FIFO. Приложение считывает информацию пакета из регистра статуса и выборки приема, и в завершение извлекает данные из FIFO приема. TxFIFO. Хост использует один передающий FIFO для всех не периодических (control и bulk) OUT-транзакций, и один передающий FIFO для всех периодических (isochronous и interrupt) OUT-транзакций. Стеки FIFO используются как буферы передачи, чтобы временно хранить данные (полезную нагрузку передаваемого пакета), которые должны быть переданы через USB. Размер периодического (или не периодического) TxFIFO конфигурируется в регистрах HPTXFSIZ/HNPTXFSIZ. Две реализации TxFIFO необходимы для того, чтобы дать во фрейме USB более высокий приоритет трафику периодического типа. В начале каждого фрейма встроенный планировщик хоста сначала обрабатывает очередь периодических запросов, затем очередь не периодических. Архитектура двух FIFO передачи предоставляет хосту USB раздельную оптимизацию обслуживания периодического и не периодического буфера данных: • Все каналы хоста конфигурируются для поддержки периодических (не периодических) транзакций в направлении OUT с использованием одного и того же RAM-буфера (общие FIFO). Ядро OTG_FS выдает прерывание опустошенности периодического TxFIFO (бит PTXFE в регистре OTG_FS_GINTSTS), пока периодический Tx-FIFO пуст наполовину или полностью, в зависимости от бита уровня опустошенности стека периодической передачи (periodic Tx-FIFO empty level bit) в регистре конфигурации AHB (бит PTXFELVL в регистре OTG_FS_GAHBCFG). Приложение может проталкивать данные передачи в стек, пока есть в нем свободное место, что справедливо как для периодического TxFIFO, так и для периодической очереди запросов. Может быть прочитан регистр статуса периодического FIFO передачи и очереди (HPTXSTS), чтобы определить сколько есть места в них обоих. Ядро OTG_FS выдает прерывание опустошенности не периодического TxFIFO (бит NPTXFE в регистре OTG_FS_GINTSTS), пока не периодический TxFIFO опустошен наполовину или полностью, в зависимости от бита уровня опустошенности стека не периодической передачи (non periodic TxFIFO empty level bit) в регистре конфигурации AHB (бит TXFELVL в регистре OTG_FS_GAHBCFG). Приложение может проталкивать данные передачи в стек, пока есть в нем свободное место, что справедливо как для не периодического TxFIFO, так и для не периодической очереди запросов. Может быть прочитан регистр статуса не периодического FIFO передачи и очереди (HNPTXSTS), чтобы определить сколько есть места в них обоих. [Выделение FIFO RAM] Режим устройства USB, RxFIFO. Приложение должно выделить RAM для пакетов SETUP: 10 ячеек должно быть зарезервировано в FIFO приема, чтобы принимать пакеты настройки устройства USB (SETUP packets) на конечной точки управления (endpoint0). Ядро не использует эти ячейки, зарезервированные для пакетов SETUP, чтобы записывать туда какие-либо другие данные. Одна ячейка выделяется для Global OUT NAK. Информация статуса записывается в FIFO вместе с каждым принятым пакетом. Таким образом, для принимаемых пакетов должно быть выделено минимальное пространство (размер самого большого пакета / 4) + 1. Если разрешено несколько изохронных конечных точек, то как минимум два пространства (размер самого большого пакета / 4) + 1 должно быть выделено, чтобы принимать пакеты друг за другом. Обычно рекомендуется выделять два пространства (размер самого большого пакета / 4) + 1, чтобы когда предыдущий пакет передавался CPU, USB могло принять следующий пакет (двойная буферизация). Вместе с последним пакетом для каждой конечной точки в FIFO также проталкивается информация полного статуса. Обычно рекомендуется одна ячейка для каждой конечной точки OUT. Режим устройства USB, TxFIFO. Минимальное требуемое пространство RAM для каждой конечной точки IN передающего FIFO равно максимальному размеру пакета для конкретной конечной точки IN. Примечание: чем больше выделено места на FIFO конечной точки передачи IN, тем можно получить больше производительности по шине USB. Режим хоста USB, RxFIFO. Информация статуса записывается в FIFO вместе с каждым принятым пакетом. Таким образом, для приема пакетов должно быть выделено минимальное пространство (размер самого большого пакета / 4) + 1. Если разрешено несколько изохронных каналов, то должно быть выделено как минимум два пространства (размер самого большого пакета / 4) + 1, чтобы принимать следующие друг за другом пакеты. Обычно рекомендуется два пространства (размер самого большого пакета / 4) + 1, чтобы при обработке CPU одного уже принятого пакета по шине USB можно было принимать следующий пакет (двойная буферизация). Вместе с последним пакетом на канале хоста в FIFO проталкивается полная информация статуса транзакции. Так что для этого должна быть выделена еще одна ячейка. Режим хоста USB, TxFIFO. Минимальное требуемое пространство RAM для не периодического FIFO передачи хоста равно максимальному размеру пакета для всех поддерживаемых не периодических каналов OUT. Обычно рекомендуется выделять двойной размер самого большого пакета, чтобы в процессе передачи по USB одного пакета CPU мог предоставить следующий пакет. Примечание: чем больше выделено места на не периодический FIFO передачи, тем можно получить больше производительности по шине USB. Минимальное требуемое пространство RAM для периодического FIFO передачи хоста равно максимальному размеру пакета для всех поддерживаемых периодических каналов OUT. Если имеется как минимум одна конечная точка Isochronous OUT, то должно быть выделено как минимум двойное пространство от самого большого размера пакета этого канала. [Производительность системы USB] Лучшая производительность USB и системы в целом достигается благодаря большим буферам RAM, большим возможностям по конфигурированию размеров FIFO, быстрому 32-битному доступу к FIFO через регистры push/pop шины AHB, и особенно благодаря продвинутому механизму управления FIFO. Действительно, этот механизм позволяет OTG_FS заполнять доступное пространство RAM самым лучшим образом, вне зависимости от текущей последовательности USB. С помощью этих функций: • Приложение получает преимущества подстройки своего вмешательства в процесс передачи информации, чтобы оптимизировать использование процессорного времени CPU: – Оно может накапливать большое количество передаваемых данных, когда данные эффективно передаются через USB. • Ядро USB может поддерживает полную скорость (full speed, FS) передачи, обеспечивая максимальную полосу пропускания с большой автономией аппаратуры, освобождая приложение от лишних действий: – Имеется в распоряжении большой резерв передаваемых данных, чтобы можно было автономно управлять передачей данных по шине USB. Поскольку ядро OTG_FS может очень эффективно заполнять буфер 1.25 килобайт RAM, и поскольку этого пространства более чем достаточно для передачи/приема данных полноскоростного фрейма, система USB может выдерживать максимальную скорость передачи данных до одного фрейма USB (следующего с интервалами 1 мс) без какого-либо вмешательства со стороны CPU. [Прерывания OTG_FS] Когда контроллер OTG_FS работает в одном из режимов, либо устройства USB, либо хоста, приложение не должно обращаться к регистрам другого режима. Если произойдет недопустимый доступ, то произойдет прерывание несовпадения (mismatch interrupt), и это будет отражено в регистре прерываний ядра (бит MMIS в регистре OTG_FS_GINTSTS). Когда ядро переключается из одного режима в другой, регистры в новом режиме работы должны быть перепрограммированы так же, как после перезагрузки или сброса при включении питания. Рис. 394. Иерархия прерываний. Примечание (1): OTG_FS_WKUP становится активным (состояние лог. 1), когда происходит событие возобновления во время состояний L1 SLEEP или L2 SUSPEND. [Регистры управления и статуса OTG_FS] Через чтение и запись регистров управления и статуса (control and status registers, сокращенно CSR) через интерфейс AHB slave, приложение может управлять контроллером OTG_FS. Эти регистры 32-разрядные, и их адреса выровнены на границу 32-битного блока (байтовый адрес делится нацело на 4). К регистрам OTG_FS должен осуществляться доступ только через слова (32 бита). Регистры CSR классифицируются следующим образом: • Глобальные регистры ядра. В обоих режимах, и хоста и устройства USB, можно обращаться только к глобальным регистрам ядра, регистрам управления питания и тактирования, регистрам доступа к Data FIFO и к регистрам управления и статуса порта хоста. Когда контроллер OTG_FS работает в одном из режимов (хост или устройство), приложение не должно обращаться к регистрам другого режима. Если происходит недопустимый доступ, то генерируется прерывание несовпадения (mismatch interrupt), и это будет отражено в регистре прерываний ядра (бит MMIS в регистре OTG_FS_GINTSTS). Когда ядро переключается из одного режима в другой, регистры в новом режиме работы должны быть перепрограммированы так же, как после перезагрузки или сброса при включении питания. Карта памяти CSR. Регистры режима хоста и режима устройства находятся по разным адресам. Все регистры реализованы в домене тактов AHB. Смещения адресов регистров OTG_FS в адресном пространстве STM32F4xx отсчитываются относительно адреса 0x50000000 (см. таблицу 1 в даташите [1]). Рис. 395. Карта памяти регистров CSR. Примечание (1): x = 3 в режиме устройства USB и x = 7 в режиме хоста USB. Карта памяти глобальных CSR. Эти регистры доступны в обоих режимах - и в режиме хоста, и в режиме устройства USB. Таблица 198. Глобальные регистры ядра для управления и статуса (CSR).
Примечание (1): основное правило - использовать OTG_FS_HNPTXFSIZ в режиме хоста и OTG_FS_DIEPTXF0 в режиме устройства. Карта памяти CSR режима хоста. Эти регистры должны программироваться всякий раз, когда ядро меняет режим на хост USB. Таблица 199. Регистры ядра управления и статуса (CSR) режима хоста.
Примечание (1): основное правило - использовать OTG_FS_HNPTXFSIZ для режима хоста, и OTG_FS_DIEPTXF0 для режима устройства. Карта памяти CSR режима устройства. Эти регистры должны программироваться всякий раз, когда ядро меняет режим на устройство USB. Таблица 200. Регистры ядра управления и статуса (CSR) режима устройства.
Карта памяти регистров доступа к Data FIFO (DFIFO). Эти регистры доступны в обоих режимах, и хоста, и устройства USB. Они используются для записи или чтения пространства FIFO определенной конечной точки или канала, которые работают в указанном направлении. Если тип канала хоста IN, то FIFO канала можно только считывать. Подобным образом, если канал хоста типа OUT, то FIFO канала можно только записывать. Таблица 201. Карта регистров доступа к Data FIFO (DFIFO).
Примечание (1): x = 3 в режиме устройства USB и x = 7 в режиме хоста USB. Карта CSR питания и тактирования. Имеется только один регистр для управления питанием и тактированием. Он доступен в обоих режимах - и хоста, и устройства. Таблица 202. Регистры управления питанием и тактированием.
В описании функций регистров используются следующие сокращения: 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 Регистр OTG_FS_GOTGCTL управляет поведением функций ядра OTG и отражает его состояние.
Биты 31:20 зарезервированы и должны сохраняться в состоянии сброса (все нули). BSVLD (бит 19): B-Session VaLiD. Показывает статус трансивера в режиме устройства USB. 0: B-сессия неправильная. В режиме OTG можно использовать этот бит, чтобы определить, подключено устройство, или нет. Примечание: доступно только в режиме устройства USB. ASVLD (бит 18): A-Session VaLiD. Показывает статус трансивера в режиме хоста USB. 0: A-сессия неправильная. Примечание: доступно только в режиме хоста USB. DBCT (бит 17): длинное/короткое время дебоунсинга. Показывает время дебоунсинга обнаруженного подключения. 0: большое debounce time, используется для физических подключений (100 мс + 2.5 мкс). Примечание: доступно только в режиме хоста. CIDSTS (бит 16): Connector ID STatuS. Показывает состояние ID коннектора при событии подключения. 0: контроллер OTG_FS в режиме A-device (хост USB). Примечание: доступно в обоих режимах (и хоста, и устройства USB). Биты 15:12 зарезервированы и должны сохраняться в состоянии сброса (все нули). DHNPEN (бит 11): Device HNP Enabled. Приложение устанавливает этот бит, когда оно успешно получило команду SetFeature.SetHNPEnable от подключенного хоста USB. 0: HNP в приложении не разрешен. Примечание: доступно только в режиме устройства USB. HSHNPEN (бит 10): Host Set HNP Enable. Приложение устанавливает этот бит, когда оно успешно разрешило HNP (используя команду SetFeature.SetHNPEnable) на подключенном устройстве. 0: установка хоста HNP не разрешена. Примечание: доступно только в режиме хоста USB. HNPRQ (бит 9): HNP ReQuest. Приложение устанавливает этот бит, чтобы инициировать запрос HNP для подключенного хоста USB. Приложение может очистить этот бит записью в него 0, когда установлен бит успешной смены состояния согласования хоста (бит HNSSCHG в регистре OTG_FS_GOTGINT). Ядро очищает этот бит, когда очищен бит HNSSCHG. 0: нет запроса HNP. Примечание: доступно только в режиме устройства USB. HNGSCS (бит 8): Host NeGotiation SuCceSs. Ядро устанавливает этот бит, когда согласование хоста успешное. Ядро очищает этот бит, когда установлен бит запроса HNP (HNPRQ) в этом регистре. 0: согласование хоста не прошло. Примечание: доступно только в режиме устройства USB. Биты 7:2 зарезервированы и должны сохраняться в состоянии сброса (все нули). SRQ (бит 1): Session ReQuest. Приложение устанавливает этот бит для инициирования запроса сессии на USB. Приложение очищает этот бит записью 0, когда установлен бит успешной смены состояния согласования хоста (бит HNSSCHG в регистре OTG_FS_GOTGINT). Ядро очищает этот бит, когда очищаен бит HNSSCHG. Если Вы используете интерфейс последовательного трансиваера USB 1.1 full-speed для инициирования запроса сессии, то приложение должно ждать момента, когда VBUS разрядится до 0.2V после того, как в этом регистре очистится бит B-Session Valid (бит BSVLD в регистре OTG_FS_GOTGCTL). 0: нет запроса сессии. Примечание: доступно только в режиме устройства USB. SRQSCS (бит 0): Session ReQuest SuCceSs. Ядро установит этот бит, когда был успешный запрос инициации сессии. 0: неудача запроса сессии. Примечание: доступно только в режиме устройства USB. Смещение адреса: 0x004 Приложение считывает этот регистр, когда происходит прерывание OTG и очищает биты в этом регистре, чтобы очистить прерывание OTG.
Биты 31:20 зарезервированы и должны сохраняться в состоянии сброса (все нули). DBCDNE (бит 19): DeBounCe DoNE. Ядро установит этот бит, когда завершен дребезг после подключения устройства. Приложение может запустить сброс по шине (USB reset) после того, как увидит это прерывание. Этот бит достоверен только когда установлен бит HNP Capable или SRP Capable в регистре OTG_FS_GUSBCFG (соответственно бит HNPCAP или бит SRPCAP в регистре OTG_FS_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_FS_GOTGCTL чтобы проверить успех или неудачу. Примечание: доступно в обоих режимах (и хоста, и устройства USB). SRSSCHG (бит 8): Session Request Success Status CHanGe. Ядро установит этот бит при успехе или неудаче запроса сессии. Приложение должно прочитать бит запроса сессии (SRQSCS) в регистре OTG_FS_GOTGCTL чтобы определить успех или неудачу. Примечание: доступно в обоих режимах (и хоста, и устройства USB). Биты 7:3 зарезервированы и должны сохраняться в состоянии сброса (все нули). SEDET (бит 2): Session End DETected. Ядро установит этот бит чтобы показать, что уровень напряжения на VBUS больше недопустим для сессии B-периферии, когда VBUS < 0.8V. Биты 1:0 зарезервированы и должны сохраняться в состоянии сброса (все нули). Смещение адреса: 0x008 Этот регистр может использоваться для конфигурирования ядра после включения питания или смены режима. В регистре содержатся главным образом системные конфигурационные параметры AHB. Не меняйте этот регистр после начального программирования. Приложение должно программировать этот регистр перед началом любых транзакций либо на AHB, либо на USB.
Биты 31:9 зарезервированы и должны сохраняться в состоянии сброса (все нули). PTXFELVL (бит 8): Periodic TxFIFO Empty LeVeL. Показывает, когда переключаться биту прерывания опустошения периодического TxFIFO (бит PTXFE) в регистре OTG_FS_GINTSTS. 0: прерывание бита PTXFE (находится в регистре OTG_FS_GINTSTS) показывает, что периодический TxFIFO наполовину опустошен. Примечание: доступно только в режиме хоста USB. TXFELVL (бит 7): TxFIFO Empty LeVeL. В режиме устройства: бит показывает, когда срабатывает прерывание опустошения стека передачи конечной точки IN (IN endpoint Transmit FIFO empty, бит TXFE в регистре OTG_FS_DIEPINTx). 0: прерывание бита TXFE (находится в регистре OTG_FS_DIEPINTx) показывает, что IN Endpoint TxFIFO опустошен наполовину. В режиме хоста: бит показывает, когда сработает прерывание опустошения непериодического стека передачи (nonperiodic TxFIFO empty, бит NPTXFE в регистре OTG_FS_GINTSTS). 0: прерывание бита NPTXFE (находится в регистре OTG_FS_GINTSTS) показывает, что непериодический TxFIFO наполовину опустошен. Биты 6:1 зарезервированы и должны сохраняться в состоянии сброса (все нули). GINTMSK (бит 0): Global INTerrupt MaSK. Приложение использует этот бит, чтобы замаскировать или отменить маскирование линии прерывания. Независимо от состояния этого бита регистры статуса прерывания все равно будут изменяться ядром. 0: маскирование прерывания для приложения. Прерывание при событиях USB генерироваться не будет, но приложение все равно может определить состояние событий USB чтением бит регистров статуса прерывания. Примечание: доступно в обоих режимах (и хоста, и устройства USB). Смещение адреса: 0x00C Этот регистр может использоваться для конфигурирования ядра после включения питания или при смене режима (хоста или устройства USB). Регистр содержит конфигурационные параметры, относящиеся к USB и USB-PHY. Приложение должно программировать этот регистр перед запуском любых транзакций либо на AHB, либо на USB. Не меняйте этот регистр после начального программирования.
CTXPKT (бит 31): Corrupt Tx PacKeT. Этот бит предназначен только для отладки. Никогда не устанавливайте его в 1. Примечание: доступно в обоих режимах (и хоста, и устройства USB). FDMOD (бит 30): Force Device MODe. Запись 1 в этот бит переведет ядро в режим устройства USB независимо от уровня на выводе входа OTG_FS_ID. 0: нормальный режим. После установки этого бита приложение должно подождать как минимум 25 мс перед тем, как изменение вступит в силу. Примечание: доступно в обоих режимах (и хоста, и устройства USB). FHMOD (бит 29): Force host MODe. Запись 1 в этот бит переведет ядро в режим хоста USB независимо от уровня на выводе входа OTG_FS_ID. 0: нормальный режим. После установки этого бита приложение должно подождать как минимум 25 мс перед тем, как изменение вступит в силу. Примечание: доступно в обоих режимах (и хоста, и устройства USB). Биты 28:14 зарезервированы и должны сохраняться в состоянии сброса (все нули). TRDT (биты 13:10): USB TuRnaround Time. Эти биты позволяют установить время выполнения работы в тактах PHY. Они должны быть установлены по таблице 203, в зависимости от частоты AHB в приложении. Чем больше значения TRDT, тем больше разрешается растянуть время ответа USB на токены IN, чтобы компенсировать латентность доступа на чтение AHB при обращении к Data FIFO. Примечание: доступно только в режиме устройства USB.
HNPCAP (бит 9): HNP-CAPable. Приложение использует этот бит для управления возможностями HNP контроллера OTG_FS. 0: функционал HNP не разрешен. Примечание: доступно в обоих режимах (и хоста, и устройства USB). SRPCAP (бит 8): SRP-CAPable. Приложение использует этот бит для управления возможностями HNP контроллера OTG_FS. Если ядро работает с B-устройством, несовместимым с SRP, то оно не может запросить подключенное A-устройство (хост USB) активировать VBUS и начать сессию. 0: функционал 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 Приложение использует этот регистр для сброса различных аппаратных функций внутри ядра.
AHBIDL (бит 31): AHB master IDLe. Показывает, что машина состояний мастера AHB находится в состоянии ожидания. Примечание: доступно в обоих режимах (и хоста, и устройства USB). Биты 30:11 зарезервированы и должны сохраняться в состоянии сброса (все нули). TXFNUM (биты 10:6): TxFIFO NUMber. Это номер FIFO, содержимое которого должно быть сброшено (flush) с использованием бита TxFIFO Flush. Это поле не должно изменяться, пока ядро не очистит бит TxFIFO Flush. 00000: 00001: 00010: сброс TxFIFO 2 в режиме устройства. ... 00101: сброс TxFIFO 15 в режиме устройства. 10000: сброс всех передающих FIFO в режиме устройства или в режиме хоста. Примечание: доступно в обоих режимах (и хоста, и устройства USB). TXFFLSH (бит 5): TxFIFO FLuSH. Этот бит селективно сбрасывает один или все передающие FIFO, но не может это делать, если ядро находится посередине транзакции. Приложение должно записать этот бит только после проверки, что ядро ни записывает в TxFIFO, ни читает из TxFIFO. Проверка происходит с помощью следующих регистров: Read - NAK Effective Interrupt гарантирует, что ядро не читает из 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_FS_PCGCCTL Все машины состояния модуля (кроме блока 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 Это регистр прерываний приложения для событий системного уровня текущего режима (режим устройства или режим хоста USB). Некоторые биты в этом регистры достоверны только в режиме хоста, в то время как другие доступны только в режиме устройства. Чтобы очистить биты статуса прерывания типа rc_w1, приложение должно записать 1 в этот бит. Статус прерываний FIFO только для чтения; как только программа читает FIFO или записывает его при обслуживании этих прерываний, события прерывания FIFO очищаются автоматически. Приложение должно очистить регистр OTG_FS_GINTSTS при инициализации перед демаскированием бита прерывания, чтобы избежать генерации любых прерываний до инициализации.
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_FS_GAHBCFG). Примечание: доступно только в режиме хоста USB. HCINT (бит 25): Host Channels INTerrupt. Ядро установит этот бит, чтобы показать наличие ожидающего обработки прерывания на одном из каналов ядра (режим хоста). Приложение должно прочитать регистр OTG_FS_HAINT, чтобы определить точный номер канала, на котором произошло прерывание, и затем прочитать соответствующий регистр OTG_FS_HCINTx, чтобы точно определить причину прерывания. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса в регистре OTG_FS_HCINTx. Примечание: доступно только в режиме хоста USB. HPRTINT (бит 24): Host PoRt INTerrupt. Ядро установит этот бит, чтобы показать изменение статуса портов контроллера OTG_FS в режиме хоста. Приложение должно прочитать регистр OTG_FS_HPRT, чтобы точно определить событие, которое привел к этому прерыванию. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса регистра OTG_FS_HPRT. Примечание: доступно только в режиме хоста USB. Биты 23:22 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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_FS_DAINT, чтобы определить точный номер конечной точки OUT, на которой произошло прерывание, и затем прочитать соответствующий регистр OTG_FS_DOEPINTx для точного определения причины прерывания. Для очистки этого бита приложение должно очистить соответствующий бит статуса регистра OTG_FS_DOEPINTx. Примечание: доступно только в режиме устройства USB. IEPINT (бит 18): IN EndPoint INTerrupt. Ядро установит этот бит, чтобы показать ожидающее обработки прерывание на одной из конечных точек IN (в режиме устройства). Приложение должно прочитать регистр OTG_FS_DAINT, чтобы точно определить номер конечной точки, для которой произошло прерывание, и затем прочитать соответствующий регистр OTG_FS_DIEPINTx, чтобы точно определить причину прерывания. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса регистра OTG_FS_DIEPINTx. Примечание: доступно только в режиме устройства USB. Биты 17:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). EOPF (бит 15): End Of Periodic Frame interrupt. Показывает, что в текущем фрейме достигнут период, указанный в поле интервала периодического фрейма (бит PFIVL) регистра OTG_FS_DCFG. Примечание: доступно только в режиме устройства USB. ISOODRP (бит 14): ISOchronous OUT packet DRoPped interrupt. Ядро установит этот бит, когда не смогло записать изохронный пакет OUT packet в RxFIFO, потому что в RxFIFO не было достаточно места для размещения пакета максимального размера конечной точки isochronous OUT. Примечание: доступно только в режиме устройства USB. ENUMDNE (бит 13): ENUMeration DoNE. Ядро установит этот бит, чтобы показать завершение быстрой энумерации (speed enumeration). Приложение должно прочитать регистр OTG_FS_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_FS_DCTL, установленный приложением, вступил в действие для ядра. Бит GONAKEFF может быть очищен запись бита Clear global OUT NAK (бит CGONAK) в регистре OTG_FS_DCTL. Примечание: доступно только в режиме устройства USB. GINAKEFF (бит 6): Global IN non-periodic NAK EFFective. Показывает, что бит Set global non-periodic IN NAK (бит SGINAK) в регистре OTG_FS_DCTL, установленный приложением, вступил в действие для ядра. Таким образом, ядро произвело выборку бита Global IN NAK, установленного приложением. Бит GINAKEFF можно очистить путем очистки бита (бит CGINAK) в регистре OTG_FS_DCTL. Это прерывание необязательно означает, что через USB было отправлено отрицательное подтверждение (NAK handshake). Бит STALL имеет приоритет над битом NAK. Примечание: доступно только в режиме устройства USB. NPTXFE (бит 5): Non-Periodic TxFIFO Empty. Это прерывание выставляется, когда непериодический передающий FIFO опустошен наполовину или полностью, и есть место для как минимум одной записи в непериодическую очередь запросов передачи. Статус половинной или полной опустошенности определяется по биту non-periodic TxFIFO empty level (бит TXFELVL) в регистре OTG_FS_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_FS_GOTGINT), чтобы точно определить событие, вызвавшее это прерывание. Чтобы очистить этот бит, приложение должно очистить соответствующий бит статуса в регистре OTG_FS_GOTGINT. Примечание: доступно в обоих режимах (и хоста, и устройства USB). MMIS (бит 1): Mode MISmatch interrupt. Ядро установит этот бит, когда приложение пытается получить доступ к регистру, к которому в этом режиме доступ невозможен. Например, ядро находится в режиме устройства USB, и при этом обращается к регистру режима хоста. Доступ к регистру завершается на AHB ответом OKAY, однако внутренне игнорируется ядром, и не оказывает влияние на работу ядра. Примечание: доступно в обоих режимах (и хоста, и устройства USB). CMOD (бит 0): Current MODe of operation. Показывает текущий режим работы ядра. 0: режим устройства USB. Примечание: доступно в обоих режимах (и хоста, и устройства USB). Смещение адреса: 0x018 Этот регистр работает вместе с регистром прерываний ядра (Core interrupt register, OTG_FS_GINTSTS). Когда бит прерывания замаскирован, то связанное с этим битом прерывание не генерируется. Однако все еще установится бит регистра прерываний ядра (OTG_FS_GINTSTS), соответствующий этому прерыванию.
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:22 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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_FS_DCTL, установленный приложением. Примечание: доступно только в режиме устройства USB. GINAKEFFM (бит 6): Global non-periodic IN NAK EFFective mask. Этот бит, если сброшен в 0, маскирует (запрещает) генерацию прерывания, когда для ядра вступил в действие бит Set global non-periodic IN NAK (бит SGINAK) в регистре OTG_FS_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_FS. Примечание: доступно в обоих режимах (и хоста, и устройства USB). Бит 0 зарезервирован и должен сохраняться в состоянии сброса (0). Смещение адреса для Read: 0x01C Чтение регистра 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_FS_GINTSTS). [Режим хоста USB]
Биты 31:21 зарезервированы и должны сохраняться в состоянии сброса (все нули). PKTSTS (биты 20:17): PacKeT STatuS. Показывает статус принятого пакета. 0010: принят пакет данных IN. DPID (биты 16:15): Data PID. Показывает Data PID принятого пакета. 00: DATA0 BCNT (биты 14:4): Byte CouNT. Показывает количество байт данных принятого пакета IN. CHNUM (биты 3:0): CHannel NUMber. Показывает номер канала, которому принадлежит текущий принятый пакет. [Режим устройства USB]
Биты 31:25 зарезервированы и должны сохраняться в состоянии сброса (все нули). FRMNUM (24:21): FRaMe NUMber. Это младшие значащие 4 бита номера фрейма USB, в котором был принят пакет. Это поле поддерживается только когда поддерживаются изохронные конечные точки OUT. PKTSTS (биты 20:17): PacKeT STatuS. Показывает состояние принятого пакета. 0001: Global OUT NAK (срабатывает прерывание). DPID (биты 16:15): Data PID. Показывает Data PID принятого пакета данных OUT. 00: DATA0 BCNT (биты 14:4): Byte CouNT. Показывает количество байт данных принятого пакета. EPNUM (биты 3:0): EndPoint NUMber (биты 3:0): CHannel NUMber. Показывает номер конечной точки, которой принадлежит текущий принятый пакет. Смещение адреса: 0x024 Приложение может запрограммировать размер RAM, которое должно быть выделено для RxFIFO.
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). RXFD (биты 15:0): RxFIFO Depth. Это значение показывает глубину стека приема в единицах 32-битных слов. Минимальное значение этого поля 16, максимальное 256. Значение после сброса в этом регистре указано как самая большая глубина данных RxFIFO. Смещение адреса: 0x028
[Режим хоста 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 Примечание: в режиме устройства USB этот регистр недопустим. Это регистр только для чтения, содержащий информацию о свободном месте не периодического TxFIFO и очереди не периодических запросов на передачу.
Бит 31 зарезервирован, и должен сохраняться в состоянии сброса (0). NPTXQTOP (биты 30:24): TOP of the Non-Periodic Transmit request queue. Элемент очереди не периодических запросов на передачу, который в настоящий момент обрабатывает MAC. Биты 30:27: номер канала/конечной точки. Биты 26:25: 00: токен IN/OUT. Бит 24: Terminate (последний элемент для выбранного канала / выбранной конечной точки). NPTQXSAV (биты 23:16): Non-Periodic Transmit request Queue Space AVailable. Показывает количество свободного доступного места в очереди не периодических запросов передачи. Эта очередь в режиме хоста хранит запросы обоих видов - IN и OUT. В режиме устройства имеются только запросы IN. 00000000: очередь не периодических запросов передачи заполнена. NPTXFSAV (биты 15:0): Non-Periodic TxFIFO Space AVailable. Показывает количество доступного пространства в не периодическом TxFIFO. Значения указываются в единицах 32-битных слов. 0x0000: не периодический TxFIFO заполнен. Смещение адреса: 0x038
Биты 31:22 зарезервированы и должны сохраняться в состоянии сброса (все нули). NOVBUSSENS (бит 21): опция запрета определения корректности уровня VBUS. Когда этот бит установлен, ядро считается всегда допустимым уровень VBUS (5V), т. е. этот уровень не анализируется. При этом освобождается для других функций выделенная ножка порта, предназначенная для анализа уровня VBUS. Соединение с VBUS может быть переназначено на другую ножку корпуса, и уровень VBUS может отслеживаться программно. Эта опция подходит только для устройств, которые работают либо только в режиме хоста, либо только в режиме устройства. 0: аппаратный анализ уровня VBUS. SOFOUTEN (бит 20): SOF OUTput ENable. 0: импульс SOF недоступен на выделенной ножке корпуса (OTG_FS_SOF). VBUSBSEN (бит 19): разрешение детектирования уровня VBUS для B-устройства (устройство USB). 0: детектирование VBUS устройства B запрещено. VBUSASEN (бит 18): разрешение детектирования уровня VBUS для A-устройства (хост USB). 0: детектирование VBUS устройства A запрещено. Бит 17 зарезервирован, и должен сохраняться в состоянии сброса (0). PWRDWN (бит 16): PoWeR DoWN. Используется для активации трансивера при передаче/приеме. 0: трансивер выключен. Биты 15:0 зарезервированы и должны сохраняться в состоянии сброса. Смещение адреса: 0x03C Этот регистр содержит значение идентификатора продукта (Product ID).
PRODUCT_ID (биты 31:0): Поле Product ID. В нем содержится программируемый приложением идентификатор. Смещение адреса: 0x100
PTXFD (биты 31:16): глубина периодического TxFIFO хоста. Это значение указывается в единицах 32-битных слов, минимальное значение 16. PTXSA (биты 15:0): начальный адрес периодического TxFIFO хоста. Значение после сброса в этом регистре равна сумме самой большой глубины данных RxFIFO и самой большой глубины данных не периодического TxFIFO. Здесь x (в диапазоне от 1 до 3) обозначает номер FIFO. Смещение адреса: 0x104 + 0x04 * (x - 1)
INEPTXFD (биты 31:16): IN EndPoint TxFIFO Depth. Глубина FIFO передачи конечной точки IN. Значение указывается в единицах 32-битных слов. Минимальное значение 16. Значение после сброса в этом регистре указывается как самая большая глубина IN endpoint FIFO. INEPTXSA (биты 15:0): IN EndPoint FIFOx Rransmit RAM Start Address. Это поле содержит начальный адрес для передающего FIFO конечной точки IN. Этот адрес должен быть выровнен на адрес 32-битного слова (т. е. байтовый адрес должен нацело делиться на 4). [Регистры режима хоста USB] Значения бит в описании регистров выражены двоичными значениями, если не указано нечто иное. Регистры режима хоста влияют на работу ядра только когда оно работает как хост USB. К регистрам режима хоста не должен осуществляется доступ, когда ядро работает в режиме устройства USB, поскольку результат такого доступа будет не определен. Смещение адреса: 0x400 Через этот регистр программа конфигурирует ядро после включения питания. Не изменяйте этот регистр после инициализации хоста.
Биты 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: зарезервировано. Примечание: FSLSPCS должно быть установлено на событии подключения в соответствии со скоростью подключенного устройства (после изменения этого бита должен быть произведен программный сброс). Смещение адреса: 0x404 В этом регистре хранится информация по интервалу фрейма для текущей скорости, с которой прошел энумерацию контроллер OTG_FS.
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). FRIVL (биты 15:0): FRame InterVaL. Значение, которое приложение программирует в это поле, задает интервал между двумя следующими друг за другом токенами SOF (FS) или Keep-Alive (LS). В этом поле содержится количество тактов PHY, которое составляет требуемый интервал фрейма. Приложение может записать значение в этот регистр только после того, как установлен бит разрешения порта в регистре управления и статуса порта хоста (бит PENA в регистре OTG_FS_HPRT). Если никакое значение не запрограммировано, ядро вычисляет значение на основе тактов PHY, указанных в поле FS/LS PHY Clock Select регистра конфигурации хоста (FSLSPCS в регистре OTG_FS_HCFG). Не меняйте значение в этом поле после начальной конфигурации. Интервал фрейма = 1 мс x (FRIVL - 1) Смещение адреса: 0x408 В этом регистре показывается текущий номер фрейма. Также в нем показано оставшееся время (в единицах количества тактов PHY) в текущем фрейме.
FTREM (биты 31:16): Frame Time REMaining. Показывает количество времени, оставшееся в текущем фрейме, в единицах тактов PHY. Это поле автоматически декрементируется с каждым тактом PHY. Когда оно достигает 0, то автоматически перезагружается значением из регистра интервала фрейма, и новый SOF передается через USB. FRNUM (биты 15:0): FRame NUMber. Это поле инкрементируется, когда новый SOF передается через USB, и очищается в 0, когда достигает 0x3FFF. Смещение адреса: 0x410 Это регистр только для чтения, где содержится информация свободного пространства для периодического TxFIFO и очереди периодических запросов.
PTXQTOP (биты 31:24): TOP of the Periodic Transmit request Queue. Показывает элемент в очереди периодических запросов передачи, который в настоящий момент обрабатывает MAC. Этот регистр используется для отладки. Бит 31: нечетный/четный фрейм. 0: отправляется четный фрейм. Биты 30:27: номер канала/конечной точки. Биты 26:25: тип. 00: IN/OUT. Бит 24: Terminate (последнего элемента выбранного канала/конечной точки). PTXQSAV (биты 23:16): Periodic Transmit request Queue Space AVailable. Показывает количество свободных ячеек, доступное для записи в очередь периодических запросов передачи. Эта очередь хранит оба вида направлений запросов - IN и OUT. 00000000: очередь периодических запросов передачи заполнена. PTXFSAVL (биты 15:0): Periodic Transmit data FIFO Space AVailable. Показывает количество свободных ячеек, доступное для записи в периодический TxFIFO. Значение представлено в единицах 32-битных слов. 0x0000: периодический TxFIFO заполнен. Смещение адреса: 0x414 Когда на канале происходит значительное событие, в приложении происходит прерывание по биту прерывания в регистре прерываний ядра (бит HCINT в регистре OTG_FS_GINTSTS) с информации о прерывании в регистре OTG_FS_HAINT. Это показано на рис. 394. Здесь находится по одному биту прерывания на канал, максимум до 16 бит. Биты в этом регистре устанавливаются и очищаются, когда приложение устанавливает и очищает биты в соответствующем регистре прерываний канала x хоста.
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). HAINT (биты 15:0): прерывания каналов. Один бит на канал: бит 0 для канала 0, бит 15 для канала 15. Смещение адреса: 0x418 Регистр маски прерываний всех каналов хоста (OTG_FS_HAINTMSK) работает вместе с регистром прерываний всех каналов (OTG_FS_HAINT), когда на канале происходит событие. Имеется по одному биту маски на канал, максимум 16 бит.
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). HAINTM (биты 15:0): маска прерываний каналов. 0: прерывание замаскировано (запрещено). Один бит на канал: бит 0 для канала 0, бит 15 для канала 15. Смещение адреса: 0x440 Этот регистр доступен только в режиме хоста. В настоящий момент хост OTG поддерживает только один порт. Один регистр хранит информацию, относящуюся к хосту USB, такую как USB reset, разрешение, приостановка (suspend), возобновление (resume), статус подключения и режим тестирования для каждого порта (это показано на рис. 394). Биты rc_w1 в этом регистре могут привести к прерыванию в приложении через бит прерываний порта хоста (бит HPRTINT в регистре OTG_FS_GINTSTS). На прерывании порта приложение должно прочитать этот регистр и очистить бит, который привел к прерыванию. Для бит rc_w1 приложение должно записать 1 в бит, чтобы очистить прерывание.
Биты 31:19 зарезервированы и должны сохраняться в состоянии сброса (все нули). PSPD (биты 18:17): Port SPeeD. Показывает скорость устройства, подключенного к этому порту. 01: Full speed (FS, полная скорость). PTCTL (биты 16:13): Port Test ConTroL. Приложение записывает ненулевое значение в это поле, чтобы перевести порт в режим тестирования, и на порту появляется соответствующий шаблон сигнализации. 0000: режим тестирования запрещен. PPWR (бит 12): Port PoWeR. Приложение использует этот бит, чтобы управлять питанием этого порта, и ядро очищает этот бит при событии перегрузки по току (overcurrent condition). 0: Power off (порт выключен). PLSTS (биты 11:10): Port Line STatuS. Показывает текущие логические уровни на линиях данных USB D+ (DP) и D- (DM). Бит 10: логический уровень OTG_FS_DP. Бит 9 зарезервирован, и должен сохраняться в состоянии сброса (0). PRST (бит 8): Port ReSeT. Когда приложение установит этот бит, на порту запустится последовательность сброса. Приложение должно отследить период времени сброса, и очистить этот бит после завершения последовательности сброса. 0: порт не в состоянии сброса. Приложение должно оставить этот бит установленным на время как минимум 10 мс, чтобы запустить сброс порта. Приложение может оставить этот бит установленным на еще 10 мс дополнительно перед очисткой, несмотря на отсутствие максимального предела, установленного стандартом USB. PSUSP (бит 7): Port SUSPend. Приложение установит этот бит, чтобы перевести порт в режим приостановки (Suspend mode). Ядро только останавливает отправку SOF, когда этот бит установлен. Для остановки тактов PHY, приложение должно установить бит остановки тактов порта, который устанавливает входной вывод приостановки PHY. Значение чтения этого бита отражает текущее состояние приостановки порта. Этот бит очищается ядром после детектирования сигнала удаленного пробуждения (remote wakeup), или когда приложение установит бит сброса порта или бит возобновления порта в этом регистре, или бит Resume/remote wakeup detected interrupt bit, или бит прерывания Disconnect в регистре прерываний ядра (бит WKUINT или бит DISCINT в OTG_FS_GINTSTS, соответственно). 0: порт не в режиме приостановки. PRES (бит 6): Port RESume. Приложение установит этот бит, чтобы выдать сигнал возобновления в порт. Ядро продолжает выдавать сигнализацию resume до тех пор, пока приложение не очистит этот бит. Если ядро детектировало последовательность удаленного пробуждения (USB remote wakeup), что показвается битом прерывания Port resume/remote wakeup в регистре прерываний ядра (бит WKUINT в регистре OTG_FS_GINTSTS), ядро запустит сигнализацию возобновления без всякого вмешательства приложения и очистит его, когда обнаружит событие разъединения. Прочитанное значение в этом бите показывает, выдается ли в настоящий момент сигнал возобновления. 0: нет выдачи resume. POCCHNG (бит 5): Port OverCurrent CHaNGe. Ядро установит этот бит, когда меняется состояния активности перегрузки порта (бит 4) в этом регистре. POCA (бит 4): Port OverCurrent Active. Показывает перегрузку на порту USB. 0: нет перегрузки по току. PENCHNG (бит 3): Port ENable/disable CHaNGe. Ядро установит этот бит, когда поменяется статус разрешения порта (бит 2 в этом регистре). PENA (бит 2): Port ENAble. Порт разрешается только ядром после последовательности сброса, и запрещается событием перегрузки по току, событием отключения или приложением, очистившим этот бит. Приложение не может установить этот бит путем записью в регистр. Оно может только очистить этот бит, чтобы запретить порт. Этот бит не вызывает никакое прерывание для приложения. 0: порт запрещен. PCDET (бит 1): Port Connect DETected. Ядро установит этот бит, когда было определено подключение устройства для срабатывания прерывания с использованием бита прерывания порта хоста в регистре прерываний ядра (бит HPRTINT в регистре OTG_FS_GINTSTS). Приложение должно записать 1 в этот бит для очистки прерывания. PCSTS (бит 0): Port Connect STatuS. 0: к порту не подключено ни одного устройства. Здесь x это номер канала в диапазоне от 0 до 7 включительно. Смещение адреса: 0x500 + 0x20 * x
CHENA (бит 31): CHannel ENAble. Это поле устанавливается приложением и очищается хостом OTG. 0: канал запрещен. CHDIS (бит 30): CHannel DISable. Приложение установит этот бит для остановки передачи/приема данных на канале, даже до завершения передачи по этому каналу. Приложение должно ждать прерывания запрета канала перед тем, как может считать этот канал запрещенным. ODDFRM (бит 29): ODD FRaMe. Это поле устанавливается (сбрасывается) приложением, чтобы показать, что хост OTG должен выполнить транзакцию на нечетном фрейме. Это поле применимо применимо только для периодических (isochronous и interrupt) транзакций. 0: четный фрейм. DAD (биты 28:22): Device ADdress. Это поле выбирает определенное устройство, которое представляет собой источник или место назначения данных. MCNT (биты 21:20): MultiCouNT. Эта поле показывает для хоста количество транзакций, которые должны быть выполнены на фрейм для этой периодической конечной точки. Для не периодических передач это поле не используется. 00: зарезервировано. Это значение приведет к непредсказуемым результатам. Примечание: это поле должно быть установлено в значение как минимум 01. EPTYP (биты 19:18): EndPoint TYPe. Показывает выбранный тип транзакции. 00: Control LSDEV (бит 17): Low-Speed DEVice. Этот бит устанавливается приложением, чтобы показать работу этого канала в режиме низкоскоростного устройства (low-speed device). Бит 16 зарезервирован, и должен сохраняться в состоянии сброса (0). EPDIR (бит 15): EndPoint DIRection. Показывает направление транзакции - IN или OUT. 0: OUT EPNUM (биты 14:11): EndPoint NUMber. Показывает номер конечный точки на устройстве, которое работает либо как источник, либо как место назначения данных. MPSIZ (биты 10:0): Maximum Packet SIZe. Показывает максимальный размер пакета связанной конечной точки. Здесь x это номер канала в диапазоне от 0 до 7 включительно. Смещение адреса: 0x508 + 0x20 * x Этот регистр показывает статус канала по отношению к USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерывания канала хоста в регистре прерываний ядра (бит HCINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_FS_HAINT), чтобы получить точный номер канала для регистра прерываний канала x хоста. Чтобы очистить соответствующие биты в регистрах OTG_FS_HAINT и OTG_FS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_FS_HCINTx.
Биты 31:11 зарезервированы и должны сохраняться в состоянии сброса (все нули). DTERR (бит 10): Data Toggle ERRor, ошибка переключения данных. FRMOR (бит 9): FRaMe OverRun, превышение кадра. BBERR (бит 8): BaBble ERRor, ошибка помехообразного сигнала. TXERR (бит 7): Transaction ERRor. Показывает одно из следующих ошибок, произошедших на USB: CRC check failure (ошибка контрольной суммы) Бит 6 зарезервирован и должен сохраняться в состоянии сброса (0). ACK (бит 5): прерывание подтверждения ACK приема/передачи. NAK (бит 4): прерывание принятого подтверждения NAK. STALL (бит 3): прерывание принятого ответа STALL. Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0). CHH (бит 1): CHannel Halted. Показывает, что транзакция завершилась ненормально либо из-за ошибки транзакции USB, либо в ответ на запрос запрета от приложения. XFRC (бит 0): транзакция завершена нормально без какой-либо ошибки. Здесь x это номер канала в диапазоне от 0 до 7 включительно. Смещение адреса: 0x50C + 0x20 * x Этот регистр показывает маску статуса каждого канала, описанного ранее.
Биты 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, то прерывание ошибки транзакции маскировано (запрещено). Бит 6 зарезервирован, и должен сохраняться в состоянии сброса (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 маскировано (запрещено). Бит 2 зарезервирован, и должен сохраняться в состоянии сброса (0). CHHM (бит 1): CHannel Halted Mask. Если этот бит сброшен в 0, то прерывание остановки канала маскировано (запрещено). XFRCM (бит 0): Transfer Completed Mask. Если этот бит сброшен в 0, то прерывание завершения транзакции маскировано (запрещено). Здесь x это номер канала в диапазоне от 0 до 7 включительно. Смещение адреса: 0x510 + 0x20 * x
Бит 31 зарезервирован, и должен сохраняться в состоянии сброса (0). DPID (биты 30:29): Data PID. Приложение программирует это поле типом PID для использования в начальной транзакции. Хост обслуживает это поле для остальной части транзакции. 00: DATA0 PKTCNT (биты 28:19): PacKeT CouNT. В это поле приложение программирует ожидаемое количество пакетов для передачи (OUT) или приема (IN). Хост декрементирует этот счетчик при каждой успешной передаче или успешном приеме пакета OUT/IN. Как только этот счетчик достигает 0, в приложении происходит прерывание, сигнализирующее нормальное завершение транзакции. XFRSIZ (биты 18:0): Transfer SIZe. Для OUT в этом поле находится количество байт, которое хост отправляет во время транзакции. Для IN в этом поле находится размер буфера, который приложение резервирует для транзакции. Ожидается, что приложение запрограммирует это поле как целое число, кратное максимальному размеру пакета для транзакций IN (периодических и непериодических). [Регистры режима устройства USB] Смещение адреса: 0x800 Этим регистром ядро программируется в режиме устройства после включения питания или после определенных команд управления или энумерации. Не меняйте этот регистр после начальной инициализации.
Биты 31:13 зарезервированы и должны сохраняться в состоянии сброса. PFIVL (биты 12:11): Periodic Frame InterVaL. Показывает время внутри фрейма, в котором приложение должно быть оповещено прерыванием окончания периодического фрейма. Это может использоваться для определения, завершен ли весь изохронный трафик для этого фрейма. 00: 80% от интервала фрейма. 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. DSPD (биты 1:0): Device SPeeD. Указывает скорость, с которой приложение требует энумерации ядра, или максимальную скорость, которую может поддерживать приложение. Однако реальная скорость шины определяется только после завершения chirp-последовательности, и основывается на скорости хоста USB, к которому ядро подключено. 00: зарезервировано. Смещение адреса: 0x804
Биты 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_FS_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_FS_GINTSTS). TCTL (биты 6:4): Test ConTroL, управление тестированием. 000: режим тестирования (Test mode) запрещен. GONSTS (бит 3): Global OUT NAK STatuS. 0: подтверждение (handshake) отправляется на основе статуса FIFO и настроек бит NAK и STALL. GINSTS (бит 2): Global IN NAK STatuS. 0: подтверждение (handshake) отправляется на основе доступности данных в FIFO передачи. SDIS (бит 1): Soft DISconnect. Приложение использует этот бит для сигнала ядру USB OTG выполнить программное отключение (soft disconnect). Пока этот бит установлен, хост не видит, что устройство подключено, и устройство не получает сигналы по USB. Ядро остается в отключенном состоянии, пока приложение не очистит этот бит. 0: нормальное функционирование. Когда этот бит очищен после soft disconnect, ядро генерирует событие подключения устройства к хосту USB. Когда устройство подключается повторно, хост USB перезапускает энумерацию устройства. RWUSIG (бит 0): Remote WakeUp SIGnaling. Когда приложение установит этот бит, ядро инициирует сигнализацию удаленного пробуждения, чтобы вывести хост USB (wake up) из состояния пониженного энергопотребления. Приложение должно установить этот бит, чтобы инструктировать ядро выйти из состояния приостановки (Suspend state). Как указано в спецификации USB 2.0, приложение должно очистить этот бит в интервале времени от 1 до 15 мс после его установки. В таблице 204 содержится минимальная длительность (по состояниям устройства), для которой должен быть установлен бит программного отключения (soft disconnect, SDIS), чтобы хост определил отключение устройства. Чтобы учесть джиттер тактов, приложению рекомендуется добавить некоторую дополнительную задержку к указанной минимальной длительности. Таблица 204. Минимальная длительность soft disconnect.
Смещение адреса: 0x808 Этот регистр показывает состояние ядра по отношению к событиям USB. Он должен быть прочитан при прерываниях регистра (OTG_FS_DAINT).
Биты 31:22 зарезервированы и должны сохраняться в состоянии сброса (все нули). FNSOF (биты 21:8): Frame Number of the received SOF. Номер фрейма принятого сигнала начала фрейма. Биты 7:4 зарезервированы и должны сохраняться в состоянии сброса. EERR (бит 3): Erratic ERRor. Ядро установит этот бит, чтобы сообщить о любом ошибочном поведении. Из-за этих ошибок контроллер OTG_FS переходит в состояние приостановки (Suspended state), и генерируется прерывание с битом ранней приостановки (Early suspend, бит ESUSP) в регистре OTG_FS_GINTSTS. Если early suspend был выставлен из-за erratic error, то приложение может только выполнить восстановление программного отключения (soft disconnect recover). ENUMSPD (биты 2:1): ENUMerated SPeeD. Показывает скорость, на которой контроллер OTG_FS был запущен в работу после chirp-последовательности определения скорости. 01: зарезервировано. SUSPSTS (бит 0): SUSPend STatuS. В режиме устройства этот бит установлен, пока на USB определено событие приостановки (Suspend condition). Ядро входит в Suspended state, когда на линиях данных USB нет активности в течение 3 мс. Ядро выходит из suspend: – Когда появляется активность на линиях сигнала данных USB. Смещение адреса: 0x810 Этот регистр работает с каждым из регистров OTG_FS_DIEPINTx для всех конечных точек, чтобы генерировать прерывание конечной точки IN. Прерывание конечной точки IN для определенного состояния в регистре OTG_FS_DIEPINTx может быть замаскировано (запрещено) записью соответствующего бита в регистре OTG_FS_DIEPMSK. Биты статуса по умолчанию замаскированы.
Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули). NAKM (бит 13): NAK interrupt Mask. Если этот бит сброшен в 0, то прерывание отрицательного подтверждения NAK маскировано (запрещено). Биты 12:7 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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 Этот регистр работает с каждым из регистров OTG_FS_DOEPINTx для всех конечных точек, чтобы генерировать прерывания конечных точек OUT. Прерывание конечной точки OUT для определенного статуса в регистре OTG_FS_DOEPINTx можно маскировать записью соответствующего бита в регистре OTG_FS_DOEPMSK. Биты статуса по умолчанию замаскированы (запрещены).
Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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:6 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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 Когда на конечной точке происходит значимое событие, регистр OTG_FS_DAINT генерирует прерывание, используя бит прерываний конечных точек OUT устройства или конечных точек IN устройства (биты OEPINT или IEPINT в регистре OTG_FS_GINTSTS соответственно). Здесь имеется один бит прерывания на конечную точку, всего до 16 бит для конечных точек OUT и до 16 бит для конечных точек IN. Для двунаправленной конечной точки, используются соответствующие бит прерываний IN и OUT. Биты в регистре OTG_FS_DAINT устанавливаются и очищаются, когда приложение устанавливает и очищает биты в регистре соответствующей конечной точки x устройства (OTG_FS_DIEPINTx/OTG_FS_DOEPINTx).
OEPINT (биты 31:16): OUT EndPoint INTerrupt bits, биты прерываний конечных точек OUT, по одному биту на конечную точку: бит 16 соответствует конечной точке OUT номер 0, бит 19 конечной точке OUT номер 3. IEPINT (биты 15:0): IN EndPoint INTerrupt bits, биты прерываний конечных точек IN, по одному биту на конечную точку: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3. Смещение адреса: 0x81C Регистр OTG_FS_DAINTMSK работает вместе с регистром прерываний конечных точек, когда происходит прерывание на конечной точке устройства. Биты OTG_FS_DAINTMSK позволяют маскировать (запретить) прерывание соответствующей конечной точки, однако биты регистра OTG_FS_DAINT при этом все равно будут устанавливаться, даже если прерывание запрещено.
OEPM (биты 31:16): OUT EP interrupt Mask bits, биты маски прерываний конечной точки OUT, по одному биту на конечную точку: бит 16 соответствует конечной точке OUT номер 0, бит 19 конечной точке OUT номер 3. IEPM (биты 15:0): IN EP interrupt Mask bits, биты маски прерываний конечной точки IN, по одному биту на конечную точку: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3. Смещение адреса: 0x828 Этот регистр задает время разряда VBUS после импульса VBUS во время SRP.
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). VBUSDT (биты 15:0): Device VBUS Discharge Time. Задает время разряда VBUS следующим образом: время разряда VBUS в тактах PHY / 1024. Это значение может меняться в зависимости от нагрузки на шину VBUS (чем больше нагрузка по току и меньше емкость конденсатора фильтра VBUS, тем меньше постоянная времени разряда VBUS). Смещение адреса: 0x82C Этот регистр задает время импульса VBUS во время SRP.
Биты 31:12 зарезервированы и должны сохраняться в состоянии сброса (все нули). DVBUSP (биты 11:0): Device VBUS Pulsing time. Задает время импульса VBUS следующим образом: время импульса VBUS в тактах PHY/1024. Смещение адреса: 0x834 Этот регистр используется для управления генерацией прерывания опустошения FIFO конечной точки IN (TXFE_OTG_FS_DIEPINTx).
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса (все нули). INEPTXFEM (биты 15:0): IN EP TxFIFO Empty interrupt Mask. Эти биты работают как маска дляOTG_FS_DIEPINTx. Если они установлены в 0, то маскируют (запрещают) прерывание опустошения стека передачи конечной точки IN: бит 0 соответствует конечной точке IN номер 0, бит 3 конечной точке IN номер 3. Смещение адреса: 0x900 Регистр управления конечной точкой 0. Не нулевые конечные точки управления используют регистры для конечных точек 1 .. 3.
EPENA (бит 31): EndPoint ENAble. Приложение использует этот бит, чтобы запустить передачу на конечной точке 0. Ядро очищает этот бит перед установкой любого из следующих прерываний этой конечной точки: – конечная точка запрещена EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения. Биты 29:28 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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. Когда этот бит установлен либо приложением, либо ядром, ядро останавливает передачу данных, даже если в TxFIFO есть данные для передачи. Независимо от значения этого бита ядро всегда отвечает на данные пакетов SETUP положительным подтверждением ACK. Бит 16 зарезервирован и должен сохраняться в состоянии сброса (0). USBAEP (бит 15): USB Active EndPoint. Этот бит всегда установлен в 1, показывая тем самым, что конечная точка 0 активна всегда во всех конфигурациях и на всех интерфейсах. Биты 14:2 зарезервированы и должны сохраняться в состоянии сброса (все нули). MPSIZ (биты 1:0): Maximum Packet SIZe. Приложение должно запрограммировать это поле максимальным размером пакета для текущей логической конечной точки. 00: 64 байта Здесь x это номер конечной точки от 1 до 3. Смещение адреса: 0x900 + 0x20 * x Приложение использует этот регистр для управления поведением любой конечной точки, отличающейся от конечной точки управления 0 (endpoint 0, так называемая конечная точка по умолчанию).
EPENA (бит 31): EndPoint ENAble. Приложение устанавливает этот бит, чтобы запустить передачу на этой конечной точке. Ядро очистит этот бит перед установкой любого из следующих прерываний этой конечной точки: – завершена фаза SETUP EPDIS (бит 30): EndPoint DISable. Приложение установит этот бит для остановки передачи данных на конечной точке, даже до того, как транзакция этой конечной точки завершится. Приложение должно ожидать прерывания запрета конечной точки (Endpoint disabled interrupt) перед тем, как может считать конечную точку запрещенной. Ядро очищает этот бит перед установкой прерывания запрета конечной точки. Приложение должно установить этот бит только если для этой конечной точки уже установлен бит разрешения. SODDFRM (бит 29): Set ODD FRaMe. Применимо только к изохронным конечным точкам IN и OUT. Запись в это поле установит поле Even/Odd фрейма (EONUM) в нечетный (odd) фрейм. SD0PID (бит 28): Set DATA0 PID. Применимо только для конечных точек interrupt/bulk IN. Запись в это поле установит поле PID (DPID) данных конечной точки в этом регистре на DATA0. SEVNFRM (бит 28): Set EVeN FRaMe. Применимо только к конечным точкам isochronous IN. Запись в это поле установит поле фрейма Even/Odd (EONUM) в четный (even) фрейм. SNAK (бит 27): Set NAK. Запись в этот бит установит бит NAK для этой конечной точки. С использованием этого бита приложение может управлять передачей отрицательными подтверждениями NAK на конечной точке. Ядро также может установить этот бит для конечных точек OUT на прерывание завершения транзакции, или после приема на этой конечной точке пакета SETUP. CNAK (бит 26): Clear NAK. Запись в этот бит очистит бит NAK для этой конечной точки. TXFNUM (биты 25:22): TxFIFO NUMber. Эти биты задают номер FIFO, связанный с этой конечной точкой. Каждая активная конечная точка IN должна быть запрограммирована на отдельный номер FIFO. Это поле допустимо только для конечных точек IN. STALL (бит 21): STALL handshake. Применимо только для не управляющих и не изохронных конечных точек IN (тип доступа rw, чтение и запись). Приложение устанавливает этот бит для приостановки всех токенов от хоста USB к этой конечной точке. Если вместе с этим битом установлен бит Global IN NAK или Global OUT NAK, то бит STALL имеет приоритет. Очистить этот бит может только приложение, но не ядро. Бит 20 зарезервирован и должен сохраняться в состоянии сброса (0). EPTYP (биты 19:18): EndPoint TYPe, тип конечной точки. Здесь указывается тип транзакции, поддерживаемый этой логической конечной точкой. 00: Control NAKSTS (бит 17): NAK STatuS. Означает следующее: 0: ядро передает не-NAK подтверждения, базируясь на статусе FIFO. Когда либо приложение, либо ядро установит этот бит, для не изохронных конечных точек IN: ядро прекращает передавать любые данные на конечной точке IN, даже если в TxFIFO есть данные для передачи. Когда либо приложение, либо ядро установит этот бит, для изохронных конечных точек IN: ядро передает пакет данных нулевой длины (zero-length data packet), даже если в TxFIFO есть данные для передачи. Независимо от состояния этого бита ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP. EONUM (бит 16): Even/Odd frame NUMber. Применимо только к конечным точкам isochronous IN. Показывает номер пакета, в котором ядро передает/принимает изохронные данные для этой конечной точки. Приложение должно запрограммировать это поле четным/нечетным (even/odd) номером фрейма, в котором намереваются передать/принять изохронные данные для этой конечной точки, используя поля SEVNFRM и SODDFRM в этом регистре. 0: четный (even) фрейм DPID (бит 16): Endpoint Data PID. Применимо только для конечных точек interrupt/bulk IN. Содержит PID пакета для приема или передачи на этой конечной точке. Приложение должно запрограммировать PID первого пакета для передачи или приема на этой конечной точке после того, как конечная точка активирована. Приложение использует поле SD0PID регистра для программирования либо DATA0, либо DATA1 PID. 0: DATA0 USBAEP (бит 15): USB Active EndPoint. Показывает, активна ли эта конечная точка в текущей конфигурации и на текущем интерфейсе. Ядро очищает этот бит для всех конечных точек (отличающихся от EP0) после детектирования USB reset. После получения команд SetConfiguration и SetInterface, приложение должно правильно запрограммировать регистры конечных точек и установить этот бит. Биты 14:11 зарезервированы и должны сохраняться в состоянии сброса (все нули). MPSIZ (биты 10:0): Maximum Packet SIZe. Приложение должно установить в это поле максимальный размер пакета для текущей логической конечной точки. Значение указывается в байтах. Смещение адреса: 0xB00 Это регистр для настройки поведения конечной точки управления (она же конечная точка по умолчанию, или конечная точка номер 0, EP0). Для настройки ненулевых конечных точек 1 .. 3 используются другие регистры (см. далее).
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. Когда либо приложение, либо ядро установит этот бит, ядро прекратит принимать данные, даже если есть свободное место в 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 байта Здесь x это номер конечной точки от 1 до 3. Смещение адреса: 0xB00 + 0x20 * x Приложение использует этот регистр для управления поведением любой конечной точки, отличающейся от конечной точки управления 0 (endpoint 0, так называемая конечная точка по умолчанию).
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 NAKSTS (бит 17): NAK STatuS. Означает следующее: 0: ядро передает не-NAK подтверждения, базируясь на статусе FIFO. Когда либо приложение, либо ядро установит этот бит: ядро прекращает принимать любые данные на конечной точке OUT, даже если в RxFIFO есть свободное место для сохранения поступившего пакета. Независимо от состояния этого бита ядро всегда отвечает положительным подтверждением ACK на пакеты данных SETUP. EONUM (бит 16): Even/Odd frame NUMber. Применимо только к конечным точкам isochronous IN и OUT. Показывает номер пакета, в котором ядро передает/принимает изохронные данные для этой конечной точки. Приложение должно запрограммировать это поле четным/нечетным (even/odd) номером фрейма, в котором намереваются передать/принять изохронные данные для этой конечной точки, используя поля SEVNFRM и SODDFRM в этом регистре. 0: четный (even) фрейм DPID (бит 16): Endpoint Data PID. Применимо только для конечных точек interrupt/bulk OUT. Содержит PID пакета для приема или передачи на этой конечной точке. Приложение должно запрограммировать PID первого пакета для передачи или приема на этой конечной точке после того, как конечная точка активирована. Приложение использует поле SD0PID регистра для программирования либо DATA0, либо DATA1 PID. 0: DATA0 USBAEP (бит 15): USB Active EndPoint. Показывает, активна ли эта конечная точка в текущей конфигурации и на текущем интерфейсе. Ядро очищает этот бит для всех конечных точек (отличающихся от EP0) после детектирования USB reset. После получения команд SetConfiguration и SetInterface, приложение должно правильно запрограммировать регистры конечных точек и установить этот бит. Биты 14:11 зарезервированы и должны сохраняться в состоянии сброса (все нули). MPSIZ (биты 10:0): Maximum Packet SIZe. Приложение должно установить в это поле максимальный размер пакета для текущей логической конечной точки. Значение указывается в байтах. Здесь x это номер конечной точки от 1 до 3. Смещение адреса: 0x908 + 0x20 * x Этот регистр показывает статус конечной точки по отношению к событиям USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерываний конечной точки IN в регистре прерываний ядра (бит IEPINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_FS_DAINT), чтобы получить точный номер конечной точки для регистра прерываний конечной точки x устройства. Чтобы очистить соответствующие биты в регистрах OTG_FS_DAINT и OTG_FS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_FS_DIEPINTx.
Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули). NAK (бит 13): NAK input. Ядро генерирует это прерывание, когда устройством передается или принимается NAK. В случае изохронных конечных точек IN прерывание генерируется, когда передается пакет нулевой длины (zero length packet) из-за отсутствия данных в TxFIFO. Бит 12 зарезервирован и должен сохраняться в состоянии сброса (0). PKTDRPSTS (бит 11): PacKeT DRoPped STatuS. Этот бит показывает приложению, что был отброшен пакет ISOC OUT. У этого бита нет связанного бита маски, и он не генерирует прерывание. Биты 10:8 зарезервированы и должны сохраняться в состоянии сброса (все нули). TXFE (бит 7): Transmit FIFO Empty. Это прерывание выставляется, когда TxFIFO для этой конечной точки пуст либо наполовину, либо полностью. Наполовину ил полностью - определяется битом уровня опустошенности стека передачи TxFIFO Empty Level (бит TXFELVL) в регистре OTG_FS_GAHBCFG. INEPNE (бит 6): IN EndPoint NAK Effective. Этот бит может быть очищен, когда приложение очищает IN endpoint NAK записью бита CNAK в регистре OTG_FS_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 до 3. Смещение адреса: 0xB08 + 0x20 * x Этот регистр показывает статус конечной точки по отношению к событиям USB и AHB. Это показано на рис. 394. Приложение должно читать этот регистр, когда установлен бит прерываний конечной точки OUT в регистре прерываний ядра (бит OEPINT в регистре OTG_FS_GINTSTS). Перед тем, как приложение может прочитать этот регистр, оно должно сначала прочитать регистр прерываний всех каналов (OTG_FS_DAINT), чтобы получить точный номер конечной точки для регистра прерываний конечной точки x устройства OTG_FS_DOEPINTx. Чтобы очистить соответствующие биты в регистрах OTG_FS_DAINT и OTG_FS_GINTSTS, приложение должно очистить соответствующий бит в регистре OTG_FS_DOEPINTx.
Биты 31:14 зарезервированы и должны сохраняться в состоянии сброса (все нули). 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:6 зарезервированы и должны сохраняться в состоянии сброса. 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. Бит 2 зарезервирован и должен сохраняться в состоянии сброса (0). EPDISD (бит 1): EndPoint DISableD interrupt. Этот бит показывает, что конечная точка запрещена по запросу приложения. XFRC (бит 0): Transfer Completed interrupt. Это поле показывает, что для этой конечной точки завершена запрограммированная транзакция как на AHB, так и на USB. Смещение адреса: 0x910 Приложение должно изменять этот регистр перед разрешением конечной точки 0. Как только конечная точка 0 разрешена соответствующим битом в регистре управления конечной точкой 0 (бит EPENA в регистре OTG_FS_DIEPCTL0), этот регистр модифицирует ядро. Приложение может только читать этот регистр, как только ядро очистило бит разрешения конечной точки. Ненулевые конечные точки 1 .. 3 используют другие регистры.
Биты 31:21 зарезервированы и должны сохраняться в состоянии сброса (все нули). PKTCNT (биты 20:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) данных для конечной точки 0. Это поле декрементируется каждый раз, когда пакет (максимального размера или короче) прочитан из TxFIFO. Биты 18:7 зарезервированы и должны сохраняться в состоянии сброса (все нули). XFRSIZ (биты 6:0): Transfer size. Показывает размер транзакции в байтах для конечной точки 0. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет перемещается из внешней памяти в TxFIFO. Смещение адреса: 0xB10 Как только конечная точка 0 разрешена соответствующим битом в регистре управления конечной точкой 0 (бит EPENA в регистре OTG_FS_DIEPCTL0), этот регистр модифицирует ядро. Приложение может только читать этот регистр, как только ядро очистило бит разрешения конечной точки. Ненулевые конечные точки 1 .. 3 используют другие регистры.
Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0). STUPCNT (бит 30:29): SETUP Packet CouNT. Это поле задает количество пакетов данных back-to-back SETUP, которое может принять конечная точка. 01: 1 пакет Биты 28:20 зарезервированы и должны сохраняться в состоянии сброса (все нули). PKTCNT (бит 19): PacKeT CouNT. Это поле декрементируется до нуля после того, как пакет записывается в RxFIFO. Биты 18:7 зарезервированы и должны сохраняться в состоянии сброса (все нули). XFRSIZ (биты 6:0): Transfer size. Показывает размер транзакции в байтах для конечной точки 0. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается в TxFIFO и перемещается во внешнюю память. Здесь x это номер конечной точки от 1 до 3. Смещение адреса: 0x910 + 0x20 * x Приложение должно менять этот регистр перед тем, как разрешит эту конечную точку. Как только конечная точка разрешена соответствующим битом (бит EPENA в регистре OTG_FS_DIEPCTLx), этот регистр модифицирует ядро. Приложение может только читать этот регистр, ккогда ядро очистит бит разрешения конечной точки.
Биты 31:29 зарезервированы и должны сохраняться в состоянии сброса (все нули). PKTCNT (биты 28:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) объема данных для этой конечной точки. Это поле декрементируется всякий раз, когда пакет (максимального размера или меньше) считывается из TxFIFO. XFRSIZ (биты 18:0): Transfer size. Показывает размер транзакции в байтах для текущей конечной точки. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается из внешней памяти и перемещается в TxFIFO. Здесь x это номер конечной точки от 1 до 3. Смещение адреса: 0x918 + 0x20 * x Это регистр только для чтения, содержащий информацию свободного пространства TxFIFO для конечной точки Device IN.
Биты 31:16 зарезервированы и должны сохраняться в состоянии сброса. INEPTFSAV (биты 15:0): IN EndPoint TxFIFO Space AVailable. Показывает количество свободного пространства, доступного в TxFIFO конечной точки. Значение указывается в 32-битных словах: 0x0000: TxFIFO конечной точки заполнен. Здесь x это номер конечной точки от 1 до 3. Смещение адреса: 0xB10 + 0x20 * x Приложение должно модифицировать этот регистр перед разрешением конечной точки. Как только конечная точка разрешена соответствующим битом (бит EPENA в регистре OTG_FS_DOEPCTLx), этот регистр модифицирует ядро. Приложение может только считывать этот регистр, когда ядро очистит бит разрешения конечной точки.
Бит 31 зарезервирован и должен сохраняться в состоянии сброса (0). RXDPID (биты 30:29): Received Data PID. Применимо только к конечным точкам isochronous OUT. Это PID данных, принятый в последнем пакете для этой конечной точки. 00: DATA0 STUPCNT (биты 30:29): SETUP packet CouNT. Применимо только к конечным точкам control OUT. Это поле задает количество пакетов данных back-to-back SETUP, которое может принять конечная точка. 01: 1 пакет PKTCNT (биты 28:19): PacKeT CouNT. Показывает общее количество пакетов USB, составляющих размер транзакции (Transfer Size) объема данных для этой конечной точки. Это поле декрементируется всякий раз, когда пакет (максимального размера или меньше) записывается в RxFIFO. XFRSIZ (биты 18:0): Transfer size. Показывает размер транзакции в байтах для текущей конечной точки. Ядро генерирует прерывание только после того, как оно исчерпало объем передаваемых данных. Размер транзакции может быть установлен на максимальный размер пакета конечной точки, чтобы прерываться по окончанию каждого пакета. Ядро декрементирует это поле каждый раз, когда пакет считывается из RxFIFO и перемещается во внешнюю память. Смещение адреса: 0xE00 Регистр управления питанием и тактированием, он доступен в режиме хоста USB и в режиме устройства USB.
Биты 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_FS в адресном пространстве STM32F4xx отсчитываются относительно адреса 0x50000000 (см. таблицу 1 в даташите [1]). [Модель программирования OTG_FS] Инициализация ядра. Приложение должно выполнить последовательность инициализации ядра. Если при включении питания кабель подключен, то бит текущего режима работы (бит CMOD в регистре OTG_FS_GINTSTS) показывает, как работает ядро - как хост или как устройство USB. Контроллер OTG_FS входит в режим хоста, когда подключен коннектор "A", или в режим устройства, когда подключен коннектор "B". В этом разделе описывается инициализация контроллера OTG_FS после включения питания. Приложение должно следовать этой последовательности инициализации, независимо от режима работы - как хост или как устройство. Все глобальные регистры ядра инициализируются в соответствии с конфигурацией ядра (эта процедура общая как для режима хоста, так и для режима устройства): 1. Запрограммируйте следующие поля в регистре OTG_FS_GAHBCFG: – Бит глобальной маски прерываний (Global interrupt mask bit) GINTMSK = 1. 2. Запрограммируйте следующие поля в регистре OTG_FS_GUSBCFG: – Бит разрешения функции смены ролей хост-устройство (HNP capable bit). 3. Программа должна демаскировать следующие биты в регистре OTG_FS_GINTMSK: - Маска прерывания OTG. 4. Программа может прочитать бит CMOD в регистре OTG_FS_GINTSTS, чтобы определить, в каком режиме работает контроллер OTG_FS - в режиме хоста или в режиме устройства USB. Инициализация хоста USB. Чтобы инициализировать ядро как хост, приложение должно выполнить следующие шаги: 1. Запрограммировать HPRTINT в регистре OTG_FS_GINTMSK, чтобы демаскировать это прерывание. 2. Запрограммировать регистр OTG_FS_HCFG, чтобы выбрать full-speed (FS) хост. 3. Запрограммировать бит PPWR регистра OTG_FS_HPRT в лог. 1. Это включит VBUS на USB. 4. Подождать прерывания PCDET в регистре OTG_FS_HPRT0. Оно покажет, что устройство подключено к порту. 5. Запрограммировать бит PRST регистра OTG_FS_HPRT в лог. 1. Это начнет процесс сброса по шине USB (USB reset). 6. Подождать как минимум 10 мс, чтобы завершился USB reset. 7. Запрограммировать бит PRST регистра OTG_FS_HPRT в лог. 0. 8. Подождать прерывания PENCHNG в регистре OTG_FS_HPRT. 9. Прочитать бит PSPD регистра OTG_FS_HPRT, чтобы получить скорость, с которой прошла энумерация. 10. Запрограммировать регистр HFIR значением, соответствующим выбранной PHY clock 1. 11. Запрограммировать поле FSLSPCS в регистре OTG_FS_HCFG в соответствии со скоростью, которая была определена на шаге 9. Если FSLSPCS было изменено, то должен быть выполнен сброс порта. 12. Запрограммировать регистр OTG_FS_GRXFSIZ для выбора размера FIFO приема. 13. Запрограммировать регистр OTG_FS_HNPTXFSIZ для выбора размера и начального адреса не периодического FIFO передачи для не периодических транзакций. 14. Запрограммировать регистр OTG_FS_HPTXFSIZ для выбора размера и начального адреса периодического FIFO для периодических транзакций. Чтобы обмениваться данными с устройствами, системное ПО должно инициализировать и разрешить как минимум один канал. Инициализация устройства USB. Приложение должно выполнить следующие шаги для инициализации ядра в качестве устройства при включении питания, или при смене режима с хоста на устройство. 1. Запрограммируйте следующие поля в регистре OTG_FS_DCFG: – Скорость устройства (Device speed). 2. Запрограммируйте регистр OTG_FS_GINTMSK для демаскирования следующих прерываний: – Сброс по шине (USB reset). 3. Запрограммируйте бит VBUSBSEN в регистре OTG_FS_GCCFG, чтобы разрешить анализ уровня VBUS в режиме "B" устройства, и подачи 5V через верхний подтягивающий резистор (pull-up) линии данных D+ (DP). 4. Подождите прерывания USBRST в регистре OTG_FS_GINTSTS. Это показывает, что был определен сброс по шине USB длительностью около 10 мс или больше. Потом нужно подождать прерывания ENUMDNE в регистре OTG_FS_GINTSTS. Это прерывание показывает окончание сброса по шине USB. При получении этого прерывания, приложение должно прочитать регистр OTG_FS_DSTS, чтобы определить скорость энумерации и выполнить шаги, перечисленные далее в секции "Инициализация конечной точки по завершению энумерации". Начиная с этого момента устройство готово принять пакеты SOF и выполнить управляющие передачи на конечной точке 0. [Модель программирования хоста USB] Инициализация канала. Приложение должно инициализировать один или большее количество каналов перед тем, как оно может обмениваться данными с подключенными устройствами. Для инициализации и разрешения канала, приложение должно выполнить следующие шаги: 1. Запрограммируйте регистр OTG_FS_GINTMSK, чтобы демаскировать следующее: 2. Прерывание канала. – Прерывание опустошения не периодического FIFO передачи для транзакций OUT (применимо при работе на конвейерном уровне транзакции с полем подсчета пакетов, запрограммированным на более чем один пакет). 3. Запрограммируйте регистр OTG_FS_HAINTMSK для демаскирования выбранных прерываний каналов. 4. Запрограммируйте регистр OTG_FS_HCINTMSK для демаскирования интересующих прерываний, связанных с транзакциями, заданных в регистре каналов прерываний хоста. 5. Запрограммируйте в регистр OTG_FS_HCTSIZx выбранных каналов общий размер транзакции, в байтах, и ожидаемое количество пакетов, включая короткие пакеты. Приложение должно запрограммировать поле PID начальным PID данных (для использования на первой транзакции OUT, или ожидаемым от первой транзакции IN). 6. Запрограммируйте регистр OTG_FS_HCCHARx выбранного канала характеристиками конечной точки устройства, такими как тип, скорость, направление, и т. д. (канал может быть разрешен установкой в 1 бита разрешения канала только когда приложение готово передавать или принимать какой-либо пакет). Остановка (halt) канала. Приложение может запретить любой канал программированием регистра OTG_FS_HCCHARx с установкой в 1 бит CHDIS и CHENA. Это разрешает хосту OTG_FS сбросить (flush) выставленные запросы (если они есть) и сгенерировать прерывание остановки канала (channel halted interrupt). Приложение должно подождать прерывания CHH в OTG_FS_HCINTx перед повторным выделением канала для других транзакций. Хост OTG_FS не прерывает транзакции, которые уже запущены по USB. Перед запретом канала приложение должно убедиться в наличии хотя бы одного свободного места в очереди не периодических запросов (когда запрещается не периодический канал) или в очереди периодических запросов (когда запрещается периодический канал). Приложение может просто сбросить (flush) выставленные запросы в очереди запросов (перед запретом канала) путем программирования регистра OTG_FS_HCCHARx с битом CHDIS, установленным в 1, и бита CHENA, очищенным в 0. Ожидается, что приложение запрещает канал при любом из следующих условий: 1. Когда для канала IN или OUT получено прерывание STALL, TXERR, BBERR или DTERR в регистре OTG_FS_HCINTx. Приложение должно быть в состоянии принять другие прерывания (DTERR, Nak, Data, TXERR) на том же канале пред получением остановки (halt). 2. Когда получено прерывание DISCINT (Disconnect Device, отключение устройства) в регистре OTG_FS_GINTSTS (ожидается, что приложение запретит все разрешенные каналы). 3. Когда приложение обрывает транзакцию перед её нормальным завершением. Приложение должно инициализировать канал перед обменом данными с подключенным устройством. В этой секции объясняется последовательность действий, которая должна быть выполнена для различных типов транзакций USB. • Запись в передающий FIFO (TxFIFO) Хост OTG_FS автоматически записывает элемент (запрос OUT) в очередь периодических / не периодических запросов, вместе с последним словом записи пакета. Приложение должно гарантировать, что доступно как минимум одна свободная ячейка в очереди периодических / не периодических запросов перед тем, как начать записывать в FIFO передачи. Приложение всегда должно записывать в FIFO слова (32-битный доступ). Если размер в байтах пакета не делится нацело на 4, то приложение должно дополнить пакет данными (обычно нулевыми, или заранее известного значения). Хост OTG_FS определяет реальный размер пакета, базируясь на запрограммированном максимальном размере пакета и размере транзакции. Рис. 396. Задача записи в TxFIFO. Примечание: MPS Maximum packet size (максимальный размер пакета), LPS Last packet size (размер последнего пакета). • Чтение FIFO приема (RxFIFO) Приложение должно игнорировать все состояния пакета, отличающиеся от IN data packet (0010b). Рис. 397. Задача чтения из RxFIFO. • Транзакции bulk и control OUT/SETUP Типовые конвейеризированные операции bulk или control OUT/SETUP на уровне транзакции показаны на рис 398. См. channel 1 (ch_1). Передается два пакета bulk OUT. Транзакция control SETUP работает так же, однако имеет только один пакет. Предположения следующие: – Приложение пытается отправить 2 пакета максимального размера (размер транзакции transfer size = 1024 байта). Рис. 398. Нормальные транзакции bulk/control OUT/SETUP и bulk/control IN. • Операции bulk и control OUT/SETUP Последовательность операции (channel 1) следующая: a) Инициализация канала 1 (channel 1). В следующих примерах на псевдокоде показаны обработчики прерывания (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_FS_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 байта). Рис. 399. Транзакции bulk/control IN. Последовательность операций следующая: a) Инициализация канала 2. • Транзакции управления (control transfer) Стадии Setup, Data и Status транзакции управления должны быть выполнены как три отдельные транзакции. Транзакции OUT стадий Setup, Data или Status выполняются подобно транзакциям bulk OUT, описанным выше. Транзакции IN стадий Data или Status также выполняются подобно транзакциям bulk IN, описанным выше. Для всех трех стадий приложение ожидает установки значения Control в поле EPTYP регистра OTG_FS_HCCHAR1. Во время стадии Setup приложение ожидает установки значения SETUP в поле PID регистра OTG_FS_HCTSIZ1. • Транзакции Interrupt OUT Типовая операция interrupt OUT показана на рис. 400. Предположения следующие: – Приложение пытается отправить один пакет в каждом фрейме (до одного пакета максимального размера), начиная с нечетного фрейма (transfer size = 1024 байта). Рис. 400. Нормальные транзакции interrupt OUT/IN. Последовательность операций следующая: a) Инициализация и разрешение канала 1 (channel 1). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR1. • 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 { Повторная инициализация канала (in next b_interval - 1 Frame) } } else if (ACK) { Сброс счетчика ошибок Маскирование ACK } Приложение использует прерывание NPTXFE в OTG_FS_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 байта). • Нормальное функционирование interrupt IN Последовательность операций следующая: a) Инициализация канала 2 (channel 2). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR2. • Транзакции isochronous OUT Типовая операция isochronous OUT показана на рис. 401. Предположения следующие: – Приложение пытается отправить 1 пакет каждый фрейм (до одного пакета максимального размера), начиная с нечетного фрейма (размер транзакции transfer size = 1024 байта). Последовательность операций следующая: a) Инициализация и разрешение канала 1 (channel 1). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR1. g) Обработка не-ACK ответов. Рис. 401. Нормальные транзакции isochronous OUT/IN. • 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 байта). Последовательность операций следующая: a) Инициализация канала 2 (channel 2). Приложение должно установить бит ODDFRM в регистре OTG_FS_HCCHAR2. • Выбор глубины очереди Тщательно выбирайте глубину очереди периодических и не периодических запросов, чтобы это соответствовало количеству периодических / не периодических конечных точек, к которым осуществляется доступ. Глубина очереди непериодических запросов влияет на производительность не периодических транзакций. Чем глубже очередь (при условии достаточного пространства в FIFO), тем чаще ядро может запланировать конвейеризацию транзакций не периодических передач. Если размер очереди мал, то ядро может помещать в неё новые запросы только по мере освобождения ячеек в очереди. Глубина очереди периодических запросов является критической для выполнения запланированных периодических транзакций. Выберите глубину периодической очереди на основе количества периодических передач, запланированных в микрофрейме. Если глубина периодической очереди меньше, чем периодические транзакции, запланированные в микрофрейме, то произойдет событие недогрузки фрейма (frame overrun). • Обработка событий помехообразного сигнала (babble) Контроллер OTG_FS обрабатывает 2 случая подобной ошибки: packet babble и port babble. Packet babble произойдет, если устройство отправило больше данных, чем максимальный размер пакета на канале. Port babble произойдет, если ядро продолжает получать данные от устройства на EOF2 (окончание фрейма 2, очень близко к SOF). Когда контроллер OTG_FS детектирует packet babble, он прекращает записывать данные в буфер Rx, и ждет окончания пакета (end of packet, EOP). Когда контроллер определил EOP, он сбрасывает (flush) уже записанные в буфер Rx данные, и генерирует прерывание Babble. Когда контроллер OTG_FS детектирует port babble, он сбрасывает (flush) RxFIFO и запрещает порт. Затем ядро генерирует прерывание запрета порта (Port disabled, бит HPRTINT в регистре OTG_FS_GINTSTS, бит PENCHNG в регистре OTG_FS_HPRT). При получении этого прерывания приложение должно определить, что оно произошло не из-за перегрузки по току (overcurrent condition, это еще одна причина прерывания Port Disabled) путем проверки POCA в регистре OTG_FS_HPRT, затем должно выполнить программный сброс (soft reset). Ядро не отправляет больше никаких токенов после того, как оно детектирует событие port babble. [Модель программирования устройства USB] Инициализация конечной точки при USB reset: 1. Установка бита NAK для всех конечных точек OUT: SNAK = 1 в регистре OTG_FS_DOEPCTLx (для всех конечных точек OUT, x это номер конечной точки). 2. Демаскирование следующих бит прерывания: INEP0 = 1 в регистре OTG_FS_DAINTMSK (control 0 IN endpoint) 3. Настройка Data FIFO RAM для каждого FIFO: - Запрограммируйте регистр OTG_FS_GRXFSIZ, чтобы иметь возможность принять данные control OUT и данные setup. Если порог не разрешен, то на минимуме он должен быть равным 1 пакету максимального размера control endpoint 0 плюс 2 слова (для статуса пакета данных control OUT) плюс 10 слов (для пакетов setup). 4. Запрограммируйте следующие поля в регистрах, относящихся к конечной точке control OUT endpoint 0, чтобы принять пакет SETUP: STUPCNT = 3 в регистре OTG_FS_DOEPTSIZ0 (чтобы принять до 3 пакетов back-to-back SETUP). На этом этапе выполнена вся требуемая инициализация для приема пакетов SETUP. Инициализация конечной точки по завершению энумерации: 1. На прерывании Enumeration Done (завершение энумерации, бит ENUMDNE в регистре OTG_FS_GINTSTS), прочитайте регистр OTG_FS_DSTS, чтобы определить скорость энумерации. 2. Запрограммируйте поле MPSIZ в регистре OTG_FS_DIEPCTL0, чтобы установить максимальный размер пакета. Этот шаг конфигурирует control endpoint 0. Максимальный размер пакета для control endpoint зависит от скорости энумерации. На этом этапе устройство готово принять пакеты SOF и оно сконфигурировано для выполнения управляющих транзакций на control endpoint 0. Инициализация конечной точки на команде SetAddress. Здесь описывается, что должно делать приложение, когда оно получает команду SetAddress в пакете SETUP. 1. Запрограммировать регистр OTG_FS_DCFG адресом устройства, полученным в команде SetAddress. Инициализация конечной точки на команде SetConfiguration/SetInterface. Здесь описывается, что должно делать приложение, когда оно получает команду SetConfiguration или SetInterface в пакете SETUP. 1. Когда получена команда SetConfiguration, приложение должно запрограммировать регистры конечной точки, чтобы сконфигурировать в ней характеристики правильной конечной точки в новой конфигурации. 2. Когда принята команда SetInterface, приложение должно запрограммировать регистры конечной точки на тех конечных точках, на которые влияет команда установки интерфейса. 3. Некоторые конечные точки, которые были активными в предыдущей конфигурации или на альтернативной настройке, могут быть недопустимы в новой конфигурации, и тогда они должны быть деактивированы. 4. Демаскировать прерывание для каждой активной конечной точки, и замаскировать прерывания для всех не активных конечных точек в регистре OTG_FS_DAINTMSK. 5. Настроить Data FIFO RAM для каждого FIFO. 6. После того, как все требуемые конечные точки сконфигурированы, приложение должно запрограммировать ядро для отправки пакета status IN. На этом этапе ядро устройства сконфигурировано для приема и передачи пакета данных любого типа. Активация конечной точки. Здесь описываются шаги, которые требуются для активации конечной точки устройства или для конфигурирования существующей конечной точки устройства на новый тип. 1. Запрограммировать характеристики требуемой конечной точки в следующие поля регистра OTG_FS_DIEPCTLx (для конечных точек IN или двунаправленных конечных точек) или регистра OTG_FS_DOEPCTLx (для конечных точек OUT или двунаправленных конечных точек): – максимальный размер пакета 2. Как только конечная точка активирована, ядро начинает декодировать токены, адресованные этой конечной точке и отправлять правильное подтверждение (valid handshake) для каждого правильного токена этой конечной точки. Деактивация конечной точки. Здесь описаны шаги, необходимые для деактивирования существующей конечной точки. 1. В деактивируемой конечной точке очистите бит USB active endpoint в регистре OTG_FS_DIEPCTLx (для конечных точек IN или двунаправленных конечных точек) или регистр OTG_FS_DOEPCTLx (для конечных точек OUT или двунаправленных конечных точек). 2. Как только конечная точка деактивирована, ядро игнорирует токены, адресуемые в эту конечную точку, что приводит к таймауту на USB. Примечание: приложение должно удовлетворять следующим условиям для настройки ядра, чтобы обрабатывать трафик: должны быть очищены биты NPTXFEM и RXFLVLM в регистре OTG_FS_GINTMSK. [Транзакции SETUP и data OUT] В этой секции описан внутренний поток данных и операции на уровне приложения во время транзакций data OUT и транзакций SETUP. • Чтение пакета Здесь описывается, как читать пакеты (data OUT и SETUP) из RxFIFO. 1. При перехвате прерывания RXFLVL (в регистре OTG_FS_GINTSTS) приложение должно прочитать регистр выборки статуса приема (OTG_FS_GRXSTSP). 2. Приложение может маскировать прерывание RXFLVL (в регистре OTG_FS_GINTSTS) путем записи RXFLVL = 0 (в регистре OTG_FS_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_FS_GINTSTS). 6. Шаги 1–5 повторяются каждый раз, когда приложение детектирует установку линии прерывания из-за RXFLVL в OTG_FS_GINTSTS. Чтение пустого RxFIFO может привести к непредсказуемому поведению ядра. Рис. 402 показывает алгоритм вышеописанной процедуры. Рис. 402. Чтение пакета из RxFIFO. [Транзакции SETUP] В этой секции описывается, как ядро обрабатывает пакеты SETUP и последовательность действий приложения для обработки транзакций SETUP. • Требования приложения: 1. Чтобы принять пакет SETUP, должно быть запрограммировано в ненулевое значение поле STUPCNT (в регистре OTG_FS_DOEPTSIZx) контрольной точки control OUT. Когда приложение программирует поле STUPCNT в ненулевое значение, ядро принимает пакеты SETUP и записывает их в RxFIFO, независимо от статуса NAK и настройки бита EPENA в регистре OTG_FS_DOEPCTLx. Поле STUPCNT декрементируется всякий раз, когда управляющая конечная точка (control endpoint) получает пакет SETUP. Если поле STUPCNT не запрограммировано в правильное значение перед приемом пакета SETUP, ядро все еще принимает пакет SETUP и декрементирует поле STUPCNT, однако возможно, что приложение не сможет определить корректное количество принятых пакетов на стадии Setup транзакции управления. STUPCNT = 3 в регистре OTG_FS_DOEPTSIZx 2. Приложение должно всегда выделять некоторое дополнительное пространство данных в RxFIFO, чтобы иметь возможность принять до 3 пакетов SETUP на конечной точке управления (control endpoint). – Резервируемое пространство составляет 10 слов. 3 слова требуется для первого пакета SETUP, 1 слово требуется для завершения стадии Setup, и 6 слов для сохранения 2 дополнительных пакетов SETUP между всеми конечными точками управления. 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. – Первое слово содержит информацию управления, используемую внутри ядра. 3. Когда стадия Setup меняется на стадию Data IN/OUT, ядро записывает элемент (слово Setup stage done) в RxFIFO, показывая тем самым завершение стадии Setup. 4. На стороне AHB пакеты SETUP опустошаются (извлекаются) приложением. 5. Когда приложение извлекает слово Setup stage done из RxFIFO, срабатывает прерывание STUP (в регистре OTG_FS_DOEPINTx), показывая приложению, что оно может обработать принятый пакет SETUP. Ядро очищает бит разрешения конечной точки для конечных точек control OUT. • Последовательность программирования приложения: 1. Программируется регистр OTG_FS_DOEPTSIZx: STUPCNT = 3. 2. Ожидание прерывания RXFLVL (в регистре OTG_FS_GINTSTS) и извлекаются пакеты данных из RxFIFO. 3. Срабатывание прерывания STUP (OTG_FS_DOEPINTx) помечает успешное завершение транзакции SETUP Data. На этом прерывании приложение должно прочитать регистр OTG_FS_DOEPTSIZx, чтобы определить количество принятых пакетов SETUP, и обработать последний принятый пакет SETUP. Рис. 403. Обработка пакета SETUP. • Обработка более 3 пакетов back-to-back SETUP В спецификации USB 2.0 определена нормальная ситуация, когда во время ошибки пакета SETUP, хост не посылает больше 3 пакетов back-to-back SETUP в одну и ту же конечную точку. Однако спецификация USB 2.0 не ограничивает количество пакетов back-to-back SETUP, которое хост может отправить в одну и ту же конечную точку. Когда имеет место это событие, контроллер OTG_FS генерирует прерывание (бит B2BSTUP в регистре OTG_FS_DOEPINTx). • Установка глобального OUT NAK Внутренний поток данных: 1. Когда приложение устанавливает Global OUT NAK (бит SGONAK в регистре OTG_FS_DCTL), ядро останавливает запись в RxFIFO данных, кроме пакетов SETUP. Независимо от от доступного пространства в RxFIFO, не изохронные токены OUT получают ответ отрицательного подтверждения NAK, и ядро игнорирует изохронные пакеты данных OUT. 2. Ядро записывает шаблон Global OUT NAK в RxFIFO. Приложение должно зарезервировать достаточно пространства в RxFIFO, чтобы записать этот шаблон данных. 3. Когда приложение извлекает шаблон Global OUT NAK из RxFIFO, ядро установит прерывание GONAKEFF (регистр OTG_FS_GINTSTS). 4. Как только приложение детектирует это прерывание, оно может предполагать, что ядро находится в режиме Global OUT NAK. Приложение может очистить это прерывание путем очистки бита в SGONAK в регистре OTG_FS_DCTL. Последовательность программирования приложения: 1. Чтобы остановить прием любого вида данных в RxFIFO, приложение должно установить бит Global OUT NAK путем программирования поля: SGONAK = 1 в регистре OTG_FS_DCTL. 2. Ожидание прерывания GONAKEFF в регистре OTG_FS_GINTSTS. Когда это прерывание сработало, оно показывает, что ядро остановило прием любого типа данных, кроме пакетов SETUP. 3. Приложение может принимать правильные пакеты OUT после того, как оно установлено бит SGONAK в регистре OTG_FS_DCTL и перед тем, как ядро выставляет прерывание GONAKEFF (в регистре OTG_FS_GINTSTS). 4. Приложение может временно замаскировать это прерывание путем записи бита GINAKEFFM в регистре OTG_FS_GINTMSK: GINAKEFFM = 0. 5. Всякий раз, когда приложение готово выйти из режима Global OUT NAK, оно должно очистить бит SGONAK в регистре OTG_FS_DCTL. Это также очистит прерывание GONAKEFF (в регистре OTG_FS_GINTSTS): CGONAK = 1 в регистре OTG_FS_DCTL. 6. Если приложение ранее замаскировало это прерывание, то оно должно демаскировать его следующим образом: GINAKEFFM = 1 в регистре GINTMSK. • Запрет конечной точки OUT Приложение должно использовать следующую последовательность программирования приложения для запрета конечной точки OUT, которая была разрешена: 1. Перед запретом любой конечной точки OUT приложение должно разрешить в ядре режим Global OUT NAK: SGONAK = 1 в регистре OTG_FS_DCTL. 2. Ожидание прерывания GONAKEFF (регистр OTG_FS_GINTSTS). 3. Запрет требуемой конечной точки OUT путем программирования следующих полей в регистре OTG_FS_DOEPCTLx (x это номер конечной точки): EPDIS = 1, SNAK = 1. 4. Ожидание прерывания EPDISD (в регистре OTG_FS_DOEPINTx), которое показывает, что конечная точка OUT полностью запрещена. Когда выставлено прерывание EPDISD, ядро также очистит следующие биты в регистре OTG_FS_DOEPCTLx: EPDIS = 0, EPENA = 0. 5. Приложение должно очистить бит Global OUT NAK чтобы запустить прием данных и других не запрещенных конечных точек OUT: SGONAK = 0 в регистре OTG_FS_DCTL. • Программирование остановки транзакции для конечных точек OUT Приложение должно использовать следующую последовательность операций, чтобы остановить любые транзакции (из-за обрыва со стороны хоста, обычно из-за сброса): 1. Разрешение всех конечных точек OUT установкой EPENA = 1 во всех регистрах OTG_FS_DOEPCTLx. 2. Сброс (flush) RxFIFO следующим образом: – Опрос OTG_FS_GRSTCTL.AHBIDL, пока он не установится в 1. Это покажет, что AHB master в состоянии ожидания (idle). 3. Перед запретом любой конечной точки OUT, приложение должно разрешить в ядре режим Global OUT NAK, в соответствии с показанными выше инструкциями "Установка глобального OUT NAK". Это гарантирует, что данные в RxFIFO были успешно отправлены в приложение. Установка SGONAK = 1 в регистре OTG_FS_DCTL. 4. Ожидание прерывания GONAKEFF (в регистре OTG_FS_GINTSTS). 5. Запрет всех активных конечных точек OUT путем программирования следующих бит в регистре OTG_FS_DOEPCTLx: EPDIS = 1, SNAK = 1. 6. Ожидание прерывания EPDIS в регистре OTG_FS_DOEPINTx для каждой конечной точки OUT, запрограммированной на предыдущем шаге. Прерывание EPDIS показывает, что соответствующая конечная точка OUT полностью запрещена. Когда выставлено прерывание EPDIS, очищаются следующие биты в регистре OTG_FS_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)) 3. На любом прерывании конечной точки OUT приложение должно прочитать регистр размера транзакции конечной точки, чтобы вычислить размер полезной нагрузки в памяти. Принятый размер полезной нагрузки может быть меньше, чем запрограммированный размер транзакции. – Размер полезной нагрузки в памяти = начальному размеру транзакции, запрограммированному приложением – обновленный ядром конечный размер транзакции. Внутренний поток данных: 1. Приложение должно установить поля размера транзакции и счетчика пакетов в регистрах, специфических для конечной точки, очистить бит NAK, и разрешить конечную точку для приема данных. 2. Как только бит NAK очищен, ядро начинает принимать данные и записывать их в RxFIFO, пока есть место в RxFIFO. Для каждого пакета данных, принятого через USB, его данные и статус записываются в RxFIFO. Каждый пакет (пакет максимального размера или короткий пакет) записываемый в RxFIFO декрементирует на 1 поле счетчика пакетов для каждой конечной точки. – Принятые пакеты данных OUT с неправильной CRC автоматически сбрасываются из RxFIFO. 3. Когда счетчик пакетов становится равным 0, или когда на конечной точке принят короткий пакет, устанавливается бит NAK для этой конечной точки. Как только бит NAK установлен, изохронные и не изохронные пакеты данных игнорируются и не записываются в RxFIFO, и не изохронные токены OUT получают в ответ отрицательные подтверждения NAK. 4. После того, как данные были записаны в RxFIFO, приложение считывает данные из RxFIFO и записывает их во внешнюю память, по одному пакету на одну конечную точку. 5. По окончанию записи каждого пакета во внешнюю память через AHB, декрементируется размер транзакции для конечной точки на размер записанного пакета. 6. Шаблон завершения транзакции данных OUT для конечной точки записывается в RxFIFO при одном из следующих условий: – Размер транзакции 0 и счетчик пакетов 0. 7. Когда приложение извлекает эту запись (транзакция данных OUT завершена), генерируется прерывание завершения транзакции для конечной точки, и очищается разрешение конечной точки. Последовательность действий приложения: 1. Запрограммировать регистр OTG_FS_DOEPTSIZx размером транзакции и соответствующим счетчиком пакетов. 2. Запрограммировать регистр OTG_FS_DOEPCTLx характеристиками конечной точки, и установить в нем биты EPENA и CNAK: EPENA = 1, CNAK = 1. 3. Подождать прерывания RXFLVL (в регистре OTG_FS_GINTSTS) и извлечь пакеты из RxFIFO (опустошить стек приема). Этот шаг может быть повторен несколько раз, в зависимости от размера транзакции. 4. Выставление прерывания XFRC (в регистре OTG_FS_DOEPINTx) помечает успешное завершение не изохронной транзакции данных OUT. 5. Прочитать регистр OTG_FS_DOEPTSIZx, чтобы определить размер принятой полезной нагрузки данных. • Традиционная (Generic) изохронная транзакция данных OUT В этой секции описывается обычная изохронная транзакция данных OUT. Требования приложения: 1. Все требования приложения для не изохронных транзакций данных OUT также применимы и к изохронным транзакциям данных OUT. 2. Для изохронных транзакций данных OUT поля размера транзакции и счетчика пакетов должны всегда быть установлены на максимальный размер пакета, которые могут быть приняты в одном фрейме и не более. Изохронные транзакции данных OUT не могут распространяться больше чем на 1 фрейм. 3. Приложение должно прочитать все изохронные пакеты данных OUT из RxFIFO (данные и статус) перед окончанием периодического фрейма (прерывание EOPF в регистре OTG_FS_GINTSTS). 4. Для приема данных в следующем фрейме должна быть разрешена изохронная конечная точка OUT после EOPF (OTG_FS_GINTSTS) и перед SOF (OTG_FS_GINTSTS). Внутренний поток данных: 1. Внутренний поток данных для изохронных конечных точек OUT тот же самый, что и для не изохронных конечных точек OUT, но с некоторыми отличиями. 2. Когда изохронная конечная точка разрешена установкой бита Endpoint Enable и очисткой бита NAK, также соответственно должен быть установлен бит четного/нечетного фрейма (Even/Odd frame). Ядро принимает данные на изохронной конечной точке OUT только в отдельном фрейме, если удовлетворяется условие: EONUM (в регистре OTG_FS_DOEPCTLx) = SOFFN[0] (в регистре OTG_FS_DSTS). 3. Когда приложение полностью прочитало пакет данных isochronous OUT (данные и статус) из RxFIFO, ядро обновляет поле RXDPID в регистре OTG_FS_DOEPTSIZx значением data PID последнего изохронного пакета данных OUT, прочитанного из RxFIFO. Последовательность действий приложения: 1. Запрограммировать регистр OTG_FS_DOEPTSIZx размером транзакции и соответствующим счетчиком пакетов. 2. Запрограммировать регистр OTG_FS_DOEPCTLx характеристиками конечной точки и установить в нем биты Endpoint Enable, ClearNAK и Even/Odd frame (четный/нечетный фрейм): EPENA = 1, CNAK=1, EONUM = (0: четный/1: нечетный). 3. Подождать прерывание RXFLVL (в регистре OTG_FS_GINTSTS) и выбрать пакеты данных из RxFIFO (опустошить стек приема). Этот шаг может быть повторен несколько раз, в зависимости от размера транзакции. 4. Выставляется прерывание XFRC (в регистре OTG_FS_DOEPINTx), что помечает завершение изохронной транзакции данных OUT. Это прерывание не обязательно означает, что данные в памяти хорошие. 5. Это прерывание не всегда может быть детектировано для изохронных транзакций OUT. Вместо этого приложение может детектировать прерывание IISOOXFRM в регистре OTG_FS_GINTSTS. 6. Прочитать регистр OTG_FS_DOEPTSIZx, чтобы определить размер принятой транзакции, и определить целостность принятых во фрейме данных. Приложение должно обработать принятые данные в памяти как достоверные, только если удовлетворяется одно из следующих условий: – RXDPID = D0 (в регистре OTG_FS_DOEPTSIZx) и количество принятых пакетов USB, которых эта полезная нагрузка была принята = 1. Количество пакетов USB, в которых была принята эта полезная нагрузка = начальному счетчику пакетов, запрограммированному приложением – обновленному ядром конечному счетчику пакетов. Приложение может отбросить неправильные пакеты данных. • Незавершенные изохронные транзакции данных OUT Эта секция описывает последовательность действий приложения, когда изохронные пакеты данных OUT отбрасываются внутри ядра. Внутренний поток данных: 1. Для изохронных конечных точек OUT не всегда может быть выставлено прерывание XFRC (в регистре OTG_FS_DOEPINTx). Если ядро отбросит изохронные пакеты данных OUT, приложение может не определить прерывание XFRC в следующих условиях: – Когда RxFIFO не может принять полный пакет данных ISO OUT, ядро отбрасывает принятые данные ISO OUT. 2. Когда ядро детектирует окончание периодического фрейма перед завершением транзакции для всех изохронных конечных точек OUT, оно выставляет прерывание незавершенных изохронных данных OUT (бит IISOOXFRM в регистре OTG_FS_GINTSTS). Это показывает, что прерывание XFRC (в регистре OTG_FS_DOEPINTx) не выставлено на по крайней мере одной из изохронных конечных точках OUT. В этот момент конечная точка с незавершенной транзакцией остается разрешенной, но на USB активные транзакции на этой конечной точке не выполняются. Последовательность действий приложения: 1. Выставление прерывания IISOOXFRM (в регистре OTG_FS_GINTSTS) показывает, что в текущем фрейме как минимум одна изохронная конечная точка OUT имеет незавершенную транзакцию. 2. Если это произошло из-за того, что изохронные данные OUT не были полностью извлечены из конечной точки, приложение должно гарантировать, что перед продолжением извлекло из RxFIFO все относящееся к изохронным конечным точкам OUT (их данные и статус). Когда все данные извлечены из RxFIFO, приложение может детектировать прерывание XFRC (в регистре OTG_FS_DOEPINTx). В этом случае приложение должно заново разрешить конечную точку для приема изохронных данных OUT в следующем фрейме. 3. Когда получено прерывание IISOOXFRM (в регистре OTG_FS_GINTSTS), прерывание должно прочитать регистры управления всех изохронных конечных точек OUT (в регистре OTG_FS_GINTSTS), чтобы определить, у какой конечной точки есть незавершенная транзакция в текущем микрофрейме. Транзакция конечной точки незавершенная, если удовлетворены оба следующих условия: – бит EONUM (в регистре OTG_FS_DOEPCTLx) = SOFFN[0] (в регистре OTG_FS_DSTS). 4. Предыдущий шаг может быть повторен перед детектированием прерывания SOF (в регистре OTG_FS_GINTSTS), чтобы гарантировать, что текущий номер фрейма не поменялся. 5. Для изохронных конечных точек OUT с незавершенными транзакциями приложение должно отбросить данные в памяти и запретить конечную точку установкой бита EPDIS в регистре OTG_FS_DOEPCTLx. 6. Подождать прерывания EPDIS (в регистре OTG_FS_DOEPINTx) и разрешить конечную точку для приема новых данных в следующем фрейме. Из-за того, что приложению нужно некоторое время для запрета конечной точки, приложение может не получить данные в следующем фрейме после приема неправильных изохронных данных. • Приостановка (stalling) не изохронных конечных точек OUT Эта секция описывает, как приложение может приостановить (stall) не изохронную конечную точку. 1. Поместить ядро в режим глобального отрицательного подтверждения (Global OUT NAK mode). 2. Запретить нужную конечную точку. Когда конечная точка запрещается, вместо установки бита SNAK в регистре OTG_FS_DOEPCTL нужно установить STALL = 1 (в регистре OTG_FS_DOEPCTL). Бит STALL всегда имеет приоритет перед битом NAK. 3. Когда приложение готово завершить подтверждение приостановки (STALL handshake) для конечной точки, бит STALL (в регистре OTG_FS_DOEPCTLx) должен быть очищен. 4. Если приложение устанавливает или очищает STALL для конечной точки из-за команды SetFeature.Endpoint Halt или ClearFeature.Endpoint Halt, бит STALL должен быть установлен или очищен перед тем, как приложение настроит транзакцию стадии Status на конечной точке управления (control endpoint). [Примеры] В этой секции показаны примеры и сценарии транзакций некоторых фундаментальных типов. • Транзакция Bulk OUT На рис. 404 показан прием одиночного пакета Bulk OUT Data через USB и передача его на AHB, и описываются события, возникающие при этом процессе. Рис. 404. Транзакция Bulk OUT. После команды SetConfiguration/SetInterface, приложение инициализирует все конечные точки OUT установкой CNAK = 1 и EPENA = 1 (в регистре OTG_FS_DOEPCTLx), и устанавливает подходящие значения XFRSIZ и PKTCNT в регистре OTG_FS_DOEPTSIZx. 1. Хост пытается отправить данные (токен OUT) в конечную точку. 2. Когда ядро принимает токен OUT через USB, оно сохраняет пакет в RxFIFO, потому что там есть свободное место. 3. После записи полного пакета в RxFIFO, ядро выставляет прерывание RXFLVL (в регистре OTG_FS_GINTSTS). 4. При приеме PKTCNT количества USB-пакетов ядро внутри себя установит бит NAK для этой конечной точки, чтобы предотвратить прием любых дополнительных пакетов. 5. Приложение обрабатывает прерывание и вычитывает данные из RxFIFO. 6. Когда приложение прочитало все данные (эквивалентно размеру транзакции XFRSIZ), ядро генерирует прерывание XFRC (в регистре OTG_FS_DOEPINTx). 7. Приложение обрабатывает прерывание и использует установку бита прерывания завершения транзакции XFRC (в регистре OTG_FS_DOEPINTx) чтобы определить, что предполагаемая транзакция завершена. Транзакции данных IN • Запись пакета В этой секции описывается, как приложение записывает пакет данных в FIFO конечной точки, когда разрешены выделенные TxFIFO. 1. Приложение может выбрать либо режим опроса состояния (polling), либо режим прерываний. - В режиме опроса приложение отслеживает статус данных TxFIFO конечной точки путем чтения регистра OTG_FS_DTXFSTSx, чтобы определить, есть ли доступное место для данных в TxFIFO. 2. Используя один из вышеупомянутых методов, когда приложение определяет, что есть достаточно места для записи передаваемого пакета, одно должно сначала записать регистр управления конечной точки перед записью данных в FIFO. Обычно приложение должно выполнить операцию чтение-модификация-запись на регистре OTG_FS_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_FS_DIEPINTx в ответ на бит SNAK в регистре OTG_FS_DIEPCTLx. 4. Как только приложение увидел это прерывание, приложение может предполагать, что эта конечная точка IN находится в режиме отрицательных подтверждений (IN NAK mode). Это прерывание может быть очищено приложением установкой бита CNAK в регистре OTG_FS_DIEPCTLx. Последовательность действий приложения: 1. Для остановки передачи любых данных в определенную конечную точку IN, приложение должно установить бит IN NAK. Для установки этого бита в регистре OTG_FS_DIEPCTLx должен быть установлен бит SNAK = 1. 2. Ожидание выставления прерывания INEPNE в регистре OTG_FS_DIEPINTx. Это прерывание показывает, что ядро остановило передачу данных на этой конечной точке. 3. Ядро может передать правильные данные IN на конечной точке после установки приложением бита NAK, но перед выставлением прерывания NAK Effective. 4. Приложение может временно замаскировать (запретить) это прерывание записью бита INEPNEM в регистре DIEPMSK: INEPNEM = 0. 5. Чтобы выйти из режима Endpoint NAK, приложение дожно очистить бит статуса NAK (NAKSTS) в регистре OTG_FS_DIEPCTLx (CNAK = 1). Это также очистит прерывание INEPNE (в регистре OTG_FS_DIEPINTx). 6. Если приложение ранее замаскировало это прерывание, то оно должно демаскировать его следующим образом: INEPNEM = 1 в регистре DIEPMSK. • Разрешение конечной точки IN. Используйте следующий алгоритм для запрета определенной конечной точки IN, которая была ранее разрешена. Последовательность действий приложения: 1. Приложение должно прекратить записывать данные на AHB для запрещаемой конечной точки IN. 2. Приложение дожно установить конечную точку в режим NAK: SNAK = 1 в регистре OTG_FS_DIEPCTLx. 3. Подождать прерывания INEPNE в регистре OTG_FS_DIEPINTx. 4. Установить следующие биты в регистре OTG_FS_DIEPCTLx конечной точки, которая должна быть запрещена: EPDIS = 1, SNAK = 1. 5. Выставление прерывания EPDISD в регистре OTG_FS_DIEPINTx покажет, что ядро полностью запретило указанную конечную точку. Вместе с выставлением этого прерывания также ядро очистит следующие биты в регистре OTG_FS_DIEPCTLx: EPENA = 0, EPDIS = 0. 6. Приложение должно прочитать регистр OTG_FS_DIEPTSIZx для периодической конечной точки IN, чтобы вычислить, сколько данных на конечной точке было передано через USB. 7. Приложение должно сбросить (flush) данные в TxFIFO конечной точки, путем установки следующих полей в регистре OTG_FS_GRSTCTL: TXFNUM = номеру TxFIFO конечной точки, TXFFLSH = 1. Приложение должно опрашивать регистр OTG_FS_GRSTCTL, пока ядром не будет очищен бит TXFFLSH, что показывает окончание операции сброса данных (flush). Теперь для передачи новых данных на этой конечной точке приложение должно заново разрешить эту конечную точку. • Программирование остановки транзакции для конечных точек IN Приложение должно использовать следующую последовательность программирования для остановки любых транзакций (из-за обрыва со стороны хоста, обычно сброса). Последовательность операций: 1. Запрет конечной точки IN установкой EPDIS = 1 во всех регистрах OTG_FS_DIEPCTLx. 2. Подождать прерывание EPDIS в регистре OTG_FS_DIEPINTx, которое показывает, что конечная точка IN полностью запрещена. Когда прерывание EPDIS выставлено, очищаются следующие биты в регистре OTG_FS_DIEPCTLx: EPDIS = 0, EPENA = 0. 3. Сбросить TxFIFO программированием следующих бит в регистре OTG_FS_GRSTCTL: TXFFLSH = 1, TXFNUM = номер FIFO, специфический для конечной точки. 4. Приложение может начать опрос регистра OTG_FS_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. 3. Как только конечная точка разрешена для транзакций данных, ядро обновит регистр размера транзакции. По окончании транзакции IN приложение должно прочитать регистр размера транзакции, чтобы определить, сколько данных, которые были помещены в TxFIFO, были уже переданы через USB. 4. Данные, взятые в TxFIFO = (transfer size, изначально запрограммированный приложением – обновленный ядром конечный transfer size). - Данные, переданные через USB = (packet count, изначально запрограммированный приложением – обновленный ядром конечный packet count) x MPSIZ[EPNUM]. Внутренний поток данных: 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_FS_DIEPTSIZx размером транзакции (transfer size) и соответствующим счетчиком пакетов (packet count). 2. Запрограммировать регистр OTG_FS_DIEPCTLx характеристиками конечной точки и установить биты CNAK и EPENA (Endpoint Enable). 3. Когда передается пакет не нулевой длины, приложение должно опрашивать регистр OTG_FS_DTXFSTSx (здесь x это номер FIFO, связанный с этой конечной точкой), чтобы определить, есть ли достаточно места в FIFO данных. Приложение может опционально использовать TXFE (в регистре OTG_FS_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]. 2. Приложение может планировать передачу данных только по одному фрейму за раз. – (MCNT – 1) x MPSIZ ≤ XFERSIZ ≤ MCNT x MPSIZ Имейте в виду, что поле MPSIZ находится в регистре OTG_FS_DIEPCTLx, а поля MCNT, PKTCNT и XFERSIZ в регистре OTG_FS_DIEPTSIZx. 3. Полностью передаваемые во фрейме данные должны быть записаны приложением в TxFIFO перед получением токена IN. Даже когда 1 слово данных для передачи пропущено в TxFIFO, когда получен токен IN, ядро ведет себя как если бы TxFIFO был пуст. Когда TxFIFO пуст: – Для изохронных конечных точек IN через USB передается пакет нулевой длины. Внутренний поток данных: 1. Приложение должно установить поля размера транзакции и счетчика пакетов в регистрах, относящихся к конечным точкам, и разрешить конечную точку для для передачи данных. 2. Приложение должно также записать требуемые данные в TxFIFO, связанный с конечной точкой. 3. Каждый раз, когда приложение записывает пакет в TxFIFO, размер транзакции для этой конечной точки декрементируется на размер пакета. Данные извлекаются из памяти приложения до тех пор, пока размер транзакции для конечной точки не станет равным 0. 4. Когда токен IN принимается для периодической конечной точки, ядро передает данные в TxFIFO, если они доступны. Если полная полезная нагрузка данных (пакет целиком, в режиме выделенного FIFO) для фрейма не присутствует в TxFIFO, то ядро генерирует для конечной точки прерывание получения токена IN, когда TxFIFO пуст. – Для изохронных конечных точек IN через USB передается пакет нулевой длины. 5. Счетчик пакетов для конечной точки декрементируется на 1 в следующих условиях: – Для изохронных конечных точек, когда передается пакет данных нулевой или не нулевой длины. 6. На интервале периодического фрейма (Periodic frame Interval, управляемого PFIVL в регистре OTG_FS_DCFG), когда ядро обнаруживает любой не пустой FIFO конечной точки isochronous IN, запланированной для текущего фрейма, ядро генерирует прерывание IISOIXFR в регистре OTG_FS_GINTSTS. Последовательность действий приложения: 1. Запрограммировать OTG_FS_DIEPCTLx регистр характеристиками конечной точки, и установить биты CNAK и EPENA. 2. Записать в TxFIFO данные для передачи в следующем фрейме. 3. Выставление прерывания ITTXFE (в регистре OTG_FS_DIEPINTx) показывает, что приложение пока не записало в TxFIFO все данные для передачи. 4. Если конечная точка interrupt IN уже разрешена, когда прерывание детектировано, то это прерывание должно быть проигнорировано. Если оно не разрешена, то разрешить конечную точку, чтобы данные могли быть переданы на следующей попытке получения токена IN. 5. Выставление прерывания XFRC (в регистре OTG_FS_DIEPINTx) без прерывания ITTXFE в регистре OTG_FS_DIEPINTx показывает успешное завершение изохронной транзакции IN. Чтение регистра OTG_FS_DIEPTSIZx должно дать transfer size = 0 и packet count = 0, что покажет передачу всех данных через USB. 6. Выставление прерывания XFRC (в регистре OTG_FS_DIEPINTx), с прерыванием ITTXFE или без него (бит ITTXFE в регистре OTG_FS_DIEPINTx) показывает успешное завершение транзакции interrupt IN. Чтение регистра OTG_FS_DIEPTSIZx должно дать transfer size = 0 и packet count = 0, что показывает передачу всех данных через USB. 7. Выставление прерывания незавершенной транзакции isochronous IN (IISOIXFR) в регистре OTG_FS_GINTSTS ни с одним из вышеупомянутых прерываний показывает, что ядро не приняло как минимум 1 периодический токен IN в текущем фрейме. • Незавершенные изохронные транзакции данных IN В этой секции описывается, что должно делать приложение на незавершенной транзакции данных isochronous IN. Внутренний поток данных: 1. Изохронная транзакция IN считается незавершенной, если присутствует одно из следующих условий: a) Ядро приняло поврежденный токен isochronous IN на как минимум одной конечной точке isochronous IN. В этом случае приложение детектирует прерывание незавершенной изохронной транзакции IN (IISOIXFR в регистре OTG_FS_GINTSTS). Ядро передает через USB пакет нулевой длины в ответ на принятый токен IN. 2. Приложение должно прекратить запись данных полезной нагрузки в TxFIFO, как только это становится возможным. 3. Приложение должно установить бит NAK и бит запрета для конечной точки. 4. Ядро запрещает конечную точку, очищает бит запрета, и выставляет прерывание Endpoint Disable для этой конечной точки. Последовательность действий приложения: 1. Приложение может игнорировать принятый токен IN, когда на любой изохронной конечной точке IN есть прерывание пустого TxFIFO в регистре OTG_FS_DIEPINTx, поскольку в конечном итоге это приведет к прерыванию неполной isochronous IN транзакции (в регистре OTG_FS_GINTSTS). 2. Выставление прерывания неполной изохронной транзакции IN (в регистре OTG_FS_GINTSTS) показывает незавершенную транзакцию isochronous IN на как минимум одной изохронной конечной точке IN. 3. Приложение должно прочитать регистр управления конечной точкой для всех изохронных конечных точек IN, чтобы определить конечные точки с незавершенными транзакциями данных IN. 4. Приложение должно прекратить записывать данные в периодические TxFIFO, связанные с этими конечными точками на AHB. 5. Для запрета конечной точки запрограммировать следующие поля в регистре OTG_FS_DIEPCTLx: SNAK = 1, EPDIS = 1. 6. Выставление прерывания Endpoint Disabled в регистре OTG_FS_DIEPINTx показывает, что ядро запретило конечную точку. В этот момент приложение должно сбросить (flush) данные в связанном TxFIFO, или перезаписать существующие данные в FIFO путем разрешения конечной точки для новой транзакции в следующем микрофрейме. Чтобы сбросить (flush) данные, приложение должно использовать регистр OTG_FS_GRSTCTL. • Приостановка (stalling) не изохронных конечных точек IN Эта секция описывает, как приложение должно приостановить (stall) не изохронную конечную точку. Последовательность действий приложения: 1. Запретить конечную точку IN, которая должна быть приостановлена. Также установить бит STALL. 2. EPDIS = 1 в регистре OTG_FS_DIEPCTLx, когда конечная точка уже разрешена. STALL = 1 в регистре OTG_FS_DIEPCTLx. Бит STALL всегда имеет приоритет над битом NAK. 3. Выставление прерывания Endpoint Disabled (в регистре OTG_FS_DIEPINTx) покажет приложению, что ядро запретило указанную конечную точку. 4. Приложение должно сбросить не периодический или периодический TxFIFO, в зависимости от типа конечной точки. В случае не периодической конечной точки для передачи данных приложение должно заново разрешить другие не периодические конечные точки, которые не нужно останавливать. 5. Всякий раз, когда приложение готово прекратить отправлять подтверждения STALL на конечной точке, оно должно очистить бит STALL в регистре OTG_FS_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_FS_DIEPINTx и прерывание OTEPDIS в регистре OTG_FS_DOEPINTx во время стадии данных транзакции управления, после того, как ядро передало объем данных, указанный в пакете SETUP. Затем, когда приложение получит это прерывание, оно должно установить бит STALL в соответствующем регистре управления конечной точки, и очистить это прерывание. [Наихудшее время отклика устройства USB] Когда контроллер OTG_FS работает как устройство 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_FS_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_FS_GUSBCFG). На рис. 405 есть следующие сигналы: • tkn_rcvd: информация для PFC от MAC о приеме токена. См. выше таблицу 203: значения TRDT в зависимости от тактовой частоты AHB во врезке "OTG_FS USB configuration register (OTG_FS_GUSBCFG)". Рис. 405. Случай максимального тайминга TRDT. [Модель программирования OTG] Контроллер OTG_FS это устройство OTG, поддерживающее протоколы HNP и SRP. Когда ядро подключено к коннектору типа "A", то оно называется как A-устройство (хост USB). Когда ядро подключено к коннектору типа "B", то оно работает как B-устройство (устройство USB). В режиме хоста контроллер OTG_FS выключает VBUS для экономии энергии питания. SRP это метод, с помощью которого B-устройство сигнализирует A-устройству включить питание VBUS. A-устройство должно сформировать импульс как на линии данных, так и на линии VBUS, однако хост может детектировать для SRP либо импульс линии данных, либо импульс VBUS. HNP это метод, с помощью которого B-устройство договаривается с хостом о смене ролей - чтобы оно стало хостом USB, а хост стал устройством USB. В согласованном режиме (Negotiated mode) после HNP B-устройство приостанавливает шину, и возвращается обратно к роли устройства USB. Протокол запроса сессии A-устройства. Приложение должно установить бит управления функцией SRP в регистре конфигурации ядра USB. Это разрешит контроллеру OTG_FS детектировать SRP в качестве A-устройства. Рис. 406. A-device SRP. DRV_VBUS = сигнал управления VBUS для PHY 1. Для экономии питания приложение приостанавливает и выключает порт, когда шина находится в состоянии ожидания, путем записи бит port suspend и port power в регистре управления и статуса порта. 2. PHY показывает выключение питания порта снятием сигнала VBUS_VALID. 3. Устройство должно детектировать SE0 в течение по крайней мере 2 мс, чтобы запустить SRP, когда питание VBUS выключено. 4. Для инициации SRP, устройство USB включает свой верхний подтягивающий резистор на линии данных (pull-up) на время от 5 до 10 мс. Контроллер OTG_FS детектирует импульс на линии данных. 5. Устройство USB переводит VBUS на уровень выше A-device session valid (2.0V минимум), чтобы сгенерировать импульс VBUS. Контроллер OTG_FS генерирует прерывание для приложения при детектировании SRP. Установится бит определения запроса сессии (Session request detected) в регистре глобального статуса прерываний (установится бит SRQINT в регистре OTG_FS_GINTSTS). 6. Приложение должно обработать прерывание запроса сессии и включить питание порта путем записи бита питания порта (power bit) в регистре управления и статуса порта. PHY показывает включение питания порта выставлением сигнала VBUS_VALID. 7. Когда на USB подано питание, устройство подключается, завершая тем самым процесс SRP. Протокол запроса сессии B-устройства. Приложение должно установить бит управления функцией SRP в регистре конфигурации ядра USB. Это разрешит контроллеру OTG_FS инициировать SRP в качестве B-устройства. SRP является средством, через которое контроллер OTG_FS может запросить новую сессию у хоста USB. Рис. 407. B-device SRP. VBUS_VALID = сигнал допустимости уровня VBUS от PHY 1. Чтобы экономить питание, хост приостанавливает и выключает питание порта, когда шина находится в состоянии ожидания. Контроллер OTG_FS установит бит ранней приостановки (early suspend bit) в регистре управления ядра после 3 мс нахождения шины в состоянии ожидания. После этого контроллер OTG_FS установит бит приостановки USB в регистре прерываний ядра. Контроллер OTG_FS информирует PHY разрядить VBUS. 2. PHY покажет для устройства завершение сессии. Это начальное условие для SRP. Контроллер OTG_FS требует 2 мс SE0 перед инициированием SRP. Для последовательного трансивера USB 1.1 full-speed, приложение должно подождать, пока VBUS разрядится до 0.2V после снятия BSVLD (в регистре OTG_FS_GOTGCTL). Это время разряда может быть получено от производителя трансивера, и оно может меняться в зависимости от производителя. 3. Ядро USB OTG информирует PHY, чтобы ускорить разряд VBUS. 4. Приложение инициирует SRP записью бита запроса сессии в регистре управления и статус OTG. Контроллер OTG_FS формирует импульс линии данных, затем импульс VBUS. 5. Хост детектирует SRP по импульсу либо от линии данных, либо от VBUS, и включает VBUS. PHY показывает для устройства включение VBUS. 6. Контроллер OTG_FS выполняет пульсацию VBUS. Хост запускает новую сессию включением VBUS, показывая успех SRP. Контроллер OTG_FS выставляет прерывание в приложение установкой бита успешного изменения состояния статуса запроса сессии в регистре статуса прерываний OTG. Приложение считывает бит успеха запроса сессии в регистре управления и статуса OTG. 7. Когда на USB подано питание, подключается контроллер OTG_FS, завершая процесс SRP. Протокол хоста согласования A-устройства. HNP переключает роль хоста USB от A-устройства к B-устройству. Приложение должно установить бит разрешения функции HNP в регистре конфигурации ядра USB, чтобы разрешить контроллеру OTG_FS выполнять протокол HNP в качестве A-устройства. Рис. 408. A-device HNP. DPPULLDOWN = сигнал от ядра к PHY, чтобы разрешить/запретить подтягивающий вниз резистор (pull-down) на линии DP внутри PHY. 1. Контроллер OTG_FS отправляет дескриптор B-device SetFeature b_hnp_enable, чтобы разрешить поддержку HNP. Ответ ACK B-устройства показывает, что B-устройство поддерживает HNP. Приложение должно установить бит разрешения HNP хоста в регистре управления и статуса OTG, чтобы показать контроллеру OTG_FS, что B-устройство поддерживает HNP. 2. По завершении использования шины USB приложение приостанавливается путем записи бита приостановки порта в регистр управления и состояния порта хоста. 3. Когда B-устройство увидело приостановку USB, оно отключается, с указанием начального состояния HNP. B-устройство инициирует HNP только когда оно должно переключиться на роль хоста USB; иначе шина продолжает свою приостановку. Контроллер OTG_FS установит прерывание детектирования согласования хоста (host negotiation detected) в регистре статуса прерываний OTG, показывая старт HNP. Контроллер OTG_FS снимает DM pull-down и DM pull-down в PHY, чтобы показать роль устройства. PHY разрешает резистор OTG_FS_DP, чтобы показать подключение к B-устройству. Приложение должно прочитать бит текущего режима в регистре управления и статуса OTG, для определения режима работы устройства. 4. B-устройство детектирует подключение, выдает сброс USB, и выполняет энумерацию контроллера OTG_FS для трафика данных. 5. B-устройство продолжает свою роль хоста, инициирует трафик, и приостанавливает работу шины. Контроллер OTG_FS устанавливает бит ранней приостановки (early suspend) в регистре прерываний ядра после 3 мс ожидания шины. После этого контроллер OTG_FS устанавливает бит приостановки USB (USB Suspend) в регистре прерываний ядра. 6. В согласованном режиме (Negotiated mode) контроллер OTG_FS детектирует приостановку, отключается и переключается обратно на роль хоста. Контроллер OTG_FS выставляет DM pull-down и DM pull-down в PHY, чтобы показать, что он принимает на себя роль хоста USB. 7. Контроллер OTG_FS установит прерывание изменения статуса линии идентификации на коннекторе (Connector ID status change) в регистре статуса прерываний OTG. Приложение должно прочитать статус connector ID в регистре управления и статуса OTG, чтобы определить работу контроллера OTG_FS как A-устройства. Это покажет для приложения завершение HNP. Приложение должно прочитать бит текущего режима в регистре управления и статуса OTG, чтобы определить режим работы хоста. 8. B-устройство подключается, завершая процесс HNP. Протокол согласования хоста B-устройства. HNP переключает роль хоста от B-устройства к A-устройству. Приложение должно установить бит разрешения функции HNP в регистре конфигурации ядра, чтобы разрешить контроллер OTG_FS выполнить протокол HNP в качестве B-устройства. Рис. 409. B-device HNP. DPPULLDOWN = сигнал от ядра к PHY чтобы разрешить/запретить pull-down на линии DP внутри PHY. 1. A-устройство отправляет дескриптор SetFeature b_hnp_enable для разрешения поддержки HNP. Контроллер OTG_FS выдает положительное подтверждение ACK, показывающее, что он поддерживает HNP. Приложение должно установить бит разрешения устройства HNP в регистре управления и статуса OTG, чтобы показать поддержку HNP. Приложение установит бит запроса HNP в регистре управления и статуса OTG, чтобы показать контроллеру OTG_FS инициировать HNP. 2. По завершении использования шины A-устройство приостанавливается путем записи бита приостановки бита приостановки порта в регистре управления и статуса порта. Контроллер OTG_FS установит бит ранней приостановки (Early suspend) в регистре прерываний ядра при 3 мс состояния ожидания шины. После этого контроллер OTG_FS установит бит приостановки USB (USB suspend) в регистре прерываний ядра. Контроллер OTG_FS отключается и A-устройство детектирует SE0 на шине, показывающее HNP. Контроллер OTG_FS выставит DP pull-down и DM pull-down в PHY, чтобы показать, что он принимает на себя роль хоста USB. A-устройство ответит активацией своего OTG_FS_DP pull-up резистора в течение 3 мс после обнаружения SE0. Контроллер OTG_FS детектирует это как подключение. Контроллер OTG_FS установит прерывание изменения статуса успешного согласования хоста в регистре статуса прерываний OTG, показывая статус HNP. Приложение должно прочитать бит успеха согласования хоста в регистре управления и статуса OTG, чтобы определить успех согласования хоста. Приложение должно прочитать бит текущего режима в регистре прерываний ядра (OTG_FS_GINTSTS), чтобы определить режим работы хоста. 3. Приложение устанавливает бит сброса (PRST в регистре OTG_FS_HPRT), и контроллер OTG_FS выдает на шину USB reset, и выполняет энумерацию A-устройства для трафика данных. 4. Контроллер OTG_FS продолжает свою роль хоста при инициировании трафика, и по завершении приостанавливает шину записью бита приостановки порта в регистре управления и статуса порта. 5. В согласованном режиме (Negotiated mode), когда A-устройство определит приостановку, оно отключается и переключается обратно на роль хоста. Контроллер OTG_FS снимает DP pull-down и DM pull-down в PHY, чтобы показать назначение своей роли устройства USB. 6. Приложение должно прочитать бит текущего режима в регистре прерываний ядра (OTG_FS_GINTSTS), чтобы определить режим работы хоста. 7. Контроллер OTG_FS подключается, завершая процесс HNP. [Ссылки] 1. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com. |