32. USB on-the-go full-speed/high-speed (OTG_FS/OTG_HS)

32.1 Introduction

Portions Copyright (c) Synopsys, Inc. All rights reserved. Used with permission.

This section presents the architecture and the programming model of the OTG_FS/OTG_HS controller.

The following acronyms are used throughout the section:

FSFull-speed
LSLow-speed
HSHigh-speed
MACMedia access controller
OTGOn-the-go
PFCPacket FIFO controller
PHYPhysical layer
USBUniversal serial bus
UTMIUSB 2.0 Transceiver Macrocell interface (UTMI)
ULPIUTMI+ Low Pin Interface
LPMLink power management
BCDBattery charging detector
HNPHost negotiation protocol
SRPSession request protocol

References are made to the following documents:

The USB OTG is a dual-role device (DRD) controller that supports both device and host functions and is fully compliant with the On-The-Go Supplement to the USB 2.0 Specification . It can also be configured as a host-only or device-only controller, fully compliant with the USB 2.0 Specification . OTG_HS supports the speeds defined in the Table 223: OTG_HS speeds supported below. OTG_FS supports the speeds defined in the Table 224: OTG_FS speeds supported below. The USB OTG supports both HNP and SRP. The only external device required is a charge pump for V BUS in OTG mode.

Table 223. OTG_HS speeds supported
-HS (480 Mb/s)FS (12 Mb/s)LS (1.5 Mb/s)
Host modeXXX
Device modeXX-
Table 224. OTG_FS speeds supported
-HS (480 Mb/s)FS (12 Mb/s)LS (1.5 Mb/s)
Host mode-XX
Device mode-X-

32.2 OTG_FS/OTG_HS main features

The main features can be divided into three categories: general, host-mode and device-mode features.

32.2.1 General features

The OTG_FS/OTG_HS interface general features are the following:

32.2.2 Host-mode features

The OTG_FS/OTG_HS interface main features and requirements in host-mode are the following:

32.2.3 Peripheral-mode features

The OTG_FS/OTG_HS interface main features in peripheral-mode are the following:

32.3 OTG_FS/OTG_HS implementation

Table 225. OTG_FS/OTG_HS implementation (1)

USB featuresOTG_FSOTG_HS for STM32F7x2xx and STM32F730xx (2)OTG_HS for STM32F7x3xx and STM32F730xx (2)
Device bidirectional endpoints (including EP0)699
Host mode channels121616
Size of dedicated SRAM1.2 Kbytes4 Kbytes4 Kbytes
USB 2.0 link power management (LPM) supportXXX
OTG revision supported2.0
Attach detection protocol (ADP) support---
Battery charging detection (BCD) supportX--
ULPI available to primary IOs via muxing-X-
Integrated PHYFSFSHS

1. "X" = supported, "-" = not supported, "FS" = supported in FS mode, "HS" = supported in HS mode.

2. Refer to STM32F730xx datasheet for more details on packages supporting the OTG_HS ULPI versus the integrated PHY.

32.4 OTG_FS/OTG_HS functional description

32.4.1 OTG_FS/OTG_HS block diagram

Figure 427. OTG_FS full-speed block diagram

Block diagram of the OTG_FS full-speed USB controller. The diagram shows a Cortex core connected to a Power and clock controller and a USB2.0 OTG FS core. The OTG FS core is divided into a System clock domain and a USB clock domain. The System clock domain is connected to the Power and clock controller (receiving USB suspend and USB clock at 48 MHz) and a 1.25 Kbyte USB data FIFOs block via a RAM bus. The USB clock domain is connected to an OTG FS PHY block via a UTMIFS interface. The OTG FS PHY block has four pins: OTG_FS_DP, OTG_FS_DM, OTG_FS_ID, and OTG_FS_VBUS, which are connected to a Universal serial bus. The OTG_FS_SOF pin is also connected to the Universal serial bus. The diagram is labeled MS19928V4.

The block diagram illustrates the internal architecture of the OTG_FS full-speed USB controller. At the top, a Cortex® core is shown. Below it, the USB2.0 OTG FS core is divided into two clock domains: the System clock domain and the USB clock domain . The System clock domain is connected to a Power and clock controller which provides a USB suspend signal and a USB clock at 48 MHz . The USB clock domain is connected to an OTG FS PHY block via a UTMIFS interface. The OTG FS PHY block has four pins: OTG_FS_DP , OTG_FS_DM , OTG_FS_ID , and OTG_FS_VBUS , which are connected to a Universal serial bus . The OTG_FS_SOF pin is also connected to the Universal serial bus. The System clock domain is connected to a 1.25 Kbyte USB data FIFOs block via a RAM bus . The diagram is labeled MS19928V4 .

Block diagram of the OTG_FS full-speed USB controller. The diagram shows a Cortex core connected to a Power and clock controller and a USB2.0 OTG FS core. The OTG FS core is divided into a System clock domain and a USB clock domain. The System clock domain is connected to the Power and clock controller (receiving USB suspend and USB clock at 48 MHz) and a 1.25 Kbyte USB data FIFOs block via a RAM bus. The USB clock domain is connected to an OTG FS PHY block via a UTMIFS interface. The OTG FS PHY block has four pins: OTG_FS_DP, OTG_FS_DM, OTG_FS_ID, and OTG_FS_VBUS, which are connected to a Universal serial bus. The OTG_FS_SOF pin is also connected to the Universal serial bus. The diagram is labeled MS19928V4.

In STM32F7x2xx the configuration of the USB OTG_HS is shown here:

Figure 428. OTG_HS high-speed block diagram for STM32F7x2xx

OTG_HS high-speed block diagram for STM32F7x2xx showing internal components and external connections.

The diagram illustrates the internal architecture and external connections of the OTG_HS (USB OTG HS core) in the STM32F7x2xx microcontroller. On the left, a vertical AHB (application bus) connects the CPU, Memory, Peripheral 1, and Peripheral 2 to the OTG_HS core via an AHB master interface and an AHB slave interface. Below the core, a Data FIFO RAM interface connects to a Data FIFO Single-port RAM (SPRAM). To the right of the core, several functional blocks are shown: an OTG FS PHY transceiver connected via a serial interface to pins OTG_HS_DP and OTG_HS_DM; OTG detections connected to pins OTG_HS_ID and OTG_HS_VBUS; EXTI and NVIC blocks; and a 12-pin ULPI interface. The ULPI interface connects to an external ULPI PHY component, which in turn connects to a USB2.0 (D+/D-) connector. The ULPI interface signals are ULPI_CK, ULPI_DIR, ULPI_STP, ULPI_NXT, and ULPI_D0-7. An OTG_HS_SOF pin is also shown. The core itself lists several interrupt sources: async wakeup, EP1 out, EP1 in, and global.

OTG_HS high-speed block diagram for STM32F7x2xx showing internal components and external connections.

MSv43325V1

In STM32F7x3xx the configuration of the OTG_HS is shown here:

Figure 429. OTG_HS high-speed block diagram for STM32F7x3xx

OTG_HS high-speed block diagram for STM32F7x3xx showing internal components like CPU, Memory, USB OTG HS core, PHY, and NVIC connected via various buses and interfaces.

The diagram illustrates the internal architecture of the OTG_HS block in the STM32F7x3xx microcontroller. A central vertical bus, labeled 'AHB (application bus)', connects the CPU, Memory, Peripheral 1, and Peripheral 2 to the OTG_HS (USB OTG HS core). The OTG_HS core has an 'AHB master interface' and an 'AHB slave interface'. Above the core, an 'APB (peripheral bus)' connects to the USBPHYCTL block. The USBPHYCTL block is connected to the OTG HS PHY block via a 'UTMI+' interface. The OTG HS PHY block has two external pins: OTG_HS_DP and OTG_HS_DM. Below the PHY block is the 'OTG detections' block, which has two external pins: OTG_HS_ID and OTG_HS_VBUS. Below the detections block is the 'EXTI' block, which is connected to the 'NVIC' block. The NVIC block has four interrupt lines: 'Interrupt: async wakeup', 'Interrupt: EP1 out', 'Interrupt: EP1 in', and 'Interrupt: global'. The OTG_HS core also has a 'Data FIFO RAM single port RAM (SPRAM)' connected via a 'Data FIFO RAM Interface'. An external pin labeled 'OTG_HS_SOF' is connected to the NVIC block. The diagram is labeled 'MSv43326V1' in the bottom right corner.

OTG_HS high-speed block diagram for STM32F7x3xx showing internal components like CPU, Memory, USB OTG HS core, PHY, and NVIC connected via various buses and interfaces.

32.4.2 OTG_FS/OTG_HS pin and internal signals

Table 226. OTG_FS input/output pins

Signal nameSignal typeDescription
OTG_FS_DPDigital input/outputUSB OTG D+ line
OTG_FS_DMDigital input/outputUSB OTG D- line
OTG_FS_IDDigital inputUSB OTG ID
OTG_FS_VBUSAnalog inputUSB OTG VBUS
OTG_FS_SOFDigital outputUSB OTG Start Of Frame (visibility)

Table 227. OTG_HS input/output pins

Signal nameSignal typeDescription
OTG_HS_DPDigital input/outputUSB OTG D+ line
OTG_HS_DMDigital input/outputUSB OTG D- line
OTG_HS_IDDigital inputUSB OTG ID
OTG_HS_VBUSAnalog inputUSB OTG VBUS
OTG_HS_SOFDigital outputUSB OTG Start Of Frame (visibility)
OTG_HS_ULPI_CKDigital inputUSB OTG ULPI clock
OTG_HS_ULPI_DIRDigital inputUSB OTG ULPI data bus direction control
OTG_HS_ULPI_STPDigital outputUSB OTG ULPI data stream stop
OTG_HS_ULPI_NXTDigital inputUSB OTG ULPI next data stream request
OTG_HS_ULPI_D[0..7]Digital input/outputUSB OTG ULPI 8-bit bi-directional data bus

Table 228. OTG_FS/OTG_HS input/output signals

Signal nameSignal typeDescription
usb_sofDigital outputUSB OTG start-of-frame event for on chip peripherals
usb_wkupDigital outputUSB OTG wake-up event output
usb_gbl_itDigital outputUSB OTG global interrupt
usb_ep1_in_itDigital outputUSB OTG endpoint 1 in interrupt
usb_ep1_out_itDigital outputUSB OTG endpoint 1 out interrupt

32.4.3 OTG_FS/OTG_HS core

The USB OTG_FS/OTG_HS receives the 48 MHz clock from the reset and clock controller (RCC). This clock is used for driving the 48 MHz domain at full-speed (12 Mbit/s) and must be enabled prior to configuring the OTG core.

The OTG_HS receives the 60 MHz clock from the reset and clock controller (RCC). This is typically generated in the PLL associated with the HS PHY and enabled in the RCC. This clock is used for driving the 60 MHz domain at high-speed (480 Mbit/s) and must be enabled prior to configuring the OTG core.

The CPU reads and writes from/to the OTG core registers through the AHB peripheral bus. It is informed of USB events through the single USB OTG interrupt line described in Section 32.13: OTG_FS/OTG_HS interrupts .

The CPU submits data over the USB by writing 32-bit words to dedicated OTG locations (push registers). The data are then automatically stored into Tx-data FIFOs configured within the USB data RAM. There is one Tx FIFO push register for each in-endpoint (peripheral mode) or out-channel (host mode).

The CPU receives the data from the USB by reading 32-bit words from dedicated OTG addresses (pop registers). The data are then automatically retrieved from a shared Rx FIFO configured within the 1.25[FS] / 4[HS]-Kbyte USB data RAM. There is one Rx FIFO pop register for each out-endpoint or in-channel.

The USB protocol layer is driven by the serial interface engine (SIE) and serialized over the USB by the transceiver module within the on-chip physical layer (PHY) or external HS PHY.

Caution: To guarantee a correct operation for the USB OTG_FS peripheral, the AHB frequency must be higher than 14.2 MHz.

Caution: To guarantee a correct operation for the USB OTG_HS peripheral, the AHB frequency should be higher than 30 MHz.

32.4.4 Embedded full-speed OTG PHY connected to OTG_FS

The embedded full-speed OTG PHY is controlled by the OTG_FS core and conveys USB control & data signals through the full-speed subset of the UTMI+ Bus (UTMIFS). It provides the physical support to USB connectivity.

The full-speed OTG PHY includes the following components:

32.4.5 Embedded full-speed OTG PHY connected to OTG_HS

The embedded full-speed OTG PHY is controlled by the OTG_HS core and conveys USB control & data signals through the full-speed subset of the UTMI+ Bus (UTMIFS). It provides the physical support to USB connectivity.

The full-speed OTG PHY includes the following components:

32.4.6 OTG detections

Additionally the OTG_FS/OTG_HS uses the following functions:

32.4.7 High-speed OTG PHY connected to OTG_HS

Note: Refer to implementation table to determine if an HS PHY is embedded.

The USB OTG core includes an internal UTMI interface which is connected to the embedded HS PHY (see Section 32.4.1: OTG_FS/OTG_HS block diagram ).

The USB OTG_HS core includes an ULPI interface to connect an external HS PHY.

Note: In case of multiple OTG_HS instances, ULPI may not be available on each one. Refer to implementation table.

32.5 OTG_FS/OTG_HS dual role device (DRD)

Figure 430. OTG_FS/OTG_HS A-B device connection

Figure 430. OTG_FS/OTG_HS A-B device connection diagram showing STM32 connected to a USB micro-AB connector via a power switch and voltage regulator.
graph TD
    subgraph STM32
        GPIO
        GPIO_IRQ[GPIO + IRQ]
        VBUS_IN[VBUS]
        DM_IN[DM]
        DP_IN[DP]
        ID_IN[ID]
        OSC_IN
        OSC_OUT
    end

    VDD_REG[5 V to VDD Voltage regulator(1)]
    PWR_SW[STMP2141STR Current-limited power distribution switch(2)]
    USB_CONN[USBmicro-AB connector]

    VDD_REG -- VDD --> STM32
    GPIO -- EN --> VDD_REG
    VDD_REG -- VDD --> PWR_SW
    PWR_SW -- "5 V Pwr" --> USB_CONN
    PWR_SW -- Overcurrent --> GPIO_IRQ
    
    STM32 -- VBUS --> USB_CONN
    STM32 -- DM --> USB_CONN
    STM32 -- DP --> USB_CONN
    STM32 -- ID --> USB_CONN
    
    USB_CONN -- VSS --> GND[Ground]
Figure 430. OTG_FS/OTG_HS A-B device connection diagram showing STM32 connected to a USB micro-AB connector via a power switch and voltage regulator.

1. External voltage regulator only needed when building a V BUS powered device.

2. STMP2141STR needed only if the application has to support a V BUS powered device. A basic power switch can be used if 5 V are available on the application board.

32.5.1 ID line detection

The host or peripheral (the default) role is assumed depending on the ID input pin. The ID line status is determined on plugging in the USB cable, depending on whether a MicroA or MicroB plug is connected to the micro-AB receptacle.

configuration the OTG_FS/OTG_HS complies with the standard FSM described in section 4.2.4: ID pin of the On-the-Go specification Rev2.0, supplement to the USB2.0.

32.5.2 HNP dual role device

The HNP capable bit in the Global USB configuration register (HNPCAP bit in OTG_GUSBCFG) enables the OTG_FS/OTG_HS core to dynamically change its role from A-host to A-peripheral and vice-versa, or from B-Peripheral to B-host and vice-versa according to the host negotiation protocol (HNP). The current device status can be read by the combined values of the connector ID status bit in the Global OTG control and status register (CIDSTS bit in OTG_GOTGCTL) and the current mode of operation bit in the global interrupt and status register (CMOD bit in OTG_GINTSTS).

The HNP program model is described in detail in Section 32.16: OTG_FS/OTG_HS programming model .

32.5.3 SRP dual role device

The SRP capable bit in the global USB configuration register (SRPCAP bit in OTG_GUSBCFG) enables the OTG_FS/OTG_HS core to switch off the generation of V BUS for the A-device to save power. Note that the A-device is always in charge of driving V BUS regardless of the host or peripheral role of the OTG_FS/OTG_HS.

The SRP A/B-device program model is described in detail in Section 32.16: OTG_FS/OTG_HS programming model .

32.6 OTG_FS/OTG_HS as a USB peripheral

This section gives the functional description of the OTG_FS/OTG_HS in the USB peripheral mode. The OTG_FS/OTG_HS works as an USB peripheral in the following circumstances:

Note: To build a bus-powered device implementation in case of the B-device or peripheral-only configuration, an external regulator has to be added, that generates the necessary power-supply from \( V_{BUS} \) .

Figure 431. OTG_FS/OTG_HS peripheral-only connection

Figure 431. OTG_FS/OTG_HS peripheral-only connection diagram. The diagram shows a microcontroller (OTG_FS/OTG_HS) connected to a USB micro connector. The microcontroller has pins for VDD, GPIO, GPIO + IRQ, OSC_IN, and OSC_OUT. The USB micro connector has pins for VBUS, DM, DP, and VSS. A 5 V to VDD voltage regulator is connected to the VDD pin of the microcontroller and the VBUS pin of the USB micro connector. A current-limited power distribution switch (STMPSP2141STR) is connected to the VDD pin of the microcontroller and the VBUS pin of the USB micro connector. The switch is enabled by the EN pin of the microcontroller and has an Overcurrent pin connected to the GPIO + IRQ pin of the microcontroller. The switch outputs 5 V Pwr to the VBUS pin of the USB micro connector. The microcontroller also has an OSC_IN pin connected to a crystal and an OSC_OUT pin connected to a crystal.
Figure 431. OTG_FS/OTG_HS peripheral-only connection diagram. The diagram shows a microcontroller (OTG_FS/OTG_HS) connected to a USB micro connector. The microcontroller has pins for VDD, GPIO, GPIO + IRQ, OSC_IN, and OSC_OUT. The USB micro connector has pins for VBUS, DM, DP, and VSS. A 5 V to VDD voltage regulator is connected to the VDD pin of the microcontroller and the VBUS pin of the USB micro connector. A current-limited power distribution switch (STMPSP2141STR) is connected to the VDD pin of the microcontroller and the VBUS pin of the USB micro connector. The switch is enabled by the EN pin of the microcontroller and has an Overcurrent pin connected to the GPIO + IRQ pin of the microcontroller. The switch outputs 5 V Pwr to the VBUS pin of the USB micro connector. The microcontroller also has an OSC_IN pin connected to a crystal and an OSC_OUT pin connected to a crystal.

1. Use a regulator to build a bus-powered device.

32.6.1 SRP-capable peripheral

The SRP capable bit in the Global USB configuration register (SRPCAP bit in OTG_GUSBCFG) enables the OTG_FS/OTG_HS to support the session request protocol (SRP). In this way, it allows the remote A-device to save power by switching off \( V_{BUS} \) while the USB session is suspended.

The SRP peripheral mode program model is described in detail in the B-device session request protocol section.

32.6.2 Peripheral states

Powered state

The \( V_{BUS} \) input detects the B-session valid voltage by which the USB peripheral is allowed to enter the powered state (see USB2.0 section 9.1). The OTG_FS/OTG_HS then automatically connects the DP pull-up resistor to signal full-speed device connection to the host and generates the session request interrupt (SRQINT bit in OTG_GINTSTS) to notify the powered state.

The \( V_{BUS} \) input also ensures that valid \( V_{BUS} \) levels are supplied by the host during USB operations. If a drop in \( V_{BUS} \) below B-session valid happens to be detected (for instance because of a power disturbance or if the host port has been switched off), the OTG_FS/OTG_HS automatically disconnects and the session end detected (SEDET bit in OTG_GOTGINT) interrupt is generated to notify that the OTG_FS/OTG_HS has exited the powered state.

In the powered state, the OTG_FS/OTG_HS expects to receive some reset signaling from the host. No other USB operation is possible. When a reset signaling is received the reset

detected interrupt (USBRST in OTG_GINTSTS) is generated. When the reset signaling is complete, the enumeration done interrupt (ENUMDNE bit in OTG_GINTSTS) is generated and the OTG_FS/OTG_HS enters the Default state.

Soft disconnect

The powered state can be exited by software with the soft disconnect feature. The DP pull-up resistor is removed by setting the soft disconnect bit in the device control register (SDIS bit in OTG_DCTL), causing a device disconnect detection interrupt on the host side even though the USB cable was not really removed from the host port.

Default state

In the Default state the OTG_FS/OTG_HS expects to receive a SET_ADDRESS command from the host. No other USB operation is possible. When a valid SET_ADDRESS command is decoded on the USB, the application writes the corresponding number into the device address field in the device configuration register (DAD bit in OTG_DCFG). The OTG_FS/OTG_HS then enters the address state and is ready to answer host transactions at the configured USB address.

Suspended state

The OTG_FS/OTG_HS peripheral constantly monitors the USB activity. After counting 3 ms of USB idleness, the early suspend interrupt (ESUSP bit in OTG_GINTSTS) is issued, and confirmed 3 ms later, if appropriate, by the suspend interrupt (USBSUSP bit in OTG_GINTSTS). The device suspend bit is then automatically set in the device status register (SUSPSTS bit in OTG_DSTS) and the OTG_FS/OTG_HS enters the suspended state.

The suspended state may optionally be exited by the device itself. In this case the application sets the remote wake-up signaling bit in the device control register (RWUSIG bit in OTG_DCTL) and clears it after 1 to 15 ms.

When a resume signaling is detected from the host, the resume interrupt (WKUPINT bit in OTG_GINTSTS) is generated and the device suspend bit is automatically cleared.

32.6.3 Peripheral endpoints

The OTG_FS/OTG_HS core instantiates the following USB endpoints:

(OTG_DIEPINT0/OTG_DOEPINT0) registers. The available set of bits inside the control and transfer size registers slightly differs from that of other endpoints

Endpoint control

Endpoint transfer

The device endpoint-x transfer size registers (OTG_DIEPTSIZx/OTG_DOEPTSIZx) allow the application to program the transfer size parameters and read the transfer status.

Programming must be done before setting the endpoint enable bit in the endpoint control register. Once the endpoint is enabled, these fields are read-only as the OTG_FS/OTG_HS core updates them with the current transfer status.

The following transfer parameters can be programmed:

Endpoint status/interrupt

The device endpoint-x interrupt registers (OTG_DIEPINTx/OTG_DOEPINTx) indicate the status of an endpoint with respect to USB- and AHB-related events. The application must read these registers when the OUT endpoint interrupt bit or the IN endpoint interrupt bit in the core interrupt register (OEPINT bit in OTG_GINTSTS or IEPINT bit in OTG_GINTSTS, respectively) is set. Before the application can read these registers, it must first read the device all endpoints interrupt (OTG_DAINT) register to get the exact endpoint number for the device endpoint-x interrupt register. The application must clear the appropriate bit in this register to clear the corresponding bits in the OTG_DAINT and OTG_GINTSTS registers

The peripheral core provides the following status checks and interrupt generation:

32.7 OTG_FS/OTG_HS as a USB host

This section gives the functional description of the OTG_FS/OTG_HS in the USB host mode. The OTG_FS/OTG_HS works as a USB host in the following circumstances:

Automatic host mode direct from ID pin:

The ID pin is not always available, refer to product datasheet for available pins.

Manual forcing of host mode when not possible via ID pin:

The force host mode bit (FHMOD) in the OTG USB configuration register (OTG_GUSBCFG) forces the OTG_FS/OTG_HS core to work as a USB host-only when required.

Note: On-chip 5 V \( V_{BUS} \) generation is not supported. For this reason, a charge pump or, if 5 V are available on the application board, a basic power switch must be added externally to drive the 5 V \( V_{BUS} \) line. The external charge pump can be driven by any GPIO output. This is required for the OTG A-host, A-device and host-only configurations.

Figure 432. OTG_FS/OTG_HS host-only connection

Figure 432. OTG_FS/OTG_HS host-only connection diagram. The diagram shows an STM32 microcontroller connected to an external 5V power distribution switch (STMPS2141STR) and a USB Std-A connector. The microcontroller's VDD pin is connected to a 5V source. The STMPS2141STR is connected to the microcontroller's GPIO and GPIO + IRQ pins. The STMPS2141STR's output is connected to the USB Std-A connector's VBUS pin. The microcontroller's OSC_IN and OSC_OUT pins are connected to an external crystal. The microcontroller's DP and DM pins are connected to the USB Std-A connector's DP and DM pins. The microcontroller's VSS pin is connected to ground. The STMPS2141STR is labeled 'Current-limited power distribution switch(2)'. The USB Std-A connector is labeled '5 V Pwr' and 'VBUS'. The microcontroller is labeled 'VDD' and '5 V'. The diagram is labeled 'MSV36915V2'.
Figure 432. OTG_FS/OTG_HS host-only connection diagram. The diagram shows an STM32 microcontroller connected to an external 5V power distribution switch (STMPS2141STR) and a USB Std-A connector. The microcontroller's VDD pin is connected to a 5V source. The STMPS2141STR is connected to the microcontroller's GPIO and GPIO + IRQ pins. The STMPS2141STR's output is connected to the USB Std-A connector's VBUS pin. The microcontroller's OSC_IN and OSC_OUT pins are connected to an external crystal. The microcontroller's DP and DM pins are connected to the USB Std-A connector's DP and DM pins. The microcontroller's VSS pin is connected to ground. The STMPS2141STR is labeled 'Current-limited power distribution switch(2)'. The USB Std-A connector is labeled '5 V Pwr' and 'VBUS'. The microcontroller is labeled 'VDD' and '5 V'. The diagram is labeled 'MSV36915V2'.

1. \( V_{DD} \) range is between 2 V and 3.6 V.

32.7.1 SRP-capable host

SRP support is available through the SRP capable bit in the global USB configuration register (SRPCAP bit in OTG_GUSBCFG). With the SRP feature enabled, the host can save power by switching off the \( V_{BUS} \) power while the USB session is suspended.

The SRP host mode program model is described in detail in the A-device session request protocol ) section.

32.7.2 USB host states

Host port power

On-chip 5 V \( V_{BUS} \) generation is not supported. For this reason, a charge pump or, if 5 V are available on the application board, a basic power switch, must be added externally to drive the 5 V \( V_{BUS} \) line. The external charge pump can be driven by any GPIO output or via an I 2 C interface connected to an external PMIC (power management IC). When the application

decides to power on \( V_{BUS} \) , it must also set the port power bit in the host port control and status register (PPWR bit in OTG_HPRT).

\( V_{BUS} \) valid

When HNP or SRP is enabled the \( V_{BUS} \) sensing pin must be connected to \( V_{BUS} \) . The \( V_{BUS} \) input ensures that valid \( V_{BUS} \) levels are supplied by the charge pump during USB operations. Any unforeseen \( V_{BUS} \) voltage drop below the \( V_{BUS} \) valid threshold (4.4 V) leads to an OTG interrupt triggered by the session end detected bit (SEDET bit in OTG_GOTGINT). The application is then required to remove the \( V_{BUS} \) power and clear the port power bit.

When HNP and SRP are both disabled, the \( V_{BUS} \) sensing pin does not need to be connected to \( V_{BUS} \) .

The charge pump overcurrent flag can also be used to prevent electrical damage. Connect the overcurrent flag output from the charge pump to any GPIO input and configure it to generate a port interrupt on the active level. The overcurrent ISR must promptly disable the \( V_{BUS} \) generation and clear the port power bit.

Host detection of a peripheral connection

If SRP or HNP are enabled, even if USB peripherals or B-devices can be attached at any time, the OTG_FS/OTG_HS does not detect any bus connection until \( V_{BUS} \) is no longer sensed at a valid level (5 V). When \( V_{BUS} \) is at a valid level and a remote B-device is attached, the OTG_FS/OTG_HS core issues a host port interrupt triggered by the device connected bit in the host port control and status register (PCDET bit in OTG_HPRT).

When HNP and SRP are both disabled, USB peripherals or B-device are detected as soon as they are connected. The OTG_FS/OTG_HS core issues a host port interrupt triggered by the device connected bit in the host port control and status (PCDET bit in OTG_HPRT).

Host detection of peripheral a disconnection

The peripheral disconnection event triggers the disconnect detected interrupt (DISCINT bit in OTG_GINTSTS).

Host enumeration

After detecting a peripheral connection the host must start the enumeration process by sending USB reset and configuration commands to the new peripheral.

Before starting to drive a USB reset, the application waits for the OTG interrupt triggered by the debounce done bit (DBCDNE bit in OTG_GOTGINT), which indicates that the bus is stable again after the electrical debounce caused by the attachment of a pull-up resistor on DP (FS) or DM (LS).

The application drives a USB reset signaling (single-ended zero) over the USB by keeping the port reset bit set in the host port control and status register (PRST bit in OTG_HPRT) for a minimum of 10 ms and a maximum of 20 ms. The application takes care of the timing count and then of clearing the port reset bit.

Once the USB reset sequence has completed, the host port interrupt is triggered by the port enable/disable change bit (PENCHNG bit in OTG_HPRT). This informs the application that the speed of the enumerated peripheral can be read from the port speed field in the host port control and status register (PSPD bit in OTG_HPRT) and that the host is starting to

drive SOFs (FS) or Keep alives (LS). The host is now ready to complete the peripheral enumeration by sending peripheral configuration commands.

Host suspend

The application decides to suspend the USB activity by setting the port suspend bit in the host port control and status register (PSUSP bit in OTG_HPRT). The OTG_FS/OTG_HS core stops sending SOFs and enters the suspended state.

The suspended state can be optionally exited on the remote device's initiative (remote wake-up). In this case the remote wake-up interrupt (WKUPINT bit in OTG_GINTSTS) is generated upon detection of a remote wake-up signaling, the port resume bit in the host port control and status register (PRES bit in OTG_HPRT) self-sets, and resume signaling is automatically driven over the USB. The application must time the resume window and then clear the port resume bit to exit the suspended state and restart the SOF.

If the suspended state is exited on the host initiative, the application must set the port resume bit to start resume signaling on the host port, time the resume window and finally clear the port resume bit.

32.7.3 Host channels

The OTG_FS/OTG_HS core instantiates 12[FS] / 16[HS] host channels. Each host channel supports an USB host transfer (USB pipe). The host is not able to support more than 12[FS] / 16[HS] transfer requests at the same time. If more than 12[FS] / 16[HS] transfer requests are pending from the application, the host controller driver (HCD) must re-allocate channels when they become available from previous duty, that is, after receiving the transfer completed and channel halted interrupts.

Each host channel can be configured to support in/out and any type of periodic/nonperiodic transaction. Each host channel makes use of proper control (OTG_HCCHARx), transfer configuration (OTG_HCTSIZx) and status/interrupt (OTG_HCINTx) registers with associated mask (OTG_HCINTMSKx) registers.

Host channel control

Host channel transfer

The host channel transfer size registers (OTG_HCTSIZx) allow the application to program the transfer size parameters, and read the transfer status. Programming must be done before setting the channel enable bit in the host channel characteristics register. Once the

endpoint is enabled the packet count field is read-only as the OTG_FS/OTG_HS core updates it according to the current transfer status.

Host channel status/interrupt

The host channel-x interrupt register (OTG_HCINTx) indicates the status of an endpoint with respect to USB- and AHB-related events. The application must read these registers when the host channels interrupt bit in the core interrupt register (HCINT bit in OTG_GINTSTS) is set. Before the application can read these registers, it must first read the host all channels interrupt (OTG_HAINT) register to get the exact channel number for the host channel-x interrupt register. The application must clear the appropriate bit in this register to clear the corresponding bits in the OTG_HAINT and OTG_GINTSTS registers. The mask bits for each interrupt source of each channel are also available in the OTG_HCINTMSKx register.

32.7.4 Host scheduler

The host core features a built-in hardware scheduler which is able to autonomously re-order and manage the USB transaction requests posted by the application. At the beginning of each frame the host executes the periodic (isochronous and interrupt) transactions first, followed by the nonperiodic (control and bulk) transactions to achieve the higher level of priority granted to the isochronous and interrupt transfer types by the USB specification.

The host processes the USB transactions through request queues (one for periodic and one for nonperiodic). Each request queue can hold up to 8 entries. Each entry represents a pending transaction request from the application, and holds the IN or OUT channel number along with other information to perform a transaction on the USB. The order in which the requests are written to the queue determines the sequence of the transactions on the USB interface.

At the beginning of each frame, the host processes the periodic request queue first, followed by the nonperiodic request queue. The host issues an incomplete periodic transfer interrupt (IPXFR bit in OTG_GINTSTS) if an isochronous or interrupt transaction scheduled for the

current frame is still pending at the end of the current frame. The OTG_FS/OTG_HS core is fully responsible for the management of the periodic and nonperiodic request queues. The periodic transmit FIFO and queue status register (OTG_HPTXSTS) and nonperiodic transmit FIFO and queue status register (OTG_HNPTXSTS) are read-only registers which can be used by the application to read the status of each request queue. They contain:

As request queues can hold a maximum of 8 entries each, the application can push to schedule host transactions in advance with respect to the moment they physically reach the SB for a maximum of 8 pending periodic transactions plus 8 pending non-periodic transactions.

To post a transaction request to the host scheduler (queue) the application must check that there is at least 1 entry available in the periodic (nonperiodic) request queue by reading the PTXQSAV bits in the OTG_HNPTXSTS register or NPTQXSAV bits in the OTG_HNPTXSTS register.

32.8 OTG_FS/OTG_HS SOF trigger

Figure 433. SOF connectivity (SOF trigger output to TIM and ITR1 connection)

Figure 433. SOF connectivity diagram showing the internal components of an STM32 microcontroller connected to a USB micro-AB connector. The diagram includes a block for the STM32 containing ITR1, TIM, SOF pulse, and SOFgen. The SOF pulse output is connected to an external audio control. The SOFgen is connected to the ITR1 and TIM. The USB micro-AB connector is connected to the SOF pulse output, VBUS, D-, D+, ID, and Vss pins.

The diagram illustrates the internal architecture of an STM32 microcontroller for SOF connectivity. Inside the STM32 block, there are four sub-components: ITR1, TIM, SOF pulse, and SOFgen. The SOF pulse component is connected to an external audio control output. The SOFgen component is connected to both the ITR1 and TIM components. The USB micro-AB connector is shown on the right, with its pins connected to the internal components: VBUS, D-, D+, ID, and Vss. The SOF pulse output is also connected to the VBUS pin of the USB connector. The diagram is labeled with 'MSv36914V1' in the bottom right corner.

Figure 433. SOF connectivity diagram showing the internal components of an STM32 microcontroller connected to a USB micro-AB connector. The diagram includes a block for the STM32 containing ITR1, TIM, SOF pulse, and SOFgen. The SOF pulse output is connected to an external audio control. The SOFgen is connected to the ITR1 and TIM. The USB micro-AB connector is connected to the SOF pulse output, VBUS, D-, D+, ID, and Vss pins.

The OTG_FS/OTG_HS core provides means to monitor, track and configure SOF framing in the host and peripheral, as well as an SOF pulse output connectivity feature.

Such utilities are especially useful for adaptive audio clock generation techniques, where the audio peripheral needs to synchronize to the isochronous stream provided by the PC, or the host needs to trim its framing rate according to the requirements of the audio peripheral.

32.8.1 Host SOFs

In host mode the number of PHY clocks occurring between the generation of two consecutive SOF (HS/FS) or Keep-alive (LS) tokens is programmable in the host frame interval register (HFIR), thus providing application control over the SOF framing period. An

interrupt is generated at any start of frame (SOF bit in OTG_GINTSTS). The current frame number and the time remaining until the next SOF are tracked in the host frame number register (HFNUM).

A SOF pulse signal, is generated at any SOF starting token and with a width of 20 HCLK cycles. The SOF pulse is also internally connected to the input trigger of the timer, so that the input capture feature, the output compare feature and the timer can be triggered by the SOF pulse.

32.8.2 Peripheral SOFs

In device mode, the start of frame interrupt is generated each time an SOF token is received on the USB (SOF bit in OTG_GINTSTS). The corresponding frame number can be read from the device status register (FNSOF bit in OTG_DSTS). A SOF pulse signal with a width of 20 HCLK cycles is also generated. The SOF pulse signal is also internally connected to the TIM input trigger, so that the input capture feature, the output compare feature and the timer can be triggered by the SOF pulse.

The end of periodic frame interrupt (OTG_GINTSTS/EOPF) is used to notify the application when 80%, 85%, 90% or 95% of the time frame interval elapsed depending on the periodic frame interval field in the device configuration register (PFIVL bit in OTG_DCFG). This feature can be used to determine if all of the isochronous traffic for that frame is complete.

32.9 OTG_FS/OTG_HS low-power modes

Table 229 below defines the STM32 low power modes and their compatibility with the OTG.

Table 229. Compatibility of STM32 low power modes with the OTG

ModeDescriptionUSB compatibility
RunMCU fully activeRequired when USB not in suspend state.
SleepUSB suspend exit causes the device to exit Sleep mode. Peripheral registers content is kept.Available while USB is in suspend state.
StopUSB suspend exit causes the device to exit Stop mode. Peripheral registers content is kept (1) .Available while USB is in suspend state.
StandbyPowered-down. The peripheral must be reinitialized after exiting Standby mode.Not compatible with USB applications.
  1. 1. Within Stop mode there are different possible settings. Some restrictions may also exist, refer to Section 4: Power controller (PWR) to understand which (if any) restrictions apply when using OTG.

The following bits and procedures reduce power consumption.

The power consumption of the OTG PHY is controlled by two or three bits in the general core configuration register, depending on OTG revision supported.

Power reduction techniques are available while in the USB suspended state, when the USB session is not yet valid or the device is disconnected.

When setting the stop PHY clock bit in the clock gating control register, most of the 48 MHz clock domain internal to the OTG core is switched off by clock gating. The dynamic power consumption due to the USB clock switching activity is cut even if the 48 MHz clock input is kept running by the application

Most of the transceiver is also disabled, and only the part in charge of detecting the asynchronous resume or remote wake-up event is kept alive.

When setting the Gate HCLK bit in the clock gating control register, most of the system clock domain internal to the OTG_FS/OTG_HS core is switched off by clock gating. Only the register read and write interface is kept alive. The dynamic power consumption due to the USB clock switching activity is cut even if the system clock is kept running by the application for other purposes.

When the OTG_FS/OTG_HS is in the USB suspended state, the application may decide to drastically reduce the overall power consumption by a complete shut down of all the clock sources in the system. USB System Stop is activated by first setting the Stop PHY clock bit and then configuring the system deep sleep mode in the power control system module (PWR).

The OTG_FS/OTG_HS core automatically reactivates both system and USB clocks by asynchronous detection of remote wake-up (as an host) or resume (as a device) signaling on the USB.

To save dynamic power, the USB data FIFO is clocked only when accessed by the OTG_FS/OTG_HS core.

32.10 OTG_FS/OTG_HS Dynamic update of the OTG_HFIR register

The USB core embeds a dynamic trimming capability of micro-SOF[HS] / SOF[FS] framing period in host mode allowing to synchronize an external device with the micro-SOF[HS] / SOF[FS] frames.

When the OTG_HFIR register is changed within a current micro-SOF[HS] / SOF[FS] frame, the SOF period correction is applied in the next frame as described in Figure 434 .

For a dynamic update, it is required to set RLDCTRL=1.

Figure 434. Updating OTG_HFIR dynamically (RLDCTRL = 1)

Timing diagram showing the dynamic update of OTG_HFIR. Signals include SOF reload (pulses), OTG_HFIR write (single pulse), OTG_HFIR value (changes from 400 to 450), and Frame timer (counts up to the HFIR value). The update from 400 to 450 occurs after an OTG_HFIR write and is synchronized to the next SOF reload pulse.
Timing diagram showing the dynamic update of OTG_HFIR. Signals include SOF reload (pulses), OTG_HFIR write (single pulse), OTG_HFIR value (changes from 400 to 450), and Frame timer (counts up to the HFIR value). The update from 400 to 450 occurs after an OTG_HFIR write and is synchronized to the next SOF reload pulse.

32.11 OTG_FS/OTG_HS data FIFOs

The USB system features 1.25[FS] / 4[HS] Kbytes of dedicated RAM with a sophisticated FIFO control mechanism. The packet FIFO controller module in the OTG_FS/OTG_HS core organizes RAM space into Tx FIFOs into which the application pushes the data to be temporarily stored before the USB transmission, and into a single Rx FIFO where the data received from the USB are temporarily stored before retrieval (popped) by the application. The number of instructed FIFOs and how these are organized inside the RAM depends on the device's role. In peripheral mode an additional Tx FIFO is instructed for each active IN endpoint. Any FIFO size is software configured to better meet the application requirements.

32.11.1 Peripheral FIFO architecture

Figure 435. Device-mode FIFO address mapping and AHB FIFO access mapping

Diagram of Device-mode FIFO address mapping and AHB FIFO access mapping. It shows the mapping of IN endpoint Tx FIFOs and OUT endpoint Rx FIFOs to a single data FIFO structure. IN endpoints 0, 1, and #x have dedicated control blocks and map to Tx FIFO #0, #1, and #x packets respectively. OUT endpoints map to a shared Rx packet area. Address ranges OTG_DIEPTXFx[31:16] and OTG_DIEPTXFx[15:0] are shown for each Tx FIFO. The Rx FIFO size is OTG_GRXFSIZ[15:0] with a fixed start address A1=0.

The diagram illustrates the FIFO architecture for device mode. On the left, IN endpoint Tx FIFOs are shown with their corresponding AHB access and control blocks. IN endpoint Tx FIFO #x, #1, and #0 have dedicated control blocks (optional) that receive D FIFO push access from the AHB and send MAC pop signals. These map to a 'Single data FIFO' on the right, which contains 'Tx FIFO #x packet', 'Tx FIFO #1 packet', and 'Tx FIFO #0 packet'. Each Tx FIFO packet has two associated address registers: OTG_DIEPTXFx[31:16] and OTG_DIEPTXFx[15:0]. Below the Tx FIFOs, the 'Rx packets' area is shown, which receives data from any OUT endpoint via a dedicated control block (optional) that receives MAC push signals and sends D FIFO pop access to the AHB. The Rx FIFO size is defined by OTG_GRXFSIZ[15:0], and the start address is fixed at A1=0.

Diagram of Device-mode FIFO address mapping and AHB FIFO access mapping. It shows the mapping of IN endpoint Tx FIFOs and OUT endpoint Rx FIFOs to a single data FIFO structure. IN endpoints 0, 1, and #x have dedicated control blocks and map to Tx FIFO #0, #1, and #x packets respectively. OUT endpoints map to a shared Rx packet area. Address ranges OTG_DIEPTXFx[31:16] and OTG_DIEPTXFx[15:0] are shown for each Tx FIFO. The Rx FIFO size is OTG_GRXFSIZ[15:0] with a fixed start address A1=0.

MSV36929V1

Peripheral Rx FIFO

The OTG peripheral uses a single receive FIFO that receives the data directed to all OUT endpoints. Received packets are stacked back-to-back until free space is available in the Rx FIFO. The status of the received packet (which contains the OUT endpoint destination number, the byte count, the data PID and the validity of the received data) is also stored by the core on top of the data payload. When no more space is available, host transactions are NACKed and an interrupt is received on the addressed endpoint. The size of the receive FIFO is configured in the receive FIFO size register (OTG_GRXFSIZ).

The single receive FIFO architecture makes it more efficient for the USB peripheral to fill in the receive RAM buffer:

The application keeps receiving the Rx FIFO non-empty interrupt (RXFLVL bit in OTG_GINTSTS) as long as there is at least one packet available for download. It reads the packet information from the receive status read and pop register (OTG_GRXSTSP) and finally pops data off the receive FIFO by reading from the endpoint-related pop address.

Peripheral Tx FIFOs

The core has a dedicated FIFO for each IN endpoint. The application configures FIFO sizes by writing the endpoint 0 transmit FIFO size register (OTG_DIEPTXF0) for IN endpoint0 and the device IN endpoint transmit FIFOx registers (OTG_DIEPTXFx) for IN endpoint-x.

32.11.2 Host FIFO architecture

Figure 436. Host-mode FIFO address mapping and AHB FIFO access mapping

Diagram of Host-mode FIFO address mapping and AHB FIFO access mapping. It shows a 'Single data FIFO' divided into three sections: 'Periodic Tx packets', 'Non-periodic Tx packets', and 'Rx packets'. On the left, three control blocks ('Periodic Tx FIFO control (optional)', 'Non-periodic Tx FIFO control', and 'Rx FIFO control') are connected to the FIFO sections via a vertical bus. 'Any periodic channel DFIFO push access from AHB' connects to the Periodic Tx control, which has a 'MAC pop' arrow pointing to the Periodic Tx packets section. 'Any non-periodic channel DFIFO push access from AHB' connects to the Non-periodic Tx control, which has a 'MAC pop' arrow pointing to the Non-periodic Tx packets section. 'Any channel DFIFO pop access from AHB' connects to the Rx control, which has a 'MAC push' arrow pointing to the Rx packets section. On the right, configuration registers are listed: OTG_HPTXFSIZ[31:16] and OTG_HPTXFSIZ[15:0] for periodic tx, OTG_HNPTXFSIZ[31:16] and OTG_HNPTXFSIZ[15:0] for non-periodic tx, and OTG_GRXFSIZ[15:0] for rx. A note indicates 'Rx start address fixed to 0 A1=0'. The diagram is labeled MSv36930V1.
Diagram of Host-mode FIFO address mapping and AHB FIFO access mapping. It shows a 'Single data FIFO' divided into three sections: 'Periodic Tx packets', 'Non-periodic Tx packets', and 'Rx packets'. On the left, three control blocks ('Periodic Tx FIFO control (optional)', 'Non-periodic Tx FIFO control', and 'Rx FIFO control') are connected to the FIFO sections via a vertical bus. 'Any periodic channel DFIFO push access from AHB' connects to the Periodic Tx control, which has a 'MAC pop' arrow pointing to the Periodic Tx packets section. 'Any non-periodic channel DFIFO push access from AHB' connects to the Non-periodic Tx control, which has a 'MAC pop' arrow pointing to the Non-periodic Tx packets section. 'Any channel DFIFO pop access from AHB' connects to the Rx control, which has a 'MAC push' arrow pointing to the Rx packets section. On the right, configuration registers are listed: OTG_HPTXFSIZ[31:16] and OTG_HPTXFSIZ[15:0] for periodic tx, OTG_HNPTXFSIZ[31:16] and OTG_HNPTXFSIZ[15:0] for non-periodic tx, and OTG_GRXFSIZ[15:0] for rx. A note indicates 'Rx start address fixed to 0 A1=0'. The diagram is labeled MSv36930V1.

Host Rx FIFO

The host uses one receiver FIFO for all periodic and nonperiodic transactions. The FIFO is used as a receive buffer to hold the received data (payload of the received packet) from the USB until it is transferred to the system memory. Packets received from any remote IN endpoint are stacked back-to-back until free space is available. The status of each received packet with the host channel destination, byte count, data PID and validity of the received data are also stored into the FIFO. The size of the receive FIFO is configured in the receive FIFO size register (OTG_GRXFSIZ).

The single receive FIFO architecture makes it highly efficient for the USB host to fill in the receive data buffer:

The application receives the Rx FIFO not-empty interrupt as long as there is at least one packet available for download. It reads the packet information from the receive status read and pop register and finally pops the data off the receive FIFO.

Host Tx FIFOs

The host uses one transmit FIFO for all non-periodic (control and bulk) OUT transactions and one transmit FIFO for all periodic (isochronous and interrupt) OUT transactions. FIFOs are used as transmit buffers to hold the data (payload of the transmit packet) to be transmitted over the USB. The size of the periodic (nonperiodic) Tx FIFO is configured in the host periodic (nonperiodic) transmit FIFO size OTG_HPTXFSIZ / OTG_HNPTXFSIZ register.

The two Tx FIFO implementation derives from the higher priority granted to the periodic type of traffic over the USB frame. At the beginning of each frame, the built-in host scheduler processes the periodic request queue first, followed by the nonperiodic request queue.

The two transmit FIFO architecture provides the USB host with separate optimization for periodic and nonperiodic transmit data buffer management:

The OTG_FS/OTG_HS core issues the periodic Tx FIFO empty interrupt (PTXFE bit in OTG_GINTSTS) as long as the periodic Tx FIFO is half or completely empty, depending on the value of the periodic Tx FIFO empty level bit in the AHB configuration register (PTXFELVL bit in OTG_GAHBCFG). The application can push the transmission data in advance as long as free space is available in both the periodic Tx FIFO and the periodic request queue. The host periodic transmit FIFO and queue status register (OTG_HPTXSTS) can be read to know how much space is available in both.

OTG_FS/OTG_HS core issues the non periodic Tx FIFO empty interrupt (NPTXFE bit in OTG_GINTSTS) as long as the nonperiodic Tx FIFO is half or completely empty depending on the non periodic Tx FIFO empty level bit in the AHB configuration register (TXFELVL bit in OTG_GAHBCFG). The application can push the transmission data as long as free space is available in both the nonperiodic Tx FIFO and nonperiodic request queue. The host nonperiodic transmit FIFO and queue status register (OTG_HNPTXSTS) can be read to know how much space is available in both.

32.11.3 FIFO RAM allocation

Device mode

Receive FIFO RAM allocation: the application must allocate RAM for SETUP packets:

Device RxFIFO =

\( (5 * \text{number of control endpoints} + 8) + ((\text{largest USB packet used} / 4) + 1 \text{ for status information}) + (2 * \text{number of OUT endpoints}) + 1 \text{ for Global NAK} \)

Example: The MPS is 1,024 bytes for a periodic USB packet and 512 bytes for a non-periodic USB packet. There are three OUT endpoints, three IN endpoints, one control endpoint, and three host channels.

Device RxFIFO = \( (5 * 1 + 8) + ((1,024 / 4) + 1) + (2 * 4) + 1 = 279 \)

Transmit FIFO RAM allocation: the minimum RAM space required for each IN endpoint
Transmit FIFO is the maximum packet size for that particular IN endpoint.

Note: More space allocated in the transmit IN endpoint FIFO results in better performance on the USB.

Host mode

Receive FIFO RAM allocation:

Status information is written to the FIFO along with each received packet. Therefore, a minimum space of \( (\text{largest packet size} / 4) + 1 \) must be allocated to receive packets. If multiple isochronous channels are enabled, then at least two \( (\text{largest packet size} / 4) + 1 \) spaces must be allocated to receive back-to-back packets. Typically, two \( (\text{largest packet size} / 4) + 1 \) spaces are recommended so that when the previous packet is being transferred to the CPU, the USB can receive the subsequent packet.

Along with the last packet in the host channel, transfer complete status information is also pushed to the FIFO. So one location must be allocated for this.

Host RxFIFO = \( (\text{largest USB packet used} / 4) + 1 \text{ for status information} + 1 \text{ transfer complete} \)

Example: Host RxFIFO = \( ((1,024 / 4) + 1) + 1 = 258 \)

Transmit FIFO RAM allocation:

The minimum amount of RAM required for the host Non-periodic Transmit FIFO is the largest maximum packet size among all supported non-periodic OUT channels.

Typically, two largest packet sizes worth of space is recommended, so that when the current packet is under transfer to the USB, the CPU can get the next packet.

Non-Periodic TxFIFO = largest non-periodic USB packet used / 4

Example: Non-Periodic TxFIFO = \( (512 / 4) = 128 \)

The minimum amount of RAM required for host periodic Transmit FIFO is the largest maximum packet size out of all the supported periodic OUT channels. If there is at least one isochronous OUT endpoint, then the space must be at least two times the maximum packet size of that channel.

Host Periodic TxFIFO = largest periodic USB packet used / 4

Example: Host Periodic TxFIFO = \( (1,024 / 4) = 256 \)

Note: More space allocated in the Transmit Non-periodic FIFO results in better performance on the USB.

32.12 OTG_FS system performance

Best USB and system performance is achieved owing to the large RAM buffers, the highly configurable FIFO sizes, the quick 32-bit FIFO access through AHB push/pop registers and, especially, the advanced FIFO control mechanism. Indeed, this mechanism allows the OTG_FS to fill in the available RAM space at best regardless of the current USB sequence. With these features:

As the OTG_FS core is able to fill in the 1.25-Kbyte RAM buffer very efficiently, and as 1.25-Kbyte of transmit/receive data is more than enough to cover a full speed frame, the USB system is able to withstand the maximum full-speed data rate for up to one USB frame (1 ms) without any CPU intervention.

32.13 OTG_FS/OTG_HS interrupts

When the OTG_FS/OTG_HS controller is operating in one mode, either device or host, the application must not access registers from the other mode. If an illegal access occurs, a mode mismatch interrupt is generated and reflected in the core interrupt register (MMIS bit in the OTG_GINTSTS register). When the core switches from one mode to the other, the registers in the new mode of operation must be reprogrammed as they would be after a power-on reset.

Figure 437 shows the interrupt hierarchy.

Figure 437. Interrupt hierarchy

Interrupt hierarchy diagram for USB OTG. It shows the flow of interrupts from various sources (Host, Device, Wakeup) through a series of registers and logic gates (AND/OR) to the final interrupt lines. The diagram is divided into Host (H) and Device (D) sections. Host interrupts include HPRTINT, HINT, and HCTINT. Device interrupts include DINT, DEACHINT, and EP1_IN/OUT. A wakeup interrupt is also shown. Logic gates combine these signals based on mask register settings to produce the final OTG_FS/OTG_HS global interrupt.

The diagram illustrates the interrupt hierarchy for the USB OTG controller. At the top, a Wakeup interrupt (OTG_FS_WKUP / OTG_HS_WKUP) is generated. This signal is ANDed with the output of an OR gate. The OR gate takes inputs from the OTG_GINTSTS (Core register interrupt) and the OTG_GOTGINT (OTG interrupt register). The output of the OR gate is also ANDed with the Global interrupt mask (bit 0) from the OTG_AHBCFG (AHB configuration register) to produce the final Global interrupt (OTG_FS / OTG_HS).

The OTG_GINTSTS register is a 32-bit register with the following bit fields: 31:26 (reserved), 25 (HINT), 24 (HPRTINT), 23:20 (reserved), 19 (DEPINT), 18 (IEPINT), 17:3 (reserved), 2 (OTGINT), and 1:0 (reserved). The HINT and HPRTINT bits are set by the OTG_HPRT (Host port control and status register). The DEPINT and IEPINT bits are set by the OTG_DINT (Device all endpoints interrupt register) and the OTG_DEACHINT (Device each endpoint interrupt register) respectively. The OTGINT bit is set by the OTG_GOTGINT register.

The OTG_DINT register is controlled by the OTG_DAINMSK (Device all endpoints interrupt mask register) and the OTG_DEPMSK/OTG_DOEPMSK (Device IN/OUT endpoints common interrupt mask register). The OTG_DAINMSK register is further controlled by the OTG_DIEPMSK/OTG_DOEPMSK (Device IN/OUT endpoints common interrupt mask register) and the OTG_DIEPINTx/OTG_DOEPINTx (Device IN/OUT endpoint interrupt registers) for each endpoint x (0 to #EP-1).

The OTG_DEACHINT register is controlled by the OTG_DEACHINTMSK (Device each endpoint interrupt mask register) and the OTG_DEPEACHMSK1/OTG_DOEPEACHMSK1 (Device each IN/OUT endpoint interrupt mask registers) for each endpoint x (0 to #EP-1). This section is HS only (High Speed only).

The OTG_HPRT register is controlled by the OTG_HAINTMSK (Host all channels interrupt mask register) and the OTG_HAINT (Host all channels interrupt register). The OTG_HAINT register is further controlled by the OTG_HCTINTMSKx (Host channels interrupt mask registers) and the OTG_HCTINTx (Host channels interrupt registers) for each channel x (0 to #HC-1).

Registers shown in dashed boxes are mask registers, while solid boxes represent interrupt registers or control registers.

Interrupt hierarchy diagram for USB OTG. It shows the flow of interrupts from various sources (Host, Device, Wakeup) through a series of registers and logic gates (AND/OR) to the final interrupt lines. The diagram is divided into Host (H) and Device (D) sections. Host interrupts include HPRTINT, HINT, and HCTINT. Device interrupts include DINT, DEACHINT, and EP1_IN/OUT. A wakeup interrupt is also shown. Logic gates combine these signals based on mask register settings to produce the final OTG_FS/OTG_HS global interrupt.
  1. 1. OTG_FS_WKUP / OTG_HS_WKUP become active (high state) when resume condition occurs during L1 SLEEP or L2 SUSPEND states.

32.14 OTG_FS/OTG_HS control and status registers

By reading from and writing to the control and status registers (CSRs) through the AHB slave interface, the application controls the OTG_FS/OTG_HS controller. These registers are 32 bits wide, and the addresses are 32-bit block aligned. The OTG_FS/OTG_HS registers must be accessed by words (32 bits).

CSRs are classified as follows:

Only the core global, power and clock-gating, data FIFO access, and host port control and status registers can be accessed in both host and device modes. When the OTG_FS/OTG_HS controller is operating in one mode, either device or host, the application must not access registers from the other mode. If an illegal access occurs, a mode mismatch interrupt is generated and reflected in the core interrupt register (MMIS bit in the OTG_GINTSTS register). When the core switches from one mode to the other, the registers in the new mode of operation must be reprogrammed as they would be after a power-on reset.

32.14.1 CSR memory map

The host and device mode registers occupy different addresses. All registers are implemented in the AHB clock domain.

Global CSR map

These registers are available in both host and device modes.

Table 230. Core global control and status registers (CSRs)

AcronymAddress offsetRegister name
OTG_GOTGCTL0x000Section 32.15.1: OTG control and status register (OTG_GOTGCTL)
OTG_GOTGINT0x004Section 32.15.2: OTG interrupt register (OTG_GOTGINT)
OTG_GAHBCFG0x008Section 32.15.3: OTG AHB configuration register (OTG_GAHBCFG)
OTG_GUSBCFG0x00CSection 32.15.4: OTG USB configuration register (OTG_GUSBCFG)
OTG_GRSTCTL0x010Section 32.15.5: OTG reset register (OTG_GRSTCTL)
OTG_GINTSTS0x014Section 32.15.6: OTG core interrupt register (OTG_GINTSTS)
OTG_GINTMSK0x018Section 32.15.7: OTG interrupt mask register (OTG_GINTMSK)

Table 230. Core global control and status registers (CSRs) (continued)

AcronymAddress offsetRegister name
OTG_GRXSTSR0x01CSection 32.15.8: OTG receive status debug read register (OTG_GRXSTSR)
Section 32.15.9: OTG receive status debug read [alternate] (OTG_GRXSTSR)
OTG_GRXSTSP0x020Section 32.15.10: OTG status read and pop registers (OTG_GRXSTSP)
Section 32.15.11: OTG status read and pop registers [alternate] (OTG_GRXSTSP)
OTG_GRXFSIZ0x024Section 32.15.12: OTG receive FIFO size register (OTG_GRXFSIZ)
OTG_HNPTXFSIZ/
OTG_DIEPTXF0 (1)
0x028Section 32.15.13: OTG host non-periodic transmit FIFO size register (OTG_HNPTXFSIZ)/Endpoint 0 Transmit FIFO size (OTG_DIEPTXF0)
OTG_HNPTXSTS0x02CSection 32.15.14: OTG non-periodic transmit FIFO/queue status register (OTG_HNPTXSTS)
OTG_GCCFG0x038Section 32.15.15: OTG general core configuration register (OTG_GCCFG)
OTG_CID0x03CSection 32.15.16: OTG core ID register (OTG_CID)
OTG_GLPMCFG0x54Section 32.15.17: OTG core LPM configuration register (OTG_GLPMCFG)
OTG_HPTXFSIZ0x100Section 32.15.18: OTG host periodic transmit FIFO size register (OTG_HPTXFSIZ)
OTG_DIEPTXFx0x104
0x108
...
0x114
Section 32.15.19: OTG device IN endpoint transmit FIFO x size register (OTG_DIEPTXFx) for USB_OTG FS
OTG_DIEPTXFx0x104
0x108
...
0x120
Section 32.15.19: OTG device IN endpoint transmit FIFO x size register (OTG_DIEPTXFx) for USB_OTG HS

1. The general rule is to use OTG_HNPTXFSIZ for host mode and OTG_DIEPTXF0 for device mode.

Host-mode CSR map

These registers must be programmed every time the core changes to host mode.

Table 231. Host-mode control and status registers (CSRs)

AcronymOffset addressRegister name
OTG_HCFG0x400Section 32.15.21: OTG host configuration register (OTG_HCFG)
OTG_HFIR0x404Section 32.15.22: OTG host frame interval register (OTG_HFIR)
OTG_HFNUM0x408Section 32.15.23: OTG host frame number/frame time remaining register (OTG_HFNUM)

Table 231. Host-mode control and status registers (CSRs) (continued)

AcronymOffset addressRegister name
OTG_HPTXSTS0x410Section 32.15.24: OTG Host periodic transmit FIFO/queue status register (OTG_HPTXSTS)
OTG_HAINT0x414Section 32.15.25: OTG host all channels interrupt register (OTG_HAINT)
OTG_HAINTMSK0x418Section 32.15.26: OTG host all channels interrupt mask register (OTG_HAINTMSK)
OTG_HPRT0x440Section 32.15.27: OTG host port control and status register (OTG_HPRT)
OTG_HCCHARx0x500
0x520
...
0x660
Section 32.15.28: OTG host channel x characteristics register (OTG_HCCHARx) for USB_OTG FS
OTG_HCCHARx0x500
0x520
...
0x6E0
Section 32.15.28: OTG host channel x characteristics register (OTG_HCCHARx) for USB_OTG HS
OTG_HCSPLTx0x504
0x524
....
0x6E4
Section 32.15.29: OTG host channel x split control register (OTG_HCSPLTx)
OTG_HCINTx0x508
0x528
....
0x668
Section 32.15.30: OTG host channel x interrupt register (OTG_HCINTx) for USB_OTG FS
OTG_HCINTx0x508
0x528
....
0x6E8
Section 32.15.30: OTG host channel x interrupt register (OTG_HCINTx) for USB_OTG HS
OTG_HCINTMSKx0x50C
0x52C
....
0x66C
Section 32.15.31: OTG host channel x interrupt mask register (OTG_HCINTMSKx) for USB_OTG FS
OTG_HCINTMSKx0x50C
0x52C
....
0x6EC
Section 32.15.31: OTG host channel x interrupt mask register (OTG_HCINTMSKx) for USB_OTG HS
OTG_HCTSIZx0x510
0x530
....
0x670
Section 32.15.32: OTG host channel x transfer size register (OTG_HCTSIZx) for USB_OTG FS
Table 231. Host-mode control and status registers (CSRs) (continued)
AcronymOffset addressRegister name
OTG_HCTSIZx0x510
0x530
....
0x6F0
Section 32.15.32: OTG host channel x transfer size register (OTG_HCTSIZx) for USB_OTG HS
OTG_HCDMAx0x514
0x534
....
0x6F4
Section 32.15.33: OTG host channel x DMA address register (OTG_HCDMAx)

Device-mode CSR map

These registers must be programmed every time the core changes to device mode.

Table 232. Device-mode control and status registers
AcronymOffset addressRegister name
OTG_DCFG0x800Section 32.15.35: OTG device configuration register (OTG_DCFG)
OTG_DCTL0x804Section 32.15.36: OTG device control register (OTG_DCTL)
OTG_DSTS0x808Section 32.15.37: OTG device status register (OTG_DSTS)
OTG_DIEPMSK0x810Section 32.15.38: OTG device IN endpoint common interrupt mask register (OTG_DIEPMSK)
OTG_DOEPMSK0x814Section 32.15.39: OTG device OUT endpoint common interrupt mask register (OTG_DOEPMSK)
OTG_DAINT0x818Section 32.15.40: OTG device all endpoints interrupt register (OTG_DAINT)
OTG_DAINTMSK0x81CSection 32.15.41: OTG all endpoints interrupt mask register (OTG_DAINTMSK)
OTG_DVBUSDIS0x828Section 32.15.42: OTG device V BUS discharge time register (OTG_DVBUSDIS)
OTG_DVBUSPULSE0x82CSection 32.15.43: OTG device V BUS pulsing time register (OTG_DVBUSPULSE)
OTG_DTHRCTL0x830Section 32.15.44: OTG device threshold control register (OTG_DTHRCTL)
OTG_DIEPMPMSK0x834Section 32.15.45: OTG device IN endpoint FIFO empty interrupt mask register (OTG_DIEPMPMSK)
OTG_DEACHINT0x838Section 32.15.46: OTG device each endpoint interrupt register (OTG_DEACHINT)
OTG_DEACHINTMSK0x83CSection 32.15.47: OTG device each endpoint interrupt mask register (OTG_DEACHINTMSK)

Table 232. Device-mode control and status registers (continued)

AcronymOffset addressRegister name
OTG_HS_DIEPEACHMSK10x844Section 32.15.48: OTG device each IN endpoint-1 interrupt mask register (OTG_HS_DIEPEACHMSK1)
OTG_HS_DOEPEACHMSK10x884Section 32.15.49: OTG device each OUT endpoint-1 interrupt mask register (OTG_HS_DOEPEACHMSK1)
OTG_DIEPCTL00x900Section 32.15.50: OTG device control IN endpoint 0 control register (OTG_DIEPCTL0) for USB_OTG FS
OTG_DIEPCTLx0x920
0x940
...
0x9A0
Section 32.15.51: OTG device IN endpoint x control register (OTG_DIEPCTLx) for USB_OTG FS
OTG_DIEPCTLx0x900
0x920
...
0xA00
Section 32.15.51: OTG device IN endpoint x control register (OTG_DIEPCTLx) for USB_OTG HS
OTG_DIEPINTx0x908
0x928
....
0x988
Section 32.15.52: OTG device IN endpoint x interrupt register (OTG_DIEPINTx) for USB_OTG FS
OTG_DIEPINTx0x908
0x928
...
0x9E8
Section 32.15.52: OTG device IN endpoint x interrupt register (OTG_DIEPINTx) for USB_OTG HS
OTG_DIEPTSIZ00x910Section 32.15.53: OTG device IN endpoint 0 transfer size register (OTG_DIEPTSIZ0)
OTG_DIEPDMAx0x914
0x934
...
0x9F4
Section 32.15.54: OTG device IN endpoint x DMA address register (OTG_DIEPDMAx)
OTG_DTXFSTSx0x918
0x938
....
0x998
Section 32.15.55: OTG device IN endpoint transmit FIFO status register (OTG_DTXFSTSx) for USB_OTG FS
OTG_DTXFSTSx0x918
0x938
.....
0x9F8
Section 32.15.55: OTG device IN endpoint transmit FIFO status register (OTG_DTXFSTSx) for USB_OTG HS
OTG_DIEPTSIZx0x930
0x950
...
0x9B0
Section 32.15.56: OTG device IN endpoint x transfer size register (OTG_DIEPTSIZx) for USB_OTG FS

Table 232. Device-mode control and status registers (continued)

AcronymOffset addressRegister name
OTG_DIEPTSIZx0x930
0x950
...
0x9F0
Section 32.15.56: OTG device IN endpoint x transfer size register (OTG_DIEPTSIZx) for USB_OTG HS
OTG_DOEPCTL00xB00Section 32.15.57: OTG device control OUT endpoint 0 control register (OTG_DOEPCTL0)
OTG_DOEPINTx0xB08
0xB28
...
0xBA8
Section 32.15.58: OTG device OUT endpoint x interrupt register (OTG_DOEPINTx) for USB_OTG FS
OTG_DOEPINTx0xB08
0xB28
...
0xC08
Section 32.15.58: OTG device OUT endpoint x interrupt register (OTG_DOEPINTx) for USB_OTG HS
OTG_DOEPTSIZ00xB10Section 32.15.59: OTG device OUT endpoint 0 transfer size register (OTG_DOEPTSIZ0)
OTG_DOEPDMAx0xB14
0xB34
...
0xC14
Section 32.15.60: OTG device OUT endpoint x DMA address register (OTG_DOEPDMAx)
OTG_DOEPCTLx0xB20
0xB40
...
0xBA0
Section 32.15.61: OTG device OUT endpoint x control register (OTG_DOEPCTLx) for USB_OTG FS
OTG_DOEPCTLx0xB20
0xB40
...
0xC00
Section 32.15.61: OTG device OUT endpoint x control register (OTG_DOEPCTLx) for USB_OTG HS
OTG_DOEPTSIZx0xB30
0xB50
...
0xBB0
Section 32.15.62: OTG device OUT endpoint x transfer size register (OTG_DOEPTSIZx) for USB_OTG FS
OTG_DOEPTSIZx0xB30
0xB50
..
0xBF0
Section 32.15.62: OTG device OUT endpoint x transfer size register (OTG_DOEPTSIZx) for USB_OTG HS

Data FIFO (DFIFO) access register map

These registers, available in both host and device modes, are used to read or write the FIFO space for a specific endpoint or a channel, in a given direction. If a host channel is of type

IN, the FIFO can only be read on the channel. Similarly, if a host channel is of type OUT, the FIFO can only be written on the channel.

Table 233. Data FIFO (DFIFO) access register map

FIFO access register sectionOffset addressAccess
Device IN endpoint 0/Host OUT Channel 0: DFIFO write access
Device OUT endpoint 0/Host IN Channel 0: DFIFO read access
0x1000–0x1FFCw
r
Device IN endpoint 1/Host OUT Channel 1: DFIFO write access
Device OUT endpoint 1/Host IN Channel 1: DFIFO read access
0x2000–0x2FFCw
r
.........
Device IN endpoint x (1) /Host OUT Channel x (1) : DFIFO write access
Device OUT endpoint x (1) /Host IN Channel x (1) : DFIFO read access
0xX000–0xXFFCw
r

1. Where x is 5[FS]/8[HS] in device mode and 11[FS]/15[HS] in host mode.

Power and clock gating CSR map

There is a single register for power and clock gating. It is available in both host and device modes.

Table 234. Power and clock gating control and status registers

AcronymOffset addressRegister name
OTG_PCGCTL0xE00–0xE04Section 32.15.63: OTG power and clock gating control register (OTG_PCGCTL)

32.15 OTG_FS/OTG_HS registers

These registers are available in both host and device modes, and do not need to be reprogrammed when switching between these modes.

Bit values in the register descriptions are expressed in binary unless otherwise specified.

32.15.1 OTG control and status register (OTG_GOTGCTL)

Address offset: 0x000

Reset value: 0x0001 0000

The OTG_GOTGCTL register controls the behavior and reflects the status of the OTG function of the core.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.CUR
MOD
OTG
VER
BSVLDASVLDDBCTCID
STS
rrwrrrr
1514131211109876543210
Res.Res.Res.EHENDHNP
EN
HSHNP
EN
HNP
RQ
HNG
SCS
BVALO
VAL
BVALO
EN
AVALO
VAL
AVALO
EN
VBVAL
OVAL
VBVAL
OEN
SRQSRQ
SCS
rwrwrwrwrrwrwrwrwrwrwrwr

Bits 31:22 Reserved, must be kept at reset value.

Bit 21 CURMOD : Current mode of operation

Indicates the current mode (host or device).

0: Device mode

1: Host mode

Bit 20 OTGVER : OTG version

Selects the OTG revision.

0:OTG Version 1.3. OTG1.3 is obsolete for new product development.

1:OTG Version 2.0. In this version the core supports only data line pulsing for SRP.

Bit 19 BSVLD : B-session valid

Indicates the device mode transceiver status.

0: B-session is not valid.

1: B-session is valid.

In OTG mode, the user can use this bit to determine if the device is connected or disconnected.

Note: Only accessible in device mode.

Bit 18 ASVLD : A-session valid

Indicates the host mode transceiver status.

0: A-session is not valid

1: A-session is valid

Note: Only accessible in host mode.

Bit 17 DBCT : Long/short debounce time

Indicates the debounce time of a detected connection.

0: Long debounce time, used for physical connections (100 ms + 2.5 µs)

1: Short debounce time, used for soft connections (2.5 µs)

Note: Only accessible in host mode.

Bit 16 CIDSTS : Connector ID status

Indicates the connector ID status on a connect event.

0: The OTG_FS/OTG_HS controller is in A-device mode

1: The OTG_FS/OTG_HS controller is in B-device mode

Note: Accessible in both device and host modes.

Bits 15:13 Reserved, must be kept at reset value.

Bit 12 EHEN : Embedded host enable

It is used to select between OTG A device state machine and embedded host state machine.

0: OTG A device state machine is selected

1: Embedded host state machine is selected

Bit 11 DHNPEN : Device HNP enabled

The application sets this bit when it successfully receives a SetFeature.SetHNPEnable command from the connected USB host.

0: HNP is not enabled in the application

1: HNP is enabled in the application

Note: Only accessible in device mode.

Bit 10 HSHNPEN: host set HNP enable

The application sets this bit when it has successfully enabled HNP (using the SetFeature.SetHNPEable command) on the connected device.

0: Host Set HNP is not enabled

1: Host Set HNP is enabled

Note: Only accessible in host mode.

Bit 9 HNPRQ: HNP request

The application sets this bit to initiate an HNP request to the connected USB host. The application can clear this bit by writing a 0 when the host negotiation success status change bit in the OTG_GOTGINT register (HNSSCHG bit in OTG_GOTGINT) is set. The core clears this bit when the HNSSCHG bit is cleared.

0: No HNP request

1: HNP request

Note: Only accessible in device mode.

Bit 8 HNGSCS: Host negotiation success

The core sets this bit when host negotiation is successful. The core clears this bit when the HNP request (HNPRQ) bit in this register is set.

0: Host negotiation failure

1: Host negotiation success

Note: Only accessible in device mode.

Bit 7 BVALOVAL: B-peripheral session valid override value.

This bit is used to set override value for Bvalid signal when BVALOEN bit is set.

0: Bvalid value is '0' when BVALOEN = 1

1: Bvalid value is '1' when BVALOEN = 1

Note: Only accessible in device mode.

Bit 6 BVALOEN: B-peripheral session valid override enable.

This bit is used to enable/disable the software to override the Bvalid signal using the BVALOVAL bit.

0: Override is disabled and Bvalid signal from the respective PHY selected is used internally by the core

1: Internally Bvalid received from the PHY is overridden with BVALOVAL bit value

Note: Only accessible in device mode.

Bit 5 AVALOVAL: A-peripheral session valid override value.

This bit is used to set override value for Avalid signal when AVALOEN bit is set.

0: Avalid value is '0' when AVALOEN = 1

1: Avalid value is '1' when AVALOEN = 1

Note: Only accessible in host mode.

Bit 4 AVALOEN: A-peripheral session valid override enable.

This bit is used to enable/disable the software to override the Avalid signal using the AVALOVAL bit.

0: Override is disabled and Avalid signal from the respective PHY selected is used internally by the core

1: Internally Avalid received from the PHY is overridden with AVALOVAL bit value

Note: Only accessible in host mode.

Bit 3 VBVALOVAL : V BUS valid override value.

This bit is used to set override value for vbusvalid signal when VBVALOEN bit is set.

0: vbusvalid value is '0' when VBVALOEN = 1

1: vbusvalid value is '1' when VBVALOEN = 1

Note: Only accessible in host mode.

Bit 2 VBVALOEN : V BUS valid override enable.

This bit is used to enable/disable the software to override the vbusvalid signal using the VBVALOVAL bit.

0: Override is disabled and vbusvalid signal from the respective PHY selected is used internally by the core

1: Internally vbusvalid received from the PHY is overridden with VBVALOVAL bit value

Note: Only accessible in host mode.

Bit 1 SRQ : Session request

The application sets this bit to initiate a session request on the USB. The application can clear this bit by writing a 0 when the host negotiation success status change bit in the OTG_GOTGINT register (HNSSCHG bit in OTG_GOTGINT) is set. The core clears this bit when the HNSSCHG bit is cleared.

If the user uses the USB 1.1 full-speed serial transceiver interface to initiate the session request, the application must wait until V BUS discharges to 0.2 V, after the B-session valid bit in this register (BSVLD bit in OTG_GOTGCTL) is cleared.

0: No session request

1: Session request

Note: Only accessible in device mode.

Bit 0 SRQSCS : Session request success

The core sets this bit when a session request initiation is successful.

0: Session request failure

1: Session request success

Note: Only accessible in device mode.

32.15.2 OTG interrupt register (OTG_GOTGINT)

Address offset: 0x04

Reset value: 0x0000 0000

The application reads this register whenever there is an OTG interrupt and clears the bits in this register to clear the OTG interrupt.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DBC
DNE
ADTO
CHG
HNG
DET
Res.
rc_w1rc_w1rc_w1

1514131211109876543210
Res.Res.Res.Res.Res.Res.HNSS
CHG
SRSS
CHG
Res.Res.Res.Res.Res.SEDETRes.Res.
rc_w1rc_w1rc_w1

Bits 31:20 Reserved, must be kept at reset value.

Bit 19 DBCDNE : Debounce done

The core sets this bit when the debounce is completed after the device connect. The application can start driving USB reset after seeing this interrupt. This bit is only valid when the HNP Capable or SRP Capable bit is set in the OTG_GUSBCFG register (HNPCAP bit or SRPCAP bit in OTG_GUSBCFG, respectively).

Note: Only accessible in host mode.

Bit 18 ADTOCHG : A-device timeout change

The core sets this bit to indicate that the A-device has timed out while waiting for the B-device to connect.

Note: Accessible in both device and host modes.

Bit 17 HNGDET : Host negotiation detected

The core sets this bit when it detects a host negotiation request on the USB.

Note: Accessible in both device and host modes.

Bits 16:10 Reserved, must be kept at reset value.

Bit 9 HNSSCHG : Host negotiation success status change

The core sets this bit on the success or failure of a USB host negotiation request. The application must read the host negotiation success bit of the OTG_GOTGCTL register (HNGSCS bit in OTG_GOTGCTL) to check for success or failure.

Note: Accessible in both device and host modes.

Bits 7:3 Reserved, must be kept at reset value.

Bit 8 SRSSCHG : Session request success status change

The core sets this bit on the success or failure of a session request. The application must read the session request success bit in the OTG_GOTGCTL register (SRQSCS bit in OTG_GOTGCTL) to check for success or failure.

Note: Accessible in both device and host modes.

Bit 2 SEDET : Session end detected

The core sets this bit to indicate that the level of the voltage on \( V_{BUS} \) is no longer valid for a B-Peripheral session when \( V_{BUS} < 0.8 \) V.

Note: Accessible in both device and host modes.

Bits 1:0 Reserved, must be kept at reset value.

32.15.3 OTG AHB configuration register (OTG_GAHBCFG)

Address offset: 0x008

Reset value: 0x0000 0000

This register can be used to configure the core after power-on or a change in mode. This register mainly contains AHB system-related configuration parameters. Do not change this register after the initial programming. The application must program this register before starting any transactions on either the AHB or the USB.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.PTXFE
LVL
TXFE
LVL
Res.Res.Res.Res.Res.Res.GINT
MSK
rwrwrw

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.PTXFE
LVL
TXFE
LVL
Res.DMAENHBSTLEN[3:0]GINT
MSK
rwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG HS

Bits 31:9 Reserved, must be kept at reset value.

Bit 8 PTXFELVL : Periodic Tx FIFO empty level

Indicates when the periodic Tx FIFO empty interrupt bit in the OTG_GINTSTS register (PTXFE bit in OTG_GINTSTS) is triggered.

0: PTXFE (in OTG_GINTSTS) interrupt indicates that the Periodic Tx FIFO is half empty

1: PTXFE (in OTG_GINTSTS) interrupt indicates that the Periodic Tx FIFO is completely empty

Note: Only accessible in host mode.

Bit 7 TXFELVL : Tx FIFO empty level

In device mode, this bit indicates when IN endpoint Transmit FIFO empty interrupt (TXFE in OTG_DIEPINTx) is triggered:

0: The TXFE (in OTG_DIEPINTx) interrupt indicates that the IN endpoint Tx FIFO is half empty

1: The TXFE (in OTG_DIEPINTx) interrupt indicates that the IN endpoint Tx FIFO is completely empty

In host mode, this bit indicates when the nonperiodic Tx FIFO empty interrupt (NPTXFE bit in OTG_GINTSTS) is triggered:

0: The NPTXFE (in OTG_GINTSTS) interrupt indicates that the nonperiodic Tx FIFO is half empty

1: The NPTXFE (in OTG_GINTSTS) interrupt indicates that the nonperiodic Tx FIFO is completely empty

Bits 6:1 Reserved, must be kept at reset value for USB OTG FS.

Bit 6 Reserved, must be kept at reset value for USB OTG HS.

Bit 5 DMAEN : DMA enabled for USB OTG HS

0: The core operates in slave mode

1: The core operates in DMA mode

Bits 4:1 HBSTLEN[3:0] : Burst length/type for USB OTG HS

0000 Single: Bus transactions use single 32 bit accesses (not recommended)

0001 INCR: Bus transactions use unspecified length accesses (not recommended, uses the INCR AHB bus command)

0011 INCR4: Bus transactions target 4x 32 bit accesses

0101 INCR8: Bus transactions target 8x 32 bit accesses

0111 INCR16: Bus transactions based on 16x 32 bit accesses

Others: Reserved

Bit 0 GINTMSK : Global interrupt mask

The application uses this bit to mask or unmask the interrupt line assertion to itself.

Irrespective of this bit's setting, the interrupt status registers are updated by the core.

0: Mask the interrupt assertion to the application.

1: Unmask the interrupt assertion to the application.

Note: Accessible in both device and host modes.

32.15.4 OTG USB configuration register (OTG_GUSBCFG)

Address offset: 0x00C

Reset value: 0x0000 1440 for USB OTG FS

Reset value: 0x0000 1400 for USB OTG HS

This register can be used to configure the core after power-on or a changing to host mode or device mode. It contains USB and USB-PHY related configuration parameters. The application must program this register before starting any transactions on either the AHB or the USB. Do not make changes to this register after the initial programming.

31302928272625242322212019181716
Res.FD MODFH MODRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
rwrw
1514131211109876543210
Res.Res.TRDT[3:0]HNP CAPSRP CAPRes.PHY SELRes.Res.Res.TOTAL[2:0]
rwrwrwrwrwrwrrwrwrw

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.FD MODFH MODRes.Res.Res.ULPI IPDPTCIPCCITSDPSULPIE VBUSIULPIE VBUSDULPI CSMULPI ARULPI FSLRes.
rwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
PHYL PCRes.TRDT[3:0]HNP CAPSRP CAPRes.PHY SELRes.ULPI SELRes.TOTAL[2:0]
rwrwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG HS

Bit 31 Reserved, must be kept at reset value.

Bit 30 FDMOD : Force device mode

Writing a 1 to this bit, forces the core to device mode irrespective of the OTG_ID input pin.

0: Normal mode

1: Force device mode

After setting the force bit, the application must wait at least 25 ms before the change takes effect.

Note: Accessible in both device and host modes.

Bit 29 FHMOD : Force host mode

Writing a 1 to this bit, forces the core to host mode irrespective of the OTG_ID input pin.

0: Normal mode

1: Force host mode

After setting the force bit, the application must wait at least 25 ms before the change takes effect.

Note: Accessible in both device and host modes.

Bits 28:26 Reserved, must be kept at reset value.

Bit 25 ULPIIPD: ULPI interface protect disable for USB OTG HS

This bit controls the circuitry built in the PHY to protect the ULPI interface when the link tri-states stp and data. Any pull-up or pull-down resistors employed by this feature can be disabled. Refer to the ULPI specification for more details.

0: Enables the interface protection circuit
1: Disables the interface protection circuit

Bit 24 PTCI: Indicator pass through for USB OTG HS

This bit controls whether the complement output is qualified with the internal \( V_{BUS} \) valid comparator before being used in the \( V_{BUS} \) state in the RX CMD. Refer to the ULPI specification for more details.

0: Complement Output signal is qualified with the Internal \( V_{BUS} \) valid comparator
1: Complement Output signal is not qualified with the Internal \( V_{BUS} \) valid comparator

Bit 23 PCCI: Indicator complement for USB OTG HS

This bit controls the PHY to invert the ExternalVbusIndicator input signal, and generate the complement output. Refer to the ULPI specification for more details.

0: PHY does not invert the ExternalVbusIndicator signal
1: PHY inverts ExternalVbusIndicator signal

Bit 22 TSDPS: TermSel DLine pulsing selection for USB OTG HS

This bit selects utmi_termselect to drive the data line pulse during SRP (session request protocol).

0: Data line pulsing using utmi_txvalid (default)
1: Data line pulsing using utmi_termsel

Bit 21 ULPIEVBUSI: ULPI external \( V_{BUS} \) indicator for USB OTG HS

This bit indicates to the ULPI PHY to use an external \( V_{BUS} \) overcurrent indicator.

0: PHY uses an internal \( V_{BUS} \) valid comparator
1: PHY uses an external \( V_{BUS} \) valid comparator

Bit 20 ULPIEVBUSD: ULPI External \( V_{BUS} \) Drive for USB OTG HS

This bit selects between internal or external supply to drive 5 V on \( V_{BUS} \) , in the ULPI PHY.

0: PHY drives \( V_{BUS} \) using internal charge pump (default)
1: PHY drives \( V_{BUS} \) using external supply.

Bit 19 ULPICSM: ULPI clock SuspendM for USB OTG HS

This bit sets the ClockSuspendM bit in the interface control register on the ULPI PHY. This bit applies only in the serial and carkit modes.

0: PHY powers down the internal clock during suspend
1: PHY does not power down the internal clock

Bit 18 ULPIAR: ULPI Auto-resume for USB OTG HS

This bit sets the AutoResume bit in the interface control register on the ULPI PHY.

0: PHY does not use AutoResume feature
1: PHY uses AutoResume feature

Bit 17 ULPIFSLS: ULPI FS/LS select for USB OTG HS

The application uses this bit to select the FS/LS serial interface for the ULPI PHY. This bit is valid only when the FS serial transceiver is selected on the ULPI PHY.

0: ULPI interface
1: ULPI FS/LS serial interface

Bit 16 Reserved, must be kept at reset value. Bit 15 PHYLPC: PHY Low-power clock select for USB OTG HS

This bit selects either 480 MHz or 48 MHz (low-power) PHY mode. In FS and LS modes, the PHY can usually operate on a 48 MHz clock to save power.

0: 480 MHz internal PLL clock
1: 48 MHz external clock

In 480 MHz mode, the UTMI interface operates at either 60 or 30 MHz, depending on whether the 8- or 16-bit data width is selected. In 48 MHz mode, the UTMI interface operates at 48 MHz in FS and LS modes.

Bit 14 Reserved, must be kept at reset value. Bits 13:10 TRDT[3:0]: USB turnaround time

These bits are used to set the turnaround time in PHY clocks. They must be configured according to Table 235: TRDT values (FS) or Table 236: TRDT values (HS) , depending on the application AHB frequency. Higher TRDT values allow stretching the USB response time to IN tokens in order to compensate for longer AHB read access latency to the data FIFO.

Note: Only accessible in device mode.

Bit 9 HNPCAP: HNP-capable

The application uses this bit to control the OTG_FS/OTG_HS controller's HNP capabilities.

0: HNP capability is not enabled.
1: HNP capability is enabled.

Note: Accessible in both device and host modes.

Bit 8 SRPCAP: SRP-capable

The application uses this bit to control the OTG_FS/OTG_HS controller's SRP capabilities. If the core operates as a non-SRP-capable B-device, it cannot request the connected A-device (host) to activate V BUS and start a session.

0: SRP capability is not enabled.
1: SRP capability is enabled.

Note: Accessible in both device and host modes.

Bit 7 Reserved, must be kept at reset value. Bit 6 PHYSEL: Full Speed serial transceiver mode select for USB OTG FS

This bit is always 1 with read-only access.

Bit 6 PHYSEL: Full speed serial transceiver mode select for USB OTG HS

0: USB 2.0 external ULPI high-speed PHY or internal UTMI high-speed PHY (see also ULPISEL ).
1: USB 1.1 full-speed serial mode. Refer also to PWRDWN setting which specifies the destination PHY for this full speed serial traffic.

Bit 5 Reserved, must be kept at reset value.

Bit 4 ULPISSEL : Select which high speed interface is to be used

0: UTMI interface is selected (internal high speed PHY)

1: ULPI interface is selected (external high speed PHY)

Bit 3 Reserved, must be kept at reset value.

Bits 2:0 TOCAL[2:0] : FS timeout calibration

The number of PHY clocks that the application programs in this field is added to the full-speed interpacket timeout duration in the core to account for any additional delays introduced by the PHY. This can be required, because the delay introduced by the PHY in generating the line state condition can vary from one PHY to another.

The USB standard timeout value for full-speed operation is 16 to 18 (inclusive) bit times. The application must program this field based on the speed of enumeration. The number of bit times added per PHY clock is 0.25 bit times.

Table 235. TRDT values (FS)

AHB frequency range (MHz)TRDT minimum value
MinMax
14.2150xF
15160xE
1617.20xD
17.218.50xC
18.5200xB
2021.80xA
21.8240x9
2427.50x8
27.5320x7
32-0x6

Table 236. TRDT values (HS)

AHB frequency range (MHz)TRDT minimum value
MinMax
30-0x9

32.15.5 OTG reset register (OTG_GRSTCTL)

Address offset: 0x10

Reset value: 0x8000 0000

The application uses this register to reset various hardware features inside the core.

31302928272625242322212019181716
AHB IDLRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
r
1514131211109876543210
Res.Res.Res.Res.Res.TXFNUM[4:0]TXF FLSHRXF FLSHRes.FCRSTPSRSTCSRST
rwrwrwrwrwrsrsrsrsrs

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
AHB IDLDMAR EQRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
rr
1514131211109876543210
Res.Res.Res.Res.Res.TXFNUM[4:0]TXF FLSHRXF FLSHRes.FCRSTPSRSTCSRST
rwrwrwrwrwrsrsrsrsrs

Note: Configuration register for USB OTG HS

Bit 31 AHBIDL : AHB master idle

Indicates that the AHB master state machine is in the Idle condition.

Note: Accessible in both device and host modes.

Bits 30:11 Reserved, must be kept at reset value for USB OTG FS.

Bit 30 DMAREQ : DMA request signal enabled for USB OTG HS

This bit indicates that the DMA request is in progress. Used for debug.

Bits 29:11 Reserved, must be kept at reset value for USB OTG HS.

Bits 10:6 TXFNUM[4:0] : Tx FIFO number

This is the FIFO number that must be flushed using the Tx FIFO Flush bit. This field must not be changed until the core clears the Tx FIFO Flush bit.

00000:

00001:

00010: Tx FIFO 2 flush in device mode

...

01111: Tx FIFO 15 flush in device mode

10000: Flush all the transmit FIFOs in device or host mode.

Note: Accessible in both device and host modes.

Bit 5 TXFFLSH: Tx FIFO flush

This bit selectively flushes a single or all transmit FIFOs, but cannot do so if the core is in the midst of a transaction.

The application must write this bit only after checking that the core is neither writing to the Tx FIFO nor reading from the Tx FIFO. Verify using these registers:

Read—NAK Effective interrupt ensures the core is not reading from the FIFO

Write—AHBIDL bit in OTG_GRSTCTL ensures the core is not writing anything to the FIFO.

Flushing is normally recommended when FIFOs are reconfigured. FIFO flushing is also recommended during device endpoint disable. The application must wait until the core clears this bit before performing any operations. This bit takes eight clocks to clear, using the slower clock of phy_clk or hclk.

Note: Accessible in both device and host modes.

Bit 4 RXFFLSH: Rx FIFO flush

The application can flush the entire Rx FIFO using this bit, but must first ensure that the core is not in the middle of a transaction.

The application must only write to this bit after checking that the core is neither reading from the Rx FIFO nor writing to the Rx FIFO.

The application must wait until the bit is cleared before performing any other operations. This bit requires 8 clocks (slowest of PHY or AHB clock) to clear.

Note: Accessible in both device and host modes.

Bit 3 Reserved, must be kept at reset value. Bit 2 FCRST: Host frame counter reset

The application writes this bit to reset the micro-frame/frame number counter inside the core. When the micro-frame/frame counter is reset, the subsequent SOF sent out by the core has a frame number of 0.

When application writes '1' to the bit, it might not be able to read back the value as it gets cleared by the core in a few clock cycles.

Note: Only accessible in host mode.

Bit 1 PSRST: Partial soft reset

Resets the internal state machines but keeps the enumeration info. Can be used to recover some specific PHY errors.

Note: Accessible in both device and host modes.

Bit 0 CSRST: Core soft reset

Resets the HCLK and PHY clock domains as follows:

Clears the interrupts and all the CSR register bits except for the following bits:

All module state machines (except for the AHB slave unit) are reset to the Idle state, and all the transmit FIFOs and the receive FIFO are flushed.

Any transactions on the AHB Master are terminated as soon as possible, after completing the last data phase of an AHB transfer. Any transactions on the USB are terminated immediately.

The application can write to this bit any time it wants to reset the core. This is a self-clearing bit and the core clears this bit after all the necessary logic is reset in the core, which can take several clocks, depending on the current state of the core. Once this bit has been cleared, the software must wait at least 3 PHY clocks before accessing the PHY domain (synchronization delay). The software must also check that bit 31 in this register is set to 1 (AHB Master is Idle) before starting any operation.

Typically, the software reset is used during software development and also when the user dynamically changes the PHY selection bits in the above listed USB configuration registers. When the user changes the PHY, the corresponding clock for the PHY is selected and used in the PHY domain. Once a new clock is selected, the PHY domain has to be reset for proper operation.

Note: Accessible in both device and host modes.

32.15.6 OTG core interrupt register (OTG_GINTSTS)

Address offset: 0x014

Reset value: 0x0400 0020

This register interrupts the application for system-level events in the current mode (device mode or host mode).

Some of the bits in this register are valid only in host mode, while others are valid in device mode only. This register also indicates the current mode. To clear the interrupt status bits of the rc_w1 type, the application must write 1 into the bit.

The FIFO status interrupts are read-only; once software reads from or writes to the FIFO while servicing these interrupts, FIFO interrupt conditions are cleared automatically.

The application must clear the OTG_GINTSTS register at initialization before unmasking the interrupt bit to avoid any interrupts generated prior to initialization.

31302928272625242322212019181716
WKUP INTSRQ INTDISC INTCIDS CHGLPM INTPTXFEHCINTHPRT INTRST DETRes.IPXFR/ IN COMP ISO OUTIISOI XFROEP INTIEPINTRes.Res.
rc_w1rc_w1rc_w1rc_w1rc_w1rrrrc_w1rc_w1rc_w1rr

1514131211109876543210
EOPFISOO DRPENUM DNEUSB RSTUSB SUSPESUSPRes.Res.GO NAK EFFGI NAK EFFNPTXF ERXF LVLSOFOTG INTMMISCMOD
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rrrrrc_w1rrc_w1r

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
WKUP INTSRQ INTDISC INTCIDS CHGLPM INTPTXFEHCINTHPRT INTRST DETDATAF SUSPIPXFR/ IN COMP ISO OUTIISOI XFROEP INTIEPINTRes.Res.
rc_w1rc_w1rc_w1rc_w1rc_w1rrrrc_w1rc_w1rc_w1rc_w1rr

1514131211109876543210
EOPFISOO DRPENUM DNEUSB RSTUSB SUSPESUSPRes.Res.GO NAK EFFGI NAK EFFNPTXF ERXF LVLSOFOTG INTMMISCMOD
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rrrrrc_w1rrc_w1r

Note: Configuration register for USB OTG HS

Bit 31 WKUPINT : Resume/remote wake-up detected interrupt

Wake-up interrupt during suspend(L2) or LPM(L1) state.

– During suspend(L2):

In device mode, this interrupt is asserted when a resume is detected on the USB. In host mode, this interrupt is asserted when a remote wake-up is detected on the USB.

– During LPM(L1):

This interrupt is asserted for either host initiated resume or device initiated remote wake-up on USB.

Note: Accessible in both device and host modes.

Bit 30 SRQINT : Session request/new session detected interrupt

In host mode, this interrupt is asserted when a session request is detected from the device.

In device mode, this interrupt is asserted when \( V_{BUS} \) is in the valid range for a B-peripheral device. Accessible in both device and host modes.

Bit 29 DISCINT : Disconnect detected interrupt

Asserted when a device disconnect is detected.

Note: Only accessible in host mode.

Bit 28 CIDSCHG : Connector ID status change

The core sets this bit when there is a change in connector ID status.

Note: Accessible in both device and host modes.

Bit 27 LPMINT : LPM interrupt

In device mode, this interrupt is asserted when the device receives an LPM transaction and responds with a non-ERRORed response.

In host mode, this interrupt is asserted when the device responds to an LPM transaction with a non-ERRORed response or when the host core has completed LPM transactions for the programmed number of times (RETRYCNT bit in OTG_GLPMCFG).

This field is valid only if the LPMEN bit in OTG_GLPMCFG is set to 1.

Bit 26 PTXFE : Periodic Tx FIFO empty

Asserted when the periodic transmit FIFO is either half or completely empty and there is space for at least one entry to be written in the periodic request queue. The half or completely empty status is determined by the periodic Tx FIFO empty level bit in the OTG_GAHBCFG register (PTXFELVL bit in OTG_GAHBCFG).

Note: Only accessible in host mode.

Bit 25 HCINT : Host channels interrupt

The core sets this bit to indicate that an interrupt is pending on one of the channels of the core (in host mode). The application must read the OTG_HAINT register to determine the exact number of the channel on which the interrupt occurred, and then read the corresponding OTG_HCINTx register to determine the exact cause of the interrupt. The application must clear the appropriate status bit in the OTG_HCINTx register to clear this bit.

Note: Only accessible in host mode.

Bit 24 HPRTINT : Host port interrupt

The core sets this bit to indicate a change in port status of one of the OTG_FS/OTG_HS controller ports in host mode. The application must read the OTG_HPRT register to determine the exact event that caused this interrupt. The application must clear the appropriate status bit in the OTG_HPRT register to clear this bit.

Note: Only accessible in host mode.

Bit 23 RSTDET: Reset detected interrupt

In device mode, this interrupt is asserted when a reset is detected on the USB in partial power-down mode when the device is in suspend.

Note: Only accessible in device mode.

Bit 22 Reserved, must be kept at reset value for USB OTG FS. Bit 22 DATAFSUSP: Data fetch suspended for USB OTG HS

This interrupt is valid only in DMA mode. This interrupt indicates that the core has stopped fetching data for IN endpoints due to the unavailability of TxFIFO space or request queue space. This interrupt is used by the application for an endpoint mismatch algorithm. For example, after detecting an endpoint mismatch, the application:

Clears the global nonperiodic IN NAK handshake If the global nonperiodic IN NAK is cleared, the core has not yet fetched data for the IN endpoint, and the IN token is received: the core generates an “IN token received when FIFO empty” interrupt. The OTG then sends a NAK response to the host. To avoid this scenario, the application can check the FetSusp interrupt in OTG_GINTSTS, which ensures that the FIFO is full before clearing a global NAK handshake. Alternatively, the application can mask the “IN token received when FIFO empty” interrupt when clearing a global IN NAK handshake.

Bit 21 IPXFR: Incomplete periodic transfer

In host mode, the core sets this interrupt bit when there are incomplete periodic transactions still pending, which are scheduled for the current frame.

INCOMPISOOUT: Incomplete isochronous OUT transfer

In device mode, the core sets this interrupt to indicate that there is at least one isochronous OUT endpoint on which the transfer is not completed in the current frame. This interrupt is asserted along with the End of periodic frame interrupt (EOPF) bit in this register.

Bit 20 IISOIXFR: Incomplete isochronous IN transfer

The core sets this interrupt to indicate that there is at least one isochronous IN endpoint on which the transfer is not completed in the current frame. This interrupt is asserted along with the End of periodic frame interrupt (EOPF) bit in this register.

Note: Only accessible in device mode.

Bit 19 OEPINT: OUT endpoint interrupt

The core sets this bit to indicate that an interrupt is pending on one of the OUT endpoints of the core (in device mode). The application must read the OTG_DAINT register to determine the exact number of the OUT endpoint on which the interrupt occurred, and then read the corresponding OTG_DOEPINTx register to determine the exact cause of the interrupt. The application must clear the appropriate status bit in the corresponding OTG_DOEPINTx register to clear this bit.

Note: Only accessible in device mode.

Bit 18 IEPINT: IN endpoint interrupt

The core sets this bit to indicate that an interrupt is pending on one of the IN endpoints of the core (in device mode). The application must read the OTG_DAINT register to determine the exact number of the IN endpoint on which the interrupt occurred, and then read the corresponding OTG_DIEPINTx register to determine the exact cause of the interrupt. The application must clear the appropriate status bit in the corresponding OTG_DIEPINTx register to clear this bit.

Note: Only accessible in device mode.

Bits 17:16 Reserved, must be kept at reset value.

Bit 15 EOPF : End of periodic frame interrupt

Indicates that the period specified in the periodic frame interval field of the OTG_DCFG register (PFIVL bit in OTG_DCFG) has been reached in the current frame.

Note: Only accessible in device mode.

Bit 14 ISOODRP : Isochronous OUT packet dropped interrupt

The core sets this bit when it fails to write an isochronous OUT packet into the Rx FIFO because the Rx FIFO does not have enough space to accommodate a maximum size packet for the isochronous OUT endpoint.

Note: Only accessible in device mode.

Bit 13 ENUMDNE : Enumeration done

The core sets this bit to indicate that speed enumeration is complete. The application must read the OTG_DSTS register to obtain the enumerated speed.

Note: Only accessible in device mode.

Bit 12 USBRST : USB reset

The core sets this bit to indicate that a reset is detected on the USB.

Note: Only accessible in device mode.

Bit 11 USBSUSP : USB suspend

The core sets this bit to indicate that a suspend was detected on the USB. The core enters the suspended state when there is no activity on the data lines for an extended period of time.

Note: Only accessible in device mode.

Bit 10 ESUSP : Early suspend

The core sets this bit to indicate that an Idle state has been detected on the USB for 3 ms.

Note: Only accessible in device mode.

Bits 9:8 Reserved, must be kept at reset value.

Bit 7 GONAKEFF : Global OUT NAK effective

Indicates that the Set global OUT NAK bit in the OTG_DCTL register (SGONAK bit in OTG_DCTL), set by the application, has taken effect in the core. This bit can be cleared by writing the Clear global OUT NAK bit in the OTG_DCTL register (CGONAK bit in OTG_DCTL).

Note: Only accessible in device mode.

Bit 6 GINAKEFF : Global IN non-periodic NAK effective

Indicates that the Set global non-periodic IN NAK bit in the OTG_DCTL register (SGINAK bit in OTG_DCTL), set by the application, has taken effect in the core. That is, the core has sampled the Global IN NAK bit set by the application. This bit can be cleared by clearing the Clear global non-periodic IN NAK bit in the OTG_DCTL register (CGINAK bit in OTG_DCTL).

This interrupt does not necessarily mean that a NAK handshake is sent out on the USB. The STALL bit takes precedence over the NAK bit.

Note: Only accessible in device mode.

Bit 5 NPTXFE : Non-periodic Tx FIFO empty

This interrupt is asserted when the non-periodic Tx FIFO is either half or completely empty, and there is space for at least one entry to be written to the non-periodic transmit request queue. The half or completely empty status is determined by the non-periodic Tx FIFO empty level bit in the OTG_GAHBCFG register (TXFELVL bit in OTG_GAHBCFG).

Note: Accessible in host mode only.

Bit 4 RXFLVL: Rx FIFO non-empty

Indicates that there is at least one packet pending to be read from the Rx FIFO.

Note: Accessible in both host and device modes.

Bit 3 SOF: Start of frame

In host mode, the core sets this bit to indicate that an SOF (FS), or Keep-Alive (LS) is transmitted on the USB. The application must write a 1 to this bit to clear the interrupt.

In device mode, the core sets this bit to indicate that an SOF token has been received on the USB. The application can read the OTG_DSTS register to get the current frame number.

This interrupt is seen only when the core is operating in FS.

Note: This register may return '1' if read immediately after power on reset. If the register bit reads '1' immediately after power on reset it does not indicate that an SOF has been sent (in case of host mode) or SOF has been received (in case of device mode). The read value of this interrupt is valid only after a valid connection between host and device is established. If the bit is set after power on reset the application can clear the bit.

Note: Accessible in both host and device modes.

Bit 2 OTGINT: OTG interrupt

The core sets this bit to indicate an OTG protocol event. The application must read the OTG interrupt status (OTG_GOTGINT) register to determine the exact event that caused this interrupt. The application must clear the appropriate status bit in the OTG_GOTGINT register to clear this bit.

Note: Accessible in both host and device modes.

Bit 1 MMIS: Mode mismatch interrupt

The core sets this bit when the application is trying to access:

The register access is completed on the AHB with an OKAY response, but is ignored by the core internally and does not affect the operation of the core.

Note: Accessible in both host and device modes.

Bit 0 CMOD: Current mode of operation

Indicates the current mode.

0: Device mode

1: Host mode

Note: Accessible in both host and device modes.

32.15.7 OTG interrupt mask register (OTG_GINTMSK)

Address offset: 0x018

Reset value: 0x0000 0000

This register works with the core interrupt register to interrupt the application. When an interrupt bit is masked, the interrupt associated with that bit is not generated. However, the core interrupt (OTG_GINTSTS) register bit corresponding to that interrupt is still set.

31302928272625242322212019181716
WUIMSRQIMDISCINTCIDSC HGMLPMINTMPTXFEMHCIMPRTIMRSTDETMRes.IPXFRM/ISO OXFREMIISOXFRMOEPINTIEPINTRes.Res.
rwrwrwrwrwrwrwrwrwrwrwrwrw

1514131211109876543210
EOPFMISOODRPMENUSDNEMUSBRSTUSBSPMESUSPMRes.Res.GONAKEFFMGINAKEFFMNPTXFEMRXFLVLMSOFMOTGINTMMISMRes.
rwrwrwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
WUIMSRQIMDISCINTCIDSC HGMLPMINTMPTXFEMHCIMPRTIMRSTDETMFSUSPMIPXFRM/ISO OXFREMIISOXFRMOEPINTIEPINTRes.Res.
rwrwrwrwrwrwrwrrwrwrwrwrwrw

1514131211109876543210
EOPFMISOODRPMENUSDNEMUSBRSTUSBSPMESUSPMRes.Res.GONAKEFFMGINAKEFFMNPTXFEMRXFLVLMSOFMOTGINTMMISMRes.
rwrwrwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG HS

Bit 31 WUIM : Resume/remote wake-up detected interrupt mask

Note: Accessible in both host and device modes.

Bit 30 SRQIM : Session request/new session detected interrupt mask

Note: Accessible in both host and device modes.

Bit 29 DISCINT : Disconnect detected interrupt mask

Note: Only accessible in host mode.

Bit 28 CIDSCHGM : Connector ID status change mask

Note: Accessible in both host and device modes.

Bit 27 LPMINTM : LPM interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Accessible in both host and device modes.

Bit 26 PTXFEM : Periodic Tx FIFO empty mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in host mode.

Bit 25 HCIM : Host channels interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in host mode.

Bit 24 PRTIM : Host port interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in host mode.

Bit 23 RSTDTEM : Reset detected interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 22 Reserved, must be kept at reset value for USB OTG FS.

Bit 22 FSUSPM : Data fetch suspended mask for USB OTG HS

0: Masked interrupt

1: Unmasked interrupt

Only accessible in peripheral mode.

Bit 21 IPXFRM : Incomplete periodic transfer mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in host mode.

IISOOXFRM : Incomplete isochronous OUT transfer mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 20 IISOIXFRM : Incomplete isochronous IN transfer mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 19 OEPINT : OUT endpoints interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 18 IEPINT : IN endpoints interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bits 17:16 Reserved, must be kept at reset value.

Bit 15 EOPFM : End of periodic frame interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 14 ISOODRPM : Isochronous OUT packet dropped interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 13 ENUMDNEM : Enumeration done mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 12 USBRST : USB reset mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 11 USBSUSPM : USB suspend mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 10 ESUSPM : Early suspend mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bits 9:8 Reserved, must be kept at reset value.

Bit 7 GONAKEFFM : Global OUT NAK effective mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 6 GINAKEFFM : Global non-periodic IN NAK effective mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in device mode.

Bit 5 NPTXFEM : Non-periodic Tx FIFO empty mask

0: Masked interrupt

1: Unmasked interrupt

Note: Only accessible in host mode.

Bit 4 RXFLVLM : Receive FIFO non-empty mask

0: Masked interrupt

1: Unmasked interrupt

Note: Accessible in both device and host modes.

Bit 3 SOFM : Start of frame mask

0: Masked interrupt

1: Unmasked interrupt

Note: Accessible in both device and host modes.

Bit 2 OTGINT : OTG interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Accessible in both device and host modes.

Bit 1 MMISM : Mode mismatch interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Note: Accessible in both device and host modes.

Bit 0 Reserved, must be kept at reset value.

32.15.8 OTG receive status debug read register (OTG_GRXSTSR)

Address offset for read: 0x01C

Reset value: 0x0000 0000

This description is for register OTG_GRXSTSR in Device mode.

A read to the receive status debug read register returns the contents of the top of the receive FIFO.

The core ignores the receive status read when the receive FIFO is empty and returns a value of 0x0000 0000.

31302928272625242322212019181716
Res.Res.Res.Res.STSPH
ST
Res.Res.FRMNUM[3:0]PKTSTS[3:0]DPID[1]
rrrrrrrrrrrrrrrr

1514131211109876543210
DPID[0]BCNT[10:0]EPNUM[3:0]
rrrrrrrrrrrrrrrr

Bits 31:28 Reserved, must be kept at reset value.

Bit 27 STSPHST : Status phase start

Indicates the start of the status phase for a control write transfer. This bit is set along with the OUT transfer completed PKTSTS pattern.

Bits 26:25 Reserved, must be kept at reset value.

Bits 24:21 FRMNUM[3:0] : Frame number

This is the least significant 4 bits of the frame number in which the packet is received on the USB. This field is supported only when isochronous OUT endpoints are supported.

Bits 20:17 PKTSTS[3:0] : Packet status

Indicates the status of the received packet

Bits 16:15 DPID[1:0] : Data PID

Indicates the data PID of the received OUT data packet

Bits 14:4 BCNT[10:0] : Byte count

Indicates the byte count of the received data packet.

Bits 3:0 EPNUM[3:0] : Endpoint number

Indicates the endpoint number to which the current received packet belongs.

32.15.9 OTG receive status debug read [alternate] (OTG_GRXSTSR)

Address offset for read: 0x01C
Reset value: 0x0000 0000

This description is for register OTG_GRXSTSR in Host mode.

A read to the receive status debug read register returns the contents of the top of the receive FIFO.

The core ignores the receive status read when the receive FIFO is empty and returns a value of 0x0000 0000.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PKTSTS[3:0]DPID
rrrrr
1514131211109876543210
DPIDBCNT[10:0]CHNUM[3:0]
rrrrrrrrrrrrrrrr

Bits 31:21 Reserved, must be kept at reset value.

Bits 20:17 PKTSTS[3:0] : Packet status

Indicates the status of the received packet

0010: IN data packet received

0011: IN transfer completed (triggers an interrupt)

0101: Data toggle error (triggers an interrupt)

0111: Channel halted (triggers an interrupt)

Others: Reserved

Bits 16:15 DPID[1:0] : Data PID

Indicates the data PID of the received packet

00: DATA0

10: DATA1

01: DATA2

11: MDATA

Bits 14:4 BCNT[10:0] : Byte count

Indicates the byte count of the received IN data packet.

Bits 3:0 CHNUM[3:0] : Channel number

Indicates the channel number to which the current received packet belongs.

32.15.10 OTG status read and pop registers (OTG_GRXSTSP)

Address offset for pop: 0x020

Reset value: 0x0000 0000

This description is for register OTG_GRXSTSP in Device mode.

Similarly to OTG_GRXSTSR (receive status debug read register) where a read returns the contents of the top of the receive FIFO, a read to OTG_GRXSTSP (receive status read and pop register) additionally pops the top data entry out of the Rx FIFO.

The core ignores the receive status pop/read when the receive FIFO is empty and returns a value of 0x0000 0000. The application must only pop the receive status FIFO when the receive FIFO non-empty bit of the core interrupt register (RXFLVL bit in OTG_GINTSTS) is asserted.

31302928272625242322212019181716
Res.Res.Res.Res.STSPH
ST
Res.Res.FRMNUM[3:0]PKTSTS[3:0]DPID[1]
rrrrrrrrrr
1514131211109876543210
DPID[0]BCNT[10:0]EPNUM[3:0]
rrrrrrrrrrrrrrrr

Bits 31:28 Reserved, must be kept at reset value.

Bit 27 STSPHST : Status phase start

Indicates the start of the status phase for a control write transfer. This bit is set along with the OUT transfer completed PKTSTS pattern.

Bits 26:25 Reserved, must be kept at reset value.

Bits 24:21 FRMNUM[3:0] : Frame number

This is the least significant 4 bits of the frame number in which the packet is received on the USB. This field is supported only when isochronous OUT endpoints are supported.

Bits 20:17 PKTSTS[3:0] : Packet status

Indicates the status of the received packet
0001: Global OUT NAK (triggers an interrupt)
0010: OUT data packet received
0011: OUT transfer completed (triggers an interrupt)
0100: SETUP transaction completed (triggers an interrupt)
0110: SETUP data packet received
Others: Reserved

Bits 16:15 DPID[1:0] : Data PID

Indicates the data PID of the received OUT data packet
00: DATA0
10: DATA1
01: DATA2
11: MDATA

Bits 14:4 BCNT[10:0] : Byte count

Indicates the byte count of the received data packet.

Bits 3:0 EPNUM[3:0] : Endpoint number

Indicates the endpoint number to which the current received packet belongs.

32.15.11 OTG status read and pop registers [alternate] (OTG_GRXSTSP)

Address offset for pop: 0x020

Reset value: 0x0000 0000

This description is for register OTG_GRXSTSP in Host mode.

Similarly to OTG_GRXSTSR (receive status debug read register) where a read returns the contents of the top of the receive FIFO, a read to OTG_GRXSTSP (receive status read and pop register) additionally pops the top data entry out of the Rx FIFO.

The core ignores the receive status pop/read when the receive FIFO is empty and returns a value of 0x0000 0000. The application must only pop the receive status FIFO when the receive FIFO non-empty bit of the core interrupt register (RXFLVL bit in OTG_GINTSTS) is asserted.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PKTSTS[3:0]DPID
rrrrr
1514131211109876543210
DPIDBCNT[10:0]CHNUM[3:0]
rrrrrrrrrrrrrrrr

Bits 31:21 Reserved, must be kept at reset value.

Bits 20:17 PKTSTS[3:0] : Packet status

Indicates the status of the received packet

0010: IN data packet received

0011: IN transfer completed (triggers an interrupt)

0101: Data toggle error (triggers an interrupt)

0111: Channel halted (triggers an interrupt)

Others: Reserved

Bits 16:15 DPID[1:0] : Data PID

Indicates the data PID of the received packet

00: DATA0

10: DATA1

01: DATA2

11: MDATA

Bits 14:4 BCNT[10:0] : Byte count

Indicates the byte count of the received IN data packet.

Bits 3:0 CHNUM[3:0] : Channel number

Indicates the channel number to which the current received packet belongs.

32.15.12 OTG receive FIFO size register (OTG_GRXFSIZ)

Address offset: 0x024

Reset value: 0x0000 0200 for USB OTG FS

Reset value: 0x0000 0400 for USB OTG HS

The application can program the RAM size that must be allocated to the Rx FIFO.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
RXFD[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 RXFD[15:0] : Rx FIFO depth

This value is in terms of 32-bit words.

Minimum value is 16

Maximum value is 1024

Programmed values must respect the available FIFO memory allocation and must not exceed the power-on value.

32.15.13 OTG host non-periodic transmit FIFO size register
(OTG_HNPTXFSIZ)/Endpoint 0 Transmit FIFO size
(OTG_DIEPTXF0)

Address offset: 0x028

Reset value: 0x0200 0200

31302928272625242322212019181716
NPTXFD/TX0FD[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
NPTXFSA/TX0FSA[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Host mode

Bits 31:16 NPTXFD[15:0] : Non-periodic Tx FIFO depth

This value is in terms of 32-bit words.

Minimum value is 16

Programmed values must respect the available FIFO memory allocation and must not exceed the power-on value.

Bits 15:0 NPTXFSA[15:0] : Non-periodic transmit RAM start address

This field configures the memory start address for non-periodic transmit FIFO RAM.

Device mode

Bits 31:16 TX0FD : Endpoint 0 Tx FIFO depth

This value is in terms of 32-bit words.

Minimum value is 16

Programmed values must respect the available FIFO memory allocation and must not exceed the power-on value.

Bits 15:0 TX0FSA : Endpoint 0 transmit RAM start address

This field configures the memory start address for the endpoint 0 transmit FIFO RAM.

32.15.14 OTG non-periodic transmit FIFO/queue status register (OTG_HNPTXSTS)

Address offset: 0x02C

Reset value: 0x0008 0200 for USB OTG FS

Reset value: 0x0008 0400 for USB OTG HS

Note: In device mode, this register is not valid.

This read-only register contains the free space information for the non-periodic Tx FIFO and the non-periodic transmit request queue.

31302928272625242322212019181716
Res.NPTXQTOP[6:0]NPTQXSAV[7:0]
rrrrrrrrrrrrrrr
1514131211109876543210
NPTXFSAV[15:0]
rrrrrrrrrrrrrrrr

Bit 31 Reserved, must be kept at reset value.

Bits 30:24 NPTXQTOP[6:0] : Top of the non-periodic transmit request queue

Entry in the non-periodic Tx request queue that is currently being processed by the MAC.
Bits 30:27: Channel/endpoint number
Bits 26:25:
00: IN/OUT token
01: Zero-length transmit packet (device IN/host OUT)
11: Channel halt command
Bit 24: Terminate (last entry for selected channel/endpoint)

Bits 23:16 NPTQXSAV[7:0] : Non-periodic transmit request queue space available

Indicates the amount of free space available in the non-periodic transmit request queue.
This queue holds both IN and OUT requests.
0: Non-periodic transmit request queue is full
1: 1 location available
2: 2 locations available
n: n locations available ( \( 0 \leq n \leq 8 \) )
Others: Reserved

Bits 15:0 NPTXFSAV[15:0] : Non-periodic Tx FIFO space available

Indicates the amount of free space available in the non-periodic Tx FIFO.
Values are in terms of 32-bit words.
0: Non-periodic Tx FIFO is full
1: 1 word available
2: 2 words available
n: n words available (where \( 0 \leq n \leq 512 \) )
Others: Reserved

32.15.15 OTG general core configuration register (OTG_GCCFG)

Address offset: 0x038

Reset value: 0x0000 XXXX

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.VBDENSDENPDENDCDENBCDENPWR DWN
rwrwrwrwrwrw
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PS2 DETSDETPDETDCDET
rrrr

For USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.VBDENRes.Res.Res.Res.PWR DWN
rwrw
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.

For USB OTG HS

Bits 31:22 Reserved, must be kept at reset value.

Bit 21 VBDEN : USB V BUS detection enable

Enables V BUS sensing comparators to detect V BUS valid levels on the V BUS PAD for USB host and device operation. If HNP and/or SRP support is enabled, V BUS comparators are automatically enabled independently of VBDEN value.

0 = V BUS detection disabled

1 = V BUS detection enabled

Bit 20 SDEN : Secondary detection (SD) mode enable

This bit is set by the software to put the BCD into SD mode. Only one detection mode (DCD, PD, SD or OFF) must be selected to work correctly

Bit 19 PDEN : Primary detection (PD) mode enable

This bit is set by the software to put the BCD into PD mode. Only one detection mode (DCD, PD, SD or OFF) must be selected to work correctly.

Bit 18 DCDEN : Data contact detection (DCD) mode enable

This bit is set by the software to put the BCD into DCD mode. Only one detection mode (DCD, PD, SD or OFF) must be selected to work correctly.

Bit 17 BCDEN : Battery charging detector (BCD) enable

This bit is set by the software to enable the BCD support within the USB device. When enabled, the USB PHY is fully controlled by BCD and cannot be used for normal communication. Once the BCD discovery is finished, the BCD must be placed in OFF mode by clearing this bit to '0' in order to allow the normal USB operation.

Bit 16 PWRDWN : Power down control of FS PHY and selection of HS PHY when PHYSEL=1
Used to activate the FS PHY in transmission/reception. When reset, the PHY is kept in power-down. When set, the BCD function must be off (BCDEN=0).

0 = USB FS PHY disabled; HS PHY enabled

1 = USB FS PHY enabled; HS PHY disabled

Bits 15:4 Reserved, must be kept at reset value.

Bit 3 PS2DET : DM pull-up detection status

This bit is active only during PD and gives the result of comparison between DM voltage level and VLGC threshold. In normal situation, the DM level must be below this threshold. If it is above, it means that the DM is externally pulled high. This can be caused by connection to a PS2 port (which pulls-up both DP and DM lines) or to some proprietary charger not following the BCD specification.

0: Normal port detected (connected to SDP, CDP or DCP)

1: PS2 port or proprietary charger detected

Bit 2 SDET : Secondary detection (SD) status

This bit gives the result of SD.

0: CDP detected

1: DCP detected

Bit 1 PDET : Primary detection (PD) status

This bit gives the result of PD.

0: no BCD support detected (connected to SDP or proprietary device).

1: BCD support detected (connected to CDP or DCP).

Bit 0 DCDET : Data contact detection (DCD) status

This bit gives the result of DCD.

0: data lines contact not detected

1: data lines contact detected

32.15.16 OTG core ID register (OTG_CID)

Address offset: 0x03C

Reset value: 0x0000 3000 for USB OTG FS

Reset value: 0x0000 3100 for USB OTG HS

This is a register containing the Product ID as reset value.

31302928272625242322212019181716
PRODUCT_ID[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
PRODUCT_ID[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:0 PRODUCT_ID[31:0] : Product ID field

Application-programmable ID field.

32.15.17 OTG core LPM configuration register (OTG_GLPMCFG)

Address offset: 0x54

Reset value: 0x0000 0000

31302928272625242322212019181716
Res.Res.Res.EN
BESL
LPMRCNTSTS[2:0]SND
LPM
LPMRCNT[2:0]LPMCHIDX[3:0]L1RSM
OK
rrrrwrrrrsrwrwrwrwrwrwrwr

1514131211109876543210
SLP
STS
LPMRSP[1:0]L1DS
EN
BESLTHRS[3:0]L1SS
EN
REM
WAKE
BESL[3:0]LPM
ACK
LPM
EN
rrrrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:29 Reserved, must be kept at reset value.

Bit 28 ENBESL : Enable best effort service latency

This bit enables the BESL feature as defined in the LPM errata:

0:The core works as described in the following document:

USB 2.0 Link Power Management Addendum Engineering Change Notice to the USB 2.0 specification, July 16, 2007

1:The core works as described in the LPM Errata:

Errata for USB 2.0 ECN: Link Power Management (LPM) - 7/2007

Note: Only the updated behavior (described in LPM Errata) is considered in this document and so the ENBESL bit must be set to '1' by application SW.

Bits 27:25 LPMRCNTSTS[2:0] : LPM retry count status

Number of LPM host retries still remaining to be transmitted for the current LPM sequence.

Note: Accessible only in host mode.

Bit 24 SNDLPM : Send LPM transaction

When the application software sets this bit, an LPM transaction containing two tokens, EXT and LPM is sent. The hardware clears this bit once a valid response (STALL, NYET, or ACK) is received from the device or the core has finished transmitting the programmed number of LPM retries.

Note: This bit must be set only when the host is connected to a local port.

Note: Accessible only in host mode.

Bits 23:21 LPMRCNT[2:0] : LPM retry count

When the device gives an ERROR response, this is the number of additional LPM retries that the host performs until a valid device response (STALL, NYET, or ACK) is received.

Note: Accessible only in host mode.

Bits 20:17 LPMCHIDX[3:0] : LPM Channel Index

The channel number on which the LPM transaction has to be applied while sending an LPM transaction to the local device. Based on the LPM channel index, the core automatically inserts the device address and endpoint number programmed in the corresponding channel into the LPM transaction.

Note: Accessible only in host mode.

Bit 16 L1RSMOK: Sleep state resume OK

Indicates that the device or host can start resume from Sleep state. This bit is valid in LPM sleep (L1) state. It is set in sleep mode after a delay of 50 µs ( \( T_{L1Residency} \) ).

This bit is reset when SLPSTS is 0.

1: The application or host can start resume from Sleep state

0: The application or host cannot start resume from Sleep state

Bit 15 SLPSTS: Port sleep status Device mode:

This bit is set as long as a Sleep condition is present on the USB bus. The core enters the Sleep state when an ACK response is sent to an LPM transaction and the \( T_{L1TokenRetry} \) timer has expired. To stop the PHY clock, the application must set the STPPCLK bit in OTG_PCGCCTL, which asserts the PHY suspend input signal.

The application must rely on SLPSTS and not ACK in LPMRSP to confirm transition into sleep.

The core comes out of sleep:

Host mode:

The host transitions to Sleep (L1) state as a side-effect of a successful LPM transaction by the core to the local port with ACK response from the device. The read value of this bit reflects the current Sleep status of the port.

The core clears this bit after:

0: Core not in L1

1: Core in L1

Bits 14:13 LPMRSP[1:0]: LPM response Device mode:

The response of the core to LPM transaction received is reflected in these two bits.

Host mode:

Handshake response received from local device for LPM transaction

11: ACK

10: NYET

01: STALL

00: ERROR (No handshake response)

Bit 12 L1DSEN: L1 deep sleep enable

Enables suspending the PHY in L1 Sleep mode. For maximum power saving during L1 Sleep mode, this bit must be set to '1' by application SW in all the cases.

Bits 11:8 BESLTHRS[3:0] : BESL threshold

Device mode:

The core puts the PHY into deep low power mode in L1 when BESL value is greater than or equal to the value defined in this field BESL_Thres[3:0].

Host mode:

The core puts the PHY into deep low power mode in L1. BESLTHRS[3:0] specifies the time for which resume signaling is to be reflected by host ( \( T_{L1HubDrvResume2} \) ) on the USB bus when it detects device initiated resume.

BESLTHRS must not be programmed with a value greater than 1100b in host mode, because this exceeds maximum \( T_{L1HubDrvResume2} \) .

Thres[3:0] host mode resume signaling time ( \( \mu\text{s} \) ):

0000: 75

0001: 100

0010: 150

0011: 250

0100: 350

0101: 450

0110: 950

All other values: reserved

Bit 7 L1SSEN : L1 Shallow Sleep enable

Enables suspending the PHY in L1 Sleep mode. For maximum power saving during L1 Sleep mode, this bit must be set to '1' by application SW in all the cases.

Bit 6 REMWAKE : bRemoteWake value

Host mode:

The value of remote wake up to be sent in the wIndex field of LPM transaction.

Device mode (read-only):

This field is updated with the received LPM token bRemoteWake bmAttribute when an ACK, NYET, or STALL response is sent to an LPM transaction.

Bits 5:2 BESL[3:0] : Best effort service latency

Host mode:

The value of BESL to be sent in an LPM transaction. This value is also used to initiate resume for a duration \( T_{L1HubDrvResume1} \) for host initiated resume.

Device mode (read-only):

This field is updated with the received LPM token BESL bmAttribute when an ACK, NYET, or STALL response is sent to an LPM transaction.

BESL[3:0] \( T_{BESL} \) ( \( \mu \) s)

0000: 125

0001: 150

0010: 200

0011: 300

0100: 400

0101: 500

0110: 1000

0111: 2000

1000: 3000

1001: 4000

1010: 5000

1011: 6000

1100: 7000

1101: 8000

1110: 9000

1111: 10000

Bit 1 LPMACK : LPM token acknowledge enable

Handshake response to LPM token preprogrammed by device application software.

1: ACK

Even though ACK is preprogrammed, the core device responds with ACK only on successful LPM transaction. The LPM transaction is successful if:

0: NYET

The preprogrammed software bit is over-ridden for response to LPM token when:

Note: Accessible only in device mode.

Bit 0 LPMEN : LPM support enable

The application uses this bit to control the OTG_FS/OTG_HS core LPM capabilities.

If the core operates as a non-LPM-capable host, it cannot request the connected device or hub to activate LPM mode.

If the core operates as a non-LPM-capable device, it cannot respond to any LPM transactions.

0: LPM capability is not enabled

1: LPM capability is enabled

32.15.18 OTG host periodic transmit FIFO size register (OTG_HPTXFSIZ)

Address offset: 0x100

Reset value: 0x0200 0400 for USB OTG FS

Reset value: 0x0400 0800 for USB OTG HS

31302928272625242322212019181716
PTXFSIZ[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
PTXSA[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 PTXFSIZ[15:0] : Host periodic Tx FIFO depth

This value is in terms of 32-bit words.
Minimum value is 16

Bits 15:0 PTXSA[15:0] : Host periodic Tx FIFO start address

This field configures the memory start address for periodic transmit FIFO RAM.

32.15.19 OTG device IN endpoint transmit FIFO x size register (OTG_DIEPTXFx)

Address offset: \( 0x104 + 0x04 \times (x - 1) \) , (x = 1 to 5[FS] / 8[HS])

Reset value: Block 1: 0x0200 0400

Reset value: Block 2: 0x0200 0600

Reset value: Block 3: 0x0200 0800

Reset value: Block 4: 0x0200 0A00

Reset value: Block 5: 0x0200 0C00

Reset value: Block 6: 0x0200 0E00

Reset value: Block 7: 0x0200 1000

Reset value: Block 8: 0x0200 1200

31302928272625242322212019181716
INEPTXFD[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
INEPTXSA[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 INEPTXFD[15:0] : IN endpoint Tx FIFO depth

This value is in terms of 32-bit words.

Minimum value is 16

Bits 15:0 INEPTXSA[15:0] : IN endpoint FIFOx transmit RAM start address

This field contains the memory start address for IN endpoint transmit FIFOx. The address must be aligned with a 32-bit memory location.

32.15.20 Host-mode registers

Bit values in the register descriptions are expressed in binary unless otherwise specified.

Host-mode registers affect the operation of the core in the host mode. Host mode registers must not be accessed in device mode, as the results are undefined. Host mode registers can be categorized as follows:

32.15.21 OTG host configuration register (OTG_HCFG)

Address offset: 0x400

Reset value: 0x0000 0000

This register configures the core after power-on. Do not make changes to this register after initializing the host.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.FSLSSFSLSPCS[1:0]
rnwnw

Bits 31:3 Reserved, must be kept at reset value.

Bit 2 FSLSS : FS- and LS-only support

The application uses this bit to control the core's enumeration speed. Using this bit, the application can make the core enumerate as an FS host, even if the connected device supports HS traffic. Do not make changes to this field after initial programming.

1: FS/LS-only, even if the connected device can support HS (read-only).

Bits 1:0 FSLSPCS[1:0] : FS/LS PHY clock select

When the core is in FS host mode

01: PHY clock is running at 48 MHz

Others: Reserved

When the core is in LS host mode

00: Reserved

01: Select 48 MHz PHY clock frequency

10: Select 6 MHz PHY clock frequency

11: Reserved

Note: The FSLSPCS must be set on a connection event according to the speed of the connected device (after changing this bit, a software reset must be performed).

32.15.22 OTG host frame interval register (OTG_HFIR)

Address offset: 0x404

Reset value: 0x0000 EA60

This register stores the frame interval information for the current speed to which the OTG_FS/OTG_HS controller has enumerated.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.RLD
CTRL
rw
1514131211109876543210
FRIVL[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:17 Reserved, must be kept at reset value.

Bit 16 RLDCTRL : Reload control

This bit allows dynamic reloading of the HFIR register during run time.

0: The HFIR cannot be reloaded dynamically

1: The HFIR can be dynamically reloaded during run time.

This bit needs to be programmed during initial configuration and its value must not be changed during run time.

Caution: RLDCTRL = 0 is not recommended.

Bits 15:0 FRIVL[15:0] : Frame interval for USB OTG FS

The value that the application programs to this field, specifies the interval between two consecutive SOFs (FS) or Keep-Alive tokens (LS). This field contains the number of PHY clocks that constitute the required frame interval. The application can write a value to this register only after the port enable bit of the host port control and status register (PENA bit in OTG_HPRT) has been set. If no value is programmed, the core calculates the value based on the PHY clock specified in the FS/LS PHY clock select field of the host configuration register (FSLSPCS in OTG_HCFG). Do not change the value of this field after the initial configuration, unless the RLDCTRL bit is set. In such case, the FRIVL is reloaded with each SOF event.

– Frame interval = 1 ms × (FRIVL - 1)

Bits 15:0 FRIVL[15:0] : Frame interval for USB OTG HS

The value that the application programs to this field, specifies the interval between two consecutive micro-SOFs (HS) or Keep-Alive tokens (LS). This field contains the number of PHY clocks that constitute the required frame interval. The application can write a value to this register only after the port enable bit of the host port control and status register (PENA bit in OTG_HPRT) has been set. If no value is programmed, the core calculates the value based on the PHY clock specified in the FS/LS PHY clock select field of the host configuration register (FSLSPCS in OTG_HCFG). Do not change the value of this field after the initial configuration, unless the RLDCTRL bit is set. In such case, the FRIVL is reloaded with each SOF event.

– Frame interval = 125 µs × (FRIVL - 1) in high speed operation

– Frame interval = 1 ms × (FRIVL - 1) in low/full speed operation

32.15.23 OTG host frame number/frame time remaining register (OTG_HFNUM)

Address offset: 0x408

Reset value: 0x0000 3FFF

This register indicates the current frame number. It also indicates the time remaining (in terms of the number of PHY clocks) in the current frame.

31302928272625242322212019181716
FTREM[15:0]
rrrrrrrrrrrrrrrr
1514131211109876543210
FRNUM[15:0]
rrrrrrrrrrrrrrrr

Bits 31:16 FTREM[15:0] : Frame time remaining

Indicates the amount of time remaining in the current frame, in terms of PHY clocks. This field decrements on each PHY clock. When it reaches zero, this field is reloaded with the value in the Frame interval register and a new SOF is transmitted on the USB.

Bits 15:0 FRNUM[15:0] : Frame number

This field increments when a new SOF is transmitted on the USB, and is cleared to 0 when it reaches 0x3FFF.

32.15.24 OTG_Host periodic transmit FIFO/queue status register (OTG_HPTXSTS)

Address offset: 0x410

Reset value: 0x0008 0100

This read-only register contains the free space information for the periodic Tx FIFO and the periodic transmit request queue.

31302928272625242322212019181716
PTXQTOP[7:0]PTXQSAV[7:0]
rrrrrrrrrrrrrrrr
1514131211109876543210
PTXFSAVL[15:0]
rrrrrrrrrrrrrrrr

Bits 31:24 PTXQTOP[7:0] : Top of the periodic transmit request queue

This indicates the entry in the periodic Tx request queue that is currently being processed by the MAC.

This register is used for debugging.

Bit 31: Odd/Even frame

0: send in even frame

1: send in odd frame

Bits 30:27: Channel/endpoint number

Bits 26:25: Type

00: IN/OUT

01: Zero-length packet

11: Disable channel command

Bit 24: Terminate (last entry for the selected channel/endpoint)

Bits 23:16 PTXQSAV[7:0] : Periodic transmit request queue space available

Indicates the number of free locations available to be written in the periodic transmit request queue. This queue holds both IN and OUT requests.

00: Periodic transmit request queue is full

01: 1 location available

10: 2 locations available

bxn: n locations available ( \( 0 \leq n \leq 8 \) )

Others: Reserved

Bits 15:0 PTXFSAVL[15:0] : Periodic transmit data FIFO space available

Indicates the number of free locations available to be written to in the periodic Tx FIFO.

Values are in terms of 32-bit words

0000: Periodic Tx FIFO is full

0001: 1 word available

0010: 2 words available

bxn: n words available (where \( 0 \leq n \leq PTXFD \) )

Others: Reserved

32.15.25 OTG host all channels interrupt register (OTG_HAINT)

Address offset: 0x414

Reset value: 0x0000 0000

When a significant event occurs on a channel, the host all channels interrupt register interrupts the application using the host channels interrupt bit of the core interrupt register (HCINT bit in OTG_GINTSTS). This is shown in Figure 437 . There is one interrupt bit per channel, up to a maximum of 16 bits. Bits in this register are set and cleared when the application sets and clears bits in the corresponding host channel-x interrupt register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
HAINT[15:0]
rrrrrrrrrrrrrrrr

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 HAINT[15:0] : Channel interrupts

One bit per channel: Bit 0 for Channel 0, bit 15 for Channel 15

32.15.26 OTG host all channels interrupt mask register (OTG_HAINTMSK)

Address offset: 0x418

Reset value: 0x0000 0000

The host all channel interrupt mask register works with the host all channel interrupt register to interrupt the application when an event occurs on a channel. There is one interrupt mask bit per channel, up to a maximum of 16 bits.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
HAINTM[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 HAINTM[15:0] : Channel interrupt mask

0: Masked interrupt

1: Unmasked interrupt

One bit per channel: Bit 0 for channel 0, bit 15 for channel 15

32.15.27 OTG host port control and status register (OTG_HPRT)

Address offset: 0x440

Reset value: 0x0000 0000

This register is available only in host mode. Currently, the OTG host supports only one port.

A single register holds USB port-related information such as USB reset, enable, suspend, resume, connect status, and test mode for each port. It is shown in Figure 437 . The rc_w1 bits in this register can trigger an interrupt to the application through the host port interrupt bit of the core interrupt register (HPRTINT bit in OTG_GINTSTS). On a port interrupt, the application must read this register and clear the bit that caused the interrupt. For the rc_w1 bits, the application must write a 1 to the bit to clear the interrupt.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PSPD[1:0]PTCTL [3]
rrrw

1514131211109876543210
PTCTL[2:0]PPWRPLSTS[1:0]Res.PRSTPSUSPPRESPOC CHNGPOCAPEN CHNGPENAPCDETPCSTS
rwrwrwrwrrrwrsrwrc_w1rrc_w1rc_w1rc_w1r

Bits 31:19 Reserved, must be kept at reset value.

Bits 18:17 PSPD[1:0] : Port speed

Indicates the speed of the device attached to this port.

01: Full speed

10: Low speed

11: Reserved

00: High speed

Bits 16:13 PTCTL[3:0] : Port test control

The application writes a nonzero value to this field to put the port into a Test mode, and the corresponding pattern is signaled on the port.

0000: Test mode disabled

0001: Test_J mode

0010: Test_K mode

0011: Test_SE0_NAK mode

0100: Test_Packet mode

0101: Test_Force_Enable

Others: Reserved

Bit 12 PPWR : Port power

The application uses this field to control power to this port, and the core clears this bit on an overcurrent condition.

0: Power off

1: Power on

Bits 11:10 PLSTS[1:0] : Port line status

Indicates the current logic level USB data lines

Bit 10: Logic level of OTG_DP

Bit 11: Logic level of OTG_DM

Bit 9 Reserved, must be kept at reset value.

Bit 8 PRST: Port reset

When the application sets this bit, a reset sequence is started on this port. The application must time the reset period and clear this bit after the reset sequence is complete.

0: Port not in reset

1: Port in reset

The application must leave this bit set for a minimum duration of at least 10 ms to start a reset on the port. The application can leave it set for another 10 ms in addition to the required minimum duration, before clearing the bit, even though there is no maximum limit set by the USB standard.

High speed: 50 ms

Full speed/Low speed: 10 ms

Bit 7 PSUSP: Port suspend

The application sets this bit to put this port in suspend mode. The core only stops sending SOFs when this is set. To stop the PHY clock, the application must set the port clock stop bit, which asserts the suspend input pin of the PHY.

The read value of this bit reflects the current suspend status of the port. This bit is cleared by the core after a remote wake-up signal is detected or the application sets the port reset bit or port resume bit in this register or the resume/remote wake-up detected interrupt bit or disconnect detected interrupt bit in the core interrupt register (WKUPINT or DISCINT in OTG_GINTSTS, respectively).

0: Port not in suspend mode

1: Port in suspend mode

Bit 6 PRES: Port resume

The application sets this bit to drive resume signaling on the port. The core continues to drive the resume signal until the application clears this bit.

If the core detects a USB remote wake-up sequence, as indicated by the port resume/remote wake-up detected interrupt bit of the core interrupt register (WKUPINT bit in OTG_GINTSTS), the core starts driving resume signaling without application intervention and clears this bit when it detects a disconnect condition. The read value of this bit indicates whether the core is currently driving resume signaling.

0: No resume driven

1: Resume driven

When LPM is enabled and the core is in L1 state, the behavior of this bit is as follow:

1. The application sets this bit to drive resume signaling on the port.

2. The core continues to drive the resume signal until a predetermined time specified in BESLTHRS[3:0] field of OTG_GLPMCFG register.

3. If the core detects a USB remote wake-up sequence, as indicated by the port L1Resume/Remote L1Wakeup detected interrupt bit of the core interrupt register (WKUPINT in OTG_GINTSTS), the core starts driving resume signaling without application intervention and clears this bit at the end of resume. This bit can be set or cleared by both the core and the application. This bit is cleared by the core even if there is no device connected to the host.

Bit 5 POCCHNG: Port overcurrent change

The core sets this bit when the status of the port overcurrent active bit (bit 4) in this register changes.

Bit 4 POCA: Port overcurrent active

Indicates the overcurrent condition of the port.

0: No overcurrent condition

1: Overcurrent condition

Bit 3 PENCHNG: Port enable/disable change

The core sets this bit when the status of the port enable bit 2 in this register changes.

Bit 2 PENA : Port enable

A port is enabled only by the core after a reset sequence, and is disabled by an overcurrent condition, a disconnect condition, or by the application clearing this bit. The application cannot set this bit by a register write. It can only clear it to disable the port. This bit does not trigger any interrupt to the application.

0: Port disabled

1: Port enabled

Bit 1 PCDET : Port connect detected

The core sets this bit when a device connection is detected to trigger an interrupt to the application using the host port interrupt bit in the core interrupt register (HPRTINT bit in OTG_GINTSTS). The application must write a 1 to this bit to clear the interrupt.

Bit 0 PCSTS : Port connect status

0: No device is attached to the port

1: A device is attached to the port

32.15.28 OTG host channel x characteristics register (OTG_HCCHARx)

Address offset: 0x500 + 0x20 * x, (x = 0 to 15[HS] / 11[FS])

Reset value: 0x0000 0000

31302928272625242322212019181716
CHENACHDISODD FRMDAD[6:0]MCNT[1:0]EPTYP[1:0]LSDEVRes.
rsrsrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
EPDIREPNUM[3:0]MPSIZ[10:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Bit 31 CHENA : Channel enable

This field is set by the application and cleared by the OTG host.

0: Channel disabled

1: Channel enabled

Bit 30 CHDIS : Channel disable

The application sets this bit to stop transmitting/receiving data on a channel, even before the transfer for that channel is complete. The application must wait for the Channel disabled interrupt before treating the channel as disabled.

Bit 29 ODDFRM : Odd frame

This field is set (reset) by the application to indicate that the OTG host must perform a transfer in an odd frame. This field is applicable for only periodic (isochronous and interrupt) transactions.

0: Even frame

1: Odd frame

Bits 28:22 DAD[6:0] : Device address

This field selects the specific device serving as the data source or sink.

Bits 21:20 MCNT[1:0] : Multicount

This field indicates to the host the number of transactions that must be executed per frame for this periodic endpoint. For non-periodic transfers, this field is not used

00: Reserved. This field yields undefined results

01: 1 transaction

10: 2 transactions per frame to be issued for this endpoint

11: 3 transactions per frame to be issued for this endpoint

Note: This field must be set to at least 01.

Bits 19:18 EPTYP[1:0] : Endpoint type

Indicates the transfer type selected.

00: Control

01: Isochronous

10: Bulk

11: Interrupt

Bit 17 LSDEV : Low-speed device

This field is set by the application to indicate that this channel is communicating to a low-speed device.

Bit 16 Reserved, must be kept at reset value.

Bit 15 EPDIR : Endpoint direction

Indicates whether the transaction is IN or OUT.

0: OUT

1: IN

Bits 14:11 EPNUM[3:0] : Endpoint number

Indicates the endpoint number on the device serving as the data source or sink.

Bits 10:0 MPSIZ[10:0] : Maximum packet size

Indicates the maximum packet size of the associated endpoint.

32.15.29 OTG host channel x split control register (OTG_HCSPLTx)

Address offset: 0x504 + 0x20 * x, (x = 0 to 15)

Reset value: 0x0000 0000

Note: Configuration register applies only to USB OTG HS.

31302928272625242322212019181716
SPLIT ENRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.COMP LSPLT
rwrw

1514131211109876543210
XACTPOS[1:0]HUBADDR[6:0]PRTADDR[6:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

32.15.30 OTG host channel x interrupt register (OTG_HCINTx)

Address offset: 0x508 + 0x20 * x, (x = 0 to 15[HS] / 11[FS])

Reset value: 0x0000 0000

This register indicates the status of a channel with respect to USB- and AHB-related events. It is shown in Figure 437 . The application must read this register when the host channels interrupt bit in the core interrupt register (HCINT bit in OTG_GINTSTS) is set. Before the application can read this register, it must first read the host all channels interrupt (OTG_HAINT) register to get the exact channel number for the host channel-x interrupt register. The application must clear the appropriate bit in this register to clear the corresponding bits in the OTG_HAINT and OTG_GINTSTS registers.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.DTERRFRM ORBBERRTXERRRes.ACKNAKSTALLRes.CHHXFRC
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1

Note: Configuration register for USB OTG FS.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.DTERRFRM
OR
BBERRTXERRNYETACKNAKSTALLAHB
ERR
CHHXFRC
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1

Note: Configuration register for USB OTG HS.

Bits 31:11 Reserved, must be kept at reset value.

Bit 10 DTERR : Data toggle error.

Bit 9 FRMOR : Frame overrun.

Bit 8 BBERR : Babble error.

Bit 7 TXERR : Transaction error.

Indicates one of the following errors occurred on the USB.

CRC check failure

Timeout

Bit stuff error

False EOP

Bit 6 Reserved, must be kept at reset value for USB OTG FS.

Bit 6 NYET : Not yet ready response received interrupt for USB OTG HS.

Bit 5 ACK : ACK response received/transmitted interrupt.

Bit 4 NAK : NAK response received interrupt.

Bit 3 STALL : STALL response received interrupt.

Bit 2 Reserved, must be kept at reset value for USB OTG FS.

Bit 2 AHBERR : AHB error for USB OTG HS

This error is generated only in Internal DMA mode when an AHB error occurs during an AHB read/write operation. The application can read the corresponding DMA channel address register to get the error address.

Bit 1 CHH : Channel halted

This indicates that the transfer completed:

– because of any USB transaction error

– in response to disable request by the application

– normally

Bit 0 XFRC : Transfer completed.

Transfer completed normally without any errors.

32.15.31 OTG host channel x interrupt mask register (OTG_HCINTMSKx)

Address offset: 0x50C + 0x20 * x, (x = 0 to 15[HS] / 11[FS])

Reset value: 0x0000 0000

This register reflects the mask for each channel status described in the previous section.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.DTERR
M
FRM
ORM
BBERR
M
TXERR
M
Res.ACKMNAKMSTALL
M
Res.CHHMXFRC
M
rwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.DTERR
M
FRM
ORM
BBERR
M
TXERR
M
NYETACKMNAKMSTALL
M
AHB
ERRM
CHHMXFRC
M
rwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG HS

Bits 31:11 Reserved, must be kept at reset value.

Bit 10 DTERRM : Data toggle error mask.

Bit 9 FRMORM : Frame overrun mask.

Bit 8 BBERRM : Babble error mask.

Bit 7 TXERRM : Transaction error mask.

Bit 6 Reserved, must be kept at reset value for USB OTG FS.

Bit 6 NYET : response received interrupt mask for USB OTG HS.

Bit 5 ACKM : ACK response received/transmitted interrupt mask.

Bit 4 NAKM : NAK response received interrupt mask.

0: Masked interrupt
1: Unmasked interrupt

Bit 3 STALLM : STALL response received interrupt mask.

0: Masked interrupt
1: Unmasked interrupt

Bit 2 AHBERRM : AHB error for USB OTG HS.

0: Masked interrupt
1: Unmasked interrupt

Bit 2 Reserved, must be kept at reset value for USB OTG FS.

Bit 1 CHHM : Channel halted mask

0: Masked interrupt
1: Unmasked interrupt

Bit 0 XFRCM : Transfer completed mask

0: Masked interrupt
1: Unmasked interrupt

32.15.32 OTG host channel x transfer size register (OTG_HCTSIZx)

Address offset: 0x510 + 0x20 * x, (x = 0 to 15[HS] / 11[FS])

Reset value: 0x0000 0000

31302928272625242322212019181716
DO
PNG
DPID[1:0]PKTCNT[9:0]XFRSZ[18:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
XFRSZ[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 DOPNG : Do Ping

This bit is used only for OUT transfers. Setting this field to 1 directs the host to do PING protocol.

Note: Do not set this bit for IN transfers. If this bit is set for IN transfers, it disables the channel.

Bits 30:29 DPID[1:0] : Data PID

The application programs this field with the type of PID to use for the initial transaction. The host maintains this field for the rest of the transfer.

00: DATA0

01: DATA2

10: DATA1

11: SETUP (control) / reserved[FS]MDATA[HS] (non-control)

Bits 28:19 PKTCNT[9:0] : Packet count

This field is programmed by the application with the expected number of packets to be transmitted (OUT) or received (IN).

The host decrements this count on every successful transmission or reception of an OUT/IN packet. Once this count reaches zero, the application is interrupted to indicate normal completion.

Bits 18:0 XFRSIZ[18:0] : Transfer size

For an OUT, this field is the number of data bytes the host sends during the transfer.

For an IN, this field is the buffer size that the application has reserved for the transfer. The application is expected to program this field as an integer multiple of the maximum packet size for IN transactions (periodic and non-periodic).

32.15.33 OTG host channel x DMA address register (OTG_HCDMAx)

Address offset: 0x514 + 0x20 * x, (x = 0 to 15)

Reset value: 0x0000 0000

31302928272625242322212019181716
DMAADDR[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
DMAADDR[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:0 DMAADDR[31:0] : DMA address

This field holds the start address in the external memory from which the data for the endpoint must be fetched or to which it must be stored. This register is incremented on every AHB transaction.

32.15.34 Device-mode registers

These registers must be programmed every time the core changes to device mode

32.15.35 OTG device configuration register (OTG_DCFG)

Address offset: 0x800

Reset value: 0x0220 0000

This register configures the core in device mode after power-on or after certain control commands or enumeration. Do not make changes to this register after initial programming.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
ERRAT IMRes.Res.PFIVL[1:0]DAD[6:0]Res.NZLSO HSKDSPD[1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.PERSCHIVL[1:0]Res.Res.Res.Res.Res.Res.Res.Res.
rwrw
1514131211109876543210
ERRAT IMXCVR DLYRes.PFIVL[1:0]DAD[6:0]Res.NZLSO HSKDSPD[1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG HS

Bits 31:16 Reserved, must be kept at reset value for USB OTG FS.

Bits 31:26 Reserved, must be kept at reset value for USB OTG HS.

Bits 25:24 PERSCHIVL[1:0] : Periodic schedule interval for USB OTG HS

This field specifies the amount of time the Internal DMA engine must allocate for fetching periodic IN endpoint data. Based on the number of periodic endpoints, this value must be specified as 25, 50 or 75% of the (micro) frame.

00: 25% of (micro)frame
01: 50% of (micro)frame
10: 75% of (micro)frame
11: Reserved

Bits 23:16 Reserved, must be kept at reset value for USB OTG HS.

Bit 15 ERRATIM : Erratic error interrupt mask

1: Mask early suspend interrupt on erratic error

0: Early suspend interrupt is generated on erratic error

Bit 14 XCVRDLY : Transceiver delay

Enables or disables delay in ULPI timing during device chirp.

0: Disable delay (use default timing)

1: Enable delay to default timing, necessary for some ULPI PHYs

Bit 13 Reserved, must be kept at reset value.

Bits 12:11 PFIVL[1:0] : Periodic frame interval

Indicates the time within a frame at which the application must be notified using the end of periodic frame interrupt. This can be used to determine if all the isochronous traffic for that frame is complete.

00: 80% of the frame interval

01: 85% of the frame interval

10: 90% of the frame interval

11: 95% of the frame interval

Bits 10:4 DAD[6:0] : Device address

The application must program this field after every SetAddress control command.

Bit 3 Reserved, must be kept at reset value.

Bit 2 NZLSOHSK : Non-zero-length status OUT handshake

The application can use this field to select the handshake the core sends on receiving a nonzero-length data packet during the OUT transaction of a control transfer's status stage.

1:Send a STALL handshake on a nonzero-length status OUT transaction and do not send the received OUT packet to the application.

0:Send the received OUT packet to the application (zero-length or nonzero-length) and send a handshake based on the NAK and STALL bits for the endpoint in the device endpoint control register.

Bits 1:0 DSPD[1:0] : Device speed

Indicates the speed at which the application requires the core to enumerate, or the maximum speed the application can support. However, the actual bus speed is determined only after the chirp sequence is completed, and is based on the speed of the USB host to which the core is connected.

00: Reserved

01: Reserved

10: Reserved

11: Full speed (USB 1.1 transceiver clock is 48 MHz)

Bits 1:0 DSPD[1:0] : Device speed

Indicates the speed at which the application requires the core to enumerate, or the maximum speed the application can support. However, the actual bus speed is determined only after the chirp sequence is completed, and is based on the speed of the USB host to which the core is connected.

00: High speed

01: Full speed using HS

10: Reserved

11: Full speed using internal FS PHY

32.15.36 OTG device control register (OTG_DCTL)

Address offset: 0x804

Reset value: 0x0000 0002

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DS
BESL
RJCT
Res.Res.
1514131211109876543210
Res.Res.Res.Res.PO
PRG
DNE
CGO
NAK
SGO
NAK
CGI
NAK
SGI
NAK
TCTL[2:0]GON
STS
GIN
STS
SDISRWU
SIG
rwwwwwrwrwrwrrrwrw

Bits 31:19 Reserved, must be kept at reset value.

Bit 18 DSBESLRJCT : Deep sleep BESL reject

Core rejects LPM request with BESL value greater than BESL threshold programmed. NYET response is sent for LPM tokens with BESL value greater than BESL threshold. By default, the deep sleep BESL reject feature is disabled.

Bits 17:12 Reserved, must be kept at reset value.

Bit 11 POPRGDNE : Power-on programming done

The application uses this bit to indicate that register programming is completed after a wake-up from power down mode.

Bit 10 CGONAK : Clear global OUT NAK

Writing 1 to this field clears the Global OUT NAK.

Bit 9 SGONAK : Set global OUT NAK

Writing 1 to this field sets the Global OUT NAK.

The application uses this bit to send a NAK handshake on all OUT endpoints.

The application must set this bit only after making sure that the Global OUT NAK effective bit in the core interrupt register (GONAKEFF bit in OTG_GINTSTS) is cleared.

Bit 8 CGINAK : Clear global IN NAK

Writing 1 to this field clears the Global IN NAK.

Bit 7 SGINAK : Set global IN NAK

Writing 1 to this field sets the Global non-periodic IN NAK. The application uses this bit to send a NAK handshake on all non-periodic IN endpoints.

The application must set this bit only after making sure that the Global IN NAK effective bit in the core interrupt register (GINAKEFF bit in OTG_GINTSTS) is cleared.

Bits 6:4 TCTL[2:0] : Test control

000: Test mode disabled

001: Test_J mode

010: Test_K mode

011: Test_SE0_NAK mode

100: Test_Packet mode

101: Test_Force_Enable

Others: Reserved

Bit 3 GONSTS : Global OUT NAK status

0:A handshake is sent based on the FIFO status and the NAK and STALL bit settings.

1:No data is written to the Rx FIFO, irrespective of space availability. Sends a NAK handshake on all packets, except on SETUP transactions. All isochronous OUT packets are dropped.

Bit 2 GINSTS : Global IN NAK status

0:A handshake is sent out based on the data availability in the transmit FIFO.

1:A NAK handshake is sent out on all non-periodic IN endpoints, irrespective of the data availability in the transmit FIFO.

Bit 1 SDIS : Soft disconnect

The application uses this bit to signal the USB OTG core to perform a soft disconnect. As long as this bit is set, the host does not see that the device is connected, and the device does not receive signals on the USB. The core stays in the disconnected state until the application clears this bit.

0:Normal operation. When this bit is cleared after a soft disconnect, the core generates a device connect event to the USB host. When the device is reconnected, the USB host restarts device enumeration.

1:The core generates a device disconnect event to the USB host.

Bit 0 RWUSIG : Remote wake-up signaling

When the application sets this bit, the core initiates remote signaling to wake up the USB host. The application must set this bit to instruct the core to exit the suspend state. As specified in the USB 2.0 specification, the application must clear this bit 1 ms to 15 ms after setting it.

If LPM is enabled and the core is in the L1 (sleep) state, when the application sets this bit, the core initiates L1 remote signaling to wake up the USB host. The application must set this bit to instruct the core to exit the sleep state. As specified in the LPM specification, the hardware automatically clears this bit 50 µs ( \( T_{L1DevDrvResume} \) ) after being set by the application. The application must not set this bit when bRemoteWake from the previous LPM transaction is zero (refer to REMWAKE bit in GLPMCFG register).

Table 237 contains the minimum duration (according to device state) for which the Soft disconnect (SDIS) bit must be set for the USB host to detect a device disconnect. To accommodate clock jitter, it is recommended that the application add some extra delay to the specified minimum duration.

Table 237. Minimum duration for soft disconnect

Operating speedDevice stateMinimum duration
Full speedSuspended1 ms + 2.5 µs
Full speedIdle2.5 µs
Full speedNot Idle or suspended (Performing transactions)2.5 µs
High speedNot Idle or suspended (Performing transactions)125 µs

32.15.37 OTG device status register (OTG_DSTS)

Address offset: 0x808

Reset value: 0x0000 0010

This register indicates the status of the core with respect to USB-related events. It must be read on interrupts from the device all interrupts (OTG_DAINT) register.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.DEVLNSTS[1:0]FNSOF[13:8]
rrrrrrrr

1514131211109876543210
FNSOF[7:0]Res.Res.Res.Res.EERRENUMSPD[1:0]SUSPSTS
rrrrrrrrrrrr

Bits 31:24 Reserved, must be kept at reset value.

Bits 23:22 DEVLNSTS[1:0] : Device line status

Indicates the current logic level USB data lines.

Bit [23]: Logic level of D+

Bit [22]: Logic level of D-

Bits 21:8 FNSOF[13:0] : Frame number of the received SOF

Bits 7:4 Reserved, must be kept at reset value.

Bit 3 EERR : Erratic error

The core sets this bit to report any erratic errors.

Due to erratic errors, the OTG_FS/OTG_HS controller goes into suspended state and an interrupt is generated to the application with Early suspend bit of the OTG_GINTSTS register (ESUSP bit in OTG_GINTSTS). If the early suspend is asserted due to an erratic error, the application can only perform a soft disconnect/recover.

Bits 2:1 ENUMSPD[1:0] : Enumerated speed

Indicates the speed at which the OTG_FS/OTG_HS controller has come up after speed detection through a chirp sequence.

00: High Speed using HS PHY

01: Full Speed using HS PHY

11: Full speed using embedded FS PHY

Others: reserved

Bit 0 SUSPSTS : Suspend status

In device mode, this bit is set as long as a suspend condition is detected on the USB. The core enters the suspended state when there is no activity on the USB data lines for a period of 3 ms. The core comes out of the suspend:

32.15.38 OTG device IN endpoint common interrupt mask register (OTG_DIEPMSK)

Address offset: 0x810

Reset value: 0x0000 0000

This register works with each of the OTG_DIEPINTx registers for all endpoints to generate an interrupt per IN endpoint. The IN endpoint interrupt for a specific status in the OTG_DIEPINTx register can be masked by writing to the corresponding bit in this register. Status bits are masked by default.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAKMRes.Res.Res.Res.Res.Res.INEPN EMINEPN MMITTXFE MSKTOMRes.EPDMXFRC M
rWrWrWrWrWrWrW

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAKMRes.Res.Res.Res.TXFURMRes.INEPN EMINEPN MMITTXFE MSKTOMAHB ERRMEPDMXFRC M
rWrWrWrWrWrWrWrWrW

Note: Configuration register for USB OTG HS

Bits 31:14 Reserved, must be kept at reset value.

Bit 13 NAKM : NAK interrupt mask

0: Masked interrupt

1: Unmasked interrupt

Bits 12:10 Reserved, must be kept at reset value.

Bit 9 Reserved, must be kept at reset value.

Bit 8 TXFURM : FIFO underrun mask for USB OTG HS

0: Masked interrupt

1: Unmasked interrupt

Bit 7 Reserved, must be kept at reset value.

Bit 6 INEPNEM : IN endpoint NAK effective mask

0: Masked interrupt

1: Unmasked interrupt

Bit 5 INEPNMM : IN token received with EP mismatch mask

0: Masked interrupt

1: Unmasked interrupt

Bit 4 ITTXFEMSK : IN token received when Tx FIFO empty mask

0: Masked interrupt
1: Unmasked interrupt

Bit 3 TOM : Timeout condition mask (Non-isochronous endpoints)

0: Masked interrupt
1: Unmasked interrupt

Bit 2 AHBERRM : AHB error mask for USB OTG HS

0: Masked interrupt
1: Unmasked interrupt

Bit 1 EPDM : Endpoint disabled interrupt mask

0: Masked interrupt
1: Unmasked interrupt

Bit 0 XFRCM : Transfer completed interrupt mask

0: Masked interrupt
1: Unmasked interrupt

32.15.39 OTG device OUT endpoint common interrupt mask register (OTG_DOEPMSK)

Address offset: 0x814

Reset value: 0x0000 0000

This register works with each of the OTG_DOEPINTx registers for all endpoints to generate an interrupt per OUT endpoint. The OUT endpoint interrupt for a specific status in the OTG_DOEPINTx register can be masked by writing into the corresponding bit in this register. Status bits are masked by default.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAK
MSK
BERR
M
Res.Res.Res.OUT
PKT
ERRM
Res.Res.STS
PHSR
XM
OTEPD
M
STUPMRes.EPDMXFRC
M
rwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.NYET
MSK
NAK
MSK
BERR
M
Res.Res.Res.OUT
PKT
ERRM
Res.B2B
STUPM
STS
PHSR
XM
OTEPD
M
STUPMAHB
ERRM
EPDMXFRC
M
rwrwrwrwrwrwrwrwrwrwrw

Note: Configuration register for USB OTG HS

Bits 31:15 Reserved, must be kept at reset value.

Bit 14 NYETMSK : NYET interrupt mask for USB OTG HS

Bit 13 NAKMSK : NAK interrupt mask

Bit 12 BERRM : Babble error interrupt mask

Bits 11:10 Reserved, must be kept at reset value.

Bit 9 Reserved, must be kept at reset value.

Bit 8 OUTPKTERM : Out packet error mask

Bit 7 Reserved, must be kept at reset value.

Bit 6 B2BSTUPM : Back-to-back SETUP packets received mask for USB OTG HS

Bit 5 STSPHSRXM : Status phase received for control write mask

Bit 4 OTEPDM : OUT token received when endpoint disabled mask. Applies to control OUT endpoints only.

Bit 3 STUPM : STUPM: SETUP phase done mask. Applies to control endpoints only.

Bit 2 AHBERRM : AHB error mask for USB OTG HS

Bit 1 EPDM : Endpoint disabled interrupt mask

Bit 0 XFRM : Transfer completed interrupt mask

32.15.40 OTG device all endpoints interrupt register (OTG_DAINT)

Address offset: 0x818

Reset value: 0x0000 0000

When a significant event occurs on an endpoint, a OTG_DAINT register interrupts the application using the device OUT endpoints interrupt bit or device IN endpoints interrupt bit of the OTG_GINTSTS register (OEPINT or IEPINT in OTG_GINTSTS, respectively). There is one interrupt bit per endpoint, up to a maximum of 16 bits for OUT endpoints and 16 bits for IN endpoints. For a bidirectional endpoint, the corresponding IN and OUT interrupt bits are used. Bits in this register are set and cleared when the application sets and clears bits in the corresponding device endpoint-x interrupt register (OTG_DIEPINTx/OTG_DOEPINTx).

31302928272625242322212019181716
OEPINT[15:0]
rrrrrrrrrrrrrrrr
1514131211109876543210
IEPINT[15:0]
rrrrrrrrrrrrrrrr

Bits 31:16 OEPINT[15:0] : OUT endpoint interrupt bits

One bit per OUT endpoint:

Bit 16 for OUT endpoint 0, bit 19 for OUT endpoint 3.

Bits 15:0 IEPINT[15:0] : IN endpoint interrupt bits

One bit per IN endpoint:

Bit 0 for IN endpoint 0, bit 3 for endpoint 3.

32.15.41 OTG all endpoints interrupt mask register (OTG_DAINTMSK)

Address offset: 0x81C

Reset value: 0x0000 0000

The OTG_DAINTMSK register works with the device endpoint interrupt register to interrupt the application when an event occurs on a device endpoint. However, the OTG_DAINT register bit corresponding to that interrupt is still set.

31302928272625242322212019181716
OEPM[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
IEPM[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 OEPM[15:0] : OUT EP interrupt mask bits

Bits 15:0 IEPM[15:0] : IN EP interrupt mask bits

32.15.42 OTG device V BUS discharge time register (OTG_DVBUSDIS)

Address offset: 0x0828

Reset value: 0x0000 17D7

This register specifies the V BUS discharge time after V BUS pulsing during SRP.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
VBUSDT[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 VBUSDT[15:0] : Device V BUS discharge time

32.15.43 OTG device V BUS pulsing time register (OTG_DVBUSPULSE)

Address offset: 0x082C

Reset value: 0x0000 05B8

This register specifies the V BUS pulsing time during SRP.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
DVBUSP[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 DVBUSP[15:0] : Device \( V_{BUS} \) pulsing time. This feature is only relevant to OTG1.3.
Specifies the \( V_{BUS} \) pulsing time during SRP. This value equals:
\( V_{BUS} \) pulsing time in PHY clocks / 1 024

32.15.44 OTG device threshold control register (OTG_DTHRCTL)

Address offset: 0x0830

Reset value: 0x0000 0000

Note: Configuration register applies only to USB OTG HS

31302928272625242322212019181716
Res.Res.Res.Res.ARPENRes.RXTHRLEN[8:0]RXTHREN
rwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
Res.Res.Res.Res.Res.TXTHRLEN[8:0]ISOTHRENNONISOTHREN
rwrwrwrwrwrwrwrwrwrwrw

Bits 31:28 Reserved, must be kept at reset value.

Bit 27 ARPEN : Arbiter parking enable

This bit controls internal DMA arbiter parking for IN endpoints. When thresholding is enabled and this bit is set to one, then the arbiter parks on the IN endpoint for which there is a token received on the USB. This is done to avoid getting into underrun conditions. By default parking is enabled.

Bit 26 Reserved, must be kept at reset value.

Bits 25:17 RXTHRLEN[8:0] : Receive threshold length

This field specifies the receive thresholding size in 32-bit words. This field also specifies the amount of data received on the USB before the core can start transmitting on the AHB. The threshold length has to be at least eight 32-bit words. The recommended value for RXTHRLEN is to be the same as the programmed AHB burst length (HBSTLEN bit in OTG_GAHBCFG).

Bit 16 RXTHREN : Receive threshold enable

When this bit is set, the core enables thresholding in the receive direction.

Bits 15:11 Reserved, must be kept at reset value.

Bits 10:2 TXTHRCLEN[8:0] : Transmit threshold length

This field specifies the transmit thresholding size in 32-bit words. This field specifies the amount of data in bytes to be in the corresponding endpoint transmit FIFO, before the core can start transmitting on the USB. The threshold length has to be at least eight 32-bit words. This field controls both isochronous and nonisochronous IN endpoint thresholds. The recommended value for TXTHRCLEN is to be the same as the programmed AHB burst length (HBSTRCLEN bit in OTG_GAHBCFG).

Bit 1 ISOTHRCN : ISO IN endpoint threshold enable

When this bit is set, the core enables thresholding for isochronous IN endpoints.

Bit 0 NONISOTHRCN : Nonisochronous IN endpoints threshold enable

When this bit is set, the core enables thresholding for nonisochronous IN endpoints.

32.15.45 OTG device IN endpoint FIFO empty interrupt mask register (OTG_DIEPMPMSK)

Address offset: 0x834

Reset value: 0x0000 0000

This register is used to control the IN endpoint FIFO empty interrupt generation (TXFE_OTG_DIEPINTx).

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
INEPTXFEM[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 INEPTXFEM[15:0] : IN EP Tx FIFO empty interrupt mask bits

These bits act as mask bits for OTG_DIEPINTx.

TXFE interrupt one bit per IN endpoint:

Bit 0 for IN endpoint 0, bit 3 for IN endpoint 3

0: Masked interrupt

1: Unmasked interrupt

32.15.46 OTG device each endpoint interrupt register (OTG_DEACHINT)

Address offset: 0x0838

Reset value: 0x0000 0000

Note: Configuration register applies only to USB OTG HS.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.OEP1
INT
Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.IEP1
INT
Res.
r

Bits 31:18 Reserved, must be kept at reset value.

Bit 17 OEP1INT : OUT endpoint 1 interrupt bit

Bits 16:2 Reserved, must be kept at reset value.

Bit 1 IEP1INT : IN endpoint 1 interrupt bit

Bit 0 Reserved, must be kept at reset value.

32.15.47 OTG device each endpoint interrupt mask register (OTG_DEACHINTMSK)

Address offset: 0x083C

Reset value: 0x0000 0000

There is one interrupt bit for endpoint 1 IN and one interrupt bit for endpoint 1 OUT.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.OEP1
INTM
Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.IEP1
INTM
Res.
r/w

Bits 31:18 Reserved, must be kept at reset value.

Bit 17 OEP1INTM : OUT endpoint 1 interrupt mask bit

Bits 16:2 Reserved, must be kept at reset value.

Bit 1 IEP1INTM : IN endpoint 1 interrupt mask bit

Bit 0 Reserved, must be kept at reset value.

32.15.48 OTG device each IN endpoint-1 interrupt mask register (OTG_HS_DIEPEACHMSK1)

Address offset: 0x844

Reset value: 0x0000 0000

This register works with the OTG_DIEPINT1 register to generate a dedicated interrupt OTG_HS_EP1_IN for endpoint #1. The IN endpoint interrupt for a specific status in the OTG_DOEPINT1 register can be masked by writing into the corresponding bit in this register. Status bits are masked by default.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAKMRes.Res.Res.Res.TXFURMRes.INEPNEMRes.ITTXFEMSKTOMAHBERRMEPDMXFRCEM
rwrwrwrwrwrwrwrw

Bits 31:14 Reserved, must be kept at reset value.

Bit 13 NAKM : NAK interrupt mask

Bits 12:10 Reserved, must be kept at reset value.

Bit 9 Reserved, must be kept at reset value.

Bit 8 TXFURM : FIFO underrun mask

Bit 7 Reserved, must be kept at reset value.

Bit 6 INEPNEM : IN endpoint NAK effective mask

Bit 5 Reserved, must be kept at reset value.

Bit 4 ITTXFEMSK : IN token received when Tx FIFO empty mask

Bit 3 TOM : Timeout condition mask (Non-isochronous endpoints)

Bit 2 AHBERRM : AHB error mask

0: Masked interrupt
1: Unmasked interrupt

Bit 1 EPDM : Endpoint disabled interrupt mask

0: Masked interrupt
1: Unmasked interrupt

Bit 0 XFRCM : Transfer completed interrupt mask

0: Masked interrupt
1: Unmasked interrupt

32.15.49 OTG device each OUT endpoint-1 interrupt mask register (OTG_HS_DOEPEACHMSK1)

Address offset: 0x884

Reset value: 0x0000 0000

This register works with the OTG_DOEPINT1 register to generate a dedicated interrupt OTG_HS_EP1_OUT for endpoint #1. The OUT endpoint interrupt for a specific status in the OTG_DOEPINT1 register can be masked by writing into the corresponding bit in this register. Status bits are masked by default.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.NYET
MSK
NAK
MSK
BERR
M
Res.Res.Res.OUT
PKT
ERRM
Res.B2B
STUPM
Res.OTEPM
M
STUPMAHB
ERRM
EPDMXFRC
M
rwrwrwrwrwrwrwrwrwrw

Bits 31:15 Reserved, must be kept at reset value.

Bit 14 NYETMSK : NYET interrupt mask

0: Masked interrupt
1: Unmasked interrupt

Bit 13 NAKMSK : NAK interrupt mask

0: Masked interrupt
1: Unmasked interrupt

Bit 12 BERRM : Babble error interrupt mask

0: Masked interrupt
1: Unmasked interrupt

Bits 11:10 Reserved, must be kept at reset value.

Bit 9 Reserved, must be kept at reset value.

Bit 8 OUTPKTERRM : Out packet error mask

0: Masked interrupt
1: Unmasked interrupt

Bit 7 Reserved, must be kept at reset value.

32.15.50 OTG device control IN endpoint 0 control register (OTG_DIEPCTL0)

Address offset: 0x900

Reset value: 0x0000 0000

This section describes the OTG_DIEPCTL0 register for USB_OTG FS. Nonzero control endpoints use registers for endpoints 1–3.

31302928272625242322212019181716
EPENAEPDISRes.Res.SNAKCNAKTXFNUM[3:0]STALLRes.EPTYP[1:0]NAK STSRes.
rsrswwrwrwrwrwrsrrr

1514131211109876543210
USBA EPRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MPSIZ[1:0]
rrwrw
Bit 31 EPPENA: Endpoint enable

The application sets this bit to start transmitting data on the endpoint 0.

The core clears this bit before setting any of the following interrupts on this endpoint:

Bit 30 EPDIS: Endpoint disable

The application sets this bit to stop transmitting data on an endpoint, even before the transfer for that endpoint is complete. The application must wait for the endpoint disabled interrupt before treating the endpoint as disabled. The core clears this bit before setting the endpoint disabled interrupt. The application must set this bit only if endpoint enable is already set for this endpoint.

Bits 29:28 Reserved, must be kept at reset value.

Bit 27 SNAK: Set NAK

A write to this bit sets the NAK bit for the endpoint.

Using this bit, the application can control the transmission of NAK handshakes on an endpoint. The core can also set this bit for an endpoint after a SETUP packet is received on that endpoint.

Bit 26 CNAK: Clear NAK

A write to this bit clears the NAK bit for the endpoint.

Bits 25:22 TXFNUM[3:0]: Tx FIFO number

This value is set to the FIFO number that is assigned to IN endpoint 0.

Bit 21 STALL: STALL handshake

The application can only set this bit, and the core clears it when a SETUP token is received for this endpoint. If a NAK bit, a Global IN NAK or Global OUT NAK is set along with this bit, the STALL bit takes priority.

Bit 20 Reserved, must be kept at reset value.

Bits 19:18 EPTYP[1:0]: Endpoint type

Hardcoded to '00' for control.

Bit 17 NAKSTS: NAK status

Indicates the following:

When this bit is set, either by the application or core, the core stops transmitting data, even if there are data available in the Tx FIFO. Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake.

Bit 16 Reserved, must be kept at reset value.

Bit 15 USBAEP : USB active endpoint

This bit is always set to 1, indicating that control endpoint 0 is always active in all configurations and interfaces.

Bits 14:2 Reserved, must be kept at reset value.

Bits 1:0 MPSIZ[1:0] : Maximum packet size

The application must program this field with the maximum packet size for the current logical endpoint.
00: 64 bytes
01: 32 bytes
10: 16 bytes
11: 8 bytes

Note: Configuration register applies only to USB OTG FS

32.15.51 OTG device IN endpoint x control register (OTG_DIEPCTLx)

Address offset: 0x900 + 0x20 * x, (x = 1 to 5[FS] / 0 to 8[HS])

Reset value: 0x0000 0000

The application uses this register to control the behavior of each logical endpoint other than endpoint 0.

31302928272625 24 23 22212019 181716
EPENAEPDISSODDFRMSD0PID/SEVNFRMSNAKCNAKTXFNUM[3:0]STALLRes.EPTYP[1:0]NAKSTSEO NUM/DPID
rsrswwwwrwrwrwrwrwrwrwrr
151413121110 9 8 7 6 5 4 3 2 1 0
USBAEPRes.Res.Res.Res.MPSIZ[10:0]
rwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 EPENA : Endpoint enable

The application sets this bit to start transmitting data on an endpoint.

The core clears this bit before setting any of the following interrupts on this endpoint:

Bit 30 EPDIS : Endpoint disable

The application sets this bit to stop transmitting/receiving data on an endpoint, even before the transfer for that endpoint is complete. The application must wait for the endpoint disabled interrupt before treating the endpoint as disabled. The core clears this bit before setting the endpoint disabled interrupt. The application must set this bit only if endpoint enable is already set for this endpoint.

Bit 29 SODDFRM : Set odd frame

Applies to isochronous IN and OUT endpoints only.

Writing to this field sets the Even/Odd frame (EONUM) field to odd frame.

Bit 28 SD0PID : Set DATA0 PID

Applies to interrupt/bulk IN endpoints only.

Writing to this field sets the endpoint data PID (DPID) field in this register to DATA0.

SEVNFRM : Set even frame

Applies to isochronous IN endpoints only.

Writing to this field sets the Even/Odd frame (EONUM) field to even frame.

Bit 27 SNAK : Set NAK

A write to this bit sets the NAK bit for the endpoint.

Using this bit, the application can control the transmission of NAK handshakes on an endpoint. The core can also set this bit for OUT endpoints on a transfer completed interrupt, or after a SETUP is received on the endpoint.

Bit 26 CNAK : Clear NAK

A write to this bit clears the NAK bit for the endpoint.

Bits 25:22 TXFNUM[3:0] : Tx FIFO number

These bits specify the FIFO number associated with this endpoint. Each active IN endpoint must be programmed to a separate FIFO number.

This field is valid only for IN endpoints.

Bit 21 STALL : STALL handshake

Applies to non-control, non-isochronous IN endpoints only (access type is rw).

The application sets this bit to stall all tokens from the USB host to this endpoint. If a NAK bit, Global IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority. Only the application can clear this bit, never the core.

Bit 20 Reserved, must be kept at reset value.

Bits 19:18 EPTYP[1:0] : Endpoint type

This is the transfer type supported by this logical endpoint.

00: Control

01: Isochronous

10: Bulk

11: Interrupt

Bit 17 NAKSTS : NAK status

It indicates the following:

0: The core is transmitting non-NAK handshakes based on the FIFO status.

1: The core is transmitting NAK handshakes on this endpoint.

When either the application or the core sets this bit:

For non-isochronous IN endpoints: The core stops transmitting any data on an IN endpoint, even if there are data available in the Tx FIFO.

For isochronous IN endpoints: The core sends out a zero-length data packet, even if there are data available in the Tx FIFO.

Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake.

Bit 16 EONUM : Even/odd frame

Applies to isochronous IN endpoints only.

Indicates the frame number in which the core transmits/receives isochronous data for this endpoint. The application must program the even/odd frame number in which it intends to transmit/receive isochronous data for this endpoint using the SEVNFRM and SODDFRM fields in this register.

0: Even frame

1: Odd frame

DPID : Endpoint data PID

Applies to interrupt/bulk IN endpoints only.

Contains the PID of the packet to be received or transmitted on this endpoint. The application must program the PID of the first packet to be received or transmitted on this endpoint, after the endpoint is activated. The application uses the SD0PID register field to program either DATA0 or DATA1 PID.

0: DATA0

1: DATA1

Bit 15 USBAEP : USB active endpoint

Indicates whether this endpoint is active in the current configuration and interface. The core clears this bit for all endpoints (other than EP 0) after detecting a USB reset. After receiving the SetConfiguration and SetInterface commands, the application must program endpoint registers accordingly and set this bit.

Bits 14:11 Reserved, must be kept at reset value.

Bits 10:0 MPSIZ[10:0] : Maximum packet size

The application must program this field with the maximum packet size for the current logical endpoint. This value is in bytes.

32.15.52 OTG device IN endpoint x interrupt register (OTG_DIEPINTx)

Address offset: 0x908 + 0x20 * x, (x = 0 to 5[FS] /8[HS])

Reset value: 0x0000 0080

This register indicates the status of an endpoint with respect to USB- and AHB-related events. It is shown in Figure 437 . The application must read this register when the IN endpoints interrupt bit of the core interrupt register (IEPINT in OTG_GINTSTS) is set. Before the application can read this register, it must first read the device all endpoints interrupt (OTG_DAININT) register to get the exact endpoint number for the device endpoint-x interrupt register. The application must clear the appropriate bit in this register to clear the corresponding bits in the OTG_DAININT and OTG_GINTSTS registers.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAKRes.PKTD
RPSTS
Res.Res.Res.TXFEIN
EPNE
IN
EPNM
ITTXFETOCRes.EP
DISD
XFRC
rc_w1rc_w1rrc_w1rc_w1rc_w1rc_w1rc_w1rc_w1

Note: Configuration register for USB OTG FS

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAKRes.PKTD
RPSTS
Res.Res.TXFIF
OUD
RN
TXFEIN
EPNE
IN
EPNM
ITTXFETOCAHB
ERR
EP
DISD
XFRC
rc_w1rc_w1rc_w1rrc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1

Note: Configuration register for USB OTG HS

Bits 31:14 Reserved, must be kept at reset value.

Bit 13 NAK : NAK input

The core generates this interrupt when a NAK is transmitted or received by the device. In case of isochronous IN endpoints the interrupt gets generated when a zero length packet is transmitted due to unavailability of data in the Tx FIFO.

Bit 12 Reserved, must be kept at reset value.

Bit 11 PKTDRPSTS : Packet dropped status

This bit indicates to the application that an ISOC OUT packet has been dropped. This bit does not have an associated mask bit and does not generate an interrupt.

Bit 10 Reserved, must be kept at reset value.

Bit 9 Reserved, must be kept at reset value.

Bit 8 TXFIFODRN : Transmit FIFO Underrun (TxfifoUndrn)

The core generates this interrupt when it detects a transmit FIFO underrun condition for this endpoint. Dependency: This interrupt is valid only when Thresholding is enabled

Bit 7 TXFE : Transmit FIFO empty

This interrupt is asserted when the Tx FIFO for this endpoint is either half or completely empty. The half or completely empty status is determined by the Tx FIFO Empty Level bit in the OTG_GAHBCFG register (TXFELVL bit in OTG_GAHBCFG).

Bit 6 INEPNE : IN endpoint NAK effective

This bit can be cleared when the application clears the IN endpoint NAK by writing to the CNAK bit in OTG_DIEPCTLx.

This interrupt indicates that the core has sampled the NAK bit set (either by the application or by the core). The interrupt indicates that the IN endpoint NAK bit set by the application has taken effect in the core.

This interrupt does not guarantee that a NAK handshake is sent on the USB. A STALL bit takes priority over a NAK bit.

Bit 5 INEPNM : IN token received with EP mismatch

Indicates that the data in the top of the non-periodic TxFIFO belongs to an endpoint other than the one for which the IN token was received. This interrupt is asserted on the endpoint for which the IN token was received.

Bit 4 ITTXFE : IN token received when Tx FIFO is empty

Indicates that an IN token was received when the associated Tx FIFO (periodic/non-periodic) was empty. This interrupt is asserted on the endpoint for which the IN token was received.

Bit 3 TOC : Timeout condition

Indicates that the core has detected a timeout condition on the USB for the last IN token on this endpoint.

Bit 2 AHBERR : AHB error for USB OTG HS

This is generated only in internal DMA mode when there is an AHB error during an AHB read/write. The application can read the corresponding endpoint DMA address register to get the error address.

Bit 1 EPDISD : Endpoint disabled interrupt

This bit indicates that the endpoint is disabled per the application's request.

Bit 0 XFRC : Transfer completed interrupt

This field indicates that the programmed transfer is complete on the AHB as well as on the USB, for this endpoint.

32.15.53 OTG device IN endpoint 0 transfer size register (OTG_DIEPTSIZ0)

Address offset: 0x910

Reset value: 0x0000 0000

The application must modify this register before enabling endpoint 0. Once endpoint 0 is enabled using the endpoint enable bit in the device control endpoint 0 control registers (EPENA in OTG_DIEPCTL0), the core modifies this register. The application can only read this register once the core has cleared the endpoint enable bit.

Nonzero endpoints use the registers for endpoints 1–3.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PKTCNT[1:0]Res.Res.Res.
rwrw
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.XFRSIZ[6:0]
rwrwrwrwrwrwrw

Bits 31:21 Reserved, must be kept at reset value.

Bits 20:19 PKTCNT[1:0] : Packet count

Indicates the total number of USB packets that constitute the transfer size amount of data for endpoint 0.

This field is decremented every time a packet (maximum size or short packet) is read from the Tx FIFO.

Bits 18:7 Reserved, must be kept at reset value.

Bits 6:0 XFRSIZ[6:0] : Transfer size

Indicates the transfer size in bytes for endpoint 0. The core interrupts the application only after it has exhausted the transfer size amount of data. The transfer size can be set to the maximum packet size of the endpoint, to be interrupted at the end of each packet.

The core decrements this field every time a packet from the external memory is written to the Tx FIFO.

32.15.54 OTG device IN endpoint x DMA address register (OTG_DIEPDMAX)

Address offset: \( 0x914 + 0x20 * x \) , ( \( x = 0 \) to \( 8 \) )

Reset value: \( 0x0000\ 0000 \)

Note: Configuration register applies only to USB OTG HS

31302928272625242322212019181716
DMAADDR[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
DMAADDR[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:0 DMAADDR[31:0] : DMA Address

This field holds the start address in the external memory from which the data for the endpoint must be fetched. This register is incremented on every AHB transaction.

32.15.55 OTG device IN endpoint transmit FIFO status register (OTG_DTXFSTSx)

Address offset: \( 0x918 + 0x20 * x \) , ( \( x = 0 \) to \( 5 \) [FS] / \( 8 \) [HS])

Reset value: \( 0x0000\ 0200 \)

This read-only register contains the free space information for the device IN endpoint Tx FIFO.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
INEPTFSAV[15:0]
rrrrrrrrrrrrrrrr

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 INEPTFSAV[15:0] : IN endpoint Tx FIFO space available

Indicates the amount of free space available in the endpoint Tx FIFO.

Values are in terms of 32-bit words:

0x0: Endpoint Tx FIFO is full

0x1: 1 word available

0x2: 2 words available

0xn: n words available

Others: Reserved

32.15.56 OTG device IN endpoint x transfer size register (OTG_DIEPTSIZx)

Address offset: 0x910 + 0x20 * x, (x = 1 to 5[FS] /8[HS])

Reset value: 0x0000 0000

The application must modify this register before enabling the endpoint. Once the endpoint is enabled using the endpoint enable bit in the OTG_DIEPCTLx registers (EPENA bit in OTG_DIEPCTLx), the core modifies this register. The application can only read this register once the core has cleared the endpoint enable bit.

31302928272625242322212019181716
Res.MCNT[1:0]PKTCNT[9:0]XFRSIZ[18:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
XFRSIZ[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 Reserved, must be kept at reset value.

Bits 30:29 MCNT[1:0] : Multi count

For periodic IN endpoints, this field indicates the number of packets that must be transmitted per frame on the USB. The core uses this field to calculate the data PID for isochronous IN endpoints.

Bits 28:19 PKTCNT[9:0] : Packet count

Indicates the total number of USB packets that constitute the transfer size amount of data for this endpoint.

This field is decremented every time a packet (maximum size or short packet) is read from the Tx FIFO.

Bits 18:0 XFRSIZ[18:0] : Transfer size

This field contains the transfer size in bytes for the current endpoint. The core only interrupts the application after it has exhausted the transfer size amount of data. The transfer size can be set to the maximum packet size of the endpoint, to be interrupted at the end of each packet.

The core decrements this field every time a packet from the external memory is written to the Tx FIFO.

32.15.57 OTG device control OUT endpoint 0 control register (OTG_DOEPCTL0)

Address offset: 0xB00

Reset value: 0x0000 8000

This section describes the OTG_DOEPCTL0 register. Nonzero control endpoints use registers for endpoints 1–3.

31302928272625242322212019181716
EPENAEPDISRes.Res.SNAKCNAKRes.Res.Res.Res.STALLSNPMEPTYP[1:0]NAK
STS
Res.
wrwwrsrwrrr
1514131211109876543210
USBA
EP
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MPSIZ[1:0]
rrr

Bit 31 EPENA : Endpoint enable

The application sets this bit to start transmitting data on endpoint 0.

The core clears this bit before setting any of the following interrupts on this endpoint:

Bit 30 EPDIS : Endpoint disable

The application cannot disable control OUT endpoint 0.

Bits 29:28 Reserved, must be kept at reset value.

Bit 27 SNAK : Set NAK

A write to this bit sets the NAK bit for the endpoint.

Using this bit, the application can control the transmission of NAK handshakes on an endpoint. The core can also set this bit on a transfer completed interrupt, or after a SETUP is received on the endpoint.

Bit 26 CNAK : Clear NAK

A write to this bit clears the NAK bit for the endpoint.

Bits 25:22 Reserved, must be kept at reset value.

Bit 21 STALL : STALL handshake

The application can only set this bit, and the core clears it, when a SETUP token is received for this endpoint. If a NAK bit or Global OUT NAK is set along with this bit, the STALL bit takes priority. Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake.

Bit 20 SNPM : Snoop mode

This bit configures the endpoint to Snoop mode. In Snoop mode, the core does not check the correctness of OUT packets before transferring them to application memory.

Bits 19:18 EPTYP[1:0] : Endpoint type

Hardcoded to 2'b00 for control.

Bit 17 NAKSTS : NAK status

Indicates the following:

0: The core is transmitting non-NAK handshakes based on the FIFO status.

1: The core is transmitting NAK handshakes on this endpoint.

When either the application or the core sets this bit, the core stops receiving data, even if there is space in the Rx FIFO to accommodate the incoming packet. Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake.

Bit 16 Reserved, must be kept at reset value.

Bit 15 USBAEP : USB active endpoint

This bit is always set to 1, indicating that a control endpoint 0 is always active in all configurations and interfaces.

Bits 14:2 Reserved, must be kept at reset value.

Bits 1:0 MPSIZ[1:0] : Maximum packet size

The maximum packet size for control OUT endpoint 0 is the same as what is programmed in control IN endpoint 0.

00: 64 bytes

01: 32 bytes

10: 16 bytes

11: 8 bytes

32.15.58 OTG device OUT endpoint x interrupt register (OTG_DOEPINTx)

Address offset: 0xB08 + 0x20 * x, (x = 0 to 5[FS] /8[HS])

Reset value: 0x0000 0080

This register indicates the status of an endpoint with respect to USB- and AHB-related events. It is shown in Figure 437 . The application must read this register when the OUT endpoints interrupt bit of the OTG_GINTSTS register (OEPINT bit in OTG_GINTSTS) is set. Before the application can read this register, it must first read the OTG_DAINT register to get the exact endpoint number for the OTG_DOEPINTx register. The application must clear the appropriate bit in this register to clear the corresponding bits in the OTG_DAINT and OTG_GINTSTS registers.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.NAKBERRRes.Res.Res.Res.Res.Res.STSPH
SRX
OTEP
DIS
STUPRes.EP
DISD
XFRC
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1

Note: Configuration register for USB OTG FS.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
STPK
TRX
NYETNAKBERRRes.Res.Res.OUT
PKT
ERR
Res.B2B
STUP
STSPH
SRX
OTEP
DIS
STUPAHB
ERR
EP
DISD
XFRC
rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1rc_w1

Note: Configuration register for USB OTG HS.

Bits 31:16 Reserved, must be kept at reset value.

Bit 15 STPKTRX : Setup packet received for USB OTG HS

Applicable for control OUT endpoints in only in the Buffer DMA Mode. Set by the OTG_HS, this bit indicates that this buffer holds 8 bytes of setup data. There is only one setup packet per buffer. On receiving a setup packet, the OTG_HS closes the buffer and disables the corresponding endpoint after SETUP_COMPLETE status is seen in the Rx FIFO. OTG_HS puts a SETUP_COMPLETE status into the Rx FIFO when it sees the first IN or OUT token after the SETUP packet for that particular endpoint. The application must then re-enable the endpoint to receive any OUT data for the control transfer and reprogram the buffer start address. Because of the above behavior, OTG_HS can receive any number of back to back setup packets and one buffer for every setup packet is used.

Bit 14 NYET : NYET interrupt for USB OTG HS

This interrupt is generated when a NYET response is transmitted for a non isochronous OUT endpoint.

Bit 13 NAK : NAK input

The core generates this interrupt when a NAK is transmitted or received by the device. In case of isochronous IN endpoints the interrupt gets generated when a zero length packet is transmitted due to unavailability of data in the Tx FIFO.

Bit 12 BERR : Babble error interrupt

The core generates this interrupt when babble is received for the endpoint.

Bits 11:10 Reserved, must be kept at reset value.

Bit 9 Reserved, must be kept at reset value.

Bit 8 OUTPKTERR : OUT packet error for USB OTG HS

This interrupt is asserted when the core detects an overflow or a CRC error for an OUT packet. This interrupt is valid only when thresholding is enabled.

Bit 7 Reserved, must be kept at reset value.

Bit 6 B2BSTUP : Back-to-back SETUP packets received for USB OTG HS

Applies to control OUT endpoint only.

This bit indicates that the core has received more than three back-to-back SETUP packets for this particular endpoint.

Bit 5 STSPHSRX : Status phase received for control write

This interrupt is valid only for control OUT endpoints. This interrupt is generated only after OTG_FS/OTG_HS has transferred all the data that the host has sent during the data phase of a control write transfer, to the system memory buffer. The interrupt indicates to the application that the host has switched from data phase to the status phase of a control write transfer. The application can use this interrupt to ACK or STALL the status phase, after it has decoded the data phase.

Bit 4 OTEPDIS : OUT token received when endpoint disabled

Applies only to control OUT endpoints.

Indicates that an OUT token was received when the endpoint was not yet enabled. This interrupt is asserted on the endpoint for which the OUT token was received.

Bit 3 STUP : SETUP phase done

Applies to control OUT endpoint only. Indicates that the SETUP phase for the control endpoint is complete and no more back-to-back SETUP packets were received for the current control transfer. On this interrupt, the application can decode the received SETUP data packet.

Bit 2 AHBERR : AHB error for USB OTG HS

This is generated only in internal DMA mode when there is an AHB error during an AHB read/write. The application can read the corresponding endpoint DMA address register to get the error address.

Bit 1 EPDISD : Endpoint disabled interrupt

This bit indicates that the endpoint is disabled per the application's request.

Bit 0 XFRC : Transfer completed interrupt

This field indicates that the programmed transfer is complete on the AHB as well as on the USB, for this endpoint.

32.15.59 OTG device OUT endpoint 0 transfer size register (OTG_DOEPTSIZ0)

Address offset: 0xB10

Reset value: 0x0000 0000

The application must modify this register before enabling endpoint 0. Once endpoint 0 is enabled using the endpoint enable bit in the OTG_DOEPCTL0 registers (EPENA bit in OTG_DOEPCTL0), the core modifies this register. The application can only read this register once the core has cleared the endpoint enable bit.

Nonzero endpoints use the registers for endpoints 1–5[FS] /8[HS].

31302928272625242322212019181716
Res.STUPCNT[1:0]Res.Res.Res.Res.Res.Res.Res.Res.Res.PKTCNTRes.Res.Res.
rwrwrw
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.Res.XFRSIZ[6:0]
rwrwrwrwrwrwrw

Bit 31 Reserved, must be kept at reset value.

Bits 30:29 STUPCNT[1:0] : SETUP packet count

This field specifies the number of back-to-back SETUP data packets the endpoint can receive.

01: 1 packet

10: 2 packets

11: 3 packets

Bits 28:20 Reserved, must be kept at reset value.

Bit 19 PKTCNT : Packet count

This field is decremented to zero after a packet is written into the Rx FIFO.

Bits 18:7 Reserved, must be kept at reset value.

Bits 6:0 XFRSIZ[6:0] : Transfer size

Indicates the transfer size in bytes for endpoint 0. The core interrupts the application only after it has exhausted the transfer size amount of data. The transfer size can be set to the maximum packet size of the endpoint, to be interrupted at the end of each packet.

The core decrements this field every time a packet is read from the Rx FIFO and written to the external memory.

32.15.60 OTG device OUT endpoint x DMA address register (OTG_DOEPDMAx)

Address offset: 0xB14 + 0x20 * x, (x = 0 to 8)

Reset value: 0x0000 0000

Note: Configuration register applies only to USB OTG HS

31302928272625242322212019181716
DMAADDR[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
DMAADDR[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:0 DMAADDR[31:0] : DMA Address

This field holds the start address in the external memory from which the data for the endpoint must be fetched. This register is incremented on every AHB transaction.

32.15.61 OTG device OUT endpoint x control register (OTG_DOEPCTLx)

Address offset: 0xB00 + 0x20 * x, (x = 1 to 5[FS] /8[HS])

Reset value: 0x0000 0000

The application uses this register to control the behavior of each logical endpoint other than endpoint 0.

31302928272625242322212019181716
EPENAEPDISSD1
PID/
SODD
FRM
SD0
PID/
SEVN
FRM
SNAKCNAKRes.Res.Res.Res.STALLSNPMEPTYP[1:0]NAK
STS
EO
NUM/
DPID
rsrswwwwrwrwrwrwrr

1514131211109876543210
USBA
EP
Res.Res.Res.Res.MPSIZ[10:0]
rwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 EPENA: Endpoint enable

Applies to IN and OUT endpoints.

The application sets this bit to start transmitting data on an endpoint.

The core clears this bit before setting any of the following interrupts on this endpoint:

Bit 30 EPDIS: Endpoint disable

The application sets this bit to stop transmitting/receiving data on an endpoint, even before the transfer for that endpoint is complete. The application must wait for the endpoint disabled interrupt before treating the endpoint as disabled. The core clears this bit before setting the endpoint disabled interrupt. The application must set this bit only if endpoint enable is already set for this endpoint.

Bit 29 SD1PID: Set DATA1 PID

Applies to interrupt/bulk IN and OUT endpoints only. Writing to this field sets the endpoint data PID (DPID) field in this register to DATA1.

SODDFRM: Set odd frame

Applies to isochronous IN and OUT endpoints only. Writing to this field sets the Even/Odd frame (EONUM) field to odd frame.

Bit 28 SD0PID: Set DATA0 PID

Applies to interrupt/bulk OUT endpoints only.

Writing to this field sets the endpoint data PID (DPID) field in this register to DATA0.

SEVNFRM: Set even frame

Applies to isochronous OUT endpoints only.

Writing to this field sets the Even/Odd frame (EONUM) field to even frame.

Bit 27 SNAK: Set NAK

A write to this bit sets the NAK bit for the endpoint.

Using this bit, the application can control the transmission of NAK handshakes on an endpoint. The core can also set this bit for OUT endpoints on a transfer completed interrupt, or after a SETUP is received on the endpoint.

Bit 26 CNAK : Clear NAK

A write to this bit clears the NAK bit for the endpoint.

Bits 25:22 Reserved, must be kept at reset value.

Bit 21 STALL : STALL handshake

Applies to non-control, non-isochronous OUT endpoints only (access type is rw).

The application sets this bit to stall all tokens from the USB host to this endpoint. If a NAK bit, Global IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority. Only the application can clear this bit, never the core.

Applies to control endpoints only (access type is rs).

The application can only set this bit, and the core clears it, when a SETUP token is received for this endpoint. If a NAK bit, Global IN NAK, or Global OUT NAK is set along with this bit, the STALL bit takes priority. Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake.

Bit 20 SNPM : Snoop mode

This bit configures the endpoint to Snoop mode. In Snoop mode, the core does not check the correctness of OUT packets before transferring them to application memory.

Bits 19:18 EPTYP[1:0] : Endpoint type

This is the transfer type supported by this logical endpoint.

00: Control

01: Isochronous

10: Bulk

11: Interrupt

Bit 17 NAKSTS : NAK status

Indicates the following:

0: The core is transmitting non-NAK handshakes based on the FIFO status.

1: The core is transmitting NAK handshakes on this endpoint.

When either the application or the core sets this bit:

The core stops receiving any data on an OUT endpoint, even if there is space in the Rx FIFO to accommodate the incoming packet.

Irrespective of this bit's setting, the core always responds to SETUP data packets with an ACK handshake.

Bit 16 EONUM : Even/odd frame

Applies to isochronous IN and OUT endpoints only.

Indicates the frame number in which the core transmits/receives isochronous data for this endpoint. The application must program the even/odd frame number in which it intends to transmit/receive isochronous data for this endpoint using the SEVNFRM and SODDFRM fields in this register.

0: Even frame

1: Odd frame

DPID : Endpoint data PID

Applies to interrupt/bulk OUT endpoints only.

Contains the PID of the packet to be received or transmitted on this endpoint. The application must program the PID of the first packet to be received or transmitted on this endpoint, after the endpoint is activated. The application uses the SD0PID register field to program either DATA0 or DATA1 PID.

0: DATA0

1: DATA1

Bit 15 USBAEP : USB active endpoint

Indicates whether this endpoint is active in the current configuration and interface. The core clears this bit for all endpoints (other than EP 0) after detecting a USB reset. After receiving the SetConfiguration and SetInterface commands, the application must program endpoint registers accordingly and set this bit.

Bits 14:11 Reserved, must be kept at reset value.

Bits 10:0 MPSIZ[10:0] : Maximum packet size

The application must program this field with the maximum packet size for the current logical endpoint. This value is in bytes.

32.15.62 OTG device OUT endpoint x transfer size register (OTG_DOEPTSIZx)

Address offset: 0xB10 + 0x20 * x, (x = 1 to 5[FS] /8[HS])

Reset value: 0x0000 0000

The application must modify this register before enabling the endpoint. Once the endpoint is enabled using endpoint enable bit of the OTG_DOEPCTLx registers (EPENA bit in OTG_DOEPCTLx), the core modifies this register. The application can only read this register once the core has cleared the endpoint enable bit.

31302928272625242322212019181716
Res.RXDPID/
STUPCNT[1:0]
PKTCNT[9:0]XFRSIZ[18:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
XFRSIZ[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 Reserved, must be kept at reset value.

Bits 30:29 RXDPID[1:0] : Received data PID

Applies to isochronous OUT endpoints only.

This is the data PID received in the last packet for this endpoint.

00: DATA0

01: DATA2

10: DATA1

11: MDATA

STUPCNT[1:0] : SETUP packet count

Applies to control OUT endpoints only.

This field specifies the number of back-to-back SETUP data packets the endpoint can receive.

01: 1 packet

10: 2 packets

11: 3 packets

Bits 28:19 PKTCNT[9:0] : Packet count

Indicates the total number of USB packets that constitute the transfer size amount of data for this endpoint.

This field is decremented every time a packet (maximum size or short packet) is written to the Rx FIFO.

Bits 18:0 XFRSIZ[18:0] : Transfer size

This field contains the transfer size in bytes for the current endpoint. The core only interrupts the application after it has exhausted the transfer size amount of data. The transfer size can be set to the maximum packet size of the endpoint, to be interrupted at the end of each packet.

The core decrements this field every time a packet is read from the Rx FIFO and written to the external memory.

32.15.63 OTG power and clock gating control register (OTG_PCGCTL)

Address offset: 0xE00

Reset value: 0x200B 8000

This register is available in host and device modes.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.Res.Res.Res.Res.Res.Res.Res.SUSPPHY SLEEPENL1 GTGPHY SUSPRes.Res.GATE HCLKSTPP CLK
rrrwrrwrw

Bits 31:8 Reserved, must be kept at reset value.

Bit 7 SUSP : Deep Sleep

This bit indicates that the PHY is in Deep Sleep when in L1 state.

Bit 6 PHYSLEEP : PHY in Sleep

This bit indicates that the PHY is in the Sleep state.

Bit 5 ENL1GTG : Enable sleep clock gating

When this bit is set, core internal clock gating is enabled in Sleep state if the core cannot assert utmi_l1_suspend_n. When this bit is not set, the PHY clock is not gated in Sleep state.

Bit 4 PHYSUSP : PHY suspended

Indicates that the PHY has been suspended. This bit is updated once the PHY is suspended after the application has set the STPPCLK bit.

Bits 3:2 Reserved, must be kept at reset value.

Bit 1 GATEHCLK : Gate HCLK

The application sets this bit to gate HCLK to modules other than the AHB Slave and Master and wake-up logic when the USB is suspended or the session is not valid. The application clears this bit when the USB is resumed or a new session starts.

Bit 0 STPPCLK : Stop PHY clock

The application sets this bit to stop the PHY clock when the USB is suspended, the session is not valid, or the device is disconnected. The application clears this bit when the USB is resumed or a new session starts.

32.15.64 OTG_FS/OTG_HS register map

The table below gives the USB OTG register map and reset values.

Table 238. OTG_FS/OTG_HS register map and reset values

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x000OTG_GOTGCTLRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.CURMODOTGVERBSVLDASVLDDBCTCIDSTSRes.Res.Res.Res.EHENDHNPENHSHNPENHNPRQHNGSCSBVALOVALBVALOENAVALOVALAVALOENVBVALOVALVBVALOENSRQSRQSCS
Reset value0000010000000000000
0x004OTG_GOTGINTRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DBCDDNEADTOCHGHNGDETRes.Res.Res.Res.Res.Res.Res.Res.HNSSCHGSRSSCHGRes.Res.Res.Res.Res.SEDETRes.Res.
Reset value000000
0x008OTG_GAHBCFGRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PTXFELVLTXFELVLRes.Res.Res.Res.Res.Res.Res.GINTMSK
Reset value000
0x008OTG_GAHBCFGRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PTXFELVLTXFELVLRes.DMAENHBSTLENGINTMSK
Reset value00000000
0x00COTG_GUSBCFGRes.FDMODFHMODRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.TRDTHNP CAPSRP CAPRes.PHYSELRes.Res.Res.TOTAL
Reset value000101001000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
Res.FDMODFHMODRes.Res.Res.ULPIPDPTCIPCCITSDPSULPIEVBUSIULPIEVBUSDULPICSMULPIARULPIFSLRes.PHYLPCRes.TRDTHNP CAPSRP CAPRes.PHYS ELRes.ULPISELRes.TOCAL
0x00COTG_GUSBCFGRes.00000000000001011010000
0x010OTG_GRSTCTLAHBIDLRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.TXFNUMTXFFLSHRes.Res.FORSTPSRSTCSRST
Reset value10000
0x010OTG_GRSTCTLAHBIDLDMAREQRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.TXFNUMTXFFLSHRes.Res.FORSTPSRSTCSRST
Reset value100000
0x014OTG_GINTSTSWKUPINTSRQINTDISINTCIDSCHGLPMINTPTXFEHCINTHPRTINTRSTDETRes.IPXFR/INCOMPISOOUTIISOXFROEPINTIEPINTRes.Res.EOPFISOODRPENUMDNEUSBRSTUSBUSUSPESUSPRes.Res.GONAKEFFGINAKEFFNPTXFERXFLVLSOFOTGINTMMISCMOD
Reset value000001000000000000000100000
0x014OTG_GINTSTSWKUPINTSRQINTDISINTCIDSCHGLPMINTPTXFEHCINTHPRTINTRSTDETDATAFSUSPIPXFR/INCOMPISOOUTIISOXFROEPINTIEPINTRes.Res.EOPFISOODRPENUMDNEUSBRSTUSBUSUSPESUSPRes.Res.GONAKEFFGINAKEFFNPTXFERXFLVLSOFOTGINTMMISCMOD
Reset value0000010000000000000000100000
0x018OTG_GINTMSKWUIMSRQIMDISINTCIDSCHGLPMINTMPTXFEMHCIMPRTIMRSTDETMRes.IPXFR/ISOOXFRMIISOXFRMOEPINTIEPINTRes.Res.EOPFMISOODRPMENUMDNEMUSBRSTUSBUSUSPMESUSPMRes.Res.GONAKEFFMGINAKEFFMNPTXFEMRXFLVLMSOFMOTGINTMMISMRes.
Reset value00000000000000000000000000
0x018OTG_GINTMSKWUIMSRQIMDISINTCIDSCHGLPMINTMPTXFEMHCIMPRTIMRSTDETMFSUSPMIPXFR/ISOOXFRMIISOXFRMOEPINTIEPINTRes.Res.EOPFMISOODRPMENUMDNEMUSBRSTUSBUSUSPMESUSPMRes.Res.GONAKEFFMGINAKEFFMNPTXFEMRXFLVLMSOFMOTGINTMMISMRes.
Reset value000000000000000000000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x01COTG_GRXSTSR
(Device mode)
Res.Res.Res.Res.STSPHSTRes.Res.FRMNUMPKTSTSDPIDBCNTEPNUM
Reset value00000000000000000000000000
OTG_GRXSTSR
(Host mode)
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PKTSTSDPIDBCNTCHNUM
Reset value000000000000000000000
0x020OTG_GRXSTSP
(Device mode)
Res.Res.Res.Res.STSPHSTRes.Res.FRMNUMPKTSTSDPIDBCNTEPNUM
Reset value00000000000000000000000000
OTG_GRXSTSP
(Host mode)
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PKTSTSDPIDBCNTCHNUM
Reset value000000000000000000000
0x024OTG_GRXFSIZRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.RXFD
Reset value0000001000000000
0x028OTG_HNPTXFSIZ/
OTG_DIEPTXF0
NPTXFD/TX0FDNPTXFSA/TX0FSA
Reset value00000010000000000000001000000000
0x02COTG_HNPTXSTSRes.NPTXQTOPNPTQXSAVNPTXFSAV
Reset value0000000000010000000001000000000
0x038OTG_GCCFGRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.VBDENSDENPDENDCDENBCDENPWRDWNRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PS2DETSDDETPDETDCDET
Reset value000000XXXX
0x03COTG_CIDPRODUCT_ID (for USB OTG FS)
Reset value00000000000000000011000000000000
0x03COTG_CIDPRODUCT_ID (for USB OTG HS)
Reset value00000000000000000011000100000000
0x054OTG_GLPMCFGRes.Res.Res.ENBESLLPMR CNTSTSSNDLPMLPM RCNTLPMCHIDXL1RSMOKSLPSTSLPM RSPL1DSENBESLTHRSL1SSENREMWAKEBESLLPMACKLPMEN
Reset value00000000000000000000000000000
0x100OTG_HPTXFSIZPTXFSIZPTXSA
Reset value00000010000000000000100000000000
0x100OTG_HPTXFSIZPTXFSIZPTXSA
Reset value00000100000000000000100000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x104OTG_DIEPTXF1INEPTXFDINEPTXSA
Reset value00000010000000000000010000000000
0x108OTG_DIEPTXF2INEPTXFDINEPTXSA
Reset value00000010000000000000011000000000
....
....
0x114OTG_DIEPTXF5INEPTXFDINEPTXSA
Reset value00000010000000000000011000000000
....
....
0x120OTG_DIEPTXF7INEPTXFDINEPTXSA
Reset value00000010000000000000011000000000
0x400OTG_HCFGRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.FSLSSFSLSPCS
Reset value000
0x404OTG_HFIRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.RLDCTRLFRIVL
Reset value011101010011000000
0x408OTG_HFNUMFTREMFRNUM
Reset value00000000000000000011111111111111
0x410OTG_HPTXSTSPTXQTOPPTXQSAVPTXFSAVL
Reset value00000000000001000000010000000000
0x414OTG_HAINTRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.HAINT
Reset value0000000000000000
0x418OTG_HAINTMSKRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.HAINTM
Reset value0000000000000000
0x440OTG_HPRTRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PSPDPTCTLPPWRPLSTSRes.PRSTPSUSPPRESPOCCHNGPOCAPENCHNGPENAPCDETPCSTS
Reset value0000000000000000
0x500OTG_HCCHAR0CHENACHDISODDFRMDADMCNTEPTYPLSDEVRes.EPDIREPNUMMPSIZ
Reset value00000000000000000000000000000000
Table 238. OTG_FS/OTG_HS register map and reset values (continued)
OffsetRegister name313029282726252423222120191817161514131211109876543210
0x504OTG_HCSPLT0SPLITENRes.COMPLSPLTXACTPOSHUBADDRPRTADDR
Reset value000000000000000000
0x508OTG_HCINT0Res.DTERRFRMORBBERRTXERRRes.ACKNAKSTALLRes.CHHXFRC
Reset value000000000
0x508OTG_HCINT0Res.DTERRFRMORBBERRTXERRNYETACKNAKSTALLAHBERRCHHXFRC
Reset value00000000000
0x50COTG_HCINTMSK0Res.DTERRMFRMORMBBERRMTXERRMNYETACKMNAKMSTALLMRes.CHHMXFRCM
Reset value0000000000
0x510OTG_HCTSIZ0DOPNGDPIDPKTCNTXFRSIZ
Reset value00000000000000000000000000000000
0x514OTG_HCDMA0DMAADDR
Reset value00000000000000000000000000000000
0x520OTG_HCCHAR1CHENACHDISODDFRMDADMCNTEPTYPLSDEVRes.EPDIREPNUMMPSIZ
Reset value0000000000000000000000000000000
0x524OTG_HCSPLT1SPLITENRes.COMPLSPLTXACTPOSHUBADDRPRTADDR
Reset value000000000000000000
0x528OTG_HCINT1Res.DTERRFRMORBBERRTXERRRes.ACKNAKSTALLRes.CHHXFRC
Reset value000000000
0x528OTG_HCINT1Res.DTERRFRMORBBERRTXERRNYETACKNAKSTALLAHBERRCHHXFRC
Reset value00000000000
0x52COTG_HCINTMSK1Res.DTERRMFRMORMBBERRMTXERRMNYETACKMNAKMSTALLMRes.CHHMXFRCM
Reset value0000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x530OTG_HCTSIZ1DOPNGDPIDPKTCNTXFRSIZ
Reset value00000000000000000000000000000000
0x534OTG_HCDMA1DMAADDR
Reset value00000000000000000000000000000000
...
0x660OTG_HCCHAR11CHENACHDISODDFRMDADMCNTEPTYPLSDEVRes.EPDIREPNUMMPSIZ
Reset value00000000000000-00000000000000000
0x664OTG_HCCSPLT11SPLITENRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.COMPLSPLITXACTPOSHUBADDRPRTADDR
Reset value000000000000000000
0x668OTG_HCINT11Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DTERRFRMORBBERRTXERRRes.ACKNAKSTALLRes.CHHXFRC
Reset value000000000
0x66COTG_HCINTMSK11Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DTERRMFRMORMBBERRMTXERRMNYETACKMNAKMSTALLMRes.CHHMXFRCM
Reset value0000000000
0x670OTG_HCTSIZ11DOPNGDPIDPKTCNTXFRSIZ
Reset value00000000000000000000000000000000
0x674OTG_HCDMA11DMAADDR
Reset value00000000000000000000000000000000
...
0x6E0OTG_HCCHAR15CHENACHDISODDFRMDADMCNTEPTYPLSDEVRes.EPDIREPNUMMPSIZ
Reset value00000000000000-00000000000000000
0x6E4OTG_HCSPLT15SPLITENRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.COMPLSPLITXACTPOSHUBADDRPRTADDR
Reset value000000000000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x6E8OTG_HCINT15Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DTERRFRMORBBERRTXERRRes.ACKNAKSTALLRes.CHHXFRC
Reset value000000000
0x6ECOTG_HCINTMSK15Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DTERRMFRMORMBBERRMTXERRMNYETACKMNAKMSTALLMRes.CHHMXFRM
Reset value0000000000
0x6F0OTG_HCTSIZ15DOPNGDPIDPKTCNTXFRSIZ
Reset value00000000000000000000000000000000
0x6F4OTG_HCDMA15DMAADDR
Reset value00000000000000000000000000000000
0x800OTG_DCFGRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.ERRATIMXOVRDLYRes.PFIVLDADRes.NZLSOHSKDSPD
Reset value00000000000000
0x800OTG_DCFGRes.Res.Res.Res.Res.Res.PERS
CHI
VL
Res.Res.Res.Res.Res.Res.Res.Res.Res.ERRATIMXOVRDLYRes.PFIVLDADRes.NZLSOHSKDSPD
Reset value0000000000000000
0x804OTG_DCTLRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DSBESLURJCTRes.Res.Res.Res.Res.POPRGDNEGGONAKSGONAKCGINAKSGINAKTCTLGONSTSGINSTSSDISRWUSIG
Reset value000000000010
0x808OTG_DSTSRes.Res.Res.Res.Res.Res.Res.DEV
LN
STS
FNSOFRes.Res.Res.Res.EERRENUMSPDSUSPSTS
Reset value0000000000000000000
0x810OTG_DIEPMSKRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NAKRes.Res.Res.Res.TXFURMRes.INEPNEMINEPNMMITTXFEMSKTOMAHBERRMEPDMXFROM
Reset value000000000
0x814OTG_DOEPMSKRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NYETMSKNAKMSKBERRMRes.Res.Res.OUTPKTERRMRes.B2BSTUPMRes.OTEPDMSTUPMAHBERRMEPDMXFROM
Reset value0000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x818OTG_DAINTOEPINTIEPINT
Reset value00000000000000000000000000000000
0x81COTG_DAINTMSKOEPMIEPM
Reset value00000000000000000000000000000000
0x828OTG_DVBUSDISRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.VBUSDT
Reset value0001011111010111
0x82COTG_DVBUSPULSERes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.DVBUSP
Reset value0000010110111000
0x830OTG_DTHRCTLRes.Res.Res.Res.ARPENRes.RXTHRLENRXTHRENRes.Res.Res.Res.TXTHRLENISOTHRENNONISOTHREN
Reset value00000000000000
0x834OTG_DIEPEMPMSKRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.INEPTXFEM
Reset value0000000000000000
0x838OTG_DEACHINTRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.OEP1INTRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.IEP1INTRes.
Reset value00
0x83COTG_DEACHINTMSKRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.OEP1INTMRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.IEP1INTMRes.
Reset value00
0x844OTG_HS_DIEPEACHMSK1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NAKMSKRes.Res.Res.Res.TXFURMRes.INEPNEMRes.ITTXFEMSKTOMAHBERRMEPDMXFRCM
Reset value00000000
0x884OTG_HS_DOEPEACHMSK1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NYETMSKNAKMSKBERRMRes.Res.Res.OUTPKTERRMRes.B2BSTUPMRes.OTEPDMSTUPMAHBERRMEPDMXFRCM
Reset value0000000000
0x900OTG_DIEPCTL0EPENAEPDISRes.Res.SNAKCNAKTXFNUMSTALLRes.EPTYPNAKSTSRes.USBAEPRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MPSIZ
Reset value000000000000100

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x900OTG_DIEPCTL0EPENAEPDISSODDFRM/SD1PIDSD0PID/SEVNFRMSNAKCNAKTXFNUMSTALLRes.EPTYPNAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.MPSIZ
Reset value0000000000000000000000000000
0x908OTG_DIEPINT0Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NAKRes.PKTDRPSTSRes.Res.TXFIFOUDRNTXFEINEPNEINEPNMITTXFETOCAHBERREPDISDXFRC
Reset value00010000000
0x910OTG_DIEPTSIZ0Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PKT
CNT
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.XFRSIZ
Reset value000000000
0x914OTG_DIEPDMADMAADDR
Reset value00000000000000000000000000000000
0x918OTG_DTXFSTS0Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.INEPTFSAV
Reset value000000100000000
0x920OTG_DIEPCTL1EPENAEPDISSODDFRM/SD1PIDSD0PID/SEVNFRMSNAKCNAKTXFNUMSTALLRes.EPTYPNAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.MPSIZ
Reset value0000000000000000000000000000
0x928OTG_DIEPINT1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NAKRes.PKTDRPSTSRes.Res.TXFIFOUDRNTXFEINEPNEINEPNMITTXFETOCAHBERREPDISDXFRC
Reset value00010000000
0x930OTG_DIEPTSIZ1Res.MCN
T
PKTCNTXFRSIZ
Reset value000000000000000000000000000000
0x938OTG_DTXFSTS1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.INEPTFSAV
Reset value000000100000000
0x940OTG_DIEPCTL2EPENAEPDISSODDFRMSD0PID/SEVNFRMSNAKCNAKTXFNUMSTALLRes.EPTYPNAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.MPSIZ
Reset value0000000000000000000000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
..................................
0x9A0OTG_DIEPCTL5EPENAEPDISSODDFRMSDOPID/SEVNFRMSNAKCNAKTXFNUMSTALLRes.EPTYPNAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.Res.Res.Res.Res.Res.MPSIZ
Reset value00000000000000000000000000000000
..................................
0x9A8OTG_DIEPINT5Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NAKRes.PKTDRPSTSRes.Res.TXFIFOUDRNTXFEINEPNEINEPNMITT XFETOCAHBERREPDISDXFRC
Reset value00010000000
..................................
0x9B8OTG_DTXFSTS5Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Reset value
..................................
0x9E0OTG_DIEPCTL7EPENAEPDISSODDFRMSDOPID/SEVNFRMSNAKCNAKTXFNUMSTALLRes.EPTYPNAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.Res.Res.Res.Res.Res.MPSIZ
Reset value00000000000000000000000000000000
..................................
0x9B0OTG_DIEPTSIZ5Res.MCNTPKTCNT
Reset value0000000000000000000000000000000
0x9E8OTG_DIEPINT7Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.NAKRes.PKTDRPSTSRes.Res.TXFIFOUDRNTXFEINEPNEINEPNMITT XFETOCAHBERREPDISDXFRC
Reset value00010000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
...
...
0x9F0OTG_DIEPTSIZ7Res.MCNTPKTCNTXFRSIZ
Reset value0000000000000000000000000000000
...
...
0x9F8OTG_DTXFSTS7Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.INEPTFSAV
Reset value0000001000000000
0xB00OTG_DOEPCTL0EPENAEPDISRes.Res.SNAKCNAKRes.Res.Res.STALLSNPMRes.EPTYPRes.NAKSTSRes.USBAEPRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MPSIZ
Reset value00000000100
0xB08OTG_DOEPINT0Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.STPKTRXNYETNAKBERRRes.Res.Res.Res.Res.OUTPKTERRRes.B2BSTUPSTSPHSRXOTEPDISSTUPAHBERREPDISDXFRC
Reset value000000000000
0xB10OTG_DOEPTSIZ0Res.STUPCNTRes.Res.Res.Res.Res.Res.Res.Res.Res.PKTCNTRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.XFRSIZ
Reset value0000000000
0xB14OTG_DOEPDMA0DMAADDR
Reset value00000000000000000000000000000000
0xB20OTG_DOEPCTL1EPENAEPDISSODDFRMSD0PID/SEVNFRMSNAKCNAKRes.Res.Res.STALLSNPMEP TYPNAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.Res.Res.MPSIZ
Reset value0000000000000000000000
0xB28OTG_DOEPINT1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.STPKTRXNYETNAKBERRRes.Res.Res.Res.OUTPKTERRRes.B2BSTUPSTSPHSRXOTEPDISSTUPAHBERREPDISDXFRC
Reset value0000000000000
0xB30OTG_DOEPTSIZ1Res.RXDPID/STUPCNTPKTCNTXFRSIZ
Reset value000000000000000000000000000000
Table 238. OTG_FS/OTG_HS register map and reset values (continued)
OffsetRegister name313029282726252423222120191817161514131211109876543210
0xB34OTG_DOEPDMA1DMAADDR
Reset value00000000000000000000000000000000
..
..
..
0xBA0OTG_DOEPCTL5EPENAEPDISSODDFRMSDOPID/SEVNFRMSNAKCNAKRes.Res.Res.Res.Res.STALLSNPMRes.EPTYPRes.NAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.Res.Res.MPSIZ
Reset value0000000000000000000
0xBA8OTG_DOEPINT5Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.STPKTRXNYETNAKBERRRes.Res.Res.OUTPKTERRRes.B2BSTUPSTSPHSRXOTEPDISSTUPAHBERREPDISDXFRC
Reset value00000-0000000
0xBB0OTG_DOEPTSIZ5Res.RXDPID/STUPCNTPKTCNTXFRSIZ
Reset value000000000000000000000000000000
..
..
..
0xC00OTG_DOEPCTL8EPENAEPDISSODDFRMSDOPID/SEVNFRMSNAKCNAKRes.Res.Res.Res.Res.STALLSNPMRes.EPTYPRes.NAKSTSEONUM/DPIDUSBAEPRes.Res.Res.Res.Res.Res.MPSIZ
Reset value0000000000000000000
0xC08OTG_DOEPINT8Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.STPKTRXNYETNAKBERRRes.Res.Res.OUTPKTERRRes.B2BSTUPSTSPHSRXOTEPDISSTUPAHBERREPDISDXFRC
Reset value00000-0000000
0xC10OTG_DOEPTSIZ8Res.RXDPID/STUPCNTPKTCNTXFRSIZ
Reset value000000000000000000000000000000
0xC14OTG_DOEPDMA8DMAADDR
Reset value00000000000000000000000000000000

Table 238. OTG_FS/OTG_HS register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0xE00OTG_PCGCCTLRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.SUSPPHYSLEEPENL1GTGPHYSUSPRes.Res.GATEHCLKSTPPCLK
Reset value000000

Refer to Section 1.6 on page 56 for the register boundary addresses.

32.16 OTG_FS/OTG_HS programming model

32.16.1 Core initialization

The application must perform the core initialization sequence. If the cable is connected during power-up, the current mode of operation bit in the OTG_GINTSTS (CMOD bit in OTG_GINTSTS) reflects the mode. The OTG_FS/OTG_HS controller enters host mode when an “A” plug is connected or device mode when a “B” plug is connected.

This section explains the initialization of the OTG_FS/OTG_HS controller after power-on. The application must follow the initialization sequence irrespective of host or device mode operation. All core global registers are initialized according to the core's configuration:

  1. 1. Program the following fields in the OTG_GAHBCFG register:
    • – Global interrupt mask bit GINTMSK = 1
    • – Rx FIFO non-empty (RXFLVL bit in OTG_GINTSTS)
    • – Periodic Tx FIFO empty level
  2. 2. Program the following fields in the OTG_GUSBFG register:
    • – HNP capable bit
    • – SRP capable bit
    • – OTG_FS/OTG_HS timeout calibration field
    • – USB turnaround time field
  3. 3. The software must unmask the following bits in the OTG_GINTMSK register:
    • OTG interrupt mask
    • Mode mismatch interrupt mask
  4. 4. The software can read the CMOD bit in OTG_GINTSTS to determine whether the OTG_FS/OTG_HS controller is operating in host or device mode.

32.16.2 Host initialization

To initialize the core as host, the application must perform the following steps:

  1. 1. Program the HPRTINT in the OTG_GINTMSK register to unmask
  2. 2. Program the OTG_HCFG register to select full-speed host
  3. 3. Program the PPWR bit in OTG_HPRT to 1. This drives V BUS on the USB.
  4. 4. Wait for the PCDDET interrupt in OTG_HPRT0. This indicates that a device is connecting to the port.
  5. 5. Program the PRST bit in OTG_HPRT to 1. This starts the reset process.
  6. 6. Wait at least 10 ms for the reset process to complete.
  7. 7. Program the PRST bit in OTG_HPRT to 0.
  8. 8. Wait for the PENCHNG interrupt in OTG_HPRT.
  9. 9. Read the PSPD bit in OTG_HPRT to get the enumerated speed.
  10. 10. Program the HFIR register with a value corresponding to the selected PHY clock
  11. 11. Program the FSLSPCS field in the OTG_HCFG register following the speed of the device detected in step 9. If FSLSPCS has been changed a port reset must be performed.
  12. 12. Program the OTG_GRXFSIZ register to select the size of the receive FIFO.
  13. 13. Program the OTG_HNPTXFSIZ register to select the size and the start address of the Non-periodic transmit FIFO for non-periodic transactions.
  14. 14. Program the OTG_HPTXFSIZ register to select the size and start address of the periodic transmit FIFO for periodic transactions.

To communicate with devices, the system software must initialize and enable at least one channel.

32.16.3 Device initialization

The application must perform the following steps to initialize the core as a device on power-up or after a mode change from host to device.

  1. 1. Program the following fields in the OTG_DCFG register:
    • – Device speed
    • – Non-zero-length status OUT handshake
    • – Periodic Frame Interval
  2. 2. Program the Device threshold control register. This is required only if you are using DMA mode and you are planning to enable thresholding.
  3. 3. Clear the DCTL.SDIS bit. The core issues a connect after this bit is cleared.
  4. 4. Program the OTG_GINTMSK register to unmask the following interrupts:
    • – USB reset
    • – Enumeration done
    • – Early suspend
    • – USB suspend
    • – SOF
  5. 5. Wait for the USBRST interrupt in OTG_GINTSTS. It indicates that a reset has been detected on the USB that lasts for about 10 ms on receiving this interrupt.
  6. 6. Wait for the ENUMDNE interrupt in OTG_GINTSTS. This interrupt indicates the end of reset on the USB. On receiving this interrupt, the application must read the OTG_DSTS register to determine the enumeration speed and perform the steps listed in Endpoint initialization on enumeration completion on page 1337 .

At this point, the device is ready to accept SOF packets and perform control transfers on control endpoint 0.

32.16.4 DMA mode

The OTG host uses the AHB master interface to fetch the transmit packet data (AHB to USB) and receive the data update (USB to AHB). The AHB master uses the programmed DMA address (OTG_HCDMAx register in host mode and OTG_DIEPDMAX/OTG_DOEPDMAX register in peripheral mode) to access the data buffers.

32.16.5 Host programming model

Channel initialization

The application must initialize one or more channels before it can communicate with connected devices. To initialize and enable a channel, the application must perform the following steps:

  1. 1. Program the OTG_GINTMSK register to unmask the following:
  2. 2. Channel interrupt
    • – Non-periodic transmit FIFO empty for OUT transactions (applicable when operating in pipelined transaction-level with the packet count field programmed with more than one).
    • – Non-periodic transmit FIFO half-empty for OUT transactions (applicable when operating in pipelined transaction-level with the packet count field programmed with more than one).
  3. 3. Program the OTG_HAINTMSK register to unmask the selected channels' interrupts.
  4. 4. Program the OTG_HCINTMSK register to unmask the transaction-related interrupts of interest given in the host channel interrupt register.
  5. 5. Program the selected channel's OTG_HCTSIZx register with the total transfer size, in bytes, and the expected number of packets, including short packets. The application must program the PID field with the initial data PID (to be used on the first OUT transaction or to be expected from the first IN transaction).
  6. 6. Program the OTG_HCCHARx register of the selected channel with the device's endpoint characteristics, such as type, speed, direction, and so forth. (The channel can be enabled by setting the channel enable bit to 1 only when the application is ready to transmit or receive any packet).
  7. 7. Program the selected channels in the OTG_HCSPLTx register(s) with the hub and port addresses (split transactions only).
  8. 8. Program the selected channels in the OTG_HCDMAx register(s) with the buffer start address (DMA transactions only).

Halting a channel

The application can disable any channel by programming the OTG_HCCHARx register with the CHDIS and CHENA bits set to 1. This enables the OTG_FS/OTG_HS host to flush the posted requests (if any) and generates a channel halted interrupt. The application must wait for the CHH interrupt in OTG_HCINTx before reallocating the channel for other transactions. The OTG_FS/OTG_HS host does not interrupt the transaction that has already been started on the USB.

To disable a channel in DMA mode operation, the application does not need to check for space in the request queue. The OTG_HS host checks for space to write the disable

request on the disabled channel's turn during arbitration. Meanwhile, all posted requests are dropped from the request queue when the CHDIS bit in OTG_HCCHARx is set to 1.

Before disabling a channel, the application must ensure that there is at least one free space available in the non-periodic request queue (when disabling a non-periodic channel) or the periodic request queue (when disabling a periodic channel). The application can simply flush the posted requests when the request queue is full (before disabling the channel), by programming the OTG_HCCHARx register with the CHDIS bit set to 1 which automatically clears the CHENA bit to 0.

The application is expected to disable a channel on any of the following conditions:

  1. 1. When an STALL, TXERR, BBERR or DTERR interrupt in OTG_HCINTx is received for an IN or OUT channel. The application must be able to receive other interrupts (DTERR, Nak, data, TXERR) for the same channel before receiving the halt.
  2. 2. When an XFRC interrupt in OTG_HCINTx is received during a non periodic IN transfer or high-bandwidth interrupt IN transfer
  3. 3. When a DISCINT (disconnect device) interrupt in OTG_GINTSTS is received. (The application is expected to disable all enabled channels).
  4. 4. When the application aborts a transfer before normal completion.

Ping protocol

When the OTG_HS host operates in high speed, the application must initiate the ping protocol when communicating with high-speed bulk or control (data and status stage) OUT endpoints. The application must initiate the ping protocol when it receives a NAK/NYET/TXERR interrupt. When the OTG_HS host receives one of the above responses, it does not continue any transaction for a specific endpoint, drops all posted or fetched OUT requests (from the request queue), and flushes the corresponding data (from the transmit FIFO). This is valid in slave mode only. In Slave mode, the application can send a ping token either by setting the DOPING bit in OTG_HCTSIZx before enabling the channel or by just writing the OTG_HCTSIZx register with the DOPING bit set when the channel is already enabled. This enables the OTG_HS host to write a ping request entry to the request queue. The application must wait for the response to the ping token (a NAK, ACK, or TXERR interrupt) before continuing the transaction or sending another ping token. The application can continue the data transaction only after receiving an ACK from the OUT endpoint for the requested ping. In DMA mode operation, the application does not need to set the DOPING bit in OTG_HCTSIZx for a NAK/NYET response in case of bulk/control OUT. The OTG_HS host automatically sets the DOPING bit in OTG_HCTSIZx, and issues the ping tokens for bulk/control OUT. The OTG_HS host continues sending ping tokens until it receives an ACK, and then switches automatically to the data transaction.

Operational model

The application must initialize a channel before communicating to the connected device. This section explains the sequence of operation to be performed for different types of USB transactions.

The OTG_FS/OTG_HS host automatically writes an entry (OUT request) to the periodic/non-periodic request queue, along with the last 32-bit word write of a packet. The application must ensure that at least one free space is available in the periodic/non-periodic request queue before starting to write to the transmit FIFO. The application must always write to the transmit FIFO in 32-bit words. If the packet size is non-32-bit word aligned, the application must use padding. The OTG_FS/OTG_HS host determines the actual packet size based on the programmed maximum packet size and transfer size.

Figure 438. Transmit FIFO write task

Flowchart for Transmit FIFO write task. The process starts with 'Start', followed by a decision '1 MPS or LPS FIFO space available?'. If 'No', it goes to 'Wait for NPTXFE/PTXFE interrupt in OTG_GINTSTS', then 'Read OTG_HPTXSTS /OTG_HNPTXSTS registers for available FIFO and queue spaces', and loops back to the decision. If 'Yes', it goes to 'Write 1 packet data to transmit FIFO', then a decision 'More packets to send?'. If 'No', it ends at 'Done'. If 'Yes', it loops back to the first decision.
graph TD; Start([Start]) --> Decision1{1 MPS or LPS FIFO space available?}; Decision1 -- No --> Wait[Wait for NPTXFE/PTXFE interrupt in OTG_GINTSTS]; Wait --> Read[Read OTG_HPTXSTS /OTG_HNPTXSTS registers for available FIFO and queue spaces]; Read --> Decision1; Decision1 -- Yes --> Write[Write 1 packet data to transmit FIFO]; Write --> Decision2{More packets to send?}; Decision2 -- No --> Done([Done]); Decision2 -- Yes --> Decision1;

MPS: Maximum packet size
LPS: Last packet size

ai15673c

Flowchart for Transmit FIFO write task. The process starts with 'Start', followed by a decision '1 MPS or LPS FIFO space available?'. If 'No', it goes to 'Wait for NPTXFE/PTXFE interrupt in OTG_GINTSTS', then 'Read OTG_HPTXSTS /OTG_HNPTXSTS registers for available FIFO and queue spaces', and loops back to the decision. If 'Yes', it goes to 'Write 1 packet data to transmit FIFO', then a decision 'More packets to send?'. If 'No', it ends at 'Done'. If 'Yes', it loops back to the first decision.

The application must ignore all packet statuses other than IN data packet (bx0010).

Figure 439. Receive FIFO read task

Flowchart of the Receive FIFO read task. The process starts at 'Start', then enters a loop waiting for an 'RXFLVL interrupt?'. If 'No', it loops back. If 'Yes', it branches: 'Unmask RXFLVL interrupt' (left), 'Mask RXFLVL interrupt' (middle), and 'Unmask RXFLVL interrupt' (right). The middle path leads to 'Read OTG_FS_GRXSTSP', which then checks 'PKTSTS 0b0010?'. If 'No', it goes to 'Unmask RXFLVL interrupt'. If 'Yes', it checks 'BCNT > 0?'. If 'Yes', it leads to 'Read the received packet from the Receive FIFO', which then leads to 'Unmask RXFLVL interrupt'. If 'No' at 'BCNT > 0?', it leads to 'Unmask RXFLVL interrupt'. All 'Unmask RXFLVL interrupt' blocks lead back to the initial loop entry point. The diagram is labeled 'ai15674' in the bottom right corner.
graph TD
    Start([Start]) --> RXFLVL{RXFLVL interrupt?}
    RXFLVL -- No --> RXFLVL
    RXFLVL -- Yes --> Unmask1[Unmask RXFLVL interrupt]
    RXFLVL -- Yes --> Mask[Mask RXFLVL interrupt]
    RXFLVL -- Yes --> Unmask2[Unmask RXFLVL interrupt]
    Mask --> ReadOTG[Read OTG_FS_GRXSTSP]
    ReadOTG --> PKTSTS{PKTSTS 0b0010?}
    PKTSTS -- No --> Unmask2
    PKTSTS -- Yes --> BCNT{BCNT > 0?}
    BCNT -- Yes --> ReadFIFO[Read the received packet from the Receive FIFO]
    ReadFIFO --> Unmask1
    BCNT -- No --> Unmask2
    Unmask1 --> RXFLVL
    Unmask2 --> RXFLVL
  
Flowchart of the Receive FIFO read task. The process starts at 'Start', then enters a loop waiting for an 'RXFLVL interrupt?'. If 'No', it loops back. If 'Yes', it branches: 'Unmask RXFLVL interrupt' (left), 'Mask RXFLVL interrupt' (middle), and 'Unmask RXFLVL interrupt' (right). The middle path leads to 'Read OTG_FS_GRXSTSP', which then checks 'PKTSTS 0b0010?'. If 'No', it goes to 'Unmask RXFLVL interrupt'. If 'Yes', it checks 'BCNT > 0?'. If 'Yes', it leads to 'Read the received packet from the Receive FIFO', which then leads to 'Unmask RXFLVL interrupt'. If 'No' at 'BCNT > 0?', it leads to 'Unmask RXFLVL interrupt'. All 'Unmask RXFLVL interrupt' blocks lead back to the initial loop entry point. The diagram is labeled 'ai15674' in the bottom right corner.

A typical bulk or control OUT/SETUP pipelined transaction-level operation is shown in Figure 440. See channel 1 (ch_1). Two bulk OUT packets are transmitted. A control SETUP transaction operates in the same way but has only one packet. The assumptions are:

The sequence of operations in (channel 1) is as follows:

  1. 1. Initialize channel 1
  2. 2. Write the first packet for channel 1
  3. 3. Along with the last word write, the core writes an entry to the non-periodic request queue
  4. 4. As soon as the non-periodic queue becomes non-empty, the core attempts to send an OUT token in the current frame
  5. 5. Write the second (last) packet for channel 1
  6. 6. The core generates the XFRC interrupt as soon as the last transaction is completed successfully
  7. 7. In response to the XFRC interrupt, de-allocate the channel for other transfers
  8. 8. Handling non-ACK responses

Figure 440. Normal bulk/control OUT/SETUP

Sequence diagram showing the interaction between Application, AHB, Host, USB, and Device for a normal bulk/control OUT/SETUP transfer. The diagram includes steps for channel initialization, data writing, and interrupt handling.

The diagram illustrates the sequence of operations for a normal bulk/control OUT/SETUP transfer across five lifelines: Application, AHB, Host, USB, and Device.

MSv36018V1

Sequence diagram showing the interaction between Application, AHB, Host, USB, and Device for a normal bulk/control OUT/SETUP transfer. The diagram includes steps for channel initialization, data writing, and interrupt handling.

1. The grayed elements are not relevant in the context of this figure.

The channel-specific interrupt service routine for bulk and control OUT/SETUP transactions is shown in the following code samples.

Unmask (NAK/TXERR/STALL/XFRC)
if (XFRC)
{
    Reset Error Count
    Mask ACK
    De-allocate Channel
}
else if (STALL)
{
    Transfer Done = 1
    Unmask CHH
    Disable Channel
}
else if (NAK or TXERR )
{
    Rewind Buffer Pointers
    Unmask CHH
    Disable Channel
    if (TXERR)
    {
        Increment Error Count
        Unmask ACK
    }
    else
    {
        Reset Error Count
    }
}
else if (CHH)
{
    Mask CHH
    if (Transfer Done or (Error_count == 3))
    {
        De-allocate Channel
    }
    else
    {
        Re-initialize Channel
    }
}
    else if (ACK)
    {
        Reset Error Count
        Mask ACK
    }

    The application is expected to write the data packets into the transmit FIFO when the
    space is available in the transmit FIFO and the request queue. The application can
    make use of the NPTXFE interrupt in OTG_GINTSTS to find the transmit FIFO space.

    b) Bulk/control IN

Unmask (TXERR/XFRC/BBERR/STALL/DTERR)
if (XFRC)
{
    Reset Error Count
    Unmask CHH
    Disable Channel
    Reset Error Count
    Mask ACK
}

else if (TXERR or BBERR or STALL)
{
    Unmask CHH
    Disable Channel
    if (TXERR)
    {
        Increment Error Count
        Unmask ACK
    }
}

else if (CHH)
{
    Mask CHH
    if (Transfer Done or (Error_count == 3))
    {
        De-allocate Channel
    }
    else
    {
        Re-initialize Channel
    }
}

else if (ACK)
{
    Reset Error Count
    Mask ACK
}
else if (DTERR)
{
    Reset Error Count
}

The application is expected to write the requests as and when the request queue space is available and until the XFRG interrupt is received.

A typical bulk or control IN pipelined transaction-level operation is shown in Figure 441 . See channel 2 (ch_2). The assumptions are:

Figure 441. Bulk/control IN transactions

Sequence diagram showing bulk/control IN transactions between Application, AHB, Host, USB, and Device. The diagram illustrates the flow of data and control signals for two channels (ch_1 and ch_2).

The diagram illustrates the sequence of events for bulk/control IN transactions. It is divided into five vertical lifelines: Application, AHB, Host, USB, and Device.

Sequence diagram showing bulk/control IN transactions between Application, AHB, Host, USB, and Device. The diagram illustrates the flow of data and control signals for two channels (ch_1 and ch_2).

ai15675b

1. The grayed elements are not relevant in the context of this figure.

The sequence of operations is as follows:

  1. 1. Initialize channel 2.
  2. 2. Set the CHENA bit in OTG_HCCHAR2 to write an IN request to the non-periodic request queue.
  3. 3. The core attempts to send an IN token after completing the current OUT transaction.
  4. 4. The core generates an RXFLVL interrupt as soon as the received packet is written to the receive FIFO.
  5. 5. In response to the RXFLVL interrupt, mask the RXFLVL interrupt and read the received packet status to determine the number of bytes received, then read the receive FIFO accordingly. Following this, unmask the RXFLVL interrupt.
  6. 6. The core generates the RXFLVL interrupt for the transfer completion status entry in the receive FIFO.
  7. 7. The application must read and ignore the receive packet status when the receive packet status is not an IN data packet (PKTSTS in OTG_GRXSTSR ≠ 0b0010).
  8. 8. The core generates the XFRC interrupt as soon as the receive packet status is read.
  9. 9. In response to the XFRC interrupt, disable the channel and stop writing the OTG_HCCHAR2 register for further requests. The core writes a channel disable request to the non-periodic request queue as soon as the OTG_HCCHAR2 register is written.
  10. 10. The core generates the RXFLVL interrupt as soon as the halt status is written to the receive FIFO.
  11. 11. Read and ignore the receive packet status.
  12. 12. The core generates a CHH interrupt as soon as the halt status is popped from the receive FIFO.
  13. 13. In response to the CHH interrupt, de-allocate the channel for other transfers.
  14. 14. Handling non-ACK responses

Setup, data, and status stages of a control transfer must be performed as three separate transfers. setup-, data- or status-stage OUT transactions are performed similarly to the bulk OUT transactions explained previously. Data- or status-stage IN transactions are performed similarly to the bulk IN transactions explained previously. For all three stages, the application is expected to set the EPTYP field in

OTG_HCCHAR1 to control. During the setup stage, the application is expected to set the PID field in OTG_HCTSIZ1 to SETUP.

A typical interrupt OUT operation is shown in Figure 442 . The assumptions are:

The sequence of operations is as follows:

  1. 1. Initialize and enable channel 1. The application must set the ODDFRM bit in OTG_HCCHAR1.
  2. 2. Write the first packet for channel 1.
  3. 3. Along with the last word write of each packet, the OTG_FS/OTG_HS host writes an entry to the periodic request queue.
  4. 4. The OTG_FS/OTG_HS host attempts to send an OUT token in the next (odd) frame.
  5. 5. The OTG_FS/OTG_HS host generates an XFRC interrupt as soon as the last packet is transmitted successfully.
  6. 6. In response to the XFRC interrupt, reinitialize the channel for the next transfer.

Figure 442. Normal interrupt OUT

Sequence diagram showing normal interrupt OUT transaction between Application, AHB, Host, USB, and Device. The diagram is divided into Odd (micro) frame and Even (micro) frame sections. It shows steps for initializing channels, writing data to FIFOs, and handling interrupts (XferCompl, RxFLvl).

The diagram illustrates the sequence of events for a normal interrupt OUT transaction. It is divided into two main sections: Odd (micro) frame and Even (micro) frame.

MSv36020V1

Sequence diagram showing normal interrupt OUT transaction between Application, AHB, Host, USB, and Device. The diagram is divided into Odd (micro) frame and Even (micro) frame sections. It shows steps for initializing channels, writing data to FIFOs, and handling interrupts (XferCompl, RxFLvl).

1. The grayed elements are not relevant in the context of this figure.

Unmask (NAK/TXERR/STALL/XFRC/FRMOR)

if (XFRC)
{
    Reset Error Count
    Mask ACK
    De-allocate Channel
}
else
    if (STALL or FRMOR)
    {
        Mask ACK
        Unmask CHH
        Disable Channel
        if (STALL)
        {
            Transfer Done = 1
        }
    }
    else
        if (NAK or TXERR)
        {
            Rewind Buffer Pointers
            Reset Error Count
            Mask ACK
            Unmask CHH
            Disable Channel
        }
        else
            if (CHH)
            {
                Mask CHH
                if (Transfer Done or (Error_count == 3))
                {
                    De-allocate Channel
                }
                else
                {
                    Re-initialize Channel (in next b_interval - 1 Frame)
                }
            }
            else
                if (ACK)
                {
                    Reset Error Count
                    Mask ACK
                }
}

The application uses the NPTXFE interrupt in OTG_GINTSTS to find the transmit FIFO space.

Interrupt IN

Unmask (NAK/TXERR/XFRC/BBERR/STALL/FRMOR/DTERR)

if (XFRC)
{
    Reset Error Count
    Mask ACK
    if (OTG_HCTSIZx.PKTCNT == 0)
    {
        De-allocate Channel
    }
    else
    {
        Transfer Done = 1
        Unmask CHH
        Disable Channel
    }
}
else
    if (STALL or FRMOR or NAK or DTERR or BBERR)
    {
        Mask ACK
        Unmask CHH
        Disable Channel
        if (STALL or BBERR)
        {
            Reset Error Count
            Transfer Done = 1
        }
        else
            if (!FRMOR)
            {
                Reset Error Count
            }
    }
    else
        if (TXERR)
        {
            Increment Error Count
            Unmask ACK
            Unmask CHH
            Disable Channel
        }
    else
if (CHH)
{
    Mask CHH
    if (Transfer Done or (Error_count == 3))
    {
        De-allocate Channel
    }
    else
        Re-initialize Channel (in next b_interval - 1 /Frame)
}
}
else
    if (ACK)
    {
        Reset Error Count
        Mask ACK
    }

The assumptions are:

The sequence of operations is as follows:

  1. 1. Initialize channel 2. The application must set the ODDFRM bit in OTG_HCCHAR2.
  2. 2. Set the CHENA bit in OTG_HCCHAR2 to write an IN request to the periodic request queue.
  3. 3. The OTG_FS/OTG_HS host writes an IN request to the periodic request queue for each OTG_HCCHAR2 register write with the CHENA bit set.
  4. 4. The OTG_FS/OTG_HS host attempts to send an IN token in the next (odd) frame.
  5. 5. As soon as the IN packet is received and written to the receive FIFO, the OTG_FS/OTG_HS host generates an RXFLVL interrupt.
  6. 6. In response to the RXFLVL interrupt, read the received packet status to determine the number of bytes received, then read the receive FIFO accordingly. The application must mask the RXFLVL interrupt before reading the receive FIFO, and unmask after reading the entire packet.
  7. 7. The core generates the RXFLVL interrupt for the transfer completion status entry in the receive FIFO. The application must read and ignore the receive packet status when the receive packet status is not an IN data packet (PKTSTS in GRXSTSR ≠ 0b0010).
  8. 8. The core generates an XFRC interrupt as soon as the receive packet status is read.
  9. 9. In response to the XFRC interrupt, read the PKTCNT field in OTG_HCTSIZ2. If the PKTCNT bit in OTG_HCTSIZ2 is not equal to 0, disable the channel before re-

initializing the channel for the next transfer, if any). If PKTCNT bit in OTG_HCTSIZ2 = 0, reinitialize the channel for the next transfer. This time, the application must reset the ODDFRM bit in OTG_HCCHAR2.

Figure 443. Normal interrupt IN

Sequence diagram illustrating a normal interrupt IN transaction between an Application, AHB, Host, USB, and Device. The diagram shows the flow of data and control signals across five lifelines over two microframes (Odd and Even).

The diagram illustrates the interaction for a normal interrupt IN transaction. It is divided into five vertical lifelines: Application, AHB, Host, USB, and Device. The timeline is split into two sections by a dashed horizontal line: "Odd (micro) frame" and "Even (micro) frame".

Grayed elements (e.g., init_reg(ch_2) in the Even frame, set_ch_en(ch_2) in the Even frame) are not relevant to this figure. The USB section shows the flow of OUT , DATA (0 or 1), and ACK signals between the Host and the Device.

Sequence diagram illustrating a normal interrupt IN transaction between an Application, AHB, Host, USB, and Device. The diagram shows the flow of data and control signals across five lifelines over two microframes (Odd and Even).

1. The grayed elements are not relevant in the context of this figure.

A typical isochronous OUT operation is shown in Figure 444 . The assumptions are:

packet size), starting with an odd frame. (transfer size = 1 024 bytes).

The sequence of operations is as follows:

  1. 1. Initialize and enable channel 1. The application must set the ODDFRM bit in OTG_HCCHAR1.
  2. 2. Write the first packet for channel 1.
  3. 3. Along with the last word write of each packet, the OTG_FS/OTG_HS host writes an entry to the periodic request queue.
  4. 4. The OTG_FS/OTG_HS host attempts to send the OUT token in the next frame (odd).
  5. 5. The OTG_FS/OTG_HS host generates the XFRC interrupt as soon as the last packet is transmitted successfully.
  6. 6. In response to the XFRC interrupt, reinitialize the channel for the next transfer.
  7. 7. Handling non-ACK responses

Figure 444. Isochronous OUT transactions

Sequence diagram showing isochronous OUT transactions between Application, AHB, Host, USB, and Device. The diagram is divided into Odd (micro) frame and Even (micro) frame sections. It shows steps for initializing channels, writing data to FIFOs, and handling interrupts (XferCompl, RxFLvl).

The diagram illustrates the interaction for isochronous OUT transactions across five lifelines: Application, AHB, Host, USB, and Device. It is split into two halves by a dashed line: 'Odd (micro) frame' and 'Even (micro) frame'.

Grayed elements (init_reg(ch_2), set_ch_en(ch_2) in the first frame, and read_rx_sts, init_reg(ch_2), set_ch_en(ch_2) in the second frame) are noted as not relevant to this specific transaction sequence.

Sequence diagram showing isochronous OUT transactions between Application, AHB, Host, USB, and Device. The diagram is divided into Odd (micro) frame and Even (micro) frame sections. It shows steps for initializing channels, writing data to FIFOs, and handling interrupts (XferCompl, RxFLvl).

1. The grayed elements are not relevant in the context of this figure.

Code sample: isochronous OUT

Unmask (FRMOR/XFRC)
if (XFRC)
{
    De-allocate Channel
}
else
    if (FRMOR)
    {
        Unmask CHH
        Disable Channel
    }
    else
        if (CHH)
        {
            Mask CHH
            De-allocate Channel
        }
Code sample: Isochronous IN
Unmask (TXERR/XFRC/FRMOR/BBERR)
if (XFRC or FRMOR)
{
    if (XFRC and (OTG_HCTSIZx.PKTCNT == 0))
    {
        Reset Error Count
        De-allocate Channel
    }
    else
    {
        Unmask CHH
        Disable Channel
    }
}
else
    if (TXERR or BBERR)
    {
        Increment Error Count
        Unmask CHH
        Disable Channel
    }
    else
        if (CHH)
        {
            Mask CHH
            if (Transfer Done or (Error_count == 3))
            {
                De-allocate Channel
            }
        }
}
    else
    {
        Re-initialize Channel
    }
}

The assumptions are:

The sequence of operations is as follows:

  1. 1. Initialize channel 2. The application must set the ODDFRM bit in OTG_HCCHAR2.
  2. 2. Set the CHENA bit in OTG_HCCHAR2 to write an IN request to the periodic request queue.
  3. 3. The OTG_FS/OTG_HS host writes an IN request to the periodic request queue for each OTG_HCCHAR2 register write with the CHENA bit set.
  4. 4. The OTG_FS/OTG_HS host attempts to send an IN token in the next odd frame.
  5. 5. As soon as the IN packet is received and written to the receive FIFO, the OTG_FS/OTG_HS host generates an RXFLVL interrupt.
  6. 6. In response to the RXFLVL interrupt, read the received packet status to determine the number of bytes received, then read the receive FIFO accordingly. The application must mask the RXFLVL interrupt before reading the receive FIFO, and unmask it after reading the entire packet.
  7. 7. The core generates an RXFLVL interrupt for the transfer completion status entry in the receive FIFO. This time, the application must read and ignore the receive packet status when the receive packet status is not an IN data packet (PKTSTS bit in OTG_GRXSTSR ≠ 0b0010).
  8. 8. The core generates an XFRC interrupt as soon as the receive packet status is read.
  9. 9. In response to the XFRC interrupt, read the PKTCNT field in OTG_HCTSIZ2. If PKTCNT ≠ 0 in OTG_HCTSIZ2, disable the channel before re-initializing the channel for the next transfer, if any. If PKTCNT = 0 in OTG_HCTSIZ2, reinitialize the channel for the next transfer. This time, the application must reset the ODDFRM bit in OTG_HCCHAR2.

Figure 445. Isochronous IN transactions

Sequence diagram showing isochronous IN transactions between Application, AHB, Host, USB, and Device. The diagram is divided into Odd (micro) frame and Even (micro) frame sections. It shows steps for initializing channels, writing data to TX FIFOs, and reading data from RX FIFOs, with corresponding interrupts and USB frames.

The diagram illustrates the interaction for isochronous IN transactions across five lifelines: Application, AHB, Host, USB, and Device. It is split into two sections: Odd (micro) frame and Even (micro) frame.

Grayed elements (init_reg(ch_2) and set_ch_en(ch_2) in the even frame) are not relevant in this context.

Sequence diagram showing isochronous IN transactions between Application, AHB, Host, USB, and Device. The diagram is divided into Odd (micro) frame and Even (micro) frame sections. It shows steps for initializing channels, writing data to TX FIFOs, and reading data from RX FIFOs, with corresponding interrupts and USB frames.

1. The grayed elements are not relevant in the context of this figure.

Choose the periodic and non-periodic request queue depths carefully to match the number of periodic/non-periodic endpoints accessed.

The non-periodic request queue depth affects the performance of non-periodic

transfers. The deeper the queue (along with sufficient FIFO size), the more often the core is able to pipeline non-periodic transfers. If the queue size is small, the core is able to put in new requests only when the queue space is freed up.

The core's periodic request queue depth is critical to perform periodic transfers as scheduled. Select the periodic queue depth, based on the number of periodic transfers scheduled in a microframe. If the periodic request queue depth is smaller than the periodic transfers scheduled in a microframe, a frame overrun condition occurs.

OTG_FS/OTG_HS controller handles two cases of babble: packet babble and port babble. Packet babble occurs if the device sends more data than the maximum packet size for the channel. Port babble occurs if the core continues to receive data from the device at EOF2 (the end of frame 2, which is very close to SOF).

When OTG_FS/OTG_HS controller detects a packet babble, it stops writing data into the Rx buffer and waits for the end of packet (EOP). When it detects an EOP, it flushes already written data in the Rx buffer and generates a Babble interrupt to the application.

When OTG_FS/OTG_HS controller detects a port babble, it flushes the Rx FIFO and disables the port. The core then generates a port disabled interrupt (HPRTINT in OTG_GINTSTS, PENCHNG in OTG_HPRT). On receiving this interrupt, the application must determine that this is not due to an overcurrent condition (another cause of the port disabled interrupt) by checking POCA in OTG_HPRT, then perform a soft reset. The core does not send any more tokens after it has detected a port babble condition.

Note: The following paragraphs, ranging from here to the beginning of Section 32.16 , and covering DMA configurations, apply only to USB OTG HS.

The sequence of operations is as follows:

  1. 1. Initialize and enable channel 1 as explained in Section : Channel initialization .
  2. 2. The OTG_HS host starts fetching the first packet as soon as the channel is enabled. For internal DMA mode, the OTG_HS host uses the programmed DMA address to fetch the packet.
  3. 3. After fetching the last 32-bit word of the second (last) packet, the OTG_HS host masks channel 1 internally for further arbitration.
  4. 4. The OTG_HS host generates a CHH interrupt as soon as the last packet is sent.
  5. 5. In response to the CHH interrupt, de-allocate the channel for other transfers.

Figure 446. Normal bulk/control OUT/SETUP transactions - DMA

Sequence diagram showing normal bulk/control OUT/SETUP transactions with DMA. The diagram illustrates the interaction between an Application, AHB, Host, USB, and Device. It shows two channels, ch_1 and ch_2, being initialized and then used for data transfer. The sequence includes steps for channel initialization, data transfer, and channel de-allocation. A note indicates that the Non-Periodic Request Queue can hold 4 entries.

The diagram illustrates the sequence of operations for normal bulk/control OUT/SETUP transactions using DMA. The participants are Application, AHB, Host, USB, and Device.

Sequence diagram showing normal bulk/control OUT/SETUP transactions with DMA. The diagram illustrates the interaction between an Application, AHB, Host, USB, and Device. It shows two channels, ch_1 and ch_2, being initialized and then used for data transfer. The sequence includes steps for channel initialization, data transfer, and channel de-allocation. A note indicates that the Non-Periodic Request Queue can hold 4 entries.
  1. 1. The OTG_HS host sends a bulk OUT transaction.
  2. 2. The device responds with NAK or NYET.
  3. 3. If the application has unmasked NAK or NYET, the core generates the corresponding interrupt(s) to the application. The application is not required to service these interrupts, since the core takes care of rewinding the buffer pointers and re-initializing the Channel without application intervention.
  4. 4. The core automatically issues a ping token.
  5. 5. When the device returns an ACK, the core continues with the transfer. Optionally, the application can utilize these interrupts, in which case the NAK or NYET interrupt is masked by the application.

The core does not generate a separate interrupt when NAK or NYET is received by the host functionality.

The sequence of operations is as follows:

  1. 1. Initialize and enable the used channel (channel x) as explained in Section : Channel initialization .
  2. 2. The OTG_HS host writes an IN request to the request queue as soon as the channel receives the grant from the arbiter (arbitration is performed in a round-robin fashion).
  3. 3. The OTG_HS host starts writing the received data to the system memory as soon as the last byte is received with no errors.
  4. 4. When the last packet is received, the OTG_HS host sets an internal flag to remove any extra IN requests from the request queue.
  5. 5. The OTG_HS host flushes the extra requests.
  6. 6. The final request to disable channel x is written to the request queue. At this point, channel 2 is internally masked for further arbitration.
  7. 7. The OTG_HS host generates the CHH interrupt as soon as the disable request comes to the top of the queue.
  8. 8. In response to the CHH interrupt, de-allocate the channel for other transfers.

Figure 447. Normal bulk/control IN transaction - DMA

Sequence diagram of a normal bulk/control IN transaction in DMA mode. The diagram shows the interaction between an Application, AHB, Host, USB, and Device. The Application initializes channels (init_reg_ch_1, init_reg_ch_2) on the AHB. The Host fetches packets from the Device via the USB interface, storing them in a Non-Periodic Request Queue. The AHB then transfers the data from the queue to the Application's memory. Interrupts (ChHltd) are generated by the Host when a channel is completed. The Application de-allocates channels (De-allocate ch_1, De-allocate ch_2) on the AHB. The sequence is numbered 1 through 8. A note indicates that the Non-Periodic Request Queue can hold 4 entries. Data packets are labeled DATA0 and DATA1, and ACK/NAK signals are shown on the USB line.

The diagram illustrates the sequence of events for a normal bulk/control IN transaction in DMA mode. It involves five main components: Application, AHB, Host, USB, and Device. The sequence is as follows:

  1. The Application writes to init_reg_ch_2 (1) to initialize channel 2.
  2. The Application writes to init_reg_ch_1 (1) to initialize channel 1.
  3. The Host (2) fetches the first packet for channel 1 from the Device via the USB interface. The AHB transfers this packet (1 MPS) to the Application's memory.
  4. The Host (3) fetches the next packet for channel 1 from the Device. The AHB transfers this packet (1 MPS) to the Application's memory.
  5. The Host (4) generates a ChHltd interrupt when channel 1 is completed. The Application (5) responds with a De-allocate (ch_1) command.
  6. The Host (5) fetches the first packet for channel 2 from the Device. The AHB transfers this packet (1 MPS) to the Application's memory.
  7. The Host (6) fetches the next packet for channel 2 from the Device. The AHB transfers this packet (1 MPS) to the Application's memory.
  8. The Host (7) generates a ChHltd interrupt when channel 2 is completed. The Application (8) responds with a De-allocate (ch_2) command.
A note in the diagram states: "Non-Periodic Request Queue Assume that this queue can hold 4 entries." The USB interface shows OUT tokens, DATA0 and DATA1 packets, and ACK/NAK signals between the Host and the Device.

Sequence diagram of a normal bulk/control IN transaction in DMA mode. The diagram shows the interaction between an Application, AHB, Host, USB, and Device. The Application initializes channels (init_reg_ch_1, init_reg_ch_2) on the AHB. The Host fetches packets from the Device via the USB interface, storing them in a Non-Periodic Request Queue. The AHB then transfers the data from the queue to the Application's memory. Interrupts (ChHltd) are generated by the Host when a channel is completed. The Application de-allocates channels (De-allocate ch_1, De-allocate ch_2) on the AHB. The sequence is numbered 1 through 8. A note indicates that the Non-Periodic Request Queue can hold 4 entries. Data packets are labeled DATA0 and DATA1, and ACK/NAK signals are shown on the USB line.

MSV36928V1

  1. 1. Initialize and enable channel x as explained in Section : Channel initialization .
  2. 2. The OTG_HS host starts fetching the first packet as soon the channel is enabled and writes the OUT request along with the last 32-bit word fetch. In high-bandwidth transfers, the OTG_HS host continues fetching the next packet (up to the value specified in the MC field) before switching to the next channel.
  3. 3. The OTG_HS host attempts to send the OUT token at the beginning of the next odd frame/micro-frame.
  1. 4. After successfully transmitting the packet, the OTG_HS host generates a CHH interrupt.
  2. 5. In response to the CHH interrupt, reinitialize the channel for the next transfer.

Figure 448. Normal interrupt OUT transactions - DMA mode

Sequence diagram of normal interrupt OUT transactions in DMA mode. The diagram shows the interaction between an Application, AHB, Host, USB, and Device. The sequence starts with the Application initializing channel 1 (init_reg[ch_1]) via the AHB. The Host then writes 1 MPS to the USB. The USB sends an OUT (micro) frame to the Device. The Device responds with DATA0 and ACK. The Host receives the ACK and generates a CHH interrupt. The Application responds to the interrupt by reinitializing the channel. The sequence repeats for channel 2 (init_reg[ch_2]) and then for channel 1 again. A note indicates that the Periodic Request Queue is assumed to hold 4 entries.

The diagram illustrates the sequence of operations for normal interrupt OUT transactions in DMA mode. It is divided into five vertical lifelines: Application, AHB, Host, USB, and Device. The sequence is as follows:

  1. Application writes to init_reg[ch_1] (1).
  2. Host receives the initialization via AHB and writes 1 MPS to the USB (2).
  3. USB sends an OUT (micro) frame to the Device (3). A note indicates: "Periodic Request Queue Assume that this queue can hold 4 entries." The Device responds with DATA0 and ACK .
  4. Host receives the ACK and generates a CHH interrupt (4).
  5. Application responds to the interrupt by reinitializing the channel (5).

The sequence repeats for init_reg[ch_2] and then for init_reg[ch_1] again. The USB section shows the Periodic Request Queue with entries for ch_1 and ch_2 . The Device section shows the Odd (micro) frame and Even (micro) frame sequences.

Sequence diagram of normal interrupt OUT transactions in DMA mode. The diagram shows the interaction between an Application, AHB, Host, USB, and Device. The sequence starts with the Application initializing channel 1 (init_reg[ch_1]) via the AHB. The Host then writes 1 MPS to the USB. The USB sends an OUT (micro) frame to the Device. The Device responds with DATA0 and ACK. The Host receives the ACK and generates a CHH interrupt. The Application responds to the interrupt by reinitializing the channel. The sequence repeats for channel 2 (init_reg[ch_2]) and then for channel 1 again. A note indicates that the Periodic Request Queue is assumed to hold 4 entries.

The sequence of operations (channelx) is as follows:

  1. 1. Initialize and enable channel x as explained in Section : Channel initialization .
  2. 2. The OTG_HS host writes an IN request to the request queue as soon as the channel x gets the grant from the arbiter (round-robin with fairness). In high-bandwidth transfers, the OTG_HS host writes consecutive writes up to MC times.
  1. 3. The OTG_HS host attempts to send an IN token at the beginning of the next (odd) frame/micro-frame.
  2. 4. As soon the packet is received and written to the receive FIFO, the OTG_HS host generates a CHH interrupt.
  3. 5. In response to the CHH interrupt, reinitialize the channel for the next transfer.

Figure 449. Normal interrupt IN transactions - DMA mode

Sequence diagram showing normal interrupt IN transactions in DMA mode between Application, AHB, Host, USB, and Device. The diagram illustrates the flow of data and control signals across five steps, including channel initialization, data transfer in odd and even micro-frames, and interrupt handling.

The diagram illustrates the interaction between an Application, AHB, Host, USB, and Device for normal interrupt IN transactions in DMA mode. The sequence is as follows:

  1. Step 1: The Application initializes and enables channel 1 (init_reg[ch_1]) and channel 2 (init_reg[ch_2]) via the AHB. The Host's Periodic Request Queue (PRQ) is shown with entries for ch_1 and ch_2.
  2. Step 2: The Host fetches the first packet (1 MPS) from the PRQ.
  3. Step 3: In an Odd (micro) frame, the USB interface sends an OUT token and DATA0 packet to the Device. The Device responds with an ACK. The Host then sends an IN token to the Device, which responds with DATA0. The Host receives the data and generates a CHH interrupt.
  4. Step 4: The Host handles the CHH interrupt and reinitializes the channel (init_reg[ch_1]).
  5. Step 5: The Application reinitializes channel 2 (init_reg[ch_2]). The Host then fetches the next packet (1 MPS) from the PRQ.

Timing details: The diagram shows the flow of data packets (1 MPS) and control signals (OUT, DATA0, ACK, IN, DATA0, ACK) across the USB interface. The Host generates CHH interrupts upon completion of data transfers. The PRQ is assumed to hold 4 entries.

Sequence diagram showing normal interrupt IN transactions in DMA mode between Application, AHB, Host, USB, and Device. The diagram illustrates the flow of data and control signals across five steps, including channel initialization, data transfer in odd and even micro-frames, and interrupt handling.

Isochronous OUT transactions in DMA mode

  1. 1. Initialize and enable channel x as explained in Section : Channel initialization .
  2. 2. The OTG_HS host starts fetching the first packet as soon as the channel is enabled, and writes the OUT request along with the last 32-bit word fetch. In high-bandwidth

transfers, the OTG_HS host continues fetching the next packet (up to the value specified in the MC field) before switching to the next channel.

  1. 3. The OTG_HS host attempts to send an OUT token at the beginning of the next (odd) frame/micro-frame.
  2. 4. After successfully transmitting the packet, the OTG_HS host generates a CHH interrupt.
  3. 5. In response to the CHH interrupt, reinitialize the channel for the next transfer.

Figure 450. Normal isochronous OUT transaction - DMA mode

Sequence diagram of a normal isochronous OUT transaction in DMA mode. The diagram shows interactions between Application, AHB, Host, USB, and Device. The Host maintains a 'Periodic Request Queue' (ch_1, ch_2). The sequence involves channel initialization, OUT token transmission in odd frames, and CHH interrupts followed by reinitialization in even frames. Data transfer (DATA0 MPS) occurs in both odd and even frames. Reference MSV36923V1 is noted at the bottom right.
Sequence diagram of a normal isochronous OUT transaction in DMA mode. The diagram shows interactions between Application, AHB, Host, USB, and Device. The Host maintains a 'Periodic Request Queue' (ch_1, ch_2). The sequence involves channel initialization, OUT token transmission in odd frames, and CHH interrupts followed by reinitialization in even frames. Data transfer (DATA0 MPS) occurs in both odd and even frames. Reference MSV36923V1 is noted at the bottom right.

Isochronous IN transactions in DMA mode

The sequence of operations ((channel x) is as follows:

  1. 1. Initialize and enable channel x as explained in Section : Channel initialization .
  2. 2. The OTG_HS host writes an IN request to the request queue as soon as the channel x gets the grant from the arbiter (round-robin with fairness). In high-bandwidth transfers, the OTG_HS host performs consecutive write operations up to MC times.
  1. 3. The OTG_HS host attempts to send an IN token at the beginning of the next (odd) frame/micro-frame.
  2. 4. As soon the packet is received and written to the receive FIFO, the OTG_HS host generates a CHH interrupt.
  3. 5. In response to the CHH interrupt, reinitialize the channel for the next transfer.

Figure 451. Normal isochronous IN transactions - DMA mode

Sequence diagram showing normal isochronous IN transactions in DMA mode between an Application, AHB, Host, USB, and Device. The diagram illustrates the flow of data packets (DATA0) and control signals (INIT, CHH interrupt) across odd and even micro-frames. The Host maintains a 'Periodic Request Queue' with entries for ch_1 and ch_2. The Application interacts with the Host via registers like init_reg(ch_1) and init_reg(ch_2).

The diagram illustrates the interaction between an Application, AHB, Host, USB, and Device for isochronous IN transactions in DMA mode. The timeline is divided into 'Odd (micro) frame' and 'Even (micro) frame' sections by horizontal dashed lines.
1. In the odd frame, the Application writes to 'init_reg(ch_2)' (1), which triggers the Host (2) to fetch '1 MPS' via the AHB. The Host adds 'ch_2' to its 'Periodic Request Queue' (3).
2. The Host sends an 'OUT' request (DATA0 MPS) to the Device. The Device responds with 'DATA0' packets.
3. Upon receiving the data, the Host generates a 'ChHld interrupt' (4) to the Application.
4. The Application responds by writing to 'init_reg(ch_1)' (5), which triggers the Host (2) to fetch '1 MPS' via the AHB. The Host adds 'ch_1' to its queue.
5. The Host sends an 'OUT' request to the Device, which responds with 'DATA0' packets.
6. Upon receiving the data, the Host generates another 'ChHld interrupt' (4) to the Application.
7. The Application writes to 'init_reg(ch_2)' (5) again, repeating the cycle.
A note indicates: 'Periodic Request Queue Assume that this queue can hold 4 entries.' The diagram is labeled 'MS36922V1' in the bottom right corner.

Sequence diagram showing normal isochronous IN transactions in DMA mode between an Application, AHB, Host, USB, and Device. The diagram illustrates the flow of data packets (DATA0) and control signals (INIT, CHH interrupt) across odd and even micro-frames. The Host maintains a 'Periodic Request Queue' with entries for ch_1 and ch_2. The Application interacts with the Host via registers like init_reg(ch_1) and init_reg(ch_2).

Bulk and control OUT/SETUP split transactions in DMA mode

The sequence of operations in (channel x) is as follows:

  1. 1. Initialize and enable channel x for start split as explained in Section : Channel initialization .
  2. 2. The OTG_HS host starts fetching the first packet as soon the channel is enabled and writes the OUT request along with the last 32-bit word fetch.
  3. 3. After successfully transmitting start split, the OTG_HS host generates the CHH interrupt.
  4. 4. In response to the CHH interrupt, set the COMPLSPLT bit in OTG_HCSPLT1 to send the complete split.
  1. 5. After successfully transmitting complete split, the OTG_HS host generates the CHH interrupt.
  1. 6. In response to the CHH interrupt, de-allocate the channel.

The sequence of operations (channel x) is as follows:

  1. 1. Initialize and enable channel x as explained in Section : Channel initialization .
  2. 2. The OTG_HS host writes the start split request to the nonperiodic request after getting the grant from the arbiter. The OTG_HS host masks the channel x internally for the arbitration after writing the request.
  3. 3. As soon as the IN token is transmitted, the OTG_HS host generates the CHH interrupt.
  4. 4. In response to the CHH interrupt, set the COMPLSPLT bit in OTG_HCSPLT2 and re-enable the channel to send the complete split token. This unmaskes channel x for arbitration.
  5. 5. The OTG_HS host writes the complete split request to the nonperiodic request after receiving the grant from the arbiter.
  6. 6. The OTG_HS host starts writing the packet to the system memory after receiving the packet successfully.
  7. 7. As soon as the received packet is written to the system memory, the OTG_HS host generates a CHH interrupt.
  8. 8. In response to the CHH interrupt, de-allocate the channel.

The sequence of operations in (channel x) is as follows:

  1. 1. Initialize and enable channel 1 for start split as explained in Section : Channel initialization . The application must set the ODDFRM bit in OTG_HCCHAR1.
  2. 2. The OTG_HS host starts reading the packet.
  3. 3. The OTG_HS host attempts to send the start split transaction.
  4. 4. After successfully transmitting the start split, the OTG_HS host generates the CHH interrupt.
  5. 5. In response to the CHH interrupt, set the COMPLSPLT bit in OTG_HCSPLT1 to send the complete split.
  6. 6. After successfully completing the complete split transaction, the OTG_HS host generates the CHH interrupt.
  7. 7. In response to CHH interrupt, de-allocate the channel.

The sequence of operations in (channel x) is as follows:

  1. 1. Initialize and enable channel x for start split as explained in Section : Channel initialization .
  2. 2. The OTG_HS host writes an IN request to the request queue as soon as channel x receives the grant from the arbiter.
  3. 3. The OTG_HS host attempts to send the start split IN token at the beginning of the next odd micro-frame.
  4. 4. The OTG_HS host generates the CHH interrupt after successfully transmitting the start split IN token.
  5. 5. In response to the CHH interrupt, set the COMPLSPLT bit in OTG_HCSPLT2 to send the complete split.
  1. 6. As soon as the packet is received successfully, the OTG_HS host starts writing the data to the system memory.
  2. 7. The OTG_HS host generates the CHH interrupt after transferring the received data to the system memory.
  3. 8. In response to the CHH interrupt, de-allocate or reinitialize the channel for the next start split.

The sequence of operations (channel x) is as follows:

  1. 1. Initialize and enable channel x for start split (begin) as explained in Section : Channel initialization . The application must set the ODDFRM bit in OTG_HCCHAR1. Program the MPS field.
  2. 2. The OTG_HS host starts reading the packet.
  3. 3. After successfully transmitting the start split (begin), the OTG_HS host generates the CHH interrupt.
  4. 4. In response to the CHH interrupt, reinitialize the registers to send the start split (end).
  5. 5. After successfully transmitting the start split (end), the OTG_HS host generates a CHH interrupt.
  6. 6. In response to the CHH interrupt, de-allocate the channel.

The sequence of operations (channel x) is as follows:

  1. 1. Initialize and enable channel x for start split as explained in Section : Channel initialization .
  2. 2. The OTG_HS host writes an IN request to the request queue as soon as channel x receives the grant from the arbiter.
  3. 3. The OTG_HS host attempts to send the start split IN token at the beginning of the next odd micro-frame.
  4. 4. The OTG_HS host generates the CHH interrupt after successfully transmitting the start split IN token.
  5. 5. In response to the CHH interrupt, set the COMPLSPLIT bit in OTG_HCSPLIT2 to send the complete split.
  6. 6. As soon as the packet is received successfully, the OTG_HS host starts writing the data to the system memory.

The OTG_HS host generates the CHH interrupt after transferring the received data to the system memory. In response to the CHH interrupt, de-allocate the channel or reinitialize the channel for the next start split.

32.16.6 Device programming model

Endpoint initialization on USB reset

  1. 1. Set the NAK bit for all OUT endpoints
    • – SNAK = 1 in OTG_DOEPCTLx (for all OUT endpoints)
  2. 2. Unmask the following interrupt bits
    • – INEP0 = 1 in OTG_DAINTEMSK (control 0 IN endpoint)
    • – OUTEP0 = 1 in OTG_DAINTEMSK (control 0 OUT endpoint)
    • – STUPM = 1 in OTG_DOEPMASK
    • – XFRCM = 1 in OTG_DOEPMASK
    • – XFRCM = 1 in OTG_DIEPMASK
    • – TOM = 1 in OTG_DIEPMASK
  3. 3. Set up the data FIFO RAM for each of the FIFOs
    • – Program the OTG_GRXFSIZ register, to be able to receive control OUT data and setup data. If thresholding is not enabled, at a minimum, this must be equal to 1 max packet size of control endpoint 0 + 2 words (for the status of the control OUT data packet) + 10 words (for setup packets).
    • – Program the OTG_DIEPTXF0 register (depending on the FIFO number chosen) to be able to transmit control IN data. At a minimum, this must be equal to 1 max packet size of control endpoint 0.
  4. 4. Program the following fields in the endpoint-specific registers for control OUT endpoint 0 to receive a SETUP packet
    • – STUPCNT = 3 in OTG_DOEPTSIZ0 (to receive up to 3 back-to-back SETUP packets)
  5. 5. For USB OTG_HS in DMA mode, the OTG_DOEPDMA0 register should have a valid memory address to store any SETUP packets received.

At this point, all initialization required to receive SETUP packets is done.

Endpoint initialization on enumeration completion

  1. 1. On the Enumeration Done interrupt (ENUMDNE in OTG_GINTSTS), read the OTG_DSTS register to determine the enumeration speed.
  2. 2. Program the MPSIZ field in OTG_DIEPCTL0 to set the maximum packet size. This step configures control endpoint 0. The maximum packet size for a control endpoint depends on the enumeration speed.
  3. 3. For USB OTG_HS in DMA mode, program the OTG_DOEPCTL0 register to enable control OUT endpoint 0, to receive a SETUP packet.

At this point, the device is ready to receive SOF packets and is configured to perform control transfers on control endpoint 0.

Endpoint initialization on SetAddress command

This section describes what the application must do when it receives a SetAddress command in a SETUP packet.

  1. 1. Program the OTG_DCFG register with the device address received in the SetAddress command
  2. 2. Program the core to send out a status IN packet

Endpoint initialization on SetConfiguration/SetInterface command

This section describes what the application must do when it receives a SetConfiguration or SetInterface command in a SETUP packet.

  1. 1. When a SetConfiguration command is received, the application must program the endpoint registers to configure them with the characteristics of the valid endpoints in the new configuration.
  2. 2. When a SetInterface command is received, the application must program the endpoint registers of the endpoints affected by this command.
  3. 3. Some endpoints that were active in the prior configuration or alternate setting are not valid in the new configuration or alternate setting. These invalid endpoints must be deactivated.
  4. 4. Unmask the interrupt for each active endpoint and mask the interrupts for all inactive endpoints in the OTG_DAINTRMSK register.
  5. 5. Set up the data FIFO RAM for each FIFO.
  6. 6. After all required endpoints are configured; the application must program the core to send a status IN packet.

At this point, the device core is configured to receive and transmit any type of data packet.

Endpoint activation

This section describes the steps required to activate a device endpoint or to configure an existing device endpoint to a new type.

  1. 1. Program the characteristics of the required endpoint into the following fields of the OTG_DIEPCTLx register (for IN or bidirectional endpoints) or the OTG_DOEPCTLx register (for OUT or bidirectional endpoints).
    • – Maximum packet size
    • – USB active endpoint = 1
    • – Endpoint start data toggle (for interrupt and bulk endpoints)
    • – Endpoint type
    • – Tx FIFO number
  2. 2. Once the endpoint is activated, the core starts decoding the tokens addressed to that endpoint and sends out a valid handshake for each valid token received for the endpoint.

Endpoint deactivation

This section describes the steps required to deactivate an existing endpoint.

  1. 1. In the endpoint to be deactivated, clear the USB active endpoint bit in the OTG_DIEPCTLx register (for IN or bidirectional endpoints) or the OTG_DOEPCTLx register (for OUT or bidirectional endpoints).
  2. 2. Once the endpoint is deactivated, the core ignores tokens addressed to that endpoint, which results in a timeout on the USB.

Note: The application must meet the following conditions to set up the device core to handle traffic:
NPTXFEM and RXFLVLM in the OTG_GINTMSK register must be cleared.

Operational model

SETUP and OUT data transfers:

This section describes the internal data flow and application-level operations during data OUT transfers and SETUP transactions.

This section describes how to read packets (OUT data and SETUP packets) from the receive FIFO.

  1. 1. On catching an RXFLVL interrupt (OTG_GINTSTS register), the application must read the receive status pop register (OTG_GRXSTSP).
  2. 2. The application can mask the RXFLVL interrupt (in OTG_GINTSTS) by writing to RXFLVLM = 0 (in OTG_GINTMSK), until it has read the packet from the receive FIFO.
  3. 3. If the received packet's byte count is not 0, the byte count amount of data is popped from the receive data FIFO and stored in memory. If the received packet byte count is 0, no data is popped from the receive data FIFO.
  4. 4. The receive status readout of the packet of FIFO indicates one of the following:
    1. a) Global OUT NAK pattern:
      PKTSTS = Global OUT NAK, BCNT = 0x000, EPNUM = (0x0),
      DPID = (0b00).
      These data indicate that the global OUT NAK bit has taken effect.
    2. b) SETUP packet pattern:
      PKTSTS = SETUP, BCNT = 0x008, EPNUM = Control EP Num,
      DPID = DATA0. These data indicate that a SETUP packet for the specified endpoint is now available for reading from the receive FIFO.
    3. c) Setup stage done pattern:
      PKTSTS = Setup Stage Done, BCNT = 0x0, EPNUM = Control EP Num,
      DPID = (0b00).
      These data indicate that the setup stage for the specified endpoint has completed and the data stage has started. After this entry is popped from the receive FIFO, the core asserts a setup interrupt on the specified control OUT endpoint.
    4. d) Data OUT packet pattern:
      PKTSTS = DataOUT, BCNT = size of the received data OUT packet ( \( 0 \leq BCNT \leq 1024 \) ), EPNUM = EPNUM on which the packet was received, DPID = Actual Data PID.
    5. e) Data transfer completed pattern:
      PKTSTS = Data OUT transfer done, BCNT = 0x0, EPNUM = OUT EP Num on which the data transfer is complete, DPID = (0b00).
      These data indicate that an OUT data transfer for the specified OUT endpoint has completed. After this entry is popped from the receive FIFO, the core asserts a transfer completed interrupt on the specified OUT endpoint.
  5. 5. After the data payload is popped from the receive FIFO, the RXFLVL interrupt (OTG_GINTSTS) must be unmasked.
  6. 6. Steps 1–5 are repeated every time the application detects assertion of the interrupt line due to RXFLVL in OTG_GINTSTS. Reading an empty receive FIFO can result in undefined core behavior.

Figure 452 provides a flowchart of the above procedure.

Figure 452. Receive FIFO packet read

Flowchart for receiving a FIFO packet. The process starts with 'wait until RXFLVL in OTG_FS_GINTSTSG', followed by 'rd_data = rd_reg (OTG_FS_GRXSTSP);'. A decision diamond 'rd_data.BCNT = 0?' follows. If 'Y' (Yes), the process ends. If 'N' (No), it enters a loop: 'mem[0: word_cnt - 1] = rd_rxfifo(rd_data.EPNUM, word_cnt)'. A bracket on the left labels this as 'packet store in memory'. A bracket on the right labels the loop as 'rcv_out_pkt()'. A box on the right calculates 'word_cnt = BCNT[11:2] + (BCNT[1] BCNT[1])'.
graph TD
    Start(( )) --> Wait[wait until RXFLVL in OTG_FS_GINTSTSG]
    Wait --> RdData[rd_data = rd_reg (OTG_FS_GRXSTSP);]
    RdData --> Decnt{rd_data.BCNT = 0?}
    Decnt -- Y --> End(( ))
    Decnt -- N --> MemStore[mem[0: word_cnt - 1] = rd_rxfifo(rd_data.EPNUM, word_cnt)]
    MemStore --> WordCnt[word_cnt = BCNT[11:2] + (BCNT[1] BCNT[1])]
    WordCnt --> MemStore
  

ai15677b

Flowchart for receiving a FIFO packet. The process starts with 'wait until RXFLVL in OTG_FS_GINTSTSG', followed by 'rd_data = rd_reg (OTG_FS_GRXSTSP);'. A decision diamond 'rd_data.BCNT = 0?' follows. If 'Y' (Yes), the process ends. If 'N' (No), it enters a loop: 'mem[0: word_cnt - 1] = rd_rxfifo(rd_data.EPNUM, word_cnt)'. A bracket on the left labels this as 'packet store in memory'. A bracket on the right labels the loop as 'rcv_out_pkt()'. A box on the right calculates 'word_cnt = BCNT[11:2] + (BCNT[1] BCNT[1])'.

SETUP transactions

This section describes how the core handles SETUP packets and the application's sequence for handling SETUP transactions.

  1. 1. To receive a SETUP packet, the STUPCNT field (OTG_DOEPTSIZx) in a control OUT endpoint must be programmed to a non-zero value. When the application programs the STUPCNT field to a non-zero value, the core receives SETUP packets and writes them to the receive FIFO, irrespective of the NAK status and EPENA bit setting in OTG_DOEPCTLx. The STUPCNT field is decremented every time the control endpoint receives a SETUP packet. If the STUPCNT field is not programmed to a proper value before receiving a SETUP packet, the core still receives the SETUP packet and decrements the STUPCNT field, but the application may not be able to determine the correct number of SETUP packets received in the setup stage of a control transfer.
    • – STUPCNT = 3 in OTG_DOEPTSIZx
  2. 2. The application must always allocate some extra space in the receive data FIFO, to be able to receive up to three SETUP packets on a control endpoint.
    • – The space to be reserved is 10 words. Three words are required for the first SETUP packet, 1 word is required for the setup stage done word and 6 words are required to store two extra SETUP packets among all control endpoints.
    • – 3 words per SETUP packet are required to store 8 bytes of SETUP data and 4 bytes of SETUP status (setup packet pattern). The core reserves this space in the

receive data FIFO to write SETUP data only, and never uses this space for data packets.

  1. 3. The application must read the 2 words of the SETUP packet from the receive FIFO.
  2. 4. The application must read and discard the setup stage done word from the receive FIFO.
  1. 1. When a SETUP packet is received, the core writes the received data to the receive FIFO, without checking for available space in the receive FIFO and irrespective of the endpoint's NAK and STALL bit settings.
    • – The core internally sets the IN NAK and OUT NAK bits for the control IN/OUT endpoints on which the SETUP packet was received.
  2. 2. For every SETUP packet received on the USB, 3 words of data are written to the receive FIFO, and the STUPCNT field is decremented by 1.
    • – The first word contains control information used internally by the core
    • – The second word contains the first 4 bytes of the SETUP command
    • – The third word contains the last 4 bytes of the SETUP command
  3. 3. When the setup stage changes to a data IN/OUT stage, the core writes an entry (setup stage done word) to the receive FIFO, indicating the completion of the setup stage.
  4. 4. On the AHB side, SETUP packets are emptied by the application.
  5. 5. When the application pops the setup stage done word from the receive FIFO, the core interrupts the application with an STUP interrupt (OTG_DOEPINTx), indicating it can process the received SETUP packet.
  6. 6. The core clears the endpoint enable bit for control OUT endpoints.
  1. 1. Program the OTG_DOEPTSIZx register.
    • – STUPCNT = 3
  2. 2. Wait for the RXFLVL interrupt (OTG_GINTSTS) and empty the data packets from the receive FIFO.
  3. 3. Assertion of the STUP interrupt (OTG_DOEPINTx) marks a successful completion of the SETUP data transfer.
    • – On this interrupt, the application must read the OTG_DOEPTSIZx register to determine the number of SETUP packets received and process the last received SETUP packet.

Figure 453. Processing a SETUP packet

Flowchart illustrating the processing of a SETUP packet. The steps are: Wait for STP in OTG_DOEPINTx, calculate rem_supcnt, read setup_cmd, find setup cmd type, and then branch based on ctrl_rd/wr/2 stage (Read, 2-stage, or Write) to setup_np_in_pkt, status IN phase, or rcv_out_pkt.
graph TD
    A[Wait for STP in OTG_DOEPINTx] --> B["rem_supcnt=
rd_reg(OTG_DOEPTSIZx)"] B --> C["setup_cmd[31:0] = mem[4 - 2 * rem_supcnt]
setup_cmd[63:32] = mem[5 - 2 * rem_supcnt]"] C --> D[Find setup cmd type] D --> E{ctrl_rd/wr/2 stage} E -- Read --> F["setup_np_in_pkt
Data IN phase"] E -- 2-stage --> G["setup_np_in_pkt
Status IN phase"] E -- Write --> H["rcv_out_pkt
Data OUT phase"]

MSv37035V1

Flowchart illustrating the processing of a SETUP packet. The steps are: Wait for STP in OTG_DOEPINTx, calculate rem_supcnt, read setup_cmd, find setup cmd type, and then branch based on ctrl_rd/wr/2 stage (Read, 2-stage, or Write) to setup_np_in_pkt, status IN phase, or rcv_out_pkt.

Per the USB 2.0 specification, normally, during a SETUP packet error, a host does not send more than three back-to-back SETUP packets to the same endpoint. However, the USB 2.0 specification does not limit the number of back-to-back SETUP packets a host can send to the same endpoint. When this condition occurs, the OTG_FS/OTG_HS controller generates an interrupt (B2BSTUP in OTG_DOEPINTx).

Internal data flow:

  1. 1. When the application sets the Global OUT NAK (SGONAK bit in OTG_DCTL), the core stops writing data, except SETUP packets, to the receive FIFO. Irrespective of the space availability in the receive FIFO, non-isochronous OUT tokens receive a NAK handshake response, and the core ignores isochronous OUT data packets
  2. 2. The core writes the Global OUT NAK pattern to the receive FIFO. The application must reserve enough receive FIFO space to write this data pattern.
  3. 3. When the application pops the Global OUT NAK pattern word from the receive FIFO, the core sets the GONAKEFF interrupt (OTG_GINTSTS).
  4. 4. Once the application detects this interrupt, it can assume that the core is in Global OUT NAK mode. The application can clear this interrupt by clearing the SGONAK bit in OTG_DCTL.

Application programming sequence:

  1. 1. To stop receiving any kind of data in the receive FIFO, the application must set the Global OUT NAK bit by programming the following field:
    • – SGONAK = 1 in OTG_DCTL
  2. 2. Wait for the assertion of the GONAKEFF interrupt in OTG_GINTSTS. When asserted, this interrupt indicates that the core has stopped receiving any type of data except SETUP packets.
  3. 3. The application can receive valid OUT packets after it has set SGONAK in OTG_DCTL and before the core asserts the GONAKEFF interrupt (OTG_GINTSTS).
  4. 4. The application can temporarily mask this interrupt by writing to the GONAKEFFM bit in the OTG_GINTMSK register.
    • – GONAKEFFM = 0 in the OTG_GINTMSK register
  5. 5. Whenever the application is ready to exit the Global OUT NAK mode, it must clear the SGONAK bit in OTG_DCTL. This also clears the GONAKEFF interrupt (OTG_GINTSTS).
    • – CGONAK = 1 in OTG_DCTL
  6. 6. If the application has masked this interrupt earlier, it must be unmasked as follows:
    • – GONAKEFFM = 1 in OTG_GINTMSK

The application must use this sequence to disable an OUT endpoint that it has enabled.

Application programming sequence:

  1. 1. Before disabling any OUT endpoint, the application must enable Global OUT NAK mode in the core.
    • – SGONAK = 1 in OTG_DCTL
  2. 2. Wait for the GONAKEFF interrupt (OTG_GINTSTS)
  3. 3. Disable the required OUT endpoint by programming the following fields:
    • – EPDIS = 1 in OTG_DOEPCTLx
    • – SNAK = 1 in OTG_DOEPCTLx
  4. 4. Wait for the EPDISD interrupt (OTG_DOEPINTx), which indicates that the OUT endpoint is completely disabled. When the EPDISD interrupt is asserted, the core also clears the following bits:
    • – EPDIS = 0 in OTG_DOEPCTLx
    • – EPENA = 0 in OTG_DOEPCTLx
  5. 5. The application must clear the Global OUT NAK bit to start receiving data from other non-disabled OUT endpoints.
    • – SGONAK = 0 in OTG_DCTL

The application must use the following programming sequence to stop any transfers (because of an interrupt from the host, typically a reset).

Sequence of operations:

  1. 1. Enable all OUT endpoints by setting
    • – EPENA = 1 in all OTG_DOEPCTLx registers.
  2. 2. Flush the RxFIFO as follows
    • – Poll OTG_GRSTCTL.AHBIDL until it is 1. This indicates that AHB master is idle.
    • – Perform read modify write operation on OTG_GRSTCTL.RXFFLSH = 1
    • – Poll OTG_GRSTCTL.RXFFLSH until it is 0, but also using a timeout of less than 10 milli-seconds (corresponds to minimum reset signaling duration). If 0 is seen before the timeout, then the RxFIFO flush is successful. If at the moment the timeout occurs, there is still a 1, (this may be due to a packet on EP0 coming from the host) then go back (once only) to the previous step (“Perform read modify write operation”).
  3. 3. Before disabling any OUT endpoint, the application must enable Global OUT NAK mode in the core, according to the instructions in “ Setting the global OUT NAK on page 1342 ”. This ensures that data in the RxFIFO is sent to the application successfully. Set SGONAK = 1 in OTG_DCTL
  4. 4. Wait for the GONAKEFF interrupt (OTG_GINTSTS)
  5. 5. Disable all active OUT endpoints by programming the following register bits:
    • – EPDIS = 1 in registers OTG_DOEPCTLx
    • – SNAK = 1 in registers OTG_DOEPCTLx
  6. 6. Wait for the EPDIS interrupt in OTG_DOEPINTx for each OUT endpoint programmed in the previous step. The EPDIS interrupt in OTG_DOEPINTx indicates that the corresponding OUT endpoint is completely disabled. When the EPDIS interrupt is asserted, the following bits are cleared:
    • – EPENA = 0 in registers OTG_DOEPCTLx
    • – EPDIS = 0 in registers OTG_DOEPCTLx
    • – SNAK = 0 in registers OTG_DOEPCTLx

Generic non-isochronous OUT data transfers

This section describes a regular non-isochronous OUT data transfer (control, bulk, or interrupt).

Application requirements:

  1. 1. Before setting up an OUT transfer, the application must allocate a buffer in the memory to accommodate all data to be received as part of the OUT transfer.
  2. 2. For OUT transfers, the transfer size field in the endpoint's transfer size register must be a multiple of the maximum packet size of the endpoint, adjusted to the word boundary.
    • – transfer size[EPNUM] = \( n \times (\text{MPSIZ[EPNUM]} + 4 - (\text{MPSIZ[EPNUM]} \bmod 4)) \)
    • – packet count[EPNUM] = \( n \)
    • \( n > 0 \)
  3. 3. On any OUT endpoint interrupt, the application must read the endpoint's transfer size register to calculate the size of the payload in the memory. The received payload size can be less than the programmed transfer size.
    • – Payload size in memory = application programmed initial transfer size – core updated final transfer size
    • – Number of USB packets in which this payload was received = application programmed initial packet count – core updated final packet count

Internal data flow:

  1. 1. The application must set the transfer size and packet count fields in the endpoint-specific registers, clear the NAK bit, and enable the endpoint to receive the data.
  2. 2. Once the NAK bit is cleared, the core starts receiving data and writes it to the receive FIFO, as long as there is space in the receive FIFO. For every data packet received on the USB, the data packet and its status are written to the receive FIFO. Every packet (maximum packet size or short packet) written to the receive FIFO decrements the packet count field for that endpoint by 1.
    • – OUT data packets received with bad data CRC are flushed from the receive FIFO automatically.
    • – After sending an ACK for the packet on the USB, the core discards non-isochronous OUT data packets that the host, which cannot detect the ACK, re-sends. The application does not detect multiple back-to-back data OUT packets on the same endpoint with the same data PID. In this case the packet count is not decremented.
    • – If there is no space in the receive FIFO, isochronous or non-isochronous data packets are ignored and not written to the receive FIFO. Additionally, non-isochronous OUT tokens receive a NAK handshake reply.
    • – In all the above three cases, the packet count is not decremented because no data are written to the receive FIFO.
  3. 3. When the packet count becomes 0 or when a short packet is received on the endpoint, the NAK bit for that endpoint is set. Once the NAK bit is set, the isochronous or non-isochronous data packets are ignored and not written to the receive FIFO, and non-isochronous OUT tokens receive a NAK handshake reply.
  4. 4. After the data are written to the receive FIFO, the application reads the data from the receive FIFO and writes it to external memory, one packet at a time per endpoint.
  5. 5. At the end of every packet write on the AHB to external memory, the transfer size for the endpoint is decremented by the size of the written packet.
  6. 6. The OUT data transfer completed pattern for an OUT endpoint is written to the receive FIFO on one of the following conditions:
    • – The transfer size is 0 and the packet count is 0
    • – The last OUT data packet written to the receive FIFO is a short packet ( \( 0 \leq \text{packet size} < \text{maximum packet size} \) )
  7. 7. When either the application pops this entry (OUT data transfer completed), a transfer completed interrupt is generated for the endpoint and the endpoint enable is cleared.

Application programming sequence:

  1. 1. Program the OTG_DOEPTSIZx register for the transfer size and the corresponding packet count.
  2. 2. Program the OTG_DOEPCTLx register with the endpoint characteristics, and set the EPENA and CNAK bits.
    • – EPENA = 1 in OTG_DOEPCTLx
    • – CNAK = 1 in OTG_DOEPCTLx
  3. 3. Wait for the RXFLVL interrupt (in OTG_GINTSTS) and empty the data packets from the receive FIFO.
    • – This step can be repeated many times, depending on the transfer size.
  4. 4. Asserting the XFRC interrupt (OTG_DOEPINTx) marks a successful completion of the non-isochronous OUT data transfer.
  5. 5. Read the OTG_DOEPTSIZx register to determine the size of the received data payload.

This section describes a regular isochronous OUT data transfer.

Application requirements:

  1. 1. All the application requirements for non-isochronous OUT data transfers also apply to isochronous OUT data transfers.
  2. 2. For isochronous OUT data transfers, the transfer size and packet count fields must always be set to the number of maximum-packet-size packets that can be received in a single frame and no more. Isochronous OUT data transfers cannot span more than 1 frame.
  3. 3. The application must read all isochronous OUT data packets from the receive FIFO (data and status) before the end of the periodic frame (EOPF interrupt in OTG_GINTSTS).
  4. 4. To receive data in the following frame, an isochronous OUT endpoint must be enabled after the EOPF (OTG_GINTSTS) and before the SOF (OTG_GINTSTS).

Internal data flow:

  1. 1. The internal data flow for isochronous OUT endpoints is the same as that for non-isochronous OUT endpoints, but for a few differences.
  2. 2. When an isochronous OUT endpoint is enabled by setting the endpoint enable and clearing the NAK bits, the Even/Odd frame bit must also be set appropriately. The core receives data on an isochronous OUT endpoint in a particular frame only if the following condition is met:
    • – EONUM (in OTG_DOEPCTLx) = FNSOF[0] (in OTG_DSTS)
  3. 3. When the application completely reads an isochronous OUT data packet (data and status) from the receive FIFO, the core updates the RXDPID field in OTG_DOEPTSIZx with the data PID of the last isochronous OUT data packet read from the receive FIFO.

Application programming sequence:

  1. 1. Program the OTG_DOEPTSIZx register for the transfer size and the corresponding packet count
  2. 2. Program the OTG_DOEPCTLx register with the endpoint characteristics and set the endpoint enable, ClearNAK, and Even/Odd frame bits.
    • – EPENA = 1
    • – CNAK = 1
    • – EONUM = (0: Even/1: Odd)
  3. 3. Wait for the RXFLVL interrupt (in OTG_GINTSTS) and empty the data packets from the receive FIFO
    • – This step can be repeated many times, depending on the transfer size.
  4. 4. The assertion of the XFRC interrupt (in OTG_DOEPINTx) marks the completion of the isochronous OUT data transfer. This interrupt does not necessarily mean that the data in memory are good.
  5. 5. This interrupt cannot always be detected for isochronous OUT transfers. Instead, the application can detect the INCOMPISOOUT interrupt in OTG_GINTSTS.
  6. 6. Read the OTG_DOEPTSIZx register to determine the size of the received transfer and to determine the validity of the data received in the frame. The application must treat the data received in memory as valid only if one of the following conditions is met:
    • – RXDPID = DATA0 (in OTG_DOEPTSIZx) and the number of USB packets in which this payload was received = 1
    • – RXDPID = DATA1 (in OTG_DOEPTSIZx) and the number of USB packets in which this payload was received = 2
    • – RXDPID = D2 (in OTG_DOEPTSIZx) and the number of USB packets in which this payload was received = 3[HS]
      The number of USB packets in which this payload was received =
      Application programmed initial packet count – core updated final packet count
    The application can discard invalid data packets.

This section describes the application programming sequence when isochronous OUT data packets are dropped inside the core.

Internal data flow:

  1. 1. For isochronous OUT endpoints, the XFRC interrupt (in OTG_DOEPINTx) may not always be asserted. If the core drops isochronous OUT data packets, the application may fail to detect the XFRC interrupt (OTG_DOEPINTx) under the following circumstances:
    • – When the receive FIFO cannot accommodate the complete ISO OUT data packet, the core drops the received ISO OUT data
    • – When the isochronous OUT data packet is received with CRC errors
    • – When the isochronous OUT token received by the core is corrupted
    • – When the application is very slow in reading the data from the receive FIFO
  2. 2. When the core detects an end of periodic frame before transfer completion to all isochronous OUT endpoints, it asserts the incomplete isochronous OUT data interrupt (INCOMPISOOUT in OTG_GINTSTS), indicating that an XFRC interrupt (in OTG_DOEPINTx) is not asserted on at least one of the isochronous OUT endpoints. At

this point, the endpoint with the incomplete transfer remains enabled, but no active transfers remain in progress on this endpoint on the USB.

Application programming sequence:

  1. 1. Asserting the INCOMPISOOUT interrupt (OTG_GINTSTS) indicates that in the current frame, at least one isochronous OUT endpoint has an incomplete transfer.
  2. 2. If this occurs because isochronous OUT data is not completely emptied from the endpoint, the application must ensure that the application empties all isochronous OUT data (data and status) from the receive FIFO before proceeding.
    • – When all data are emptied from the receive FIFO, the application can detect the XFRC interrupt (OTG_DOEPINTx). In this case, the application must re-enable the endpoint to receive isochronous OUT data in the next frame.
  3. 3. When it receives an INCOMPISOOUT interrupt (in OTG_GINTSTS), the application must read the control registers of all isochronous OUT endpoints (OTG_DOEPCTLx) to determine which endpoints had an incomplete transfer in the current microframe. An endpoint transfer is incomplete if both the following conditions are met:
    • – EONUM bit (in OTG_DOEPCTLx) = FNSOF[0] (in OTG_DSTS)
    • – EPENA = 1 (in OTG_DOEPCTLx)
  4. 4. The previous step must be performed before the SOF interrupt (in OTG_GINTSTS) is detected, to ensure that the current frame number is not changed.
  5. 5. For isochronous OUT endpoints with incomplete transfers, the application must discard the data in the memory and disable the endpoint by setting the EPDIS bit in OTG_DOEPCTLx.
  6. 6. Wait for the EPDISD interrupt (in OTG_DOEPINTx) and enable the endpoint to receive new data in the next frame.
    • – Because the core can take some time to disable the endpoint, the application may not be able to receive the data in the next frame after receiving bad isochronous data.

Stalling a non-isochronous OUT endpoint

This section describes how the application can stall a non-isochronous endpoint.

  1. 1. Put the core in the Global OUT NAK mode.
  2. 2. Disable the required endpoint
    • – When disabling the endpoint, instead of setting the SNAK bit in OTG_DOEPCTL, set STALL = 1 (in OTG_DOEPCTL).

The STALL bit always takes precedence over the NAK bit.

  1. 3. When the application is ready to end the STALL handshake for the endpoint, the STALL bit (in OTG_DOEPCTLx) must be cleared.
  2. 4. If the application is setting or clearing a STALL for an endpoint due to a SetFeature.Endpoint Halt or ClearFeature.Endpoint Halt command, the STALL bit must be set or cleared before the application sets up the status stage transfer on the control endpoint.

Examples

This section describes and depicts some fundamental transfer types and scenarios.

Figure 454 depicts the reception of a single Bulk OUT data packet from the USB to the AHB and describes the events involved in the process.

Figure 454. Bulk OUT transaction

Sequence diagram of a Bulk OUT transaction showing Host, USB, Device, and Application interactions.

The diagram illustrates the sequence of events for a Bulk OUT transaction. It is divided into four vertical lanes: Host, USB, Device, and Application.

Registers and settings shown in the Application block:

MS36931V1

Sequence diagram of a Bulk OUT transaction showing Host, USB, Device, and Application interactions.

After a SetConfiguration/SetInterface command, the application initializes all OUT endpoints by setting CNAK = 1 and EPENA = 1 (in OTG_DOEPCTLx), and setting a suitable XFRSIZ and PKTCNT in the OTG_DOEPTSIZx register.

  1. host attempts to send data (OUT token) to an endpoint.
  2. When the core receives the OUT token on the USB, it stores the packet in the Rx FIFO because space is available there.
  3. After writing the complete packet in the Rx FIFO, the core then asserts the RXFLVL interrupt (in OTG_GINTSTS).
  4. On receiving the PKTCNT number of USB packets, the core internally sets the NAK bit for this endpoint to prevent it from receiving any more packets.
  5. The application processes the interrupt and reads the data from the Rx FIFO.
  6. When the application has read all the data (equivalent to XFRSIZ), the core generates an XFR interrupt (in OTG_DOEPINTx).
  7. The application processes the interrupt and uses the setting of the XFR interrupt bit (in OTG_DOEPINTx) to determine that the intended transfer is complete.

IN data transfers

This section describes how the application writes data packets to the endpoint FIFO when dedicated transmit FIFOs are enabled.

  1. 1. The application can either choose the polling or the interrupt mode.
    • – In polling mode, the application monitors the status of the endpoint transmit data FIFO by reading the OTG_DTXFSTSx register, to determine if there is enough space in the data FIFO.
    • – In interrupt mode, the application waits for the TXFE interrupt (in OTG_DIEPINTx) and then reads the OTG_DTXFSTSx register, to determine if there is enough space in the data FIFO.
    • – To write a single non-zero length data packet, there must be space to write the entire packet in the data FIFO.
    • – To write zero length packet, the application must not look at the FIFO space.
  2. 2. Using one of the above mentioned methods, when the application determines that there is enough space to write a transmit packet, the application must first write into the endpoint control register, before writing the data into the data FIFO. Typically, the application, must do a read modify write on the OTG_DIEPCTLx register to avoid modifying the contents of the register, except for setting the endpoint enable bit.

The application can write multiple packets for the same endpoint into the transmit FIFO, if space is available. For periodic IN endpoints, the application must write packets only for one microframe. It can write packets for the next periodic transaction only after getting transfer complete for the previous transaction.

Internal data flow:

  1. 1. When the application sets the IN NAK for a particular endpoint, the core stops transmitting data on the endpoint, irrespective of data availability in the endpoint's transmit FIFO.
  2. 2. Non-isochronous IN tokens receive a NAK handshake reply
    • – Isochronous IN tokens receive a zero-data-length packet reply
  3. 3. The core asserts the INEPNE (IN endpoint NAK effective) interrupt in OTG_DIEPINTx in response to the SNAK bit in OTG_DIEPCTLx.
  4. 4. Once this interrupt is seen by the application, the application can assume that the endpoint is in IN NAK mode. This interrupt can be cleared by the application by setting the CNAK bit in OTG_DIEPCTLx.

Application programming sequence:

  1. 1. To stop transmitting any data on a particular IN endpoint, the application must set the IN NAK bit. To set this bit, the following field must be programmed.
    • – SNAK = 1 in OTG_DIEPCTLx
  2. 2. Wait for assertion of the INEPNE interrupt in OTG_DIEPINTx. This interrupt indicates that the core has stopped transmitting data on the endpoint.
  3. 3. The core can transmit valid IN data on the endpoint after the application has set the NAK bit, but before the assertion of the NAK Effective interrupt.
  4. 4. The application can mask this interrupt temporarily by writing to the INEPNEM bit in OTG_DIEPMSK.
    • – INEPNEM = 0 in OTG_DIEPMSK
  5. 5. To exit endpoint NAK mode, the application must clear the NAK status bit (NAKSTS) in OTG_DIEPCTLx. This also clears the INEPNE interrupt (in OTG_DIEPINTx).
    • – CNAK = 1 in OTG_DIEPCTLx
    1. 6. If the application masked this interrupt earlier, it must be unmasked as follows:
      • – INEPNEM = 1 in OTG_DIEPMSK

Use the following sequence to disable a specific IN endpoint that has been previously enabled.

Application programming sequence:

  1. 1. The application must stop writing data on the AHB for the IN endpoint to be disabled.
  2. 2. The application must set the endpoint in NAK mode.
    • – SNAK = 1 in OTG_DIEPCTLx
  3. 3. Wait for the INEPNE interrupt in OTG_DIEPINTx.
  4. 4. Set the following bits in the OTG_DIEPCTLx register for the endpoint that must be disabled.
    • – EPDIS = 1 in OTG_DIEPCTLx
    • – SNAK = 1 in OTG_DIEPCTLx
  5. 5. Assertion of the EPDISD interrupt in OTG_DIEPINTx indicates that the core has completely disabled the specified endpoint. Along with the assertion of the interrupt, the core also clears the following bits:
    • – EPENA = 0 in OTG_DIEPCTLx
    • – EPDIS = 0 in OTG_DIEPCTLx
  6. 6. The application must read the OTG_DIEPTSIz register for the periodic IN EP, to calculate how much data on the endpoint were transmitted on the USB.
  7. 7. The application must flush the data in the endpoint transmit FIFO, by setting the following fields in the OTG_GRSTCTL register:
    • – TXFNUM (in OTG_GRSTCTL) = Endpoint transmit FIFO number
    • – TXFFLSH in (OTG_GRSTCTL) = 1

The application must poll the OTG_GRSTCTL register, until the TXFFLSH bit is cleared by the core, which indicates the end of flush operation. To transmit new data on this endpoint, the application can re-enable the endpoint at a later point.

The application must use the following programming sequence to stop any transfers (because of an interrupt from the host, typically a reset).

Sequence of operations:

  1. 1. Disable the IN endpoint by setting:
    • – EPDIS = 1 in all OTG_DIEPCTLx registers
  2. 2. Wait for the EPDIS interrupt in OTG_DIEPINTx, which indicates that the IN endpoint is completely disabled. When the EPDIS interrupt is asserted the following bits are cleared:
    • – EPDIS = 0 in OTG_DIEPCTLx
    • – EPENA = 0 in OTG_DIEPCTLx
  3. 3. Flush the TxFIFO by programming the following bits:
    • – TXFFLSH = 1 in OTG_GRSTCTL
    • – TXFNUM = “FIFO number specific to endpoint” in OTG_GRSTCTL
  4. 4. The application can start polling till TXFFLSH in OTG_GRSTCTL is cleared. When this bit is cleared, it ensures that there is no data left in the Tx FIFO.

Application requirements:

  1. 1. Before setting up an IN transfer, the application must ensure that all data to be transmitted as part of the IN transfer are part of a single buffer.
  2. 2. For IN transfers, the transfer size field in the endpoint transfer size register denotes a payload that constitutes multiple maximum-packet-size packets and a single short packet. This short packet is transmitted at the end of the transfer.
    • – To transmit a few maximum-packet-size packets and a short packet at the end of the transfer:

      Transfer size[EPNUM] = \( x \times \text{MPSIZ[EPNUM]} + \text{sp} \)

      If (sp > 0), then packet count[EPNUM] = \( x + 1 \) .

      Otherwise, packet count[EPNUM] = \( x \)

    • – To transmit a single zero-length data packet:

      Transfer size[EPNUM] = 0

      Packet count[EPNUM] = 1

    • – To transmit a few maximum-packet-size packets and a zero-length data packet at the end of the transfer, the application must split the transfer into two parts. The first sends maximum-packet-size data packets and the second sends the zero-length data packet alone.

      First transfer: transfer size[EPNUM] = \( x \times \text{MPSIZ[epnum]} \) ; packet count = \( n \) ;

      Second transfer: transfer size[EPNUM] = 0; packet count = 1;

  3. 3. Once an endpoint is enabled for data transfers, the core updates the transfer size register. At the end of the IN transfer, the application must read the transfer size register to determine how much data posted in the transmit FIFO have already been sent on the USB.
  4. 4. Data fetched into transmit FIFO = Application-programmed initial transfer size – core-updated final transfer size
    • – Data transmitted on USB = (application-programmed initial packet count – core updated final packet count) \( \times \text{MPSIZ[EPNUM]} \)
    • – Data yet to be transmitted on USB = (Application-programmed initial transfer size – data transmitted on USB)

Internal data flow:

  1. 1. The application must set the transfer size and packet count fields in the endpoint-specific registers and enable the endpoint to transmit the data.
  2. 2. The application must also write the required data to the transmit FIFO for the endpoint.
  3. 3. Every time a packet is written into the transmit FIFO by the application, the transfer size for that endpoint is decremented by the packet size. The data is fetched from the memory by the application, until the transfer size for the endpoint becomes 0. After writing the data into the FIFO, the “number of packets in FIFO” count is incremented (this is a 3-bit count, internally maintained by the core for each IN endpoint transmit FIFO. The maximum number of packets maintained by the core at any time in an IN endpoint FIFO is eight). For zero-length packets, a separate flag is set for each FIFO, without any data in the FIFO.
  4. 4. Once the data are written to the transmit FIFO, the core reads them out upon receiving an IN token. For every non-isochronous IN data packet transmitted with an ACK handshake, the packet count for the endpoint is decremented by one, until the packet count is zero. The packet count is not decremented on a timeout.
  5. 5. For zero length packets (indicated by an internal zero length flag), the core sends out a zero-length packet for the IN token and decrements the packet count field.
  6. 6. If there are no data in the FIFO for a received IN token and the packet count field for that endpoint is zero, the core generates an “IN token received when Tx FIFO is empty” (ITTxFE) interrupt for the endpoint, provided that the endpoint NAK bit is not set. The core responds with a NAK handshake for non-isochronous endpoints on the USB.
  7. 7. The core internally rewinds the FIFO pointers and no timeout interrupt is generated.
  8. 8. When the transfer size is 0 and the packet count is 0, the transfer complete (XFRC) interrupt for the endpoint is generated and the endpoint enable is cleared.

Application programming sequence:

  1. 1. Program the OTG_DIEPTSIZx register with the transfer size and corresponding packet count.
  2. 2. Program the OTG_DIEPCTLx register with the endpoint characteristics and set the CNAK and EPENA (endpoint enable) bits.
  3. 3. When transmitting non-zero length data packet, the application must poll the OTG_DTXFSTSx register (where x is the FIFO number associated with that endpoint) to determine whether there is enough space in the data FIFO. The application can optionally use TXFE (in OTG_DIEPINTx) before writing the data.

This section describes a typical periodic IN data transfer.

Application requirements:

  1. 1. Application requirements 1, 2, 3, and 4 of Generic non-periodic IN data transfers on page 1352 also apply to periodic IN data transfers, except for a slight modification of requirement 2.
    • – The application can only transmit multiples of maximum-packet-size data packets or multiples of maximum-packet-size packets, plus a short packet at the end. To

transmit a few maximum-packet-size packets and a short packet at the end of the transfer, the following conditions must be met:

transfer size[EPNUM] = \( x \times \text{MPSIZ}[\text{EPNUM}] + \text{sp} \)

(where \( x \) is an integer \( \geq 0 \) , and \( 0 \leq \text{sp} < \text{MPSIZ}[\text{EPNUM}] \) )

If ( \( \text{sp} > 0 \) ), packet count[EPNUM] = \( x + 1 \)

Otherwise, packet count[EPNUM] = \( x \) ;

MCNT[EPNUM] = packet count[EPNUM]

    • – The application cannot transmit a zero-length data packet at the end of a transfer. It can transmit a single zero-length data packet by itself. To transmit a single zero-length data packet:
    • – transfer size[EPNUM] = 0
    • – packet count[EPNUM] = 1
    • – MCNT[EPNUM] = packet count[EPNUM]
    1. 2. The application can only schedule data transfers one frame at a time.
      • \( (\text{MCNT} - 1) \times \text{MPSIZ} \leq \text{XFERSIZ} \leq \text{MCNT} \times \text{MPSIZ} \)
      • – PKTCNT = MCNT (in OTG_DIEPTSIZx)
      • – If \( \text{XFERSIZ} < \text{MCNT} \times \text{MPSIZ} \) , the last data packet of the transfer is a short packet.
      • – Note that: MCNT is in OTG_DIEPTSIZx, MPSIZ is in OTG_DIEPCTLx, PKTCNT is in OTG_DIEPTSIZx and XFERSIZ is in OTG_DIEPTSIZx
    2. 3. The complete data to be transmitted in the frame must be written into the transmit FIFO by the application, before the IN token is received. Even when 1 word of the data to be transmitted per frame is missing in the transmit FIFO when the IN token is received, the core behaves as when the FIFO is empty. When the transmit FIFO is empty:
      • – A zero data length packet would be transmitted on the USB for isochronous IN endpoints
      • – A NAK handshake would be transmitted on the USB for interrupt IN endpoints

Internal data flow:

  1. 1. The application must set the transfer size and packet count fields in the endpoint-specific registers and enable the endpoint to transmit the data.
  2. 2. The application must also write the required data to the associated transmit FIFO for the endpoint.
  3. 3. Every time the application writes a packet to the transmit FIFO, the transfer size for that endpoint is decremented by the packet size. The data are fetched from application memory until the transfer size for the endpoint becomes 0.
  4. 4. When an IN token is received for a periodic endpoint, the core transmits the data in the FIFO, if available. If the complete data payload (complete packet, in dedicated FIFO

mode) for the frame is not present in the FIFO, then the core generates an IN token received when Tx FIFO empty interrupt for the endpoint.

    • – A zero-length data packet is transmitted on the USB for isochronous IN endpoints
    • – A NAK handshake is transmitted on the USB for interrupt IN endpoints
    1. 5. The packet count for the endpoint is decremented by 1 under the following conditions:
      • – For isochronous endpoints, when a zero- or non-zero-length data packet is transmitted
      • – For interrupt endpoints, when an ACK handshake is transmitted
      • – When the transfer size and packet count are both 0, the transfer completed interrupt for the endpoint is generated and the endpoint enable is cleared.
    2. 6. At the “Periodic frame Interval” (controlled by PFIVL in OTG_DCFG), when the core finds non-empty any of the isochronous IN endpoint FIFOs scheduled for the current frame non-empty, the core generates an IISOIXFR interrupt in OTG_GINTSTS.

Application programming sequence:

  1. 1. Program the OTG_DIEPCTLx register with the endpoint characteristics and set the CNAK and EPENA bits.
  2. 2. Write the data to be transmitted in the next frame to the transmit FIFO.
  3. 3. Asserting the ITTXFE interrupt (in OTG_DIEPINTx) indicates that the application has not yet written all data to be transmitted to the transmit FIFO.
  4. 4. If the interrupt endpoint is already enabled when this interrupt is detected, ignore the interrupt. If it is not enabled, enable the endpoint so that the data can be transmitted on the next IN token attempt.
  5. 5. Asserting the XFRC interrupt (in OTG_DIEPINTx) with no ITTXFE interrupt in OTG_DIEPINTx indicates the successful completion of an isochronous IN transfer. A read to the OTG_DIEPTSIZx register must give transfer size = 0 and packet count = 0, indicating all data were transmitted on the USB.
  6. 6. Asserting the XFRC interrupt (in OTG_DIEPINTx), with or without the ITTXFE interrupt (in OTG_DIEPINTx), indicates the successful completion of an interrupt IN transfer. A read to the OTG_DIEPTSIZx register must give transfer size = 0 and packet count = 0, indicating all data were transmitted on the USB.
  7. 7. Asserting the incomplete isochronous IN transfer (IISOIXFR) interrupt in OTG_GINTSTS with none of the aforementioned interrupts indicates the core did not receive at least 1 periodic IN token in the current frame.

• Incomplete isochronous IN data transfers

This section describes what the application must do on an incomplete isochronous IN data transfer.

Internal data flow:

  1. 1. An isochronous IN transfer is treated as incomplete in one of the following conditions:
    1. a) The core receives a corrupted isochronous IN token on at least one isochronous IN endpoint. In this case, the application detects an incomplete isochronous IN transfer interrupt (IISOIXFR in OTG_GINTSTS).
    2. b) The application is slow to write the complete data payload to the transmit FIFO and an IN token is received before the complete data payload is written to the FIFO. In this case, the application detects an IN token received when Tx FIFO empty interrupt in OTG_DIEPINTx. The application can ignore this interrupt, as it

eventually results in an incomplete isochronous IN transfer interrupt (IISOIXFR in OTG_GINTSTS) at the end of periodic frame.

The core transmits a zero-length data packet on the USB in response to the received IN token.

  1. 2. The application must stop writing the data payload to the transmit FIFO as soon as possible.
  2. 3. The application must set the NAK bit and the disable bit for the endpoint.
  3. 4. The core disables the endpoint, clears the disable bit, and asserts the endpoint disable interrupt for the endpoint.

Application programming sequence:

  1. 1. The application can ignore the IN token received when Tx FIFO empty interrupt in OTG_DIEPINTx on any isochronous IN endpoint, as it eventually results in an incomplete isochronous IN transfer interrupt (in OTG_GINTSTS).
  2. 2. Assertion of the incomplete isochronous IN transfer interrupt (in OTG_GINTSTS) indicates an incomplete isochronous IN transfer on at least one of the isochronous IN endpoints.
  3. 3. The application must read the endpoint control register for all isochronous IN endpoints to detect endpoints with incomplete IN data transfers.
  4. 4. The application must stop writing data to the Periodic Transmit FIFOs associated with these endpoints on the AHB.
  5. 5. Program the following fields in the OTG_DIEPCTLx register to disable the endpoint:
    • – SNAK = 1 in OTG_DIEPCTLx
    • – EPDIS = 1 in OTG_DIEPCTLx
  6. 6. The assertion of the endpoint disabled interrupt in OTG_DIEPINTx indicates that the core has disabled the endpoint.
    • – At this point, the application must flush the data in the associated transmit FIFO or overwrite the existing data in the FIFO by enabling the endpoint for a new transfer in the next microframe. To flush the data, the application must use the OTG_GRSTCTL register.

This section describes how the application can stall a non-isochronous endpoint.

Application programming sequence:

  1. 1. Disable the IN endpoint to be stalled. Set the STALL bit as well.
  2. 2. EPDIS = 1 in OTG_DIEPCTLx, when the endpoint is already enabled
    • – STALL = 1 in OTG_DIEPCTLx
    • – The STALL bit always takes precedence over the NAK bit
  3. 3. Assertion of the endpoint disabled interrupt (in OTG_DIEPINTx) indicates to the application that the core has disabled the specified endpoint.
  4. 4. The application must flush the non-periodic or periodic transmit FIFO, depending on the endpoint type. In case of a non-periodic endpoint, the application must re-enable the other non-periodic endpoints that do not need to be stalled, to transmit data.
  5. 5. Whenever the application is ready to end the STALL handshake for the endpoint, the STALL bit must be cleared in OTG_DIEPCTLx.
  6. 6. If the application sets or clears a STALL bit for an endpoint due to a SetFeature.Endpoint Halt command or ClearFeature.Endpoint Halt command, the STALL bit must be set or cleared before the application sets up the status stage transfer on the control endpoint.

Special case: stalling the control OUT endpoint

The core must stall IN/OUT tokens if, during the data stage of a control transfer, the host sends more IN/OUT tokens than are specified in the SETUP packet. In this case, the application must enable the ITTXFE interrupt in OTG_DIEPINTx and the OTEPDIS interrupt in OTG_DOEPINTx during the data stage of the control transfer, after the core has transferred the amount of data specified in the SETUP packet. Then, when the application receives this interrupt, it must set the STALL bit in the corresponding endpoint control register, and clear this interrupt.

32.16.7 Worst case response time

When the OTG_FS/OTG_HS controller acts as a device, there is a worst case response time for any tokens that follow an isochronous OUT. This worst case response time depends on the AHB clock frequency.

The core registers are in the AHB domain, and the core does not accept another token before updating these register values. The worst case is for any token following an isochronous OUT, because for an isochronous transaction, there is no handshake and the next token may come sooner. This worst case value is 7 PHY clocks when the AHB clock is the same as the PHY clock. When the AHB clock is faster, this value is smaller.

If this worst case condition occurs, the core responds to bulk/interrupt tokens with a NAK and drops isochronous and SETUP tokens. The host interprets this as a timeout condition for SETUP and retries the SETUP packet. For isochronous transfers, the Incomplete isochronous IN transfer interrupt (IISOIXFR) and Incomplete isochronous OUT transfer interrupt (IISOOXFR) inform the application that isochronous IN/OUT packets were dropped.

Choosing the value of TRDT in OTG_GUSBCFG

The value in TRDT (OTG_GUSBCFG) is the time it takes for the MAC, in terms of PHY clocks after it has received an IN token, to get the FIFO status, and thus the first data from the PFC block. This time involves the synchronization delay between the PHY and AHB clocks. The worst case delay for this is when the AHB clock is the same as the PHY clock. In this case, the delay is 5 clocks.

Once the MAC receives an IN token, this information (token received) is synchronized to the AHB clock by the PFC (the PFC runs on the AHB clock). The PFC then reads the data from the SPRAM and writes them into the dual clock source buffer. The MAC then reads the data out of the source buffer (4 deep).

If the AHB is running at a higher frequency than the PHY, the application can use a smaller value for TRDT (in OTG_GUSBFG).

Figure 455 has the following signals:

To calculate the value of TRDT, refer to Table 235: TRDT values (FS) or Table 236: TRDT values (HS) .

Figure 455. TRDT max timing case

Timing diagram for TRDT max timing case showing signals HCLK, PCLK, tkn_rcvd, dsynced_tkn_rcvd, spr_read, spr_addr, spr_rdata, srcbuf_push, and srcbuf_rdata over a 200ns period. The diagram shows a sequence of events labeled 1 through 8. HCLK and PCLK are periodic signals. tkn_rcvd is a signal that goes high at point 1 and stays high. dsynced_tkn_rcvd is a signal that goes high at point 3 and stays high. spr_read is a signal that goes high at point 3 and stays high until point 4. spr_addr is a signal that is high from point 3 to point 4, labeled A1. spr_rdata is a signal that is high from point 4 to point 5, labeled D1. srcbuf_push is a signal that goes high at point 4 and stays high until point 5. srcbuf_rdata is a signal that is high from point 5 to point 6, labeled D1. A horizontal double-headed arrow at the bottom indicates a duration of 5 Clocks between point 1 and point 6. The time scale at the top is 0ns, 50ns, 100ns, 150ns, 200ns. The diagram is labeled ai15680 in the bottom right corner.
Timing diagram for TRDT max timing case showing signals HCLK, PCLK, tkn_rcvd, dsynced_tkn_rcvd, spr_read, spr_addr, spr_rdata, srcbuf_push, and srcbuf_rdata over a 200ns period. The diagram shows a sequence of events labeled 1 through 8. HCLK and PCLK are periodic signals. tkn_rcvd is a signal that goes high at point 1 and stays high. dsynced_tkn_rcvd is a signal that goes high at point 3 and stays high. spr_read is a signal that goes high at point 3 and stays high until point 4. spr_addr is a signal that is high from point 3 to point 4, labeled A1. spr_rdata is a signal that is high from point 4 to point 5, labeled D1. srcbuf_push is a signal that goes high at point 4 and stays high until point 5. srcbuf_rdata is a signal that is high from point 5 to point 6, labeled D1. A horizontal double-headed arrow at the bottom indicates a duration of 5 Clocks between point 1 and point 6. The time scale at the top is 0ns, 50ns, 100ns, 150ns, 200ns. The diagram is labeled ai15680 in the bottom right corner.

32.16.8 OTG programming model

The OTG_FS/OTG_HS controller is an OTG device supporting HNP and SRP. When the core is connected to an “A” plug, it is referred to as an A-device. When the core is connected to a “B” plug it is referred to as a B-device. In host mode, the OTG_FS/OTG_HS controller turns off V BUS to conserve power. SRP is a method by which the B-device signals the A-device to turn on V BUS power. A device must perform both data-line pulsing and V BUS pulsing, but a host can detect either data-line pulsing or V BUS pulsing for SRP. HNP is a method by which the B-device negotiates and switches to host role. In Negotiated mode after HNP, the B-device suspends the bus and reverts to the device role.

A-device session request protocol

The application must set the SRP-capable bit in the core USB configuration register. This enables the OTG_FS/OTG_HS controller to detect SRP as an A-device.

Figure 456. A-device SRP

Timing diagram for A-device SRP showing signal transitions for DRV_VBUS, VBUS_VALID, A_VALID, D+, and D- lines over time. The diagram illustrates the sequence of events from suspend to connect, with numbered points 1 through 7 indicating key transitions.

The figure is a timing diagram showing the signal levels for five USB lines over time during an A-device Session Request Protocol (SRP). The lines are DRV_VBUS, VBUS_VALID, A_VALID, D+, and D-. The sequence of events is numbered 1 through 7:

The D- line remains at a Low level throughout the entire sequence. The diagram is labeled with 'ai15681c' in the bottom right corner.

Timing diagram for A-device SRP showing signal transitions for DRV_VBUS, VBUS_VALID, A_VALID, D+, and D- lines over time. The diagram illustrates the sequence of events from suspend to connect, with numbered points 1 through 7 indicating key transitions.
  1. DRV_VBUS = V BUS drive signal to the PHY
  2. VBUS_VALID = V BUS valid signal from PHY
  3. A_VALID = A-peripheral V BUS level signal to PHY
  4. D+ = Data plus line
  5. D- = Data minus line

The following points refer and describe the signal numeration shown in the Figure 456 :

  1. To save power, the application suspends and turns off port power when the bus is idle by writing the port suspend and port power bits in the host port control and status register.
  2. PHY indicates port power off by deasserting the VBUS_VALID signal.
  3. The device must detect SE0 for at least 2 ms to start SRP when V BUS power is off.
  4. To initiate SRP, the device turns on its data line pull-up resistor for 5 to 10 ms. The OTG_FS/OTG_HS controller detects data-line pulsing.
  5. The device drives V BUS above the A-device session valid (2.0 V minimum) for V BUS pulsing.
    The OTG_FS/OTG_HS controller interrupts the application on detecting SRP. The session request detected bit is set in Global interrupt status register (SRQINT set in OTG_GINTSTS).
  6. The application must service the session request detected interrupt and turn on the port power bit by writing the port power bit in the host port control and status register. The PHY indicates port power-on by asserting the VBUS_VALID signal.
  7. When the USB is powered, the device connects, completing the SRP process.

B-device session request protocol

The application must set the SRP-capable bit in the core USB configuration register. This enables the OTG_FS/OTG_HS controller to initiate SRP as a B-device. SRP is a means by which the OTG_FS/OTG_HS controller can request a new session from the host.

Figure 457. B-device SRP

Timing diagram for B-device SRP showing signal transitions for VBUS_VALID, B_VALID, DISCHRG_VBUS, SESS_END, DP, DM, and CHRG_VBUS over time. The diagram illustrates the sequence of events from suspension to connection.

The figure is a timing diagram showing the sequence of signals for B-device SRP. It includes seven signal lines: VBUS_VALID, B_VALID, DISCHRG_VBUS, SESS_END, DP, DM, and CHRG_VBUS. The sequence is numbered 1 through 8:

DM is shown as Low throughout the sequence. The diagram is labeled ai15682c in the bottom right corner.

Timing diagram for B-device SRP showing signal transitions for VBUS_VALID, B_VALID, DISCHRG_VBUS, SESS_END, DP, DM, and CHRG_VBUS over time. The diagram illustrates the sequence of events from suspension to connection.
  1. 1. VBUS_VALID = V BUS valid signal from PHY
    B_VALID = B-peripheral valid session to PHY
    DISCHRG_VBUS = discharge signal to PHY
    SESS_END = session end signal to PHY
    CHRG_VBUS = charge V BUS signal to PHY
    DP = Data plus line
    DM = Data minus line

The following points refer and describe the signal numeration shown in the Figure 457 :

  1. 1. To save power, the host suspends and turns off port power when the bus is idle. The OTG_FS/OTG_HS controller sets the early suspend bit in the core interrupt register after 3 ms of bus idleness. Following this, the OTG_FS/OTG_HS controller sets the USB suspend bit in the core interrupt register. The OTG_FS/OTG_HS controller informs the PHY to discharge V BUS .
  2. 2. The PHY indicates the session's end to the device. This is the initial condition for SRP. The OTG_FS/OTG_HS controller requires 2 ms of SE0 before initiating SRP. For a USB 1.1 full-speed serial transceiver, the application must wait until V BUS discharges to 0.2 V after BSVLD (in OTG_GOTGCTL) is deasserted. This discharge time can be obtained from the transceiver vendor and varies from one transceiver to another.
  3. 3. The OTG_FS/OTG_HS core informs the PHY to speed up V BUS discharge.
  4. 4. The application initiates SRP by writing the session request bit in the OTG control and status register. The OTG_FS/OTG_HS controller perform data-line pulsing followed by V BUS pulsing.
  5. 5. The host detects SRP from either the data-line or V BUS pulsing, and turns on V BUS . The PHY indicates V BUS power-on to the device.
  6. 6. The OTG_FS/OTG_HS controller performs V BUS pulsing. The host starts a new session by turning on V BUS , indicating SRP success. The OTG_FS/OTG_HS controller interrupts the application by setting the session request

success status change bit in the OTG interrupt status register. The application reads the session request success bit in the OTG control and status register.

  1. When the USB is powered, the OTG_FS/OTG_HS controller connects, completing the SRP process.

A-device host negotiation protocol

HNP switches the USB host role from the A-device to the B-device. The application must set the HNP-capable bit in the core USB configuration register to enable the OTG_FS/OTG_HS controller to perform HNP as an A-device.

Figure 458. A-device HNP

Timing diagram for A-device HNP showing OTG core, DP, DM, DPPULLDOWN, and DMPULLDOWN signals over time with numbered states 1-8.

The diagram illustrates the signal states for A-device HNP across five lines: OTG core, DP, DM, DPPULLDOWN, and DMPULLDOWN. The OTG core line shows a transition from Host to Device and back to Host at point 1. The DP line shows states: Suspend (2), a low-voltage state (3), a high-voltage state (4), Reset (5), Traffic (6), another low-voltage state (7), and Connect (8). The DM line shows a Traffic state between points 5 and 7. The DPPULLDOWN and DMPULLDOWN lines show a low state from point 2 to 7, returning to high at point 8. The identifier 'ai15683' is in the bottom right.

Timing diagram for A-device HNP showing OTG core, DP, DM, DPPULLDOWN, and DMPULLDOWN signals over time with numbered states 1-8.
  1. DPPULLDOWN = signal from core to PHY to enable/disable the pull-down on the DP line inside the PHY. DMPULLDOWN = signal from core to PHY to enable/disable the pull-down on the DM line inside the PHY.

The following points refer and describe the signal numeration shown in the Figure 458 :

  1. The OTG_FS/OTG_HS controller sends the B-device a SetFeature b_hnp_enable descriptor to enable HNP support. The B-device's ACK response indicates that the B-device supports HNP. The application must set host Set HNP enable bit in the OTG

control and status register to indicate to the OTG_FS/OTG_HS controller that the B-device supports HNP.

  1. 2. When it has finished using the bus, the application suspends by writing the port suspend bit in the host port control and status register.
  2. 3. When the B-device observes a USB suspend, it disconnects, indicating the initial condition for HNP. The B-device initiates HNP only when it must switch to the host role; otherwise, the bus continues to be suspended.

The OTG_FS/OTG_HS controller sets the host negotiation detected interrupt in the OTG interrupt status register, indicating the start of HNP.

The OTG_FS/OTG_HS controller deasserts the DM pull down and DM pull down in the PHY to indicate a device role. The PHY enables the OTG_DP pull-up resistor to indicate a connect for B-device.

The application must read the current mode bit in the OTG control and status register to determine device mode operation.

  1. 4. The B-device detects the connection, issues a USB reset, and enumerates the OTG_FS/OTG_HS controller for data traffic.
  2. 5. The B-device continues the host role, initiating traffic, and suspends the bus when done.

    The OTG_FS/OTG_HS controller sets the early suspend bit in the core interrupt register after 3 ms of bus idleness. Following this, the OTG_FS/OTG_HS controller sets the USB suspend bit in the core interrupt register.

  3. 6. In Negotiated mode, the OTG_FS/OTG_HS controller detects the suspend, disconnects, and switches back to the host role. The OTG_FS/OTG_HS controller asserts the DM pull down and DM pull down in the PHY to indicate its assumption of the host role.
  4. 7. The OTG_FS/OTG_HS controller sets the connector ID status change interrupt in the OTG interrupt status register. The application must read the connector ID status in the OTG control and status register to determine the OTG_FS/OTG_HS controller operation as an A-device. This indicates the completion of HNP to the application. The application must read the Current mode bit in the OTG control and status register to determine host mode operation.
  5. 8. The B-device connects, completing the HNP process.

B-device host negotiation protocol

HNP switches the USB host role from B-device to A-device. The application must set the HNP-capable bit in the core USB configuration register to enable the OTG_FS/OTG_HS controller to perform HNP as a B-device.

Figure 459. B-device HNP

Timing diagram for B-device HNP showing signal transitions for OTG core, DP, DM, DPPULLDOWN, and DMPULLDOWN lines over time. The diagram is divided into three horizontal sections: OTG core (Device, Host, Device), DP (Suspend, Reset, Traffic, Connect), and DM (Traffic). Vertical lines 1-8 mark key events: 1. Host negotiation start; 2. Suspend; 3. SE0 detection; 4. Reset; 5. Traffic; 6. Traffic; 7. Connect; 8. Connect. Pull-down signals DPPULLDOWN and DMPULLDOWN are shown as active-low signals that go low during the Host phase.
Timing diagram for B-device HNP showing signal transitions for OTG core, DP, DM, DPPULLDOWN, and DMPULLDOWN lines over time. The diagram is divided into three horizontal sections: OTG core (Device, Host, Device), DP (Suspend, Reset, Traffic, Connect), and DM (Traffic). Vertical lines 1-8 mark key events: 1. Host negotiation start; 2. Suspend; 3. SE0 detection; 4. Reset; 5. Traffic; 6. Traffic; 7. Connect; 8. Connect. Pull-down signals DPPULLDOWN and DMPULLDOWN are shown as active-low signals that go low during the Host phase.
  1. 1. DPPULLDOWN = signal from core to PHY to enable/disable the pull-down on the DP line inside the PHY.
    DMPULLDOWN = signal from core to PHY to enable/disable the pull-down on the DM line inside the PHY.

The following points refer and describe the signal numeration shown in the Figure 459 :

  1. 1. The A-device sends the SetFeature b_hnp_enable descriptor to enable HNP support. The OTG_FS/OTG_HS controller's ACK response indicates that it supports HNP. The application must set the device HNP enable bit in the OTG control and status register to indicate HNP support.

The application sets the HNP request bit in the OTG control and status register to indicate to the OTG_FS/OTG_HS controller to initiate HNP.

  1. 2. When it has finished using the bus, the A-device suspends by writing the port suspend bit in the host port control and status register.

The OTG_FS/OTG_HS controller sets the Early suspend bit in the core interrupt register after 3 ms of bus idleness. Following this, the OTG_FS/OTG_HS controller sets the USB suspend bit in the core interrupt register.

The OTG_FS/OTG_HS controller disconnects and the A-device detects SE0 on the bus, indicating HNP. The OTG_FS/OTG_HS controller asserts the DP pull down and DM pull down in the PHY to indicate its assumption of the host role.

The A-device responds by activating its OTG_DP pull-up resistor within 3 ms of detecting SE0. The OTG_FS/OTG_HS controller detects this as a connect.

The OTG_FS/OTG_HS controller sets the host negotiation success status change interrupt in the OTG interrupt status register, indicating the HNP status. The application must read the host negotiation success bit in the OTG control and status register to

determine host negotiation success. The application must read the current Mode bit in the core interrupt register (OTG_GINTSTS) to determine host mode operation.

  1. 3. The application sets the reset bit (PRST in OTG_HPRT) and the OTG_FS/OTG_HS controller issues a USB reset and enumerates the A-device for data traffic.
  2. 4. The OTG_FS/OTG_HS controller continues the host role of initiating traffic, and when done, suspends the bus by writing the port suspend bit in the host port control and status register.
  3. 5. In Negotiated mode, when the A-device detects a suspend, it disconnects and switches back to the host role. The OTG_FS/OTG_HS controller deasserts the DP pull down and DM pull down in the PHY to indicate the assumption of the device role.
  4. 6. The application must read the current mode bit in the core interrupt (OTG_GINTSTS) register to determine the host mode operation.
  5. 7. The OTG_FS/OTG_HS controller connects, completing the HNP process.