FX3 Manual PROGRAMMERS

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 138

DownloadFX3 Manual PROGRAMMERS
Open PDF In BrowserView PDF
FX3 Programmers Manual
Doc. # 001-64707 Rev. *K

Cypress Semiconductor
198 Champion Court
San Jose, CA 95134-1709
http://www.cypress.com

Copyrights

Copyrights
© Cypress Semiconductor Corporation, 2011-2018. This document is the property of Cypress Semiconductor Corporation
and its subsidiaries, including Spansion LLC ("Cypress"). This document, including any software or firmware included or
referenced in this document ("Software"), is owned by Cypress under the intellectual property laws and treaties of the United
States and other countries worldwide. Cypress reserves all rights under such laws and treaties and does not, except as
specifically stated in this paragraph, grant any license under its patents, copyrights, trademarks, or other intellectual property
rights. If the Software is not accompanied by a license agreement and you do not otherwise have a written agreement with
Cypress governing the use of the Software, then Cypress hereby grants you a personal, non-exclusive, nontransferable
license (without the right to sublicense) (1) under its copyright rights in the Software (a) for Software provided in source code
form, to modify and reproduce the Software solely for use with Cypress hardware products, only internally within your
organization, and (b) to distribute the Software in binary code form externally to end users (either directly or indirectly through
resellers and distributors), solely for use on Cypress hardware product units, and (2) under those claims of Cypress's patents
that are infringed by the Software (as provided by Cypress, unmodified) to make, use, distribute, and import the Software
solely for use with Cypress hardware products. Any other use, reproduction, modification, translation, or compilation of the
Software is prohibited.
TO THE EXTENT PERMITTED BY APPLICABLE LAW, CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, WITH REGARD TO THIS DOCUMENT OR ANY SOFTWARE OR ACCOMPANYING HARDWARE, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. No computing device can be absolutely secure. Therefore, despite security measures implemented in Cypress
hardware or software products, Cypress does not assume any liability arising out of any security breach, such as
unauthorized access to or use of a Cypress product. In addition, the products described in these materials may contain
design defects or errors known as errata which may cause the product to deviate from published specifications. To the extent
permitted by applicable law, Cypress reserves the right to make changes to this document without further notice.
Cypress does not assume any liability arising out of the application or use of any product or circuit described in this document.
Any information provided in this document, including any sample design information or programming code, is provided only
for reference purposes. It is the responsibility of the user of this document to properly design, program, and test the
functionality and safety of any application made of this information and any resulting product. Cypress products are not
designed, intended, or authorized for use as critical components in systems designed or intended for the operation of
weapons, weapons systems, nuclear installations, life-support devices or systems, other medical devices or systems
(including resuscitation equipment and surgical implants), pollution control or hazardous substances management, or other
uses where the failure of the device or system could cause personal injury, death, or property damage ("Unintended Uses"). A
critical component is any component of a device or system whose failure to perform can be reasonably expected to cause the
failure of the device or system, or to affect its safety or effectiveness. Cypress is not liable, in whole or in part, and you shall
and hereby do release Cypress from any claim, damage, or other liability arising from or related to all Unintended Uses of
Cypress products. You shall indemnify and hold Cypress harmless from and against all claims, costs, damages, and other
liabilities, including claims for personal injury or death, arising from or related to any Unintended Uses of Cypress products.
Cypress, the Cypress logo, Spansion, the Spansion logo, and combinations thereof, WICED, PSoC, CapSense, EZ-USB,
F-RAM, and Traveo are trademarks or registered trademarks of Cypress in the United States and other countries. For a more
complete list of Cypress trademarks, visit cypress.com. Other names and brands may be claimed as property of their respective owners.

2

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Contents

1. Introduction
1.1
1.2
1.3

Chapter Overview ......................................................................................................11
Document Revision History ......................................................................................11
Documentation Conventions .....................................................................................12

2. Introduction to USB
2.1

2.2

2.3

9

13

USB 2.0 System Basics.............................................................................................13
2.1.1 Host, Devices, and Hubs................................................................................13
2.1.2 Signaling Rates ..............................................................................................13
2.1.3 Layers of Communication Flow......................................................................13
2.1.4 Device Detection and Enumeration................................................................18
2.1.5 Power Distribution and Management .............................................................19
2.1.6 Device Classes ..............................................................................................19
USB 3.0: Differences and Enhancements over USB 2.0 ...........................................20
2.2.1 USB 3.0 Motivation ........................................................................................20
2.2.2 Protocol Layer ................................................................................................20
2.2.3 Link Layer.......................................................................................................23
2.2.4 Physical Layer................................................................................................23
2.2.5 Power Management .......................................................................................23
Reference Documents ...............................................................................................24

3. FX3 Overview

25

3.1
3.2
3.3
3.4
3.5
3.6

CPU ...........................................................................................................................26
Interconnect Fabric ....................................................................................................27
Memory......................................................................................................................28
Interrupts....................................................................................................................29
JTAG Debugger Interface ..........................................................................................30
Peripherals.................................................................................................................31
3.6.1 I2S..................................................................................................................31
3.6.2 I2C..................................................................................................................33
3.6.3 UART .............................................................................................................34
3.6.4 SPI .................................................................................................................35
3.6.5 GPIO/Pins ......................................................................................................36
3.6.6 GPIF II............................................................................................................41
3.6.7 Storage Interface............................................................................................42
3.6.8 MIPI-CSI2 Interface........................................................................................43
3.7 DMA Mechanism .......................................................................................................44
3.8 Memory Map and Registers.......................................................................................47
3.9 Reset, Booting, and Renum.......................................................................................48
3.10 Clocking .....................................................................................................................49
3.11 Power.........................................................................................................................51
3.11.1 Power Domains..............................................................................................51

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

3

Contents

3.11.2 Power Management....................................................................................... 51

4. FX3 Software
4.1
4.2
4.3

4.4

4.5

5. FX3 Firmware
5.1

5.2

57

Initialization................................................................................................................ 57
5.1.1 Device Boot ................................................................................................... 59
5.1.2 FX3 Memory Organization ............................................................................. 59
5.1.3 FX3 Memory Map .......................................................................................... 59
API Library.................................................................................................................64
5.2.1 USB Block...................................................................................................... 64
5.2.2 GPIF II Block.................................................................................................. 68
5.2.3 Serial Interfaces ............................................................................................. 69
5.2.4 Storage APIs .................................................................................................. 71
5.2.5 DMA Engine................................................................................................... 72
5.2.6 RTOS and OS Primitives ............................................................................... 80
5.2.7 Debug Support............................................................................................... 81
5.2.8 Power Management....................................................................................... 81
5.2.9 Low Level DMA..............................................................................................81
5.2.10 MIPI-CSI2 Configuration APIs ....................................................................... 82

6. FX3 APIs

83

7. FX3 Application Examples

85

7.1

4

53

System Overview....................................................................................................... 53
FX3 Software Development Kit (SDK)....................................................................... 54
FX3 Firmware Stack .................................................................................................. 54
4.3.1 Firmware Framework ..................................................................................... 54
4.3.2 Firmware API Library ..................................................................................... 54
4.3.3 FX3 Firmware Examples................................................................................ 55
FX3 Host Software .................................................................................................... 55
4.4.1 Cypress Generic USB 3.0 Driver ................................................................... 55
4.4.2 Convenience APIs ......................................................................................... 55
4.4.3 USB Control Center ....................................................................................... 55
4.4.4 Bulkloop ......................................................................................................... 55
4.4.5 Streamer ........................................................................................................ 56
FX3 Development Tools ............................................................................................ 56
4.5.1 Firmware Development Environment............................................................. 56
4.5.2 GPIF II Designer ............................................................................................ 56

DMA Examples.......................................................................................................... 85
7.1.1 USBBulkLoopAuto ......................................................................................... 85
7.1.2 USBBulkLoopAutoSignal ............................................................................... 85
7.1.3 USBBulkLoopManual..................................................................................... 85
7.1.4 USBBulkLoopManualInOut ............................................................................ 86
7.1.5 USBBulkLoopAutoOneToMany...................................................................... 86
7.1.6 USBBulkLoopManualOneToMany .................................................................86
7.1.7 USBBulkLoopAutoManyToOne...................................................................... 86
7.1.8 USBBulkLoopManualManyToOne .................................................................86
7.1.9 USBBulkLoopMulticast .................................................................................. 86
7.1.10 USBBulkLoopManualAdd .............................................................................. 87
7.1.11 USBBulkLoopManualRem ............................................................................. 87
7.1.12 USBBulkLoopLowLevel ................................................................................. 87

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Contents

7.1.13 USBBulkLoopManualDCache ........................................................................87
Basic Examples .........................................................................................................87
7.2.1 RTOSExample ...............................................................................................87
7.2.2 BulkLpAutoCpp ..............................................................................................88
7.2.3 USBBulkLoopAutoEnum ................................................................................88
7.2.4 USBBulkSourceSink ......................................................................................88
7.2.5 USBIsoSourceSink.........................................................................................88
7.2.6 USBIsochLoopAuto........................................................................................88
7.2.7 USBIsochLoopManualInOut...........................................................................88
7.2.8 USBBulkStreams............................................................................................88
7.2.9 USBFlashProg ...............................................................................................89
7.2.10 USBCDCDebug .............................................................................................89
7.2.11 USBDebug .....................................................................................................89
7.2.12 USBHost ........................................................................................................89
7.2.13 USBOtg ..........................................................................................................90
7.2.14 USBBulkLoopOtg ...........................................................................................90
7.2.15 LowPowertest.................................................................................................90
7.2.16 GpifToUsb ......................................................................................................90
7.2.17 USBIsoSource................................................................................................90
7.3 Serial Interface Examples ..........................................................................................91
7.3.1 GPIO Examples .............................................................................................91
7.3.2 UART Examples.............................................................................................91
7.3.3 I2C Examples.................................................................................................92
7.3.4 SPI Examples.................................................................................................92
7.3.5 I2S Examples .................................................................................................92
7.4 USB Video Class Example ........................................................................................93
7.4.1 USBVideoClass..............................................................................................93
7.4.2 USBVideoClassBulk.......................................................................................93
7.5 Slave FIFO Examples................................................................................................93
7.5.1 SlaveFifoAsync ..............................................................................................93
7.5.2 SlaveFifoAsync5Bit ........................................................................................94
7.5.3 SlaveFifoSync ................................................................................................94
7.5.4 SlaveFifoSync5Bit ..........................................................................................94
7.6 USB Audio Class Example ........................................................................................94
7.6.1 USBAudioClass..............................................................................................94
7.7 CX3 Examples ...........................................................................................................94
7.7.1 Cx3Rgb16AS0260 .........................................................................................94
7.7.2 Cx3Rgb24AS0260 .........................................................................................94
7.7.3 Cx3UvcAS0260..............................................................................................95
7.7.4 Cx3UvcOV5640 .............................................................................................95
7.8 Two-Stage Booter (boot_fw) Examples .....................................................................95
7.8.1 BootLedBlink ..................................................................................................95
7.8.2 FX3BootAppGcc ............................................................................................95
7.8.3 BootGpifDemo................................................................................................95
7.9 Mass Storage Class Example....................................................................................96
7.9.1 USBMassStorageDemo .................................................................................96
7.9.2 FX3SMassStorage .........................................................................................96
7.9.3 FX3SRaid0.....................................................................................................96
7.10 FX3S Storage Examples ...........................................................................................96
7.10.1 GpifToStorage ................................................................................................96
7.10.2 FX3SFileSystem ............................................................................................96
7.10.3 FX3SSdioUart ................................................................................................96
7.11 GPIF-II Master Example ............................................................................................97
7.2

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

5

Contents

7.11.1 SRAMMaster.................................................................................................. 97
7.12 FX2G2 Example ........................................................................................................ 97
7.12.1 Fx2g2UvcDemo ............................................................................................. 97
7.13 Co-processor Mode Example .................................................................................... 97
7.13.1 PibSlaveDemo ............................................................................................... 97

8. FX3 Firmware Application Structure
8.1

99

Firmware Application Structure ................................................................................. 99
8.1.1 Initialization Code .......................................................................................... 99
8.1.2 Application Code..........................................................................................103

9. FX3 Serial Peripheral Register Access
9.1

9.2
9.3

10. FX3 P-Port Register Access
10.1
10.2
10.3
10.4

113

Serial Peripheral (LPP) Registers............................................................................113
9.1.1 I2S Registers ............................................................................................... 113
9.1.2 I2C Registers ............................................................................................... 113
9.1.3 UART Registers ........................................................................................... 114
9.1.4 SPI Registers ............................................................................................... 115
FX3 GPIO Register Interface...................................................................................115
9.2.1 Simple GPIO Registers................................................................................ 115
Complex GPIO (PIN) Registers...............................................................................116

117

Glossary ..................................................................................................................118
Externally Visible PP Registers ...............................................................................118
INTR and DRQ Signaling ........................................................................................118
Transferring Data In and Out of Sockets .................................................................119
10.4.1 Bursting and DMA_WMARK ........................................................................ 119
10.4.2 Short Transfer - Full Buffer........................................................................... 119
10.4.3 Short Transfer – Partial Buffer .....................................................................121
10.4.4 Short Transfer – Zero Length Buffers ..........................................................122
10.4.5 Long Transfer – Integral Number of Buffers.................................................123
10.4.6 Long Transfer – Aborted by AP ...................................................................124
10.4.7 Long Transfer – Partial Last Buffer on Ingress ............................................125
10.4.8 Long Transfer – Partial Last Buffer on Egress .............................................125
10.4.9 Odd-Sized Transfers....................................................................................126
10.4.10DMA transfer signalING on ADMUX interface.............................................126

11. FX3 Boot Image Format

129

11.1 Firmware Image Storage Format.............................................................................130

12. FX3 Development Tools

133

12.1 GNU Toolchain ........................................................................................................133
12.2 Eclipse IDE ..............................................................................................................133

13. FX3 Host Software

135

13.1 FX3 Host Software ..................................................................................................135
13.1.1 Cypress Generic Driver................................................................................135
13.1.2 CYAPI Programmer’s Reference .................................................................135
13.1.3 CYUSB.NET Programmer’s Reference .......................................................135
13.1.4 Cy Control Center ........................................................................................136

6

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Contents

14. GPIF™ II Designer

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

137

7

Contents

8

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

1.

Introduction

Cypress EZ-USB® FX3™ is the next-generation USB 3.0 peripheral controller providing highly
integrated and flexible features that enable developers to add USB 3.0 functionality to any system.
Figure 1-1. EZ USB FX3 System Diagram
JTAG Debug
Probe

EZ-USB FX3 Device

JTAG

ARM926EJ-S

Memory
Controller

System
RAM

HS/FS/LS
OTG Host

Data,
Addr,
Ctrl

GPIF™ II
or
PMMC

32
EPs

SS
Peripheral
HS/FS
Peripheral

USB Interface

OTG_ID

µP
ASIC
FPGA
Image Sensor

SSRXSSRX+
SSTXSSTX+
DD+

Charger
Detection
(EZ-Dtect™)

uP
FPGA
Sensor

SD_DAT7

SD/MMC/SDIO
Interface
SD_CMD

I2S

SD_DAT1

SPI

SD_CLK

UART

SD_DAT0

I2C

FX3S Device Only

SD Card
SDIO Device
eMMC Flash

EZ-USB FX3 has a fully configurable, parallel, general programmable interface called GPIF™ II,
which can connect to any processor, ASIC, DSP, image sensor, or FPGA. It has an integrated PHY
and controller along with a 32-bit microcontroller (ARM926EJ-S) for powerful data processing and
for building custom applications. It has an interport DMA architecture that enables data transfers of
greater than 400 MBps.
FX3 is a fully compliant USB 3.0 and USB 2.0 peripheral. An integrated USB 2.0 OTG controller
enables applications that need dual role usage scenarios. It has 512 KB of on-chip SRAM for code
and data. It supports serial peripherals such as UART, SPI, I2C, and I2S that enable communicating
to on board peripherals; for example, the I2C interface is typically connected to an EEPROM.
GPIF II is an enhanced version of the GPIF in FX2LP™, Cypress's flagship USB 2.0 product. It
provides easy and glueless connectivity to popular industry interfaces such as asynchronous and
synchronous Slave FIFO, asynchronous SRAM, asynchronous and synchronous Address Data
Multiplexed interface, parallel ATA, and so on. The GPIF II controller on the FX3 device supports a
total of 256 states. It can be used to implement multiple disjointed state machines.
The FX3 also supports a Pseudo MultiMediaCard (PMMC) or MMC slave interface through which it
can be connected to processors that support an SD or MMC memory interface. This interface uses
the same pins as the GPIF-II and the user has to choose between the GPIF-II and MMC interfaces.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

9

Introduction

The FX2G2 device is a USB 2.0 controller, which supports all other features of the FX3 controller.
The ARM9 core and DMA capabilities, along with the GPIF-II support, make this a high-performance
USB 2.0 controller.
FX3 is fully compliant with USB 3.0 V1.0 Specification and is also backward compatible with USB
2.0. It is also complaint with the Battery Charging Specification V1.1 and USB 2.0 OTG Specification.
The FX3S device is an extension to the FX3 that supports a storage interface that can be connected
to SD cards or eMMC devices. The FX3S device allows developers to add high performance
persistent storage interfaces to their USB design, and supports the SD 3.0 specification and the
MMC 4.41 specification.
The Benicia device is similar to the FX3S device but comes in a smaller wafer-level chip scale
package (WLCSP). The Bay device is a USB 2.0 only version of the Benicia controller. The small
chip footprint and high-performance flash memory support (SD/eMMC) make these devices a good
fit for solutions such as mobile phones.
The SD3 device is a programmable USB 3.0 to SD/eMMC/SDIO bridge device based on the FX3
architecture. This device does not support the GPIF-II or PMMC interfaces.
The EZ-USB CX3 device is an extension of the EZ-USB FX3 device. It includes the ability to
interface with and perform uncompressed video transfers from image sensors implementing the
MIPI CSI-2 interface over a fixed-function GPIF interface.
The FX3 comes with the easy-to-use EZ-USB tools providing a complete solution for fast application
development. The software development kit includes application examples to accelerate time to
market.
The FX3 product family has multiple devices with a varied feature set. The FX3 SDK works with all of
the FX3 and FX3S parts and is capable of identifying the type of device being used at runtime. Refer
to Table 1-1 for details of the features supported by each of the FX3 and FX3S parts.
Table 1-1. Features Supported by FX3 and FX3S Parts
USB 3.0
Support

Host/OTG
Support

GPIF Support

SD/MMC
Support

SRAM size

CYUSB3014

Yes

Yes

Up to 32 bit

No

512 KB

CYUSB3013

Yes

Yes

Up to 16 bit

No

512 KB

CYUSB3012

Yes

Yes

Up to 32 bit

No

256 KB

Part Number

10

CYUSB3011

Yes

Yes

Up to 16 bit

No

256 KB

CYUSB3035 (FX3S)

Yes

Yes

Up to 16 bit

Yes

512 KB

CYUSB3025 (SD3)

Yes

Yes

No

Yes

512 KB

CYUSB2104 (FX2G2)

No

Yes

Up to 32 bit

No

512 KB

CYUSB3065 (CX3)

Yes

No

CSI-2
interface

No

512 KB

CYWB0263 (Benicia)

Yes

Yes

Up to 16 bit

Yes

512 KB

CYWB0163 (Bay)

No

Yes

Up to 16 bit

Yes

512 KB

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Introduction

1.1

Chapter Overview
The following chapters describe in greater detail each of the Programmers Manual components:
Introduction to USB on page 13 presents an overview of the USB standard.
FX3 Overview on page 25 presents a hardware overview of the FX3 system.
FX3 Software on page 53 provides an overview of the SDK that is provided with the FX3.
FX3 Firmware on page 57 provides a brief description of each programmable firmware block. This
includes the system boot and initialization, USB, GPIF 2, serial interfaces, DMA, power
management, and debug infrastructure.
FX3 APIs on page 83 provides the description of the APIs for USB, GPIF2, serial interfaces, DMA,
RTOS, and debug.
FX3 Application Examples on page 85 presents code examples, which illustrate the API usage and
the firmware framework.
FX3 Firmware Application Structure on page 99 describes the FX3 application framework and usage
model for FX3 APIs.
FX3 Serial Peripheral Register Access chapter on page 113 describes the register based access
from an application processor when FX3 device is configured for PP mode slave operation.
FX3 Boot Image Format chapter on page 129 describes the FX3 image (img) format as required by
the FX3 boot-loader.
FX3 Development Tools on page 133 describes the available options for the firmware development
environment, including JTAG based debugging.
FX3 Host Software on page 135 describes the Cypress generic USB 3.0 WDF driver, the
convenience APIs, and the USB control center.
GPIF™ II Designer on page 137 provides a guide to the GPIF II Designer tool.

1.2

Document Revision History
Table 1-2. Revision History
Revision
**
*A
*B
*C

PDF
Origin of
Creation Date Change
05/10/2011
SHRS
07/14/2011
SHRS
03/27/2012
SHRS
08/10/2012
SHRS

*D

02/05/2013

KYS

*E
*F
*G
*H

05/24/2013
09/13/2013
11/21/2013
12/23/2014

KYS
KYS
VOM
KYS

*I

06/23/2015

KYS

*J
*K

03/08/2016
05/22/2018

SUKU
KYS

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Description of Change
New user guide
FX3 Programmers Manual update for beta release.
FX3 Programmers Manual update for FX3 SDK 1.1 release.
FX3 Programmers Manual update for SDK 1.2 release.
Added sections Segger J-Link on page 156, and on page 133
Updated on page 133
Extensive updates throughout the document.
FX3 Programmers Manual update for SDK 1.3 release
Updates for SDK 1.3.1 release
Updates for SDK 1.3.3 release.
No technical updates.
Completing Sunset Review.
Updated for SDK 1.3.4 release.
Updated the template.

11

Introduction

1.3

Documentation Conventions
Table 1-3. Document Conventions for Guides
Convention

12

Usage

Courier New

Displays file locations, user entered text, and source code:
C:\ ...cd\icc\

Italics

Displays file names and reference documentation:
Read about the sourcefile.hex file in the PSoC Designer User Guide.

[Bracketed, Bold]

Displays keyboard commands in procedures:
[Enter] or [Ctrl] [C]

File > Open

Represents menu paths:
File > Open > New Project

Bold

Displays commands, menu paths, and icon names in procedures:
Click the File icon and then click Open.

Times New Roman

Displays an equation:
2+2=4

Text in gray boxes

Describes Cautions or unique functionality of the product.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

2.

Introduction to USB

The universal serial bus (USB) has gained wide acceptance as the connection method of choice for
PC peripherals. Equally successful in the Windows and Macintosh worlds, USB has delivered on its
promises of easy attachment, an end to configuration hassles, and true plug-and-play operation. The
USB is the most successful PC peripheral interconnect ever. In 2006 alone, over 2 billion USB
devices were shipped and there are over 6 billion USB products in the installed base today.

2.1

USB 2.0 System Basics
A USB system is an asynchronous serial communication 'host-centric' design, consisting of a single
host and a myriad of devices and downstream hubs connected in a tiered-star topology. The USB
2.0 Specification supports the low-speed, full-speed, and high-speed data rates. It employs a
half-duplex two-wire signaling featuring unidirectional data flow with negotiated directional bus
transitions.

2.1.1

Host, Devices, and Hubs
The USB system has one master: the host computer. Devices implement specific functions and
transfer data to and from the host (for example: mouse, keyboard, and thumb drives). The host owns
the bus and is responsible for detecting a device as well as initiating and managing transfers
between various devices. Hubs are devices that have one upstream port and multiple down stream
ports and connect multiple devices to the host creating a tiered topology. Associated with a host is
the host controller that manages the communication between the host and various devices. Every
host controller has a root hub associated with it. A maximum of 127 devices may be connected to a
host controller with not more than seven tiers (including root hubs). Because the host is always the
bus master, the USB direction OUT refers to the direction from the host to the device, and IN refers
to the device to host direction.

2.1.2

Signaling Rates
USB 2.0 supports following signaling rates:

2.1.3

■

A low-speed rate of 1.5 Mbit/s is defined by USB 1.0.

■

A full-speed rate of 12 Mbit/s is the basic USB data rate defined by USB 1.1. All USB hubs
support full speed.

■

A high-speed (USB 2.0) rate of 480 Mbit/s introduced in 2001. All high-speed devices are
capable of falling back to full-speed operation if necessary; they are backward compatible.

Layers of Communication Flow
A layered communication model view is adopted to describe the USB system because of its
complexity and generic nature. The components that make up the layers are presented here.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

13

Introduction to USB

Figure 2-1. USB Layers from USB
HOST

DEVICE
Function

Client Software

Interface
X

Pipe Bundle for interface X
manages an interface

Interface
specific data

No USB
format

Buffers

USB System Software

Default pipe
For endpoint 0

Manages devices

Transfers

Data per
endpoint

USB Bus
Interface

USB framed
data
Transactions

2.1.3.1

No USB
format

Endpoint
Zero

USB framed
data

Host
Controller

a collection
of interfaces

Serial
Interface
Engine

USB Logical
Device
a collection
of endpoints

USB framed
data

USB Bus
Interface

Serial
Interface
Engine

USB Wire

Pipes, Endpoints
USB data transfer can occur between the host software and a logical entity on the device called an
endpoint through a logical channel called pipe. A USB device can have up to 32 active pipes, 16 for
data transfers to the host, and 16 from it. An interface is a collection of endpoints working together to
implement a specific function.

2.1.3.2

Descriptors
USB devices describe themselves to the host using a chain of information (bytes) known as
descriptors. Descriptors contain information such as the function the device implements, the
manufacturer of the device, number of endpoints, and class specific information. The first two bytes
of any descriptor specify the length and type of descriptor respectively.
All devices generally have the following descriptors.
■

Device descriptors

■

Configuration descriptors

■

Interface descriptors

■

Endpoint descriptors

■

String descriptors

A device descriptor specifies the Product ID (PID) and Vendor ID (VID) of the device as well as the
USB revision that the device complies with. Among other information listed are the number of
configurations and the maximum packet size for endpoint 0. The host system loads looks at the VID

14

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Introduction to USB

and PID to load the appropriate device drivers. A USB device can have only one device descriptor
associated with it.
The configuration descriptor contains information such as the device's remote wake up feature,
number of interfaces that can exist for the configuration, and the maximum power a particular
configuration uses. Only one configuration of a device can be active at any time.
Each function of the device has an interface descriptor associated with it. An interface descriptor
specifies the number of endpoints associated with that interface and other alternate settings.
Functions that fall under a predefined category are indicated using the interface class code and sub
class code fields. This enables the host to load standard device drivers associated with that function.
More than one interface can be active at any time.
The endpoint descriptor specifies the type of transfer, direction, polling interval, and maximum
packet size for each endpoint. Endpoint 0 is an exception; it does not have any descriptor and is
always configured to be a control endpoint. String descriptors are human-readable strings that identify a USB device and the various interfaces supported by it.

2.1.3.3

Transfer Types
USB defines four transfer types through its pipes. These match the requirements of different data
types that need to be delivered over the bus.
Bulk data is 'bursty,' traveling in packets of 8, 16, 32, or 64 bytes at full speed or 512 bytes at high
speed. Bulk data has guaranteed accuracy, due to an automatic retry mechanism for erroneous
data. The host schedules bulk packets when there is available bus time. Bulk transfers are typically
used for printer, scanner, modem data, and storage devices. Bulk data has built-in flow control
provided by handshake packets.
Interrupt data is similar to bulk data; it can have packet sizes of 1 through 64 bytes at full-speed or up
to 1024 bytes at high-speed. Interrupt endpoints have an associated polling interval that ensures
they are polled (receive an IN token) by the host on a regular basis.
Isochronous data is time-critical and used to stream data similar to audio and video. An isochronous
packet may contain up to 1023 bytes at full-speed, or up to 1024 bytes at high-speed. Time of
delivery is the most important requirement for isochronous data. In every USB frame, a certain
amount of USB bandwidth is allocated to isochronous transfers. To lighten the overhead,
isochronous transfers have no handshake and no retries; error detection is limited to a 16-bit CRC.
Control transfers configure and send commands to a device. Because they are so important, they
employ the most extensive USB error checking. The host reserves a portion of each USB frame for
control transfers.

2.1.3.4

Protocol Layer
The function of the protocol layer is to understand the type of transfer, create the necessary packet
IDs and headers, packet long data and generate CRCs, and pass them on to the link layer. Protocol
level decisions similar to packet retry are also handled in this layer.
All communication over USB happen in the form of packets. Every USB packet, consist of a Packet
ID (PID). These PIDs may fall into one of the four different categories and are listed here.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

15

Introduction to USB

PID Type

PID Name

Token

IN, OUT, SOF, SETUP

Data

DATA0, DATA1, DATA2, MDATA

Handshake

ACK, NAK, STALL, NYET

Special

PRE, ERR, SPLIT, PING

Figure 2-2. USB Packets
1

O
U
T

A
D
D
R

2

E
N
D
P

C
R
C
5

Token Packet

D
A
T
A
1

Data
Payload

Data Packet

3

C
R
C
1
6

A
C
K

4

O
U
T

A
D
D
R

5

E
N
D
P

C
R
C
5

Token Packet

D
A
T
A
0

Data
Payload

6

C
R
C
1
6

A
C
K

Data Packet

A regular pay load data transfer requires at least three packets: Token, Data, and Ack. Figure 2-2
illustrates a USB OUT transfer. Tokens sent by the host are shown in red and tokens sent by the
device are shown in blue. Packet 1 is an OUT token, indicated by the OUT PID. The OUT token signifies that data from the host is about to be transmitted over the bus. Packet 2 contains data, as indicated by the DATA1 PID. Packet 3 is a hand-shake packet, sent by the device using the ACK
(acknowledge) PID to signify to the host that the device received the data error-free. Continuing with
Figure 2-2, a second transaction begins with another OUT token 4, followed by more data 5, this
time using the DATA0 PID. Finally, the device again indicates success by transmitting the ACK PID
in a handshake packet 6.
SETUP tokens are unique to CONTROL transfers. They preface eight bytes of data from which the
peripheral decodes host device requests. At full-speed, start of frame (SOF) tokens occur once per
millisecond. At high speed, each frame contains eight SOF tokens, each denoting a 125-µs
microframe.
Four handshake PIDs indicate the status of a USB transfer: ACK (Acknowledge) means 'success';
the data is received error-free. NAK (Negative Acknowledge) means 'busy, try again.' It is tempting to
assume that NAK means 'error,' but it does not; a USB device indicates an error by not responding.
STALL means that something is wrong (probably as a result of miscommunication or lack of
cooperation between the host and device software). A device sends the STALL handshake to
indicate that it does not understand a device request, that something went wrong on the peripheral
end, or that the host tried to access a resource that was not there. It is similar to HALT, but better,
because USB provides a way to recover from a stall. NYET (Not Yet) has the same meaning as ACK
- the data was received error-free - but also indicates that the endpoint is not yet ready to receive
another OUT transfer. NYET PIDs occur only in high-speed mode. A PRE (Preamble) PID precedes
a low-speed (1.5 Mbps) USB transmission.
One notable feature of the USB 2.0 protocol is the data toggle mechanism. There are two DATA
PIDs (DATA0 and DATA1) in Figure 2-2. As mentioned previously, the ACK handshake is an
indication to the host that the peripheral received data with-out error (the CRC portion of the packet
is used to detect errors). However, the handshake packet can get garbled during transmission. To
detect this, each side (host and device) maintains a 'data toggle' bit, which is toggled between data
packet transfers. The state of this internal toggle bit is compared with the PID that arrives with the
data, either DATA0 or DATA1. When sending data, the host or device sends alternating DATA0DATA1 PIDs. By comparing the received Data PID with the state of its own internal toggle bit, the
receiver can detect a corrupted handshake packet.

16

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Introduction to USB

The PING protocol was introduced in the USB 2.0 specification to avoid wasting bus bandwidth
under certain circumstances. When operating at full speed, every OUT transfer sends the OUT data,
even when the device is busy and cannot accept the data. Such unsuccessful repetitive bulk data
transfers resulted in significant wastage of bus bandwidth. Realizing that this could get worse at high
speed, this issue was remedied by using the new 'Ping' PID. The host first sends a short PING token
to an OUT endpoint, asking if there is room for OUT data in the peripheral device. Only when the
PING is answered by an ACK does the host send the OUT token and data.
The protocol for the interrupt, bulk, isochronous and control transfers are illustrated in the following
figures.
Figure 2-3. Two Bulk Transfers, IN and OUT
1

A
D
D
R

I
N

2

E
N
D
P

D
A
T
A
1

C
R
C
5

3

C
R
C
1
6

Data
Payload

Token Packet

4

A
C
K

A
D
D
R

O
U
T

5

E
N
D
P

C
R
C
5

Token Packet

Data Packet

D
A
T
A
1

Data
Payload

6

C
R
C
1
6

A
C
K

Data Packet

Figure 2-4. Interrupt Transfer
1

A
D
D
R

I
N

2

E
N
D
P

D
A
T
A
1

C
R
C
5

3

C
R
C
1
6

Data
Payload

A
C
K

Data Packet

Token Packet

Figure 2-5. Isochronous Transfer
1

I
N

A
D
D
R

2

E
N
D
P

C
R
C
5

Token Packet

D
A
T
A
0

Data
Payload

C
R
C
1
6

Data Packet

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

17

Introduction to USB

Figure 2-6. Control Transfer
1

S
E
T
U
P

A
D
D
R

2

E
N
D
P

C
R
C
5

D
A
T
A
0

5

E
N
D
P

C
R
C
5

D
A
T
A
1

5

E
N
D
P

C
R
C
5

Token Packet

2.1.3.5

C
R
C
1
6

A
C
K

DATA stage
(optional)

Data Packet

4

A
D
D
R

SETUP
stage

6

Data
Payload

Token Packet

O
U
T

A
C
K

Data Packet

4

I
N

C
R
C
1
6

8 Byte
Setup Data

Token Packet

A
D
D
R

3

D
A
T
A
1

6
C
R
C
1
6

A
C
K

STATUS
stage

Data Packet

Link/Physical Layer
The link layer performs additional tasks to increase the reliability of the data transfer. This includes
byte ordering, line level framing, and so on.
More commonly known as the electrical interface of USB 2.0, this layer consists of circuits to
serialize and de-serialize data, pre and post equalization circuits and circuits to drive and detect
differential signals on the D+ and D– lines. All error handling is done at the protocol layer and there
is no discernible low level link layer to manage errors.

2.1.4

Device Detection and Enumeration
One of the most important advantages of USB over other contemporary communication system is its
plug-and-play capability. A change in termination at the USB port indicates that a USB device is
connected.
When a USB device is first connected to a USB host, the host tries to learn about the device from its
descriptors; this process is called enumeration. The host goes through the following sign on
sequence
1. The host sends a Get Descriptor-Device request to address zero (all USB devices must respond
to address zero when first attached).
2. The device responds to the request by sending ID data back to the host to identify itself.
3. The host sends a Set Address request, which assigns a unique address to the just-attached
device so it may be distinguished from the other devices connected to the bus.

18

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Introduction to USB

4. The host sends more Get Descriptor requests, asking for additional device information. From
this, it learns every-thing else about the device such as number of endpoints, power
requirements, required bus bandwidth, and what driver to load.
All high-speed devices begin the enumeration process in full-speed mode; devices switch to
high-speed operation only after the host and device have agreed to operate at high speed. The
high-speed negotiation process occurs during USB reset, via the 'Chirp' protocol.
Because the FX3 configuration is 'soft', a single chip can take on the identities of multiple distinct
USB devices. When first plugged into USB, the FX3 enumerates automatically and downloads
firmware and USB descriptor tables over the USB cable. A soft disconnect is triggered following
which, the FX3 enumerates again, this time as a device defined by the downloaded information. This
patented two-step process, called ReNumeration™, happens instantly when the device is plugged
in, with no hint that the initial download step had occurred. ReNumeration avoids the need to
physically disconnect and reconnect the device for the change in USB configuration to be visible to
the host controller.

2.1.5

Power Distribution and Management
Power management refers to the part of the USB Specification that spell out how power is allocated
to the devices connected downstream and how different communication layers operate to make best
use of the available bus power under different circumstances.
USB 2.0 supports both self and bus powered devices. Devices indicate this through their descriptors.
Devices, irrespective of their power requirements and capabilities are configured in their low power
state unless the software instructs the host to configure the device in its high power state. Low power
devices can draw up to 100 mA of current and high power devices can draw a maximum of 500 mA.
The USB host can 'suspend' a device to put it into a power-down mode. A 3 ms 'J' state (Differential
'1' indicated by D+ high D– low) on the USB bus triggers the host to issue a suspend request and
enter into a low power state. USB devices are required to enter a low power state in response to this
request.
When necessary, the device or the host issues a Resume. A Resume signal is initiated by driving a
'K' state on the USB bus, requesting that the host or device be taken out of its low power 'suspended'
mode. A USB device can only signal a resume if it has reported (through its Configuration
Descriptor) that it is 'remote wakeup capable', and only if the host has enabled remote wakeup from
that device.
This suspend-resume mechanism minimizes power consumed when activity on the USB bus is
absent.

2.1.6

Device Classes
In an attempt to simplify the development of new devices, commonly used device functions were
identified and nominal drivers were developed to support these devices. The host uses the
information in the class code, subclass code, and protocol code of the device and interface
descriptors to identify if built-in drivers can be loaded to communicate with the device attached. The
human interface device (HID) class and mass storage class (MSC) are some of the commonly used
device classes.
The HID class refers to interactive devices such as mouse, keyboards, and joy sticks. This interface
use control and interrupt transfer types to transfer data because data transfer speeds are not critical.
Data is sent or received using HID reports. Either the device or the interface descriptor contains the
HID class code
The MSC class is primarily intended to transfer data to storage devices. This interface primarily uses
bulk transfer type to transfer data. At least two bulk endpoints for each direction is necessary. The

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

19

Introduction to USB

MSC class uses the SCSI transparent command set to read or write sectors of data on the disk
drive.
Details about other classes can be found at the Implementers forum website http://www.usb.org.

2.2

USB 3.0: Differences and Enhancements over USB 2.0

2.2.1

USB 3.0 Motivation
USB 3.0 is the next stage of USB technology. Its primary goal is to provide the same ease of use,
flexibility, and hot-plug functionality but at a much higher data rate. Another major goal of USB 3.0 is
power management. This is important for "Sync and Go" applications that need to trade off features
for battery life.
The USB 3.0 interface consists of a physical SuperSpeed bus in addition to the physical USB 2.0
bus. The USB 3.0 standard defines a dual simplex signaling mechanism at a rate of 5 Gbits/s.
Inspired by the PCI Express and the OSI 7-layer architecture, the USB 3.0 protocol is also
abstracted into different layers as illustrated in the following sections.
In this document, USB 3.0 implicitly refers to the SuperSpeed portion of USB 3.0.
Figure 2-7. USB Protocol Layers

2.2.2

Protocol Layer
USB 3.0 SuperSpeed inherits the data transfer types from its predecessor retaining the model of
pipes, endpoints and packets. Nonetheless, the type of packets used and some protocols associated
with the bulk, control, isochronous, and control transfers have undergone some changes and
enhancements. These are discussed in the sections to follow.
Link Management packets are sent between links to communicate link level issues such as link
configuration and status and hence travel predominantly between the link layers of the host and the
device. For example, U2 Inactivity Timeout LMP is used to define the timeout from the U1 state to
the U2 state. The structure of a LMP is shown here.

20

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Introduction to USB

Figure 2-8. Link Management Packet Structure

Transaction packets reproduce the functionality provided by the Token and Handshake packets and
travel between the host and endpoints in the device. They do not carry any data but form the core of
the protocol.
For example, the ACK packet is used to acknowledge a packet received. The structure of a
transaction packet is shown in Figure 2-9.
Figure 2-9. ACK Transaction Packet

Data packets actually carry data. These are made up of two parts: a data header and the actual data.
The structure of a data packet is shown on the right.
Isochronous Time Stamp packets contain timestamps and are broadcast by the host to all active
devices. Devices use timestamps to synchronize with the host. These do not have any routing
information. The structure of an ITP is shown in Figure 2-11.
Figure 2-10. Example Data Packet

Figure 2-11. ITP Structure

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

21

Introduction to USB

OUT transfers are initiated by the host by sending a data packet on the downstream bus. The data
packet contains the device routing address and the endpoint number. If the transaction is not an
isochronous transaction, then, on receiving the data packet, the device launches an
acknowledgement packet, which also contains the next packet number in the sequence. This
process continues until all the packets are transmitted unless an endpoint responds with an error
during the transaction. In transfers are initiated by the host by sending an acknowledge packet to the
device containing the device, endpoint address and the number of packets that the host expects.
The device then starts sending the data packets to the host. The response from the host
acknowledges the previous transfer while initiating the next transfer from the device.
One important modification in the USB 3.0 specification is unicasting in place of broadcasting.
Packets in USB 2.0 were broadcast to all devices. This necessitated every connected device to
decode the packet address to check if the packet was targeted at it. Devices had to wake up to any
USB activity regardless of its necessity in the transfer. This resulted in higher idle power. USB 3.0
packets (except ITP) are unicasted to the target. Necessary routing information for hubs is built into
the packet.
Another significant modification introduced in USB 3.0 relates to interrupt transfers. In USB 2.0,
Interrupt transfers were issued by the host every service interval regardless of whether or not the
device was ready for transfers. However, SuperSpeed interrupt endpoints may send an ERDY/
NRDY in return for an interrupt transfer/request from the host. If the device returned an ERDY, the
host continues to interrupt the device endpoint every service interval. If the device returned NRDY,
the host stops interrupt request or transfers to the endpoint until the device asynchronously (not
initiated by the host) notifies ERDY.
One of the biggest advantage the dual simplex bus architecture provides the USB 3.0 protocol with
is the ability to launch multiple packets in one direction without waiting for an acknowledge packet
from the other side which otherwise on a half duplex bus would cause bus contention. This ability is
exploited to form a new protocol that dictates that packets be sent with a packet number, so that any
missing or unfavorable acknowledges that comes after a long latency can be used to trigger the
retransmission of the missed packet identified by the packet number. The number of burst packets
that can be sent (without waiting for acknowledge) is communicated before the transfer.
Another notable feature of USB 3.0 is the stream protocol available for bulk transfers. Normal bulk
(OUT) transfers transfer a single stream of data to an endpoint in the device. Typically, each stream
of data is sourced from a buffer (FIFO) in the transmitter to another buffer (FIFO) in the receiver. The
stream protocol allows the transmitter to associate a stream ID (1-65536) with the current stream
transfer/request. The receiver of the stream or request sources or sinks the data to/from the
appropriate FIFO. This multiplexing of the streams achieves mimicking a pipe which can dynamically
shift its ends. Streams make it possible to realize an out-of-order execution model required for
command queuing. The concept of streams enable more powerful mass storage protocols. A typical
communication link consists of a command OUT pipe, an IN and OUT pipe (with multiple data
streams), and a status pipe. The host can queue commands, that is, issue a new command without
waiting for completion of a prior one, tagging each command with a Stream ID.
Because of the manner in which the USB 3.0 power management is defined, nonactive links (hubs,
devices) may take longer to get activated on seeing bus activity. Isochronous transfers that activate
the links take longer to reach the destination and may violate the service interval requirement. The
Isochronous-PING protocol circumvents this issue. The host sends a PING transfer before an
isochronous transaction. A PING RESPONSE indicates that all links in the path are active (or have
been activated). The host can then send or request an isochronous data packet. USB 2.0
isochronous devices can not enter low power bus state in between service intervals.

22

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

Introduction to USB

2.2.3

Link Layer
The link layer maintains link connectivity and ensures data integrity between link partners by
implementing error detection. The link layer ensure reliable data delivery by framing packet headers
at the transmitting end and detecting link level errors at the receiving end. The link layer also
implements protocols for flow control and participates in power management. The link layer provides
an interface to the protocol layer for pass through of messages between the protocol layers. Link
partners communicate using link commands.

2.2.4

Physical Layer
The two pairs of differential lines, one for OUT transfers and another for IN transfers define the
physical connection between a USB 3.0 SuperSpeed host and the device. The physical layer
accepts one byte at a time, scrambles the bits (a procedure that is known to reduce EMI emissions),
converts it to 10 bits, serializes the bits, and transmits data differentially over a pair of wires. The
clock data recovery circuit helps to recover data at the receiving end. The LFPS (Low frequency
periodic signaling) block is used for initialization and power management when the bus is IDLE.
Detection of SuperSpeed devices is done by looking at the line terminations similar to USB 2.0
devices.

2.2.5

Power Management
USB 3.0 provides enhanced power management capabilities to address the needs of
battery-powered portable applications. Two "Idle" modes (denoted as U1 and U2) are defined in
addition to the "Suspend" mode (denoted as U3) of the USB 2.0 standard.
The U2 state provides higher power savings than U1 by allowing more analog circuitry (such as
clock generation circuits) to be quiesced. This results in a longer transition time from U2 to active
state. The Suspend state (U3) consumes the least power and again requires a longer time to wake
up the system.
The Idle modes may be entered due to inactivity on a downstream port for a programmable period of
time or may be initiated by the device, based on scheduling information received from the host. Such
information is indicated by the host to the device using the flags Packet pending, End of burst, and
Last packet. Based on these flags, the device may decide to enter an Idle mode without having to
wait for inactivity on the bus. When a link is in one of these Idle states, communication may take
place via low-frequency period signaling (LFPS), which consumes significantly lower power than
SuperSpeed signaling. In fact, the Idle mode can be exited with an LFPS transmission from either
the host or device.
The USB 3.0 standard also introduces the "Function Suspend" feature, which enables the power
management of the individual functions of a composite device. This provides the flexibility of
suspending certain functions of a composite device, while other functions remain active.
Additional power saving is achieved via a latency tolerance messaging (LTM) mechanism implemented by USB 3.0. A device may inform the host of the maximum delay it can tolerate from the time
it reports an ERDY status to the time it receives a response. The host may factor in this latency tolerance to manage system power.
Thus, power efficiency is embedded into all levels of a USB 3.0 system, including the link layer, protocol layer, and PHY. A USB 3.0 system requires more power while active. But due to its higher data
rate and various power-efficiency features, it remains active for shorter periods. A SuperSpeed data
transfer can cost up to 50 percent less power than a hi-speed transfer. This is crucial to the battery
life of mobile handset devices such as cellular phones.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

23

Introduction to USB

2.3

Reference Documents
Some of this chapter’s contents have been sourced from the following documents:

24

■

Universal Serial Bus 3.0 Specification, Revision 1.0

■

Universal Serial Bus Specification, Revision 2.0

■

On-The-Go Supplement to the USB 2.0 Specification, Revision 1.3

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

3.

FX3 Overview

FX3 is a full-feature, general purpose integrated USB 3.0 Super-Speed controller with built-in flexible
interface (GPIF II), which is designed to interface to any processor thus enabling customers to add
USB 3.0 to any system.
The FX2G2 device is a variant of the FX3 device, which does not support the USB 3.0 interface. This
part has the same ARM9 core and supports the USB 2.0 device and host mode functions as FX3.
FX3S is a variant of the FX3 device that features an integrated storage controller and can support up
to 2 independent mass storage devices on its storage ports. It can support SD 3.0 and eMMC 4.41
memory cards. It can also support SDIO on these ports.
The SD3 is a variant of the FX3S device, which does not support the GPIF-II or MMC Slave interface. This device is a programmable USB 3.0 to SD/MMC/SDIO bridge and can be used for USBbased storage and networking applications.
Figure 3-1. FX3 Logic Block Diagram
EZ-USB FX3 Device

JTAG

ARM926EJ-S

Memory
Controller

System
RAM

HS/FS/LS
OTG Host

GPIF™ II
or
PMMC

32
EPs

HS/FS
Peripheral

USB Interface

OTG_ID

SS
Peripheral

SSRXSSRX+
SSTXSSTX+
DD+

Charger
Detection
(EZ-Dtect™)

SD_DAT7

SD/MMC/SDIO
Interface
SD_DAT1

I2S

SD_CMD

SPI

SD_DAT0

UART

SD_CLK

I 2C

FX3S Device Only

The logic block diagram shows the basic block diagram of FX3. The integrated USB 3.0 Phy and
controller along with a 32-bit processor make FX3 powerful for data processing and building custom
applications. An integrated USB 2.0 OTG controller enables applications that need dual role usage
scenarios. A fully configurable, parallel, General Programmable Interface (GPIF II) provides
connection to any processor, ASIC, DSP, or FPGA. There is 512 kB of on-chip SRAM for code and
data. There are also low performance peripherals such as UART, SPI, I2C, and I2S to communicate
to onboard peripherals such as EEPROM. The CPU manages the data transfer between the USB,
GPIF II, I2S, SPI, and UART interfaces through firmware and internal DMA interfaces.
The CX3 is a variant of the FX3 device, which features an integrated MIPI-CSI2 receiver mated to
the GPIF, as shown in the CX3 Logic block diagram. This device provides the ability to add USB 3.0
connectivity to image sensors implementing the MIPI CSI-2 interface.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

25

FX3 Overview

Figure 3-2. CX3 Logic Block Diagram
JTAG

EZ-USB CX3 Device

Memory
Controller

ARM926EJ-S

System
RAM

MIPI
CSI2
Input

MIPI
CSI-2
Interface

Fixed
Function
GPIF™ II

SDA
SCL

3.1

32
EPs

I2C

UART

SPI

HS/FS
Peripheral

USB Interface

OTG_ID

SS
Peripheral

SSRXSSRX+
SSTXSSTX+
DD+

I2S

CPU
FX3 is powered by ARM926EJS, a 32-bit advanced processor core licensed from ARM that is
capable of executing 220 MIPS [Wikipedia] at 200 MHz, the compute power needed to perform MP3
encoding, decryption, and header processing at USB 3.0 rates for the Universal Video Class
The 'Harvard Architecture' based processor accesses instruction and data memory through separate
dedicated 32-bit industry standard AHB buses. Separate instruction and data caches are built into
the core to facilitate low latency access to frequently used areas of code and data memory. In
addition, the two tightly coupled memories (TCM) (one each for data and instruction) associated with
the core provide a guaranteed low latency memory (without cache hit or miss uncertainties).
The ARM926 CPU contains a full Memory Management Unit (MMU) with virtual to physical address
translation. FX3 contains 8 KB of data and instruction caches. ARM926-EJS has 4-way set
associative caches and cache lines are 32 bytes wide. Each set therefore has 64 cache lines.
Interrupts vectored into one of the Fast Interrupt Request (FIQ) or Interrupt Request (IRQ) request
lines provide a method to generate interrupt exceptions to the core.
The standard ARM JTAG TAP is integrated to allow debug support with any standard JTAG debugger.

26

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

Figure 3-3. Key CPU Features
2 x AHB
200 MHz x 32b
1,4,8 cy bursts

1,8 cy bursts

JTAG
Signals

JTAG
Debug
Logic

Instr
Cache
(8 KB)

Data
Cache
(8 KB)

nFIQ
nIRQ

ARM926EJS
Arm TCM
200 MHz x32-bit
1 cy accesses

Arm TCM
200 MHz x32-bit
1 cy accesses

Instr
TCM
(16 KB)

3.2

Data
TCM
(8 KB)

Interconnect Fabric
The Advanced Microcontroller Bus Architecture – Advanced High Performance Bus (AMBA AHB)
interconnect forms the central nervous system of FX3. This fabric allows easy integration of
processors, on-chip memories, and other peripherals using low power macro cell functions while
providing a high-bandwidth communication link between elements that are involved in majority of the
transfers. This multi-master high bandwidth interconnect has the following components:
■

AHB bus master(s) that can initiate read and write operations by providing an address and
control information. At any given instant, a bus can at most have one owner. When multiple
masters demand bus ownership, the AHB arbiter block decides the winner.

■

AHB bus slave(s) that respond to read or write operations within a given address-space range.
The bus slave signals back to the active master the success, failure, or waiting of the data
transfer. An AHB decoder is used to decode the address of each transfer and provide a select
signal for the slave that is involved in the transfer.

■

AHB bridges in the system to translate traffic of different frequency, bus width, and burst size.
These blocks are essential in linking the buses

■

AHB Slave/Master interfaces: These macro cells connect peripherals, memories, and other
elements to the bus.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

27

FX3 Overview

Figure 3-4. Interconnect Fabric
ARM AHB Bus-D

Internal Memory
Unit (Bus Slave)

ARM926EJS

ARM AHB Bus-I

AHB
Bridge

AHB
Bridge

M

M

AHB
Slave
Interface

S

System Bus

M

S

AHB
Bridge

AHB
Bridge

S

DMA bus
M

M

M

M

MMIO bus

S

S

AHB
Slave
Interface

AHB
Master
Interface

AHB
Slave
Interface

AHB
Master
Interface

AHB
Master
Interface

Key

M

The block that is attached to the
bus at this point is the master

S

The block that is attached to the
bus at this point is the slave

Peripheral-1
Reg section
(Bus Slave)

Peripheral-1
DMA section
(Bus Master)

Peripheral-2
Reg section
(Bus Slave)

Peripheral-2
DMA section
(Bus Master)

To allow implementation of an AHB system without the use of tristate drivers and to facilitate
concurrent read/write operations, separate read and write data buses are required. The minimum
data bus width is specified as 32 bits, but the bus width can be increased for realizing higher
bandwidths.

3.3

Memory
In addition to the ARM core's tightly coupled instruction and data memories, a general purpose
internal system memory block is available in FX3. The size of this memory is 512 KB or 256 KB
depending on the device variant being used. The system SRAM is implemented using 64- or 128-bit
wide SRAM banks, which run at full CPU clock frequency. Each bank may be built up from narrow
SRAM instances for implementation specific reasons. A Cypress-proprietary high-performance
memory controller translates a stream of AHB read and writes requests into SRAM accesses to the
SRAM memory array. This controller also manages power and clock gating for the memory array.
The memory controller is capable of achieving full 100% utilization of the SRAM array (meaning 1
read or 1 write at full width each cycle). CPU accesses are done 64 or 128 bit at a time to SRAM and
then multiplexed/demultiplexed as 2/4 32-bit accesses on the CPU AHB bus. The controller does not
support concurrent accesses to multiple different banks in memory.

28

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

Figure 3-5. Internal Memory Unit

512 KB SRAM

Memory controller for System
memory (AHB to SRAM
protocol converter +
clocking+power management)
(Bus Slave)

AHB
Slave
Interface

S

System Bus

The system memory is used for storing firmware code, data and DMA buffers. The first section of this
area is used to store DMA instructions (also known as descriptors). The DMA hardware logic executes instructions from these locations. The remaining part of the memory can be used for code and
data storage as well as for DMA buffers. If the MMU on the FX3 is being used to implement a virtual
memory system, the last 16 K of the system memory can be used to store the page table. In the
default configuration, virtual memory is not used and there is no need for a memory resident page
table.

3.4

Interrupts
Interrupt exceptions are facilitated using the FIQ and IRQ lines of the ARM9 processor. The ISR
branch instruction for each of these interrupts is provided in the 32 byte exception table located at
the beginning of the ITCM.
The embedded PL192 vectored interrupt controller (VIC) licensed from ARM provides a hardware
based interrupt management system that handles interrupt vectoring, priority, masking and timing,
providing a real time interrupt status. The PL192 VIC supports 32 'active high' interrupt sources, the
ISR location of which can be programmed into the VIC. Each interrupt can be assigned one of the 15
programmable priority levels; equal priority interrupts are further prioritized based on the interrupt
number. While each interrupt pin has a corresponding mask and enable bits, interrupts with a
particular priority level can all be masked out at the same time if desired. Each of the '32-interrupt'
can be vectored to one of the active low FIQ or IRQ outputs of the VIC that are directly hooked to the
corresponding lines of the ARM 9 CPU. PL192 also supports daisy chained interrupts, a feature that
is not enabled in FX3.
Note Other exceptions include reset, software exception, data abort, and pre-fetch abort.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

29

FX3 Overview

Figure 3-6. Vector Interrupt Controller
PL 192 VIC (Simplified)
Other FIQ int lines

A
H
B

AHB
Interface

L
O
G
I
C

INT_ENABLE/DISABLE[31:0]
INT_SELECT_FIQ_IRQ#[31:0]

nFIQ

Int_endis[n]
Int_fiqirq#[n]

INT_PRIORITY[4:0][0:31]

Int_priority[4:0][n]

INT_PRIORITY_MASK[15:0]

Int_priority_mask
[Int_priority[4:0][n]]

Masking and
Priority logic

nIRQ

INT_ADDRESS[31:0][0:31]
IRQ_STATUS[31:0]
FIQ_STATUS[31:0]

Int_line[n]

CUR_INT_ADDRESS[31:0]

When both FIQ and IRQ interrupt inputs assert, the CPU jumps to the FIQ entry of the exception
table. The FIQ handler is usually placed immediately after the table, saving a branch. The FIQ mode
uses dedicated FIQ bank registers. When an IRQ line alone asserts, CPU jumps to the IRQ handler.
The IRQ handler saves the workspace on stack, reads the address of the ISR from the VIC, and
jumps to the actual ISR.
In general, high priority, low latency interrupts are vectored into FIQ while the IRQ line is reserved for
general interrupts. Re-entrant interrupts can be supported with additional firmware.

3.5

JTAG Debugger Interface
Debug support is implemented by using the ARM9EJ-S core embedded within the ARM926EJ-S
processor. The ARM9EJ-S core has hardware that eases debugging at the lowest level. The debug
extensions allow to stall the core's program execution, examine the internal state of the core and the
memory system, and further resume program execution.
Figure 3-7. ARM Debug Logic Blocks

Embedded
ICE-RT

ARM926EJ-S
Core

Scan 1

PC
Debugger
(GDB Server)

Scan 2

TAP
Controller

JTAG Interface

JTAG to USB
Converter
(e.g.: J-Link)

FX3 CPU Subsystem

30

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

The ARM debugging environment has three components: A debug-host resident program (Real
View debugger), a debug communication channel (JTAG) and a target (Embedded ICE-RT). The two
JTAG-style scan chains (Scan1 and Scan2) enable debugging and 'EmbeddedICE-RT-block'
programming.
Scan Chain 1 is used to debug the ARM9EJ-S core when it has entered the debug state. The scan
chain can be used to inject instructions into ARM pipeline and also read or write core registers
without having to use the external data bus. Scan Chain 2 enables access to the EmbeddedICE
registers. The boundary scan interface includes a state machine controller called the TAP controller
that controls the action of scan chains using the JTAG serial protocol.
The ARM9EJ-S EmbeddedICE-RT logic provides integrated on-chip debug support for the
ARM9EJ-S core. The EmbeddedICE-RT logic comprises two real time watchpoint units, two
independent registers, the Debug Control Register and the Debug Status Register, and the debug
communication channel. A watchpoint unit can either be configured to monitor data accesses
(commonly called watchpoints) or monitor instruction fetches (commonly called breakpoints).
The EmbeddedICE-RT logic interacts with the external logic (logic outside the CPU subsystem)
using the debug interface. In addition, it can be programmed (for example, setting a breakpoint)
using the JTAG based TAP controller. The debug interface signals not only communicate the debug
status of the core to the external logic but also provide a means to for the external logic to raise
breakpoints if needed (disabled in FX3 by default).
ARM9EJ-S supports two debug modes: Halt mode and Monitor mode. In halt mode debug, a watchpoint or breakpoint request forces the core into debug state. The internal state of the core can then
be examined and instructions inserted into its pipeline using the TAP controller without using the
external bus thus leaving the rest of the system unaltered. The core can then be forced to resume
normal operation. Alternately, the EmbeddedICE-RT logic can be configured in monitor mode, where
watchpoints or breakpoints generate Data or Pre-fetch Aborts respectively. This enables the debug
monitor system to debug the ARM while enabling critical fast interrupt requests to be serviced.

3.6

Peripherals

3.6.1

I2S
FX3 is capable of functioning as a master mode transmitter over its Integrated Inter-chip Sound (I2S)
interface. When integrated with an audio device, the I2S bus only handles audio data, while the other
signals, such as sub-coding and control, are transferred separately.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

31

FX3 Overview

ENDIANNESS

AUDIO WIDTH

LEFT FIRST
/RIGHT FIRST

STEREO/
MONO

Figure 3-8. I2S Blocks

DMA/SGL TRANSMIT
SGL_LEFT_DATA

External Device:
Slave Receiver

SGL_RIGHT_DATA

FX3: I2S
Master Tx

SCK
WS

DMA_LEFT_DATA
DMA_RIGHT_DATA

SDA

PAUSE
MUTE

CLK_SEL
INT/EXT

EXT_CLK

INT_CLK

FIXED/
VAR SCK

ENABLE

The I2S block can be configured to support different audio bus widths, endianess, number of
channels, and data rate. By default, the interface is protocol standard big endian (most significant bit
first); nevertheless, the block's endianess can be reversed. FX3 also supports the left justified and
right justified variants of the protocol. When the block is enabled in left justified mode, the left
channel audio sample is sent first on the SDA line.
In the mono mode, the 'left data' is sent to both channels on the receiver (WordSelect = Left and
WordSelect = Right). Supported audio sample widths include 8, 16, 18, 24, and 32 bit. In the variable
SCK (Serial Clock) mode, WS (WordSelect) toggles every Nth edge of SCK, where N is the bus
width chosen. In fixed SCK mode, however, WS toggles every thirty-second SCK edge. In this mode,
the audio sample is zero padded to 32 bit. FX3 supports word at a time (SGL_LEFT_DATA,
SGL_RIGHT_DATA) I2S operations for small transfers and DMA based I2S operations for larger
transfers. The Serial Clock can be derived from the internal clock architecture of FX3 or supplied
from outside using a crystal oscillator. Typical frequencies for WS include 8, 16, 32, 44.1, 48, 96, and
192 kHz.
Two special modes of operation, Mute and Pause are supported. When Mute is held asserted, DMA
data is ignored and zeros are transmitted instead. When paused, DMA data flow into the block is
stopped and zeros are transmitted over the interface.

32

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

3.6.2

I2C

Figure 3-9. I2C Block Diagram
VDD
I2C Slave2
R1

R2

SCL
I2C Slave1

SDA

FX3_I2C
Master

Other I2C
Master

FX3 is capable of functioning as a master transceiver and supports 100 kHz, 400 kHz, and 1 MHz
operation. The I2C block operates in big endian mode (most significant bit first) and supports both
7-bit and 10-bit slave addressing. Similar to I2S, this block supports both single and burst (DMA)
data transfers.
Slow devices on its I2C bus can work with FX3's I2C using the clock stretching based flow control.
FX3 can function in multi-master bus environments as it is capable of carrying out negotiations with
other masters on the bus using SDA based arbitration. Additionally, FX3 supports the repeated start
feature to communicate to multiple slave devices on the bus without losing ownership of the bus in
between (see the stop last and start first feature in the following sections).
Combined format communication is supported, which allows the user to load multiple bytes of data
(including slave chip address phases) into using special registers called preamble. The user can
choose to place start (repeated) or stop bits between the bytes and can also define the master's
behavior on receiving either a NAK or ACK for bytes in the preamble. In applications such as
EEPROM reads, this greatly reduces firmware complexity and execution time by packing initial
communication bytes into a transaction header with the ability to abort the header transaction on
receiving NAK exceptions in the middle of an operation.
In addition, the preamble repeat feature available in FX3 simplifies firmware and saves time in
situations - for instance, ACK monitoring from the EEPROM to check completion of a previously
issued program operation. In this case, FX3's I2C can be programmed to repeat a single byte
preamble containing the EEPROM's I2C address until the device responds with an ACK.
By programming the burst read count value for this block, burst reads from the slave (EEPROM for
example), can be performed with no firmware intervention. In this case, the FX3 master receiver
sends ACK response for all bytes received as long as the burst read counter does not expire. When
the last byte of the burst is received, FX3's I2C block signals a NAK followed by a stop bit forcing the
device to stop sending data.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

33

FX3 Overview

3.6.3

UART
HW_RX_FLOW_CTRL_EN

HW_TX_FLOW_CTRL_EN

RX SAMPLING
INSTANT

LOOPBACK

TX_ENABLE

RX_ENABLE

UART_ENABLE

Figure 3-10. UART Block Diagram

SW_RTS

DataTerminal
Equipment(DTE)

TX

RX

RX

TX

RTS
CTS

CTS_STAT
DMA/SGL TRANSFER

FX3:DataCarrier
Equipment(DCE)

SGL_TX_DATA

CTS

SGL_RX_DATA

RTS

DMA_TX_DATA

BAUDCLK

# STOP BITS

TX STICKY BIT

RX STICKY BIT

PARITY STICKY

PARITY ODD

PARITY

DMA_RX_DATA

FX3's UART block provides standard asynchronous full-duplex transfer using the TX and RX pins.
Flow control mechanism, RTS (request to send) and CTS (clear to send) pins are supported. The
UART block can operate at numerous baud rates ranging from 300 bps to 4608 Kbps and supports
both one and two stop bits mode of operation. Similar to I2S and I2C blocks, this block supports both
single and burst (DMA) data transfers.
The transmitter and receiver components of the UART block can be individually enabled. When both
components are enabled and the UART set in loopback mode, the external interface is disabled;
data scheduled on the TX pin is internally looped back to the RX pin.
Both hardware and software flow control are supported. Flow control settings can individually be set
on the transmitter and receiver components. When both (Tx and Rx) flows are controlled by
hardware, the RTS and CTS signaling is completely managed by the UART block's hardware. When
the flow control is completely handled by software, software can signal a request to send using the
SW_RTS field of the block and monitor the block's CTS_STAT signal.
Transmission starts when a 0-level start bit is transmitted and ends when a 1-level stop bit is
transmitted. This represents the default 10-bit transmission mode. A ninth parity bit can be appended
to data in the 11-bit transmission mode. Both the even and odd parity variants are supported.
Optionally, a fixed check bit (sticky parity) can be inserted in place of the parity bit. The value of this
bit is configurable. Corresponding settings are also available for the Rx block.
The UART Rx line is internally oversampled by a factor of 8 and any three consecutive samples
among the eight can be chosen for the majority vote technique to decide the received bit.
Separate interface devices can be used to convert the logic level signals of the UART to and from
the external voltage signaling standards such as RS-232, RS-422, and RS-485.

34

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

3.6.4

SPI

CLK

ENDIAN

WID_SEL (N+1)

TX_ENABLE

LOOPBACK

ENABLE

RX_ENABLE

Figure 3-11. SPI Block Diagram

FX3 SPI
MASTER

SPI SLAVE
MOSI

N

ENDIAN

DMA/SGL TRANSFER
N-1

0

RX - SHIFT
REGISTER

SGL_TX_DATA

N-1

DMA_TX_DATA

N-2

DMA_RX_DATA

N-2

1
TX_BYTE_COUNT

N-1

0
RX_BYTE_COUNT

1

N

SHIFT REGISTER

N

1

N-2
SGL_RX_DATA

TX - SHIFT
REGISTER

0

ENDIAN

MISO

SCLK

FW_SSN

SSNCTRL

LAG

CPHA

CPOL

SS_POL

SSN_DESELECT

LEAD

CONTROL

SSN

FX3's SPI block operates in master mode and facilitates standard full-duplex synchronous transfers
using the Master Out Slave In (MOSI), Master In Slave Out (MISO), Serial Clock (SCLK), and Slave
Select (SS) pins. The maximum frequency of operation is 33 MHz. Similar to the I2S and I2C and
UART blocks, this block supports both single and burst (DMA) data transfers.
The transmit and receive blocks can be enabled independently using the TX_ENABLE/RX_ENABLE
inputs. Independent shift registers are used for the transmit and receive paths. The width of the shift
registers can be set to anywhere between 4 and 32 bits. By default, the Tx and Rx registers shift
data to the left (big endian). This can be reversed, if necessary.
The SSPOL input sets the polarity of the Slave Select (SSN) signal.The CPOL input sets the polarity
of the SCLK pin which is active high by default. The CPHA input sets the clock phases for data
transmit and capture. If CPHA is set to ‘1’, the devices agree to transmit data on the asserting edge
of the clock and capture at the de-asserting edge. However, if CPHA is set to 0, the devices agree to

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

35

FX3 Overview

capture data on the asserting edge of the clock and transmit at the de-asserting edge. When Idle,
the SCLK pin remains de-asserted. Hence, the first toggle of SCLK in this mode (CPHA=0) will
cause the receivers to latch data; placing a constraint on the transmitters to set up data before the
first toggle of SCLK. To SSN LEAD setting is provided to facilitate the assertion of SS (and hence the
first transmit data) a few cycles before the first SCLK toggle. The SSN LAG setting specifies the
delay in SSN de-assertion after the last SCLK toggle for the transfer. This specific mode of operation
(CPHA=0) also necessitate toggling the SSN signal between word transfers.
The SSN pin can be configured to either remain asserted always, deassert between transfers,
handled by hardware (based on CPHA configuration) or managed using software. FX3's SPI block
can share its MOSI, MISO, and SCLK pins with more than one slave connected on the bus. In this
case, the SSN signal of the block cannot be used and the slave selects need to be managed using
GPIOs.

3.6.5

GPIO/Pins
Several pins of FX3 can function as General Purpose I/O s. Each of these pins is multiplexed to
support other functions/interfaces (such as UART and SPI). By default, pins are allocated in larger
groups to functional blocks such as GPIF-II, I2C, and UART. In a typical application, not all blocks of
FX3 are used. Also, not all pins assigned to a block may be getting used. For example, the
UART_CTS and UART_RTS pins are mapped to the UART block but are rarely used. Unused pins
in each block may be overridden as a simple or complex GPIO pin on a pin-by-pin basis.
Simple GPIO provides software controlled and observable input and output capability only. In
addition, they can also raise interrupts. Complex GPIOs add 3 timer/counter registers for each and
support a variety of time based functions. They either work off a slow or fast clock. Complex GPIOs
can also be used as general purpose timers by firmware.
There are eight complex I/O pin groups, the elements of which are chosen in a modulo 8 fashion
(complex I/O group 0 – GPIO 0, 8, 16., complex I/O group 1- GPIO 1,9,17., and so on). Each group
can have different complex I/O functions (such as PWM one shot). However, only one pin from a
group can use the complex I/O functions. The rest of the pins in the group are either used as block I/
O or simple GPIO.

36

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

The following tables show the various functions that can be mapped to each GPIO pin on the FX3
device. The specific function for a pin is primarily selected on a block basis and can be over-ridden
on an individual pin basis.
Table 3-1. Block I/O Selection on FX3 Devices
Choose I/O
Pins from
Blocks: GPIF,
SPI

Choose I/O
Pins from
Blocks:
GPIF, I2S

Choose I/O
Pins from
Blocks:
GPIF(DQ32/
extended),
UART, I2S

Choose I/O
Pins from
Blocks:
GPIF,UART,
SPI, I2S

Blk I/O
Selection
Table

Choose I/O
Pins from
Blocks: GPIF

Choose I/O
Pins from
Blocks:
GPIF, UART

Blk IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

Blk IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

…

…

…

…

…

…

…

Blk IO[29]

GPIF IO[29]

GPIF IO[29]

GPIF IO[29]

GPIF IO[29]

GPIF IO[29]

GPIF IO[29]

Blk IO [30]

NC

NC

NC

NC

NC

NC

Blk IO [31]

NC

NC

NC

NC

NC

NC

Blk IO [32]

NC

NC

NC

NC

NC

NC

Blk IO [33]

GPIF IO [30]

GPIF IO [30]

GPIF IO [30]

GPIF IO [30] GPIF IO [30]

GPIF IO [30]

…

…

…

…

…

…

…

Blk IO[44]

GPIF IO[41]

GPIF IO[41]

GPIF IO[41]

GPIF IO[41]

GPIF IO[41]

GPIF IO[41]

Blk IO[45]

NC

NC

NC

NC

NC

NC

Blk IO[46]

NC

NC

NC

NC

GPIF IO [42]

UART_RTS

Blk IO[47]

NC

NC

NC

NC

GPIF IO [43]

UART_CTS

Blk IO[48]

NC

NC

NC

NC

GPIF IO [44]

UART_TX

Blk IO[49]

NC

NC

NC

NC

GPIF IO [45]

UART_RX

Blk IO[50]

NC

NC

NC

NC

I2S_CLK

I2S_CLK

Blk IO[51]

NC

NC

NC

NC

I2S_SD

I2S_SD

Blk IO[52]

NC

NC

NC

NC

I2S_WS

I2S_WS

Blk IO[53]

NC

UART_RTS

SPI_SCK

NC

UART_RTS

SPI_SCK

Blk IO[54]

NC

UART_CTS

SPI_SSN

I2S_CLK

UART_CTS

SPI_SSN

Blk IO[55]

NC

UART_TX

SPI_MISO

I2S_SD

UART_TX

SPI_MISO

Blk IO[56]

NC

UART_RX

SPI_MOSI

I2S_WS

UART_RX

SPI_MOSI

Blk IO[57]

NC

NC

NC

I2S_MCLK

I2S_MCLK

I2S_MCLK

Blk IO[58]

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

Blk IO[59]

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

Blk O [60]

Charger det

Charger det

Charger det

Charger det

Charger det

Charger det

Note: Depending on the configuration, one of the columns of the table will be selected
■

NC stands for Not Connected. Blk I/Os 30-32,45 are Not Connected

■

Charger detect is output only.

■

GPIF I/O are further configured into interface clock, control lines, address lines and data lines,
car-kit UART lines depending on the desired total number of GPIF pins, number of data lines and
address lines, whether the address and data lines need to be multiplexed and the car-kit mode.
Depending on the GPIF configuration selected by the user, some of the GPIF I/O may remain
unconnected and may only be used as GPIOs.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

37

FX3 Overview

Table 3-2. Block I/O Selection on FX3S Device

38

Blk I/O
Selection
Table

Choose I/O
Pins from
blocks:
GPIF

Choose I/O
Choose I/O
Pins from
Pins from
blocks:
blocks:
GPIF, S0,
GPIF, S0
S1

Choose I/O
Pins from
blocks:
GPIF, S0,
S1, UART

Choose I/O
Pins from
blocks:
GPIF, S0,
S1, SPI

Choose I/O
Pins from
blocks:
GPIF, S0,
S1, I2S

Choose I/O
Pins from
blocks:
GPIF, S0,
UART, SPI,
I2S

Blk IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

GPIF IO[0]

Blk IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

GPIF IO[1]

…

…

…

…

…

…

…

…

Blk IO[29]

GPIF IO[29]

GPIF IO[29] GPIF IO[29] GPIF IO[29] GPIF IO[29] GPIF IO[29] GPIF IO[29]

Blk IO[30]

PMODE[0]

PMODE[0]

PMODE[0]

PMODE[0]

PMODE[0]

PMODE[0]

PMODE[0]

Blk IO[31]

PMODE[1]

PMODE[1]

PMODE[1]

PMODE[1]

PMODE[1]

PMODE[1]

PMODE[1]

Blk IO[32]

PMODE[2]

PMODE[2]

PMODE[2]

PMODE[2]

PMODE[2]

PMODE[2]

PMODE[2]

Blk IO[33]

NC

S0_DAT[0]

S0_DAT[0]

S0_DAT[0]

S0_DAT[0]

S0_DAT[0]

S0_DAT[0]

Blk IO[34]

NC

S0_DAT[1]

S0_DAT[1]

S0_DAT[1]

S0_DAT[1]

S0_DAT[1]

S0_DAT[1]

…

…

…

…

…

…

…

…

Blk IO[40]

NC

S0_DAT[7]

S0_DAT[7]

S0_DAT[7]

S0_DAT[7]

S0_DAT[7]

S0_DAT[7]

Blk IO[41]

NC

S0_CMD

S0_CMD

S0_CMD

S0_CMD

S0_CMD

S0_CMD

Blk IO[42]

NC

S0_CLK

S0_CLK

S0_CLK

S0_CLK

S0_CLK

S0_CLK

Blk IO[43]

NC

S0_WP

S0_WP

S0_WP

S0_WP

S0_WP

S0_WP

Blk IO[44]

NC

S0_DETEC S0_DETEC S0_DETEC S0_DETEC S0_DETEC S0_DETEC
T
T
T
T
T
T

Blk IO[45]

NC

S0_MMCR
ESET

S0_MMCR
ESET

S0_MMCR
ESET

S0_MMCR
ESET

S0_MMCR
ESET

S0_MMCR
ESET

Blk IO[46]

NC

NC

S1_DAT[0]

S1_DAT[0]

S1_DAT[0]

S1_DAT[0]

UART_RTS

Blk IO[47]

NC

NC

S1_DAT[1]

S1_DAT[1]

S1_DAT[1]

S1_DAT[1]

UART_CTS

Blk IO[48]

NC

NC

S1_DAT[2]

S1_DAT[2]

S1_DAT[2]

S1_DAT[2]

UART_TX

Blk IO[49]

NC

NC

S1_DAT[3]

S1_DAT[3]

S1_DAT[3]

S1_DAT[3]

UART_RX

Blk IO[50]

NC

NC

S1_CMD

S1_CMD

S1_CMD

S1_CMD

I2S_CLK

Blk IO[51]

NC

NC

S1_CLK

S1_CLK

S1_CLK

S1_CLK

I2S_SD

Blk IO[52]

NC

NC

S1_WP

S1_WP

S1_WP

S1_WP

I2S_WS

Blk IO[53]

NC

NC

S1_DAT[4]

UART_RTS SPI_SCK

NC

SPI_SCK

Blk IO[54]

NC

NC

S1_DAT[5]

UART_CTS SPI_SSN

I2S_CLK

SPI_SSN

Blk IO[55]

NC

NC

S1_DAT[6]

UART_TX

SPI_MISO

I2S_SD

SPI_MISO

Blk IO[56]

NC

NC

S1_DAT[7]

UART_RX

SPI_MOSI

I2S_WS

SPI_MOSI

Blk IO[57]

NC

NC

S1_MMCR
ESET

NC

NC

I2S_MCLK

I2S_MCLK

Blk IO[58]

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

I2C_SCL

Blk IO[59]

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

I2C_SDA

Blk IO[60]

Charger Det

Charger Det Charger Det Charger Det Charger Det Charger Det Charger Det

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

Table 3-3 shows how the functionality of each FX3 GPIO can be selected between block I/O (blockspecific function, such as GPIF-II, UART, and I2C), simple GPIO, and complex GPIO. Any of the pins
can be selected as a simple GPIO and controlled independently. As the device only supports eight
complex GPIOs, the mapping of pins to complex GPIOs is done on a modulo-8 basis. Each complex
GPIO function can only be made active on one of the eight pins mapped to it.
Table 3-3. Block I/O Override as Simple/Complex GPIO
FX3 Pin I/O
Selection

Override block IO as simple
GPIO [pin n] = False

Override block IO as simple
GPIO [pin n] = True

Override block IO as
complex GPIO [pin n] =
True

n = 0 to 60

Override block IO as
Override block IO as
complex GPIO [pin n] = False complex GPIO [pin n] = False

IO Pin [0]

Blk IO [0]

Simple GPIO [0]

Complex GPIO [0]

IO Pin [1]

Blk IO [1]

Simple GPIO [1]

Complex GPIO [1]

IO Pin [8]

Blk IO [8]

Simple GPIO [8]

Complex GPIO [0]

IO Pin [9]

Blk IO [9]

Simple GPIO [9]

Complex GPIO [1]

…

…
IO Pin [59]

Blk IO [59]

Simple GPIO [59]

Complex GPIO [3]

O Pin [60]

Blk O [60]

Simple GPO [60]

Complex GPO [4]

Note: For each pin ‘n’ in column 1, one of column 2, 3 or 4 of the corresponding row will be selected based on the simple/override values for
the corresponding pin
■

Pins [30-32] are used as PMODE [0-2] inputs during boot. After boot, these are available as
GPIOs.

The GPIF-II block on FX3 can be configured to have a 8-, 16-, 24-, or 32-bit wide data bus. Further,
the device can have no address bus, a variable width address bus up to 16 bits wide, or an address
bus multiplexed with the data bus. The number and function of control lines can also be configured in
different ways. The actual function assigned to a GPIO in the GPIF-II block will depend on the configuration selected by the user. Table 3-4 shows the functions assigned to these GPIOs under various GPIF-II configurations.
Table 3-4. GPIF I/O Block Pin Connection for Different Configurations
Overall GPIF
Pin Count

47-pin

43-pin

35-pin

31-pin

31-pin

47-pin

43-pin

35-pin

31-pin

31-pin

Data Bus
Width

32b

24b

16b

16b

8b

32b

24b

16b

16b

8b

Address Data
lines Muxed?

Yes

Yes

Yes

Yes

Yes

No

No

No

No

No

GPIF IO [16]

CLK

CLK

CLK

CLK

CLK

CLK

CLK

CLK

CLK

CLK

GPIF IO[0]

D0/A0

D0/A0

D0/A0

D0/A0

D0/A0

D0

D0

D0

D0

D0

INT#

INT

INT

INT

INT

INT

INT

INT

INT

INT

INT

GPIF IO[1]

D1/A1

D1 /A1

D1/A1

D1/A1

D1/A1

D1

D1

D1

D1

D1

GPIF IO[2]

D2/A2

D2/A2

D2/A2

D2/A2

D2/A2

D2

D2

D2

D2

D2

GPIF IO[3]

D3/A3

D3/A3

D3/A3

D3/A3

D3/A3

D3

D3

D3

D3

D3

GPIF IO[4]

D4/A4

D4/A4

D4/A4

D4/A4

D4/A4

D4

D4

D4

D4

D4

GPIF IO[5]

D5/A5

D5/A5

D5/A5

D5/A5

D5/A5

D5

D5

D5

D5

D5

GPIF IO[6]

D6/A6

D6/A6

D6/A6

D6/A6

D6/A6

D6

D6

D6

D6

D6

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

39

FX3 Overview

Table 3-4. GPIF I/O Block Pin Connection for Different Configurations
GPIF IO[7]

D7/A7

D7/A7

D7/A7

D7/A7

GPIF IO[8]

D8/A8

D8/A8

D8/A8

GPIF IO[9]

D9/A9

D9/A9

D9/A9

GPIF IO[10]
GPIF IO[11]

D7/A7

D7

D7

D7

D7

D7

D8/A8

D8

D8

D8

D8

A0

D9/A9

D9

D9

D9

D9

A1

D10/A10 D10/A10 D10/A10 D10/A10

D10

D10

D10

D10

A2

D11/A11 D11/A11

D11

D11

D11

D11

A3

D11/A11 D11/A11

GPIF IO[12]

D12/A12 D12/A12 D12/A12 D12/A12

D12

D12

D12

D12

A4

GPIF IO[13]

D13/A13 D13/A13 D13/A13 D13/A13 C15

D13

D13

D13

D13

A5

GPIF IO[14]

D14/A14 D14/A14 D14/A14 D14/A14 C14

D14

D14

D14

D14

A6

GPIF IO[15]

D15/A15 D15/A15 D15/A15 D15/A15 C13

D15

D15

D15

D15

A7

GPIF IO[30]

D16/A16 D16/A16

D16

D16

GPIF IO[31]

D17/A17 D17/A17

D17

D17

GPIF IO[32]

D18/A18 D18/A18

D18

D18

GPIF IO[33]

D19/A19 D19/A19

D19

D19

GPIF IO[34]

D20/A20 D20/A20

D20

D20

GPIF IO[35]

D21/A21 D21/A21

D21

D21

GPIF IO[36]

D22/A22 D22/A22

D22

D22

GPIF IO[37]

D23/A23 D23/A23

D23

D23

GPIF IO[38]

D24/A24 n/u

D24

A0

GPIF IO[39]

D25/A25 C15

D25

C15/A1

GPIF IO[40]

D26/A26 C14

D26

C14/A2

GPIF IO[41]

D27/A27 C13

D27

C13/A3

GPIF IO[42]

D28/A28

D28

A0

GPIF IO[43]

D29/A29

C15

D29

C15/A1

GPIF IO[44]

D30/A30

C14

D30

C14/A2

GPIF IO[45]

D31/A31

C13

D31

C13/A3

GPIF IO[29]

C12

C12

C12

C12

C12

C12/A0 C12/A4 C12/A4 C12/A0 C12/A8

GPIF IO[28]

C11

C11

C11

C11

C11

C11/A1 C11/A5 C11/A5 C11/A1 C11/A9

GPIF IO[27]

C10

C10

C10

C10

C10

C10/A2 C10/A6 C10/A6 C10/A2

C10/
A10

GPIF IO[26]

C9

C9

C9

C9

C9

C9/A3

C9/A7

C9/A7

C9/A3

C9/A11

GPIF IO[25]

C8

C8

C8

C8

C8

C8/A4

C8/A8

C8/A8

C8/A4

C8/A12

GPIF IO[24]

C7

C7

C7

C7

C7

C7/A5

C7/A9

C7/A9

C7/A5

C7/A13

GPIF IO[23]

C6

C6

C6

C6

C6

C6/A6

C6/A10 C6/A10 C6/A6

C6/A14

GPIF IO[22]

C5

C5

C5

C5

C5

C5/A7

C5/A11 C5/A11 C5/A7

C5/A15

GPIF IO[21]

C4

C4

C4

C4

C4

C4

C4

C4

C4

C4

GPIF IO[20]

C3

C3

C3

C3

C3

C3

C3

C3

C3

C3

GPIF IO[19]

C2

C2

C2

C2

C2

C2

C2

C2

C2

C2

GPIF IO[18]

C1

C1

C1

C1

C1

C1

C1

C1

C1

C1

GPIF IO[17]

C0

C0

C0

C0

C0

C0

C0

C0

C0

C0

Note:
(1) Depending on the configuration, one of the columns of the table will be selected

40

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

(2) Empty cells imply no connection
(3) Cx - Control line # x
(4) Ay - Address line #y
(5) Dz - Data line #z

Certain pins, such as the USB lines have specific electrical characteristics and are connected
directly to the USB I/O-System. They do not have GPIO capability.
Pins belonging to the same block share the same group setting for drive strengths. Pins of a block
overridden as GPIO share a different group setting for their drive strength. The drive strength of a pin
cannot be controlled independent of the drive strength of other pins in the same group. FX3 provides
software controlled pull up (50 kΏ) or pull down (10 kΏ) resistors internally on all digital I/O pins.

3.6.6

GPIF II
The FX3 device includes a GPIF II interface that provides an easy and glueless interface to popular
interfaces such as asynchronous SRAM, synchronous SRAM, Address Data Multiplexed interface,
parallel ATA, and so on. The interface supports up to 100 MHz. and has 45 programmable pins that
are programmed by GPIF Waveform Descriptor as data, address, control, or GPIO function. For
example, the GPIF II can be configured to a 16-bit ADM (Address/Data Multiplex), seven control
signals, and seven GPIO.
The GPIF II interface features the following:
■

The ability to play both the master and slave role, eliminating the need for a separate slave FIFO
interface.

■

A large state space (256 states) to enable more complex pipelined signaling protocols.

■

A wider data path supporting 32-bit mode in addition to 16- and 8-bit.

■

A deeper pipeline designed for substantially higher speed (more than 200 MHz internal clock
frequency - “Edge Placement Frequency")

■

High frequency I/Os with DLL timing correction (shared with other interface modes), enabling
interface frequencies of up to 100 MHz.

■

45 programmable pins

The heart of the GPIF II interface is a programmable state machine.
Figure 3-12. State Machine
Sigma



Lamda
(32)

GPIF II
STATE
MACH.
(256 states)

 (33)

 Omega
(8)

This state machine
■

Supports up to 256 different states

■

Monitors up to 32 input signals (lamda) to transition between states

■

Provides for transition to two different states from the current state

■

Can drive/control up to eight external pins of the device (omega)

■

Can generate up to 33 different internal control signals (sigma)

The GPIF II is not connected directly to the USB endpoint buffers. Instead it is connected to FX3's
internal DMA network. This enables the FX3's high-performance CPU to have more control over and

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

41

FX3 Overview

access to the data flows in the application thus enabling a wider range of applications, including
ones that process, rather than just route, the actual data flows.

3.6.7

Storage Interface
The FX3S, SD3, Benicia, and Bay devices have an integrated mass storage controller that can connect to SD cards, eMMC devices or SDIO devices. The FX3S device provides two independent storage ports (S0 and S1), each of which can support the following peripheral types:
■

SD cards up to SD specification version 3.0

■

MMC cards or eMMC devices up to MMC System Specification version 4.41

■

SDIO devices up to SDIO specification version 3.0

Figure 3-13. Storage Interface Connectivity on FX3S

eMMC device

DAT[3:0]

CMD

WP
CLK

DETECT

DAT[7:0]

CMD

MMC_RESET
CLK

FX3S Storage Interface

SDXC Card

The storage ports can be configured with an 8-bit or 4-bit wide data bus, and will support interface
clock frequencies up to 104 MHz SDR or 52 MHz DDR. The storage ports do not support functioning
in the legacy SPI mode.
The storage interface signals can be driven at 3.3 V or 1.8 V (low voltage operation) based on the
voltage provided on the S0VDDQ or S1VDDQ input. When connecting to an SD 3.0 card, the interface needs to start operating at 3.3 V, and then switch to 1.8 V during the initialization sequence.
Please refer to the SD Specifications Part 1, Version 3.00 for details of the initialization procedure.
The storage controller block on the FX3S device supports sending of any command with custom
parameters, and receiving arbitrary lengths of device response. The data interface is connected to
the DMA fabric, and all data transfers need to be performed through DMA sockets. The storage controller provides a maximum of 8 DMA sockets, each of which can be used with any of the storage
ports.
The storage controller can be configured to transfer one or more blocks of data with arbitrary block
lengths. However, it is expected that the data block length will be a multiple of 8 bytes.
The interface clock frequency is divided down from the master system clock (384 MHz or 416 MHz)
through a set of dividers. The block supports clock frequencies ranging from 400 kHz to 104 MHz
SDR (or 52 MHz DDR).
The storage controller supports stopping the interface clock to reduce power consumption at times
when the interface is not in use. An Auto stop clock feature is supported to prevent data overflows

42

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

during read operations. The clock will automatically be stopped when the internal buffer is full, and
will be restarted when a buffer is made available.
The storage controller supports detection of card insertion or removal through one of two mechanisms:
■

Voltage change on the DAT[3] pin. This method requires a pull-down on the DAT[3] to be present
on the board. This method is supported on both storage ports of the FX3S device.

■

Voltage change on a dedicated GPIO pin connected to a micro-switch on the card socket. A single pin is provided for this purpose, and hence this method can only be used for one of the storage ports.

Dedicated GPIO pins are provided for resetting the eMMC devices and for checking the write protect
status of the storage devices. These pins are operated under firmware control, and do not directly
affect the storage port operation.
The storage controller supports SDIO specific features such as SDIO Interrupt detection and the
SDIO read-wait and suspend-resume features, as specified in the SDIO specification Version 2.00.

3.6.8

MIPI-CSI2 Interface
The CX3 device has an integrated MIPI-CSI2 receiver, which is mated to the GPIF and can connect
to an image sensor supporting MIPI-CSI2. The interface allows for up to four MIPI-CSI2 data lanes,
capable of speeds up to 1 Gbps per lane. The MIPI-CSI2 receiver is connected to a fixed-function
GPIF controller via 8/16/24 bit bus, which can be clocked at up to 100 MHz.
Figure 3-14. CSI-2 Interface on CX3 Device

1/2/3/4 Lane
MIPI-CSI2
Input

8/16/24 Bit
Interface

MIPI-CSI2
Interface

Fixed Function
GPIF™ II

I2C Address
8’b0000111x

I2C_SCL
I2C_SDA

I2C

The MIPI-CSI2 receiver supports a wide variety of image formats including RAW8/10/12/14,
YUV422, and RGB888/666/565.
Configuration of the MIPI-CSI2 receiver interface is done over the I2C bus. The MIPI-CSI2 receiver
is available at the 7-bit I2C slave address 8'b0000111X (Read Address 0X0F; Write Address 0x0E).
APIs to configure the MIPI-CSI2 interface and for selecting the GPIF interface width are provided as
part of the FX3 SDK.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

43

FX3 Overview

3.7

DMA Mechanism
PERIPHERAL 2

Figure 3-15. DMA Mechanism
CPU

1
SYSTEM
MEMORY

4
2

3

FX3

PERIPHERAL 1

Non-CPU intervened data chunk transfers between a peripheral and CPU or system memory,
between two different peripherals or between two different gateways of the same peripheral, loop
back between USB end points, are collectively referred to as DMA in FX3.
Figure 3-15 shows a logical paths of data flow; however, in practice, all DMA data flows through the
System memory, as shown in the following figure.

PERIPHERAL 2

Figure 3-16. System Memory

CPU

1
SYSTEM
MEMORY

2

4

3

FX3

PERIPHERAL 1

CPU
BRIDGE

PERIPHERAL_2_AHB

PERIPHERAL 1_AHB
PERIPHERAL 1

44

DMA AHB

SYSTEM
MEMORY

PERIPHERAL 2

SYSTEM AHB

FX3

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

As explained earlier, the CPU accesses the System Memory (Sysmem) using the System AHB and
the DMA paths of the peripherals are all hooked up to the DMA AHB. Bridge(s) between the System
bus and the DMA bus are essential in routing the DMA traffic through the Sysmem.
The following figure illustrates a typical arrangement of the major DMA components of any DMA
capable peripheral of FX3.
Figure 3-17. DMA Components

PERIPHERAL_N
DMA Adapter

Thread controller Peripheral Core
SCK0
SCK1
TH0

SCK2

TH1

PERIPHERAL_AHB

TH2

DATA

L
O
G
I
C

External
Host or
device

ADDR

TH3
SCK32

THR_SCK_MAP
settings (FW or fixed)

FX3

The figure shows a partition of any FX3 peripheral from a DMA view point. Any FX3 peripheral can
be split into three main components - DMA adapter, DMA thread controller, and peripheral core. The
peripheral attaches to the DMA fabric using AHB, width of which determines the throughput of the
peripheral. The peripheral core implements the actual logic of the peripheral (I2C, GPIF, and USB).
Data transfers between the peripheral core and the external world is shown to happen over two
buses - address and data. These buses symbolize that the peripherals of FX3 do not present
themselves as a single large source or sink for data; rather the external host (or device) gets to index
the data to/from different addresses.
In practice though, physical address and data buses may not exist for all peripherals. Each
peripheral has its own interface to communicate addresses and data. For example, all information
exchanges in the USB block happen over the D+ and D– lines. The core logic extracts the address
from the token packet and data from the data packet. The I2C interface exchanges all information
over the SDA lines synchronized to a clock on the SCL line. The GPIF interface on the other hand
can be configured to interface using a separate physical address and data bus.
The address specified by the external host (or device) is used to index data from/into one of the
many entities called 'Sockets' which logically present themselves, at the interface, as a chain of
buffers. The buffer chains themselves can be constructed in one of a several possible ways
depending on the application.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

45

FX3 Overview

Figure 3-18. DMA Configurations

(A) a single large
buffer of fixed size

(B) multiple buffers of
the same size
chained to create
a large buffer

(C) multiple buffers of
different sizes
chained to create
a large buffer

(D) a single large
circular buffer

(E) circular buffer
using multiple
sub buffers

The buffers do not reside in the peripherals; they are created (memory allocated) in the Sysmem
area and a pointer is made available to the associated socket. Therefore any DMA access to the
Sysmem needs to go through the DMA and the System AHB, the widths of which directly determine
the DMA bandwidth.
Certain peripherals may contain tens of sockets, each associated with different buffer chains. To
achieve reasonably high bandwidth on DMA transfers over sockets while maintaining reasonable
AHB bus width, Socket requests for buffer reads/writes are not directly time multiplexed; rather the
sockets are grouped into threads, the requests of which are time multiplexed. Only one socket
mapped to a thread can actively execute at any instant of time. The thread handling the socket group
needs to be reconfigured every time a different socket needs to execute. The thread-socket relations
are handled by the thread controller. The DMA adapter block converts read/write queries on the
threads to AHB requests and launches them on to the AHB. A single thread controller and DMA
adapter block may be shared by more than one peripheral.
A socket of a peripheral can be configured to either write to or read from buffers, not both. As a
convention, sockets used to write into system buffers are called 'Producers' and the direction of data
flow in this case is referred to as 'Ingress'. Conversely, sockets used to read out system buffers are
called 'Consumers' and the direction of data flow in this case is referred to as 'Egress'. Every socket
has a set of registers, which indicate the status of the socket such as number of bytes transferred
over the socket, current sub buffer being filled or emptied, location of the current buffer in memory,
and no buffer available.
A DMA transfer in FX3 can be envisioned as a flow of data from a producer socket on one peripheral
to a consumer socket on the other through buffers in the Sysmem. Specific DMA instructions called
'Descriptors' enable synchronizing between the sockets. Every buffer created in the Sysmem has a
descriptor associated with it that contains essential buffer information such as its address, empty/full
status and the next buffer/descriptor in chain. Descriptors are placed at specific locations in the
Sysmem which are regularly monitored and updated by the peripherals' sockets.
In a typical DMA transaction, the data source-peripheral sends data over the producing socket,
which fills the current buffer of the socket. Upon the last byte of the producer's current buffer being
written, the producer socket updates the descriptor of its current buffer and loads the next buffer in
the chain. This process goes on until either the buffer chain ends or the next buffer in the chain is not
free (empty to produce into). The corresponding consumer socket waits until the buffer it points to
becomes available (gets filled to consume from). When available, the data destination-peripheral is
notified to start reading the buffer over the consumer socket. When the last byte of the current buffer

46

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

is read, the consumer socket updates the descriptor of its current buffer and loads the next buffer in
the chain. This process goes on until either the buffer chain ends or the next buffer in the chain is not
available. The producer and consumer sockets only share the buffer/descriptor chain. It is not
necessary for them to be executing the same descriptor in the chain at any given instant.
In non-conventional DMA transactions, the producer and consumer sockets can be two different
sockets on the same peripheral. In some cases (for example, reading F/W over I2C), there is no
destination peripheral or consumer socket. In this case, the CPU is assumed to be the consumer.
Conversely, the CPU can act as a producer to a consumer socket on the destination peripheral (for
example, printing debug messages over UART).

3.8

Memory Map and Registers
Figure 3-19. Memory Map
0xFFFFF000

0xEFFFFFFF

VIC Registers
Unused

0xE000FFFF

Unused

Unused

0xE0008120

LPP DMA Regs
0xE0008000

0xE004FFFF

BootROM (32 KB)

GCTL Registers

0xF0000000

LPP Common
0xE0007F00

0xE0040000

USB Registers
MMIO Register
Space (256 MB)
0xE0000000

S-Port Registers
(FX3S only)
PIB (GPIF)
Registers

Unused
0xE0001400

0xE0030000

GPIO Registers
0xE0001000

0xE0020000

SPI Registers
0xE0000C00

0xE0010000

LPP Registers

UART Registers
0xE0000000

Page table (Opt.)

0x4007FFFF

0xE0000800

I2C Registers
0xE0000400

Unused

I2S Registers

DMA buffers

0xE0000000

Data
SYSMEM
(512 KB*)
0x40000000

Code
DMA Descriptors

Unused

0x40003000
0x40000000
0x10001FFF

ISR Data,
Runtime stacks etc.
0x10000000
0x00003FFF

DTCM (8 KB)
0x10000000

Unused
ITCM (16 KB)
0x00000000

ISR Code
Exception Vectors

0x00000100
0x00000000

Note: Some FX3 parts (CYUSB3011,
CYUSB3012) only have 256 KB
of SYSMEM available.

The ARM PL192 VIC is located outside the regular MMIO space, on top of the BootROM at location
FFFFF000. This conforms to the PL192 TRM, and facilitates single instruction jump to ISR from the
vector table at location 00000000 for IRQ and FIQ. For more details see ARM PL192 TRM.
A peripheral of FX3 typically contains the following registers
■

ID register

■

Clock, power config register

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

47

FX3 Overview

3.9

■

Peripheral specific config registers

■

Interrupt enable, mask an status registers

■

Error registers

■

Socket registers for sockets associated with the peripheral

Reset, Booting, and Renum
Resets in FX3 are classified into two: hard reset and soft reset.
A power on reset (POR) or a Reset# pin assertion initiates a hard reset. Soft Reset, on the other
hand, is initiated by the firmware writing to the control registers.
Soft Resets are of two types - CPU or Warm Reset and Device Reset
CPU or warm reset involves resetting the CPU Program Counter without affecting any of the
hardware blocks such as USB or GPIF-II. Selected blocks may be reset by the firmware as required.
Firmware does not need to be reloaded following a CPU Reset. Device Reset is identical to Hard
Reset. The firmware must be reloaded following a Device Reset.
Figure 3-20. Reset

FX3
USB HOST
(PC)
Processor
(AP)

Legacy MMC /
Async SRAM /
Async ADMux /
Sync ADMux

PMODE[2:0]

Boot mode
selection

Boot ROM

I2C

SPI

EEPROM

FLASH

FX3's flexible firmware loading mechanism allows code to be loaded from a device connected on the
I2C bus (an EEPROM for example), an SPI-based flash device, or from a PC acting as a USB host
or from an application processor (AP) connected on the flexible GPIF.
Every reset causes the device to start executing the bootloader code stored in the internal
BootROM. On a full device reset, the BootROM identifies the desired boot source by checking the
state of the PMODE pins. It then initializes the appropriate interface block (GPIF, I2C, SPI, or USB),
and then tries to obtain the user firmware image. In I2C and SPI cases, the bootloader tries to read
address 0 on the peripheral device, and checks whether a valid firmware header is received. If a
valid header is detected, the bootloader continues the boot process and transfers control to the
newly loaded application. In the case of GPIF or USB boot, the bootloader waits for the user to
initiate a boot operation.
In some cases, an intelligent processor connected to the GPIF of FX3 may also be used to download
the firmware for FX3. The processor can write the firmware bytes using the Sync ADMux, Async
ADMux, or the Async SRAM protocol. In addition, the AP can also use the MMC initialization and
write commands (PMMC legacy) to download firmware over its interface with FX3.

48

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

Alternatively, the user may simply wish to download the code from a PC using a USB cable. When
FX3 is configured for USB boot, the boot loader first enables FX3's USB block to accept vendor
commands over a bulk end point. When plugged into the host, the device enumerates with a
Cypress default VID and PID. The actual firmware is then downloaded using Cypress drivers. If
required, the firmware can then reconfigure the USB block (such as change the IDs and enable
more end points) and simulate a disconnect-event (soft disconnect) of the FX3 device from the USB
bus. On soft reconnect, FX3 enumerates with the new USB configuration. This two-step patented
process is called renumeration.
The boot loader is also responsible for restoring the state of FX3 when the device transitions back
from a low power mode to the normal active power mode. The process of system restoration is
called 'Warm boot'.

3.10

Clocking
Clocks in FX3 are generated from a single 19.2 MHz (±100 ppm) crystal oscillator. It is used as the
source clock for the PLL, which generates a master clock at frequencies up to up to 500 MHz. Four
system clocks are obtained by dividing the master clock by 1, 2, 4, and 16. The system clocks are
then used to generate clocks for most peripherals in the device through respective clock select and
divide (CSD) block A CSD block is used to select one of the four system clocks and then divide it
using the specified divider value. The depth and accuracy of the divider is different for different
peripherals,
Figure 3-21. CSD
CLOCK SELECT AND DIVIDE BLOCK
PLL_SYS_CLK_16
SEL_CLK
PLL_SYS_ _DIV[N:0]
CLKS[3:0]
CSD DIV_CLK
_OUT
PLL_SYS_
CLK_SEL

PLL_SYS_CLK_4
PLL_SYS_CLK_2

%
4:1
MUX

CLKIN

CLKOUT

PERIPHERAL_CLK

DIVIDE

PLL_SYS_CLK_1

The CPU clock is derived by selecting and dividing one of the four system clocks by an integer factor
anywhere between 1 and 16. The bus clocks are derived from the CPU clock. Independent 4-bit
dividers are provided for both the DMA and MMIO bus clocks. The frequency of the MMIO clock,
however, must be an integer divide of the DMA clock frequency.
A 32 kHz external clock source is used for low-power operation during standby. In the absence of a
32 kHz input clock source, the application can derive this from the reference clock produced by the
oscillator.
Certain peripherals deviate from the general clock derivation strategy. The fast clock source of GPIO
is derived from the system clocks using a CSD. The core clock is a fixed division of the fast clock.
The slow clock source of GPIO is obtained directly from the reference clock using a programmable
divider. The standby clock is used to implement 'Wake-Up' on GPIO. The I2S block can be run off an
internal clock derived from the system clocks or from an external clock sourced through the
I2S_MCLK pin of the device.
Exceptions to the general clock derivation strategy are blocks that contain their own PLL, because
they include a PHY that provides its clock reference. For example, the UIB block derives its
'epm_clk', 'sie_clk', 'pclk', and 'hd3_clk' using the standby clock, dma-bus clock, 30/120-MHz clock
from the USB2 PHY, and a 125-MHz clock from the USB3PHY. The sie_clk runs the USB 2.0 logic
blocks while USB 3.0 logic blocks are run using the pclk. The hd3_clk runs certain host and USB 3.0
logic blocks while the epm_clk runs the end point manager.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

49

FX3 Overview

Figure 3-22. Clock Generation Structure
PLL_SYS_CLK_SEL

SEL_CLK
PLL_SYS_ _DIV[N:0]
CLKS[3:0]
CSD DIV_CLK
_OUT
PLL_SYS_
CLK_SEL

FX3_PERIPH_CLK_CFG.
SYSCLK_SEL

peripheral_core_clk

FX3_I2S_CLK_CFG.
SELCLK_DIV

SEL_CLK
_DIV[N:0]
CLKIN

%

FX3_I2S_CLK_CFG.
SYSCLK_SEL

%4
DIV_CLK
_OUT

DIV_CLK
_OUT

i2s_core_clk

CLKIN

FX3_I2S_CLK_CFG.
SEL_M_CLK

mclk_i2s_in
PLL_CFG.MUL
CLKOUT_1
CLKOUT_2

MULTIPLY

PLL_CFG.DIV

DIVIDE

SYS_PLL

Crystal_in

FX3_GPIO_FCLK_CFG.
SELCLK_DIV

CLKIN

Xtal
Osc

SEL_CLK
PLL_SYS_ _DIV[N:0]
CLKS[3:0]
CSD DIV_CLK
_OUT
PLL_SYS_
CLK_SEL

reference clock

gpio_fast_clk

FX3_GPIO_FCLK_CFG.
SYSCLK_SEL

DIV_CLK
_OUT

%

Crystal_out

CLKOUT_4
CLKOUT_16

gpio_core_clk

CLKIN

SEL_CLK
_DIV[N:0]

SEL_CLK
_DIV[N:0]

SEL_CLK
_DIV[N:0]

FX3_GPIO_CLK_CFG.
SELCLK_DIV

CLKIN

%

%
DIV_CLK
_OUT

FX3_STANDBY_CLK_CFG.
SELCLK_DIV

CLKIN

FX3_GPIO_SCLK_CFG.
SELCLK_DIV

gpio_slow_clk

DIV_CLK
_OUT

gpio_standby_clk

Clk_32_in

FX3_CPU_CLK_CFG.
SELCLK_DIV

STANDBY_
CLK_SEL

mmio_bus_clk

DIV_CLK
_OUT

%

SEL_CLK
PLL_SYS_ _DIV[N:0]
CLKS[3:0]
CSD DIV_CLK
_OUT
PLL_SYS_
CLK_SEL

cpu_core_clk

CLKIN
SEL_CLK
_DIV[N:0]
FX3_MMIO_CLK_CFG.
SELCLK_DIV

FX3_CPU_CLK_CFG.
SYSCLK_SEL

dma_bus_clk

%

DIV_CLK
_OUT

CLKIN
SEL_CLK
_DIV[N:0]

FX3_DMA_CLK_CFG.
SELCLK_DIV

dma_bus_clk_i

standby_clk_i

UIB CLK
MUX

uib_epm_clk
USB2PHY
PLL
CLKIN

%4
CLKOUT_480
CLKOUT_30

uib_hd3_clk

usb2_clk120_i

DIV_CLK
_OUT

CLKIN

%4

uib_sie_clk

DIV_CLK
_OUT usb2_clk30_i

uib_p_clk

CLKIN

USB3PHY
PLL
CLKIN

CLKOUT_125

usb3_clk125_i

CLKOUT_5G

UIB CLOCK
SRCS.CFG

Note…………………………………………………….
UART baud rate is 1/8th of uart_core_clk…………..
I2C operating frequency is 1/10 th of I2C core clock
SPI operating frequency is ½ of spi core clock…….

The CPU, DMA, and MMIO clock domains are synchronous to each other. However, every
peripheral assumes its core clock to be fully asynchronous from other peripheral core clocks, the
computing clock or the wakeup clock.
If the core (peripheral) clock is faster than the bus clock, the DMA adapter for the block runs in the
core clock domain. The DMA adapter takes care of the clock crossing on it's interconnect side. If the
core clock is slower than the bus clock, the DMA adapter for that block runs in the bus clock domain.
The DMA adapter takes care of the clock crossing on its core IP side.

50

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Overview

Figure 3-23. DMA Adaptor
(a) Core Clock >Bus clock

(b) Bus clock>Core Clock

I/ O
Matrix

Core Logic
Block XYZ

I/ O
Pads

System

DMA / Bus
Adapter

Block XYZ Power Domain

Interconnects

System

Interconnects

Block XYZ Power Domain

DMA / Bus
Adapter

Wake Up
Logic

Block XYZ
Clock Domain

3.11

Power

3.11.1

Power Domains

Clock

I/ O
Pads

Wake Up
Logic

wakeup

Processor
/ Bus
Clock Domain

I/ O
Matrix

Core Logic
Block XYZ

Always
/ Power
/

- On
Reset Domain

Processor
/ Bus
Clock Domain

Block
XYZ
Clock
Domain

wakeup

Clock

Always
/ Power
/

- On
Reset Domain

Power supply domains in FX3 can be mainly classified in four - Core power domain, Memory power
domain, I/O power domain, and Always On power domain. The I/O power domain is further divided
into five power domains.
Core power domain encompasses a large section of the device including the CPU, peripheral logic,
and the interconnect fabric. The system SRAM memory resides in the Memory power domain. I/O
logic dwell in their respective peripheral I/O power domain (I2C I/O power domain, I2S-UART
I/O-SPI I/O-GPIO power domain, Clock I/O power domain, USB I/O power domain, and Processor
Port I/O power domain). The Always On power domain hosts the power management controller,
different wake-up sources and their associated logic.
Wake-up sources force a system in suspend or standby state to switch to the normal power
operation mode. These are distributed across peripherals and configured in the 'Always On global
configuration block'. Some of them include level match on level-sensitive wake-up I/Os, toggle on
edge sensitive wake-up I/Os, activity on the USB 2.0 data lines, OTG ID change, LFPS detection on
USB 3.0 RX lines, USB connect event, and watchdog timer – timeout event.
The 'Always On global configuration block' runs off the standby clock and will be turned off only if the
device is powered off.

3.11.2

Power Management
At any instant, FX3 is in one of the four power modes - normal, suspend, standby, or core power
down. In a typical scenario, when FX3 is actively executing its tasks, the system is in normal mode.
The usual clock gating techniques in peripherals minimize the overall power consumption.
On detecting prolonged periods of inactivity, the chip can be forced to enter the suspend mode. All
ongoing port (peripheral) activities are wrapped up, ports disabled, and wake up sources are set
before entering the suspend state. In applications involving USB 3.0, the USB3 PHY is forced into
the U3 state. USB2PHY, if used, is forced into suspend. The System RAM transitions to a low power
stand by state; read and write to RAM cannot be performed. The CPU is forced into the halt state.
The ARM core will retain its state, including the Program Counter inside the CPU. All clocks except
the 32-kHz standby are turned off by disabling the System PLL is through the global configuration
block. In the absence of clocks, the I/O pins can retain their state as long as the I/O power domain is
not turned off The INT# pin can be configured to indicate FX3's presence in low power mode.
Further reduction in power is achieved by forcing FX3 into stand-by state where, in addition to
disabling clocks, the core power domain is turned off. As in the case of suspend, I/O states of
powered peripheral I/O domains are frozen and ports disabled. Essential configuration registers of

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

51

FX3 Overview

logic blocks are first saved to the System RAM. Following this, the System RAM itself is forced into
low power memory retention only mode. Warm boot setting is enabled in the global configuration
block. Finally the core is powered down. When FX3 comes out of standby, the CPU goes through a
reset; the boot-loader senses the warm boot mode and restores the system to its original state after
loading back the configuration values (including the firmware resume point) from the System RAM.
Optionally, FX3 can be powered down (core power down) from its Standby mode. This involves an
additional process of removing power from the VDD pins. Contents of System SRAM are lost and I/
O pins go undefined. When power is re-applied to the VDD pins, FX3 will go through the normal
power on reset sequence.

52

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

4.

FX3 Software

Cypress’s EZ-USB FX3 is the next generation USB 3.0 peripheral controller. This is a highly
integrated and flexible chip which enables system designers to add USB 3.0 capability to any
system. The FX3 comes with easy-to-use EZ-USB tools providing a complete solution for fast
application development.
Cypress EZ-USB FX3 is a user-programmable device and is delivered with a complete software
development kit.

4.1

System Overview
Figure 4-1illustrates the programmer's view of FX3. The main programmable block is the FX3
device. The FX3 device can be set up to:
■

Configure and manage USB functionality such as charger detection, USB device/host detection,
and endpoint configuration

■

Interface to different master/slave peripherals on the GPIF interface

■

Connect to serial peripherals (UART/SPI/GPIO/I2C/I2S)

■

Set up, control, and monitor data flows between the peripherals (USB, GPIF, and serial
peripherals)

■

Perform necessary operations such as data inspection, data modification, header/footer
information addition/deletion

Figure 4-1. Programming View of FX3

I2C/I2S/
UART/SPI

User
Implementation

- User application
- Cypress generic USB driver
- USB 3.0 Bus/Hub driver
- USB xHCI driver

FX3
- User application
- Application framework
- FX3 APIs
- Low level drivers
- RTOS

USB Host
(SS/HS/FS)

U-Port

Master/Slave
Peripheral

P-Port

USB SS/HS/FS
GPIF II

USB HS/FS/LS

USB Device
(HS/FS/LS)
User Device
Implementation

Cypress provided software
User or customer software
Third-party or platform software

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

53

FX3 Software

The two other important entities that are external to the FX3 are
■

■

4.2

USB host/device
❐

When the FX3 is connected to a USB host, it functions as a USB device. The FX3 enumerates
as a super-speed, high-speed, or full-speed USB peripheral corresponding to the host type.

❐

When a USB device is connected, the FX3 plays the role of the corresponding high-speed,
full-speed or low-speed USB host.

GPIF II master/slave: GPIF II is a fully configurable interface and can realize any application
specific protocol as described in GPIF™ II Designer on page 137. Any processor, ASIC, DSP, or
FPGA can be interfaced to the FX3. FX3 bootloader or firmware configures GPIF II to support the
corresponding interface.

FX3 Software Development Kit (SDK)
The FX3 comes with a complete software development solution as illustrated in the following figure.
Figure 4-2. FX3 SDK Components
Host PC
GPIF – II
Designer

GPIF-II
Design

FX3
Libraries

Eclipse IDE

Tool-Chain
(Compiler,
Assembler,
Linker)

USB Suite
(Driver +
Lib)

USB

Application

FX3 API and Drivers
(DMA/USB/GPIF/Serial)

Firmware
Binary

User
Firmware

RTOS
JTAG
Debugger

4.3

FX3 Device

JTAG

FX3 Silicon

FX3 Firmware Stack
Powerful and flexible applications can be rapidly built using the FX3 firmware framework and FX3
API libraries.

4.3.1

Firmware Framework
The firmware (or application) framework has all the startup and initialization code. It also contains
the individual drivers for the USB, GPIF, and serial interface blocks. The framework:

4.3.2

■

Defines the program entry point

■

Performs the stack setup

■

Performs kernel initialization

■

Provides placeholders for application thread startup code

Firmware API Library
The FX3 API library provides a comprehensive set of APIs to control and communicate with the FX3
hardware. These APIs provide a complete programmatic view of the FX3 hardware.

54

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Software

4.3.3

FX3 Firmware Examples
Various firmware (application) examples are provided in the FX3 SDK. These examples are provided
in source form. These examples illustrate the use of the APIs and the firmware framework, putting
together a complete application. The examples illustrate the following:
■

Initialization and application entry

■

Creating and launching application threads

■

Programming the peripheral blocks (USB, GPIF, serial interfaces)

■

Programming the DMA engine and setting up data flows

■

Registering callbacks and callback handling

■

Error handling

■

Initializing and using the debug messages

The examples include:

4.4

■

USB loop examples (using both bulk and isochronous endpoints)

■

UVC (USB video class implementation)

■

USB source/sink examples (using both bulk and isochronous endpoints)

■

USB Bulk streams example

■

Serial Interface examples (UART/I2C/SPI/GPIO)

■

Slave FIFO (GPIF-II) examples

■

USB mass storage examples

FX3 Host Software
A comprehensive host side (Microsoft Windows) stack is included in the FX3 SDK. This stack
includes the Cypress generic USB 3.0 driver, APIs that expose the driver interfaces, and application
examples. Each of these components are described in brief in this section. Detailed explanations are
presented in FX3 Host Software chapter on page 135.

4.4.1

Cypress Generic USB 3.0 Driver
A generic kernel mode (WDF) driver is provided on Windows 7 (32/64-bit), Windows Vista (32/64bit), and Windows XP (32 bit only). This driver interfaces to the underlying Windows bus driver or a
third party driver and exposes a non-standard IOCTL interface to an application.

4.4.2

Convenience APIs
These APIs (in the user mode) expose generic USB driver interfaces through C++ and C# interfaces
to the application. This allows the applications to be developed with more intuitive interfaces in an
object oriented fashion.

4.4.3

USB Control Center
This is a Windows utility that provides interfaces to interact with the device at low levels such as
selecting alternate interfaces and data transfers. This can also be used to download a firmware
binary to the FX3 device RAM, and to program the binary on to an EEPROM or SPI flash device.

4.4.4

Bulkloop
This is a windows application to perform data loop back on Bulk endpoints.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

55

FX3 Software

4.4.5

Streamer
This is a windows application to perform data streaming over Isochronous, bulk on interrupt endpoints. This application can be used to measure the transfer throughput capabilities of the FX3
device as well as the USB host controller.

4.5

FX3 Development Tools
FX3 is a device with open firmware framework and driver level APIs allowing the customer to
develop firmware that matches the application. This approach requires ARM code development and
debug environment.
A set of development tools is provided with the SDK, which includes the GPIF II Designer and third
party toolchain and IDE.

4.5.1

Firmware Development Environment
The firmware development environment helps to develop, build, and debug firmware applications for
FX3. The third party ARM software development tool provides an integrated development
environment (IDE) with compiler, linker, assembler, and JTAG debugger.

4.5.2

GPIF II Designer
GPIF II Designer is a Windows application provided to FX3 customers as part of the FX3 SDK. The
tool provides a graphical user interface to allow customers to intuitively specify the necessary
interface configuration appropriate for their target environment. The tool generates firmware code
that eventually gets built into the firmware.
GPIF II Designer generates configurations and state machine descriptors for GPIF II interface module. The tool provides an user interface to express the users' design in the form of a state machine.
In addition, the user can traverse through the state machine and observe the timing diagram for all of
the external GPIF-II signals.

56

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

5.

FX3 Firmware

The chapter presents the programmers overview of the FX3 device. The boot and the initialization
sequence of the FX3 device is described. This sequence is handled by the firmware framework. A
high level overview of the API library is also presented, with a description of each programmable
block.

5.1

Initialization
The system initialization sequence sets up the CPU sub-system, initializes the firmware framework,
and sets up other modules of the firmware framework. It is the initialization point for the RTOS.
The following high level activities are handled as part of the initialization sequence.
■

Device configuration: The FX3 boot mode and GPIF startup I/O interface configuration is determined by the PMODE pins. The I/O ports (USB, GPIF, and serial interfaces) are set up according
to the device type and the internal I/O matrix is configured accordingly.

■

Clock setup: The firmware framework sets the CPU clock at startup.

■

MMU and cache management: The FX3 device does not support virtual memory. The FX3
device memory is a one to one mapping from virtual to physical addresses. This is configured in
the MMU. The device MMU is enabled to allow the use of the caches in the system. By default,
the caches are disabled and invalidated on initializing the MMU.

■

Stack initialization: The stacks needed for all modes of operation for the ARM CPU (System,
Supervisor, FIQ, IRQ) are set up by the system module.

For all user threads, the required stack space must be allocated prior to thread creation. Separate
APIs are provided to create a runtime heap and to allocate space from the heap.
■

Interrupt management: The FX3 device has a vectored interrupt controller. Exception vectors
and VIC are both initialized by this module. The exception vectors are in the I-TCM and are
located from address 0x0 (refer to memory map).

The actual initialization sequence is shown in the following figure:

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

57

FX3 Firmware

Figure 5-1. Initialization Sequence

Firmware Entry Point

Tool Chain
Initialization

Firmware Main

RTOS Initialization

FX3 Application
Thread

1. The execution starts from the firmware image entry point. This is defined at the compile time for a
given FX3 firmware image. This function initializes the MMU, VIC, and stacks.
2. The second step in the initialization sequence is the Tool Chain init. This is defined by the tool
chain used to compile the FX3 firmware. Because the stack setup is complete, this function is
only expected to initialize any application data.
3. The main() function, which is the C programming language entry for the firmware, is invoked
next. The FX3 device is initialized in this function.
4. The RTOS kernel is invoked next from the main(). This is a non-returning call and sets up the
Threadx kernel.
5. At the end of the RTOS initialization, all the driver threads are created.
6. In the final step, FX3 user application entry is invoked. This function is provided to create all user
threads.

58

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

5.1.1

Device Boot
The boot operation of the device is handled by the boot-loader in the boot ROM. On CPU reset, the
control is transferred to boot-ROM at address 0xFFFF0000.
For cold boot, download the firmware image from various available boot modes of FX3. The
bootloader identifies the boot source from the PMODE pins and loads the firmware image into the
system memory (SYS_MEM). The firmware entry location is read by the bootloader from the boot
image and is stored at address 0x40000000 by the boot-loader at the time of cold boot.
The boot options available for the FX3 device are:
■

USB boot

■

I2C boot. SPI Boot

■

GPIF boot (where the GPIF is configured to be Async SRAM, Sync/Async ADMUX)

In case of warm boot or wake-up from standby, the boot-loader simply reads the firmware entry
location (stored at the time of cold boot) and transfers control to the firmware image that is already
present in the system memory.

5.1.2

FX3 Memory Organization
The FX3 device has the following RAM areas:
1. 512 KB of system memory (SYS_MEM) [0x40000000: 80000] – This is the general memory available for code, data and DMA buffers. The first 12KB is reserved for boot/DMA usage. This area
should never be used.
2. 16KB of I-TCM [0x00000000: 4000] – This is instruction tightly coupled memory which gives single cycle access. This area is recommended for interrupt handlers and exception vectors for
reducing interrupt latencies. The first 256 bytes are reserved for ARM exception vectors and this
can never be used.
3. 8KB of D-TCM [0x10000000: 2000] – This is the data tightly coupled memory which gives single
cycle data accesses. This area is recommended for RTOS stack. Data cannot be placed here
during load time
The memory requirements for the system can be classified as the following:
1. CODE AREA: All the instructions including the RTOS.
2. DATA AREA: All uninitialized and zero-initialized global data/constant memory. This does not
include dynamically allocated memory.
3. STACK AREA: There are multiple stacks maintained: Kernel stacks as well as individual thread
stacks. It is recommended to place all kernel stacks in D-TCM. The thread stacks can be allocated from RTOS heap area.
4. RTOS/LIBRARY HEAP AREA: All memory used by the RTOS provided heap allocator. This is
used by CyU3PMemInit(), CyU3PMemAlloc(), CyU3PMemFree().
5. DMA BUFFER AREA: All memory used for DMA accesses. All memory used for DMA has to be
16 byte multiple. If the data cache is enabled, then all DMA buffers have to be 32 byte aligned
and a multiple of 32 byte so that no data is lost or corrupted. This is used by the DMABuffer functions: CyU3PDmaBufferInit(), CyU3PDmaBufferAlloc(), CyU3PDmaBufferFree(),
CyU3PDmaBufferDeInit().

5.1.3

FX3 Memory Map
The following figure shows a typical memory map for the FX3 device.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

59

FX3 Firmware

Figure 5-2. FX3 Memory Map

A linker script file is used to provide the memory map information to the GNU linker. The following
example is from the linker script file distributed with the FX3 SDK (fx3.ld):
ENTRY(CyU3PFirmwareEntry);

60

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

MEMORY
{
I-TCM: ORIGIN = 0x100LENGTH = 0x3F00
SYS_MEM: ORIGIN = 0x40003000LENGTH = 0x2D000
DATA: ORIGIN = 0x40030000LENGTH = 0x8000
}
SECTIONS
{
.vectors :
{
*(CYU3P_ITCM_SECTION);
} >I-TCM
.text :
{
*(.text)
*(.rodata*)
*(.constdata)
*(.emb_text)
*(CYU3P_EXCEPTION_VECTORS);
_etext = .;
} > SYS_MEM
.data :
{
_data = .;
*(.data*)
* (+RW, +ZI)
_edata = .;
} > DATA
.bss :
{
_bss_start = .;
*(.bss)
} >DATA
. = ALIGN(4);
_bss_end = . ;
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > DATA
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > DATA
__exidx_end = .;
}

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

61

FX3 Firmware

The contents of each section of the memory map are explained below.

5.1.3.1

I-TCM
All instructions that are recommended to be placed under I-TCM are labeled under section
CYU3P_ITCM_SECTION. This contains all the interrupt handlers for the system. If the application
requires to place a different set of instructions it is possible. Only restriction is that first 256 bytes are
reserved.

5.1.3.2

D-TCM
SVC, IRQ, FIQ and SYS stacks are recommended to be located in the D-TCM. This gives maximum
performance from RTOS. These stacks are automatically initialized by the library inside the
CyU3PFirmwareEntry location with the following allocation:
SYS_STACK
ABT_STACK
UND_STACK
FIQ_STACK
IRQ_STACK
SVC_STACK

Base:
Base:
Base:
Base:
Base:
Base:

0x10000000
0x10000800
0x10000900
0x10000A00
0x10000C00
0x10001000

Size
Size
Size
Size
Size
Size

2KB
256B
256B
512B
1KB
4KB

If for any reason the application needs to modify this, it can be done before invoking
CyU3PDeviceInit() inside the main() function. Changing this is not recommended.

5.1.3.3

Code Area
The code can be placed in the SYS_MEM area. It is recommended to place the code area in the
beginning and then the data/heap area. Code area starts after the reserved 12KB and here 180KB is
allocated for code area in the linker script file. If the code space allocated is not sufficient, the linker
will return an error when trying to generate the firmware binary. The fx3.ld file can then be modified
to increase the allocated space, as required.

5.1.3.4

Data Area
The global data area and the uninitialized data area follow the code area. In the linker script file, 32
KB is allocated for this. As in the case of code space, the fx3.ld file can be modified to increase or
decrease the space allocated for the data area.

5.1.3.5

RTOS managed heap area
This area is where the thread memory and also other dynamically allocated memory to be used by
the application are placed. The memory allocated for this is done inside the RTOS port helper file
cyfxtx.c.
To modify this memory size/location change the definition for:
#define CY_U3P_MEM_HEAP_BASE

((uint8_t *)0x40038000)

#define CY_U3P_MEM_HEAP_SIZE

(0x8000)

32 KB is allocated for RTOS managed heap. The size of this area can be changed in cyfxtx.c.
Memory allocation for the CyU3PMemAlloc is implemented using the byte pool service provided by
ThreadX. This scheme makes use of a list that tracks available memory blocks within the reserved
heap area. These routines will ensure that all allocated blocks are aligned at 4-byte boundaries.

62

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

The thread stacks are allocated from the RTOS managed heap area using the CyU3PMemAlloc()
function.

5.1.3.6

DMA buffer area
DMA buffer area is managed by helper functions provided as source in cyfxtx.c file. These are
CyU3PDmaBufferInit(), CyU3PDmaBufferAlloc(), CyU3PDmaBufferFree()
and
CyU3PDmaBufferDeInit(). All available memory above the RTOS managed heap to the top of
the SYS_MEM is allocated as the DMA buffer area.
The full implementation for these allocation routines is provided as part of the cyfxtx.c file. The allocator ensures that all blocks allocated are placed at 32-byte (cache-line) boundaries.
The allocator makes use of a bitmap to manage the free/used status of each 32-byte block within the
area reserved for the buffer heap. The memory for the bitmap is obtained using the CyU3PMemAlloc
function.
The CyU3PDmaBufferAlloc looks for the required number of free 32-byte blocks and then marks
them occupied. The CyU3PDmaBufferFree function marks the corresponding memory blocks free.
The status bit for the last 32-byte block in the allocated region is left in the used status so that it can
serve as an end of block marker.
The memory allocated for this region can be modified by changing the definition for the following in
cyfxtx.c.
#define CY_U3P_BUFFER_HEAP_BASE
((uint32_t) CY_U3P_MEM_HEAP_BASE + CY_U3P_MEM_HEAP_SIZE)
#define CY_U3P_BUFFER_HEAP_SIZE
(CY_U3P_SYS_MEM_TOP - CY_U3P_BUFFER_HEAP_BASE)

The default cyfxtx.c in the SDK reserves the last 32 KB of memory (0x40078000 to 0x40080000) for
the optional second stage bootloader application built using the fx3_boot.a library. If the second
stage boot application is not required, this memory can be reclaimed by changing the
CY_U3P_SYS_MEM_TOP value to 0x40080000.

5.1.3.7

Support for FX3 parts with reduced memory
Some FX3 parts such as the CYUSB3011 and CYUSB3012 only have 256 KB of memory available.
When these parts are being used, the memory map described must be modified to fit into the available space.
A linker script suitable for these parts has been provided in the /firmware/
common/fx3_256k.ld file. The RTOS heap and buffer heap placement can be modified by enabling
the CYMEM_256K pre-processor definition in the cyfxtx.c file.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

63

FX3 Firmware

The high-level memory map provided by the fx3_256k.ld file is:
Table 5-1. High-level Memory Map
Memory Type

Base Address

Size

DMA descriptor area

0x40000000

12 KB

Code area

0x40003000

128 KB

Data area

0x40023000

24 KB

RTOS heap

0x40029000

28 KB

Buffer heap

0x40030000

32 KB*

2-stage boot area

0x40038000

32 KB*

* The buffer heap allocation can be increased to 64 KB, if the 2-stage boot solution is not in use.
As in the above case, the values programmed into these files are only the default values that work
with the SDK examples. They can be modified as required, subject to the constraint that
CY_U3P_SYS_MEM_TOP should be set to 0x40040000 or lesser.

5.2

API Library
A full fledged API library is provided in the FX3 SDK. The API library and the corresponding header
files provide all the APIs required for programming the different blocks of the FX3. The APIs provide
for the following:

5.2.1

■

Programming each of the FX3/FX3S device blocks - USB, GPIF II, Storage, Serial peripherals
and GPIO

■

Programming the DMA engine and setting up of data flows between these blocks

■

The overall framework for application development, including system boot and init, OS entry, and
application init

■

ThreadX OS calls as required by the application

■

Power management features

■

Programming low level DMA engine

■

Debug capability

USB Block
The FX3 device has a USB-OTG PHY built-in and is capable of:
■

USB peripheral - super speed, high speed, and full speed

■

USB host - high speed and full speed only

■

Charger detection

The USB driver provided as part of the FX3 firmware is responsible for handling all the USB
activities. The USB driver runs as a separate thread and must be initialized from the user application.
After initialization, the USB driver is ready to accept commands from the application to configure the
USB interface of the FX3.
The USB driver handles both the USB device mode and the USB host mode of operation.

5.2.1.1

USB Device Mode
The USB device mode handling is described in the following sections.
USB Descriptors

64

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

Descriptors must be formed by the application and passed on to the USB driver. Each descriptor
(such as Device, Device Qualifier, String, and Config) must be framed as an array and passed to the
USB driver through an API call.
Endpoint Configuration

When configured as a USB device, the FX3 has 32 endpoints. Endpoint 0 is the control endpoint in
both IN and OUT directions, and the other 30 endpoints are fully configurable. The endpoints are
mapped to USB sockets in the corresponding directions. The mapping is normally one-to-one and
fixed – endpoint 1 is mapped to socket 1 and so on. The only exception is when one or more USB
3.0 bulk endpoints are enabled for bulk streams. In this case, it is possible to map additional sockets
that are not in use to the stream enabled endpoints.
Endpoint descriptors are formed by the application and passed to the USB driver which then
completes the endpoint configuration. An API is provided to pass the configuration to the USB driver,
this API must be invoked for each endpoint.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

65

FX3 Firmware

Enumeration

The next step in the initialization sequence is USB enumeration. After descriptor and endpoint
configuration, the Connect API is issued to the USB driver. This enables the USB PHY and the
pull-up on the D+ pin. This makes the USB device visible to a connected USB host and the
enumeration continues.
Setup Request

By default, the USB driver handles all Setup Request packets that are issued by the host. The application can register a callback for setup requests. If a callback is registered:
■

It is issued for every setup request with the setup data

■

The application can perform the necessary actions in this callback

■

The application must return the handling status whether the request was handled or not. This is
required as the application may not want to handle every setup request

■

If the request is handled in the application, the USB driver does not perform any additional
handling

■

If the request is not handled, the USB driver performs the default handling

Class/Vendor-specific Setup Request

Setup request packets can be issued for vendor commands or class specific requests such as MSC.
The application must register for the setup callback (described earlier) to handle these setup request
packets.
When a vendor command (or a class specific request) is received, the USB driver issues the callback with the setup data received in the setup request. The user application needs to perform the
requisite handling and return from the callback with the correct (command handled) status.
Events

All USB events are handled by the USB driver. These include Connect, Disconnect, Suspend,
Resume, Reset, Set Configuration, Speed Change, Clear Feature, and Setup Packet.
The user application can register for specific USB events. Callbacks are issued to the user
application with the event type specified in the callback.
■

The application can perform the necessary event handling and then return from the callback
function.

■

If no action is required for a specific event, the application can simply return from the issued callback function.

In both cases, the USB driver completes the default handling of the event.
Stall

The USB driver provides a set of APIs for stall handling.
■

The application can stall a given endpoint

■

The application can clear the stall on a given endpoint

Re-enumeration

66

■

When a reset is issued by the USB host, the USB driver handles the reset and the FX3 device
re-enumerates. If the application has registered a callback for USB event, the callback is issued
for the reset event.

■

The application can call the ConnectState API to electrically disconnect from the USB host. A
subsequent call to the same API to enable the USB connection causes the FX3 device to
re-enumerate.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

■

When any alternate setting is required, the endpoints must be reconfigured (UVC is an example
where the USB host requests a switch to an alternate setting). The USB on the FX3 can remain in
a connected state while this endpoint reconfiguration is being performed. A USB disconnect,
followed by a USB connect is not required.

■

The USB connection must be disabled before the descriptors can be modified.

Data Flows

All data transfers across the USB are done by the DMA engine. The simplest way of using the DMA
engine is by creating DMA channels. Each USB endpoint is mapped to a DMA socket. The DMA
channels are created between sockets. The types of DMA channels, data flows, and controls are
described in DMA Mechanism on page 44.

5.2.1.2

Host Mode Handling
If a host mode connection is detected by the USB driver, the previously completed endpoint
configuration is invalidated and the user application is notified. The application can switch to host
mode and query the descriptors on the connected USB peripheral. The desired endpoint
configuration can be completed based on the descriptors reported by the peripheral. When the host
mode session is stopped, the USB driver switches to a disconnect state. The user application is
expected to stop and restart the USB stack at this stage.

5.2.1.3

Bulk Streams in USB 3.0
Bulk streams are defined in the USB 3.0 specification as a mechanism to enhance the functionality
of Bulk endpoints, by supporting multiple data streams on a single endpoint. When the FX3 is in USB
3.0 mode, the bulk endpoints support streams and burst type of data transfers. All active streams are
actually mapped to USB sockets. Additional sockets that are not in use can be mapped to the stream
enabled endpoints.

5.2.1.4

USB Device Mode APIs
The USB APIs are used to configure the USB device mode of operation. These include APIs for

5.2.1.5

■

Start and stop the USB driver stack in the firmware

■

Setting up the descriptors to be sent to the USB host

■

Connect and disconnect the USB pins

■

Set and get the endpoint configuration

■

Get the endpoint status

■

Set up data transfer on an endpoint

■

Flush and endpoint

■

Stall or Nak an endpoint

■

Get or send data on endpoint 0

■

Register callbacks for setup requests and USB events

USB Host Mode APIs
The USB Host Mode APIs are used to configure the FX3 device for USB Host mode of operation.
These include APIs for
■

Start and stop the USB Host stack in the firmware

■

Enable/disable the USB Host port

■

Reset/suspend/resume the USB Host port

■

Get/set the device address

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

67

FX3 Firmware

5.2.1.6

■

Add/remove/reset an endpoint

■

Schedule and perform EP0 transfers

■

Setup/abort data transfers on endpoints.

USB OTG Mode APIs
The USB OTG Mode APIs are used to configure the USB port functionality and peripheral detection.
These include APIs for

5.2.2

■

Start and stop the USB OTG mode stack in firmware

■

Get the current mode (Host/Device)

■

Start/abort and SRP request

■

Initiate a HNP (role change)

■

Request remote host for HNP

GPIF II Block
The GPIF II is a general-purpose configurable I/O interface, which is driven through state machines.
As a result, the GPIF II enables a flexible interface that can function either as a master or slave in
many parallel and serial protocols. These may be industry standard or proprietary.
The features of the GPIF II interface are as follows:
■

Functions as master or slave

■

Provides 256 firmware programmable states

■

Supports 8-bit, 16-bit, and 32-bit data path

■

Enables interface frequencies of up to 100 MHz

Figure 5-3. GPIF II Flow
FX3 Development
Environment

User Input
State Machine

GPIF Interface
Designer

CHeader

FX3 Firmware
Application

FX3
Firmware

FX3 Firmware APIs
and Drivers

Figure 5-3 illustrates the flow of the GPIF II interface:
■

The GPIF II Interface Design tool allows to synthesize the configuration by specifying the state
machine.

■

The configuration information for the GPIF II state machine is output as a C Header file by the
tool.

■

The header file is used along with the FX3 applications and API libraries to build the FX3
firmware.

On the FX3 device, the GPIF II must be configured before activating the state machine.

68

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

1. Load the state machine configuration into GPIF memory
2. Configure the GPIF registers
3. Configure additional GPIF parameters such as comparators and pin directions
4. Initiate the GPIF state machine
Each of these actions must be achieved by calling the appropriate GPIF API from the user
application. The GPIF II driver provides calls for the user to setup and utilize the GPIF II engine.
Because the GPIF II states can hold multiple waveforms, there is also a provision to switch to
different states. These state switches are initiated through specific calls.
The GPIF II can be configured as a master or as a slave. When the GPIF II is configured as a
master, GPIF II transactions are initiated using the GPIF II driver calls. The driver supports a method
of executing master mode command sequences - initiate a command, wait for completion, and
repeat the sequence, if required. When a transaction is complete, an event can be signaled.
A set of GPIF II events are specified. The user application needs to implement an interrupt handler
function that is called from the ISR provided by the firmware library. Notification of GPIF II related
events are only provided through this handler.
The programmed GPIF II interface is mapped to sockets. All data transfers (such as in USB) are
performed by the DMA engine.

5.2.2.1

GPIF II APIs
The GPIF II APIs allow the programmer to set up and use the GPIF II engine. These include APIs to

5.2.3

■

Initialize the GPIF state machine and load the waveforms

■

Disable the GPIF state machine

■

Start the GPIF state machine from a specified state

■

Switch the GPIF state machine to a required state

■

Pause and resume the GPIF state machine

■

Configure a GPIF socket for data transfers

■

Read or write a specified number of words from/to the GPIF interface

Serial Interfaces
The FX3 device has a set of serial interfaces: UART, SPI, I2C, I2S, and GPIOs. All these peripherals
can be configured and used simultaneously. The FX3 library provides a set of APIs to configure and
use these peripherals. The driver must be first initialized in the user application. Full documentation
of all Serial Interface registers is provided in Chapter 9. The source code for the serial interface drivers and access APIs is provided in the FX3 SDK package, in the firmware/lpp_source folder.
Each peripheral is configured individually by the set of APIs provided. A set of events are defined for
these peripherals. The user application must register a callback for these events and is notified when
the event occurs.

5.2.3.1

UART
A set of APIs are provided by the serial interface driver to program the UART functionality. The
UART is first initialized and then the UART configurations such as baud rate, stop bits, parity, and
flow control are set. After this is completed, the UART block is enabled for data transfers.
The UART has one producer and one consumer socket for data transfers. A DMA channel must be
created for block transfers using the UART.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

69

FX3 Firmware

A direct register mode of data transfer is provided. This may be used to read/write to the UART, one
byte at a time.
UART APIs

These include APIs to

5.2.3.2

■

Start of stop the UART

■

Configure the UART

■

Setup the UART to transmit and receive data

■

Read and write bytes from and to the UART

I2C
The I2C initialization and configuration sequence is similar to the UART. When this sequence is
completed, the I2C interface is available for data transfer.
An API is provided to send the command to the I2C. This API must be used before every data
transfers to indicate the size, direction, and location of data.
The I2C has one producer and one consumer socket for data transfers. A DMA channel must be
created for block transfers using the I2C.
A direct register mode of data transfer is provided. This may be used to read/write to the I2C, one
byte a time. This mechanism can also be used to send commands and/or addresses to the target
I2C peripheral.
I2C APIs

These include APIs to

5.2.3.3

■

Initialize/De-initialize the I2C

■

Configure the I2C

■

Setup the I2C for block data transfer

■

Read/Write bytes from/to the I2C

■

Send a command to the I2C

I2S
The I2S interface must be initialized and configured before it can be used. The interface can be used
to send stereo or mono audio output on the I2S link.
DMA and register modes of access are provided.
I2S APIs

These include APIs to

70

■

Initialize/de-initialize the I2S

■

Configure the I2S

■

Transmit bytes on the interface (register mode)

■

Control the I2S master (mute the audio)

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

5.2.3.4

GPIO
A set of APIs are provided by the serial interface driver to program and use the GPIO. The GPIO
functionality provided on the FX3 is a serial interface that does not require DMA.
Two modes of GPIO pins are available with FX3 devices - Simple and Complex GPIOs. Simple
GPIO provides software controlled and observable input and output capability only. Complex GPIOs
contain a timer and supports a variety of timed behaviors such as pulsing, time measurements, and
one-shot.
GPIO APIs

These include APIs to

5.2.3.5

■

Initialize/de-initialize the GPIO

■

Configure a pin as a simple GPIO

■

Configure a pin as a complex GPIO

■

Get or set the value of a simple GPIO pin

■

Register an interrupt handler for a GPIO

■

Get the threshold value of a GPIO pin

SPI
The SPI has an initialization sequence that must be first completed for the SPI interface to be
available for data transfer. The SPI has one producer and one consumer socket for data transfers. A
DMA channel must be created for block transfers using the SPI.
A direct register mode of data transfer is provided. This may be used to read/write a sequence of
bytes from/to the SPI interface.
SPI APIs

These include APIs to

5.2.4

■

Initialize/de-initialize the SPI

■

Configure the SPI interface

■

Assert/de-assert the SSN line

■

Set up block transfers

■

Read/write a sequence of bytes

■

Enable callbacks on SPI events

■

Register an interrupt handler

Storage APIs
The Storage APIs are intended only for applications running on the FX3S device. These APIs allow
user applications to initialize, identify, configure and exchange data with SD, eMMC or SDIO peripheral devices.
The Storage APIs are compiled into a separate API library (cyu3sport.a) and need to be linked with
the application only if they are required. The Storage API library provides APIs to:
■

Initialize the storage peripherals connected on one or both of the storage ports.

■

Identify the device type and query device properties such as memory capacity, locked status, and
so on.

■

Perform read or write accesses to SD/eMMC storage devices. Only the DMA mode of transfer is
supported by the Storage controller, and the DMA channel used for the transfer has to be configured separately.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

71

FX3 Firmware

5.2.5

■

Partition a SD/eMMC device into multiple logical volumes that can be accessed independently.

■

Use the SD/eMMC erase commands to erase some of the blocks on the storage device.

■

Set/clear passwords and perform lock/unlock operations on SD cards and eMMC devices.

■

Query SDIO device properties such as the number of functions, card capabilities, and so on.

■

Perform byte-wise (CMD52) transfers from/to SDIO cards.

■

Perform block-wise (CMD53) transfers from/to SDIO cards.

■

Send a custom (vendor-specific) command to the peripheral and receive the response; and complete any associated data transfer.

■

Support for identifying peripheral hotplug and providing event notifications.

DMA Engine
The FX3 DMA architecture is highly flexible and programmable. It is defined in terms of sockets,
buffers, and descriptors. The complexity of programming the DMA of FX3 is eliminated by the high
level libraries.
A higher level software abstraction is provided, which hides the details of the descriptors and buffers
from the programmer. This abstraction views the DMA as being able to provide data channels
between two blocks.
■

A data channel is defined between two blocks

■

One half is a producing block and the other half is a consuming block

■

The producing and consuming blocks can be:
❐

A USB endpoint

❐

A GPIFII socket

❐

Serial interfaces such as UART and SPI

❐

CPU memory

The size and number of buffers required by the channel must be specified. Each DMA buffer is forwarded from the producer to the consumer when it has been filled with data or when an early completion is signaled by the producer. The reason for a partial buffer forwarding can be the receipt of a
short packet from the USB host, a buffer COMMIT signal received on the GPIF II port, or a firmware
initiated wrap-up action on the DMA channel. The term packet is used to denote the contents of one
buffer of data, which is forwarded from the producer to the consumer.
The following types of DMA channels are defined to address common data transfer scenarios.

72

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

Table 5-2 summarizes the various DMA channel types supported by the FX3 firmware library.
Table 5-2. DMA Channel Types

DMA Channel Type

Description

Example

AUTO

Automatic DMA channel where the data flow
is completely handled by the FX3 device
hardware. Firmware only needs to set up the
channel with the desired amount of buffering.

Data acquisition applications where
data from the sensor is to be sent to
the PC host without any modification.

AUTO – SIGNAL

Automatic DMA channel with signaling. This
is the same as an auto channel with respect
to the actual data flow. The only difference is
that the firmware is notified when each data
buffer is being forwarded through the FX3
device.

Used if the application wants to track
statistics about the data being forwarded.

MANUAL

Manual DMA channel requires firmware intervention for the forwarding of each data buffer.
Firmware is notified when a complete buffer of
data is made available by the PRODUCER
socket, and is responsible for sending this to
the CONSUMER with or without modification.

USB Video Class (UVC) streaming
applications where a UVC header
has to be added (or removed) from
each data buffer that is forwarded.

MANUAL OUT

Channel used by firmware to send data out
Debug logging channel used to send
through a CONSUMER socket. The size and
verbose log messages out through
content of each DMA buffer is determined by
an UART interface.
firmware.

MANUAL IN

Channel used by firmware to receive data
Channel used to receive command
from a PRODUCER socket. The data is not
packets (such as USB mass storage
expected to be sent out of the device and can
commands) from a PC host.
be processed by the firmware.

AUTO MANY-TO-ONE

This is a complex data channel where data
received from two different PRODUCER
Used to implement the read path for
sockets is multiplexed on to a single stream
a RAID-0 or striped storage solution
sent out through a CONSUMER socket. As in
using a pair of SD cards.
the case of an AUTO channel, the data forwarding is completely handled by hardware.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

73

FX3 Firmware

Table 5-2. DMA Channel Types

DMA Channel Type

5.2.5.1

Description

Example

AUTO ONE-TO-MANY

This is a complex data channel where data
received from one PRODUCER socket is deUsed to implement the write path for
multiplexed onto two different CONSUMER
a RAID-0 or striped storage solution
sockets. The data forwarding is done autousing a pair of SD cards.
matically by hardware on a strictly alternating
basis.

MANUAL MANY-TOONE

Used in UVC applications with a
direct image sensor interface. Using
Channel that allows firmware controlled forthe MANY-TO-ONE channel mode
warding of data from multiple PRODUCERs to
allows FX3 to continuously receive
a single CONSUMER.
data despite the latencies associated with switching between buffers

MANUAL ONE-TOMANY

Channel that allows firmware controlled forCan be used in UVC-based display
warding of data from a single PRODUCER to
applications.
multiple CONSUMERs.

MULTICAST

Channel that allows data from a PRODUCER
to be sent to multiple CONSUMERs. The
same data is sent to all of the CONSUMERs. Can be used to implement a RAID-1
This channel can only operate in MANUAL
(mirrored) mass storage implemenmode, as it is not possible to implement a
tation using a pair of SD cards.
MULTICAST AUTO channel with the FX3
hardware.

Automatic Channels
An automatic DMA channel is one where the data flows between the producer and consumer
uninterrupted when the channel is set up and started. There is no firmware involvement in the data
flow at runtime. Firmware is only responsible for setting up the required resources for the channel
and establishing the connections. When this is done, data can continue to flow through this channel
until it is stopped or freed up.
This mode of operation allows for the maximum data through-put through the FX3 device, because
there are no bottlenecks within the device.
Two flavors of the auto channel are supported: auto channel and auto channel with signaling
Auto Channel

This channel is defined as DMA_TYPE_AUTO. This is the pure auto channel. It is defined by a valid
producer socket, a valid consumer socket, and a predetermined amount of buffering; each of these
is a user programmable parameter.

74

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

The buffers are of equal size, the number of buffers is specified at channel creation time. Internally,
the buffers are linked cyclically by a descriptor chain.
This type of channel can be set up to transfer finite or infinite amount of data. The user application is
notified through an event callback when the specified amount of data is transferred.
Figure 5-4. Auto Channel
Produce and consume
event signaling

Producer
(Ingress)
Socket

Incoming data

Outgoing data

Consumer
(Egress)
Socket

Buffer

Callback function invoked at
the end of transfer
D0

D1

D2

Dn

Descriptor chain

Auto Channel with Signaling

This channel is a minor variant of the Auto channel. The channel set up and data flow remains the
same. The only change is that an event is raised to the user application every time a buffer is
received from the PRODUCER socket. The buffer pointer and the data size are communicated to the
application. This is useful for data channels where the data needs to be inspected for activities such
as collection of statistics.
■

The actual data flow is not impeded by this inspection; the DMA continues uninterrupted.

■

The notification cannot be used to modify the contents of the DMA buffer.

Figure 5-5. Auto Channel with Signaling
Produce and Consume
event signaling

Producer
(Ingress)
Socket

Incoming data

Outgoing data

Consumer
(Egress)
Socket

Buffer

Callback function invoked at
the end of transfer

Event generated when each
packet is forwarded

D0

D1

D2

Dn

Descriptor chain

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

75

FX3 Firmware

Many-to-One Auto Channel

This channel is defined as DMA_TYPE_AUTO_MANY_TO_ONE and is a variation of the auto channel. It is defined by more than one valid producer sockets, a valid consumer socket, and a predetermined amount of buffering; each of these is a user programmable parameter.
This type of channel is used when the data flow from many producers (at least 2) has to be directed
to one consumer in an interleaved fashion.
One-to-Many Auto Channel

This channel is defined as DMA_TYPE_AUTO_ONE_TO_MANY and is a variation of the auto channel. It is defined by one valid producer socket, more than one valid consumer socket, and a predetermined amount of buffering; each of these is a user programmable parameter.
This type of channel is used when the data flow from one producer has to be directed to more than
one consumer (at least 2) in an interleaved fashion.

5.2.5.2

Manual Channels
These are a class of data channels that allow the FX3 firmware to control and manage data flow:
■

Add and remove buffers to and from the data flow

■

Add and remove fixed size headers and footers to the data buffers. Note that only the header and
footer size is fixed, the data size can vary dynamically.

■

Modify the data in the buffers provided the data size itself is not modified.

In manual channels, the CPU (FX3 firmware) itself can be the producer or the consumer of the data.
Manual channels have a lower throughput compared to the automatic channels as the CPU is
involved in every buffer that is transferred across the FX3 device.
Manual Channel

The channel DMA_TYPE_MANUAL is a pass through channel with CPU intervention. Internally, the
channel has two separate descriptor lists, one for the producer socket and one for the consumer
socket. At channel creation time, the user application must indicate the amount of buffering required
and register a callback function.
When the channel is operational, the registered callback is invoked when a data buffer is committed
by the producer. In this callback, the user application can:

76

■

Change the content of the data packet (size cannot be changed)

■

Commit the packet, triggering the sending out of this packet

■

Insert a new custom data packet into the data stream

■

Discard the current packet without sending to the consumer

■

Add a fixed sized header and/or footer to the received packet. The size of the header and footer
is fixed during the channel creation

■

Remove a fixed sized header and footer from the received packet

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

Figure 5-6. Manual Channel
Producer descriptor list

D0_P

Consume
event signaling

D1_P

Consumer descriptor list

D2_P

Producer
(Ingress)
Socket

Dn_P

Incoming data

D0_C

D1_C

Outgoing data
Buffer

D2_C

D3_C

Consumer
(Egress)
Socket

Consume
event signaling
CPU interrupt on every
Ingress buffer

Callback function invoked at
end of transaction
Modified data

YES

Discard buffer?
NO

Produce event
signaling

Buffer inspection/modification

Consume descriptor update

Manual In Channel

The DMA_TYPE_MANUAL_IN channel is a special channel where the CPU (FX3 firmware) is the
consumer of the data. A callback must be registered at channel creation time and this is invoked to
the user application when a specified (default is one) number of buffers are transferred.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

77

FX3 Firmware

Figure 5-7. Manual In Channel

Producer
(Ingress)
Socket

Incoming data

Buffer
Buffer low threshold
interrupt (optional)

CPU interrupt on every N
Ingress buffers

Consume
event signaling

Use buffer

D0

Buffer ready?

D1

D2

Dn

Descriptor chain

Yes

Manual Out Channel

The DMA_TYPE_MANUAL_OUT channel is a special channel where the CPU (FX3 firmware) is the
producer of data. The user application needs to get the active data buffer, populate the buffer, and
then commit it.
Figure 5-8. Manual Out Channel
Produce Event Signaling

Data

Outgoing data

CPU

Consumer
(Egress)
Socket

Buffer

Buffer low threshold
interrupt (optional)
CPU interrupt after
every N buffers

Descriptor list
D0

78

D1

D2

Dn

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

Many-to-One Manual Channel

This channel is defined as DMA_TYPE_MANUAL_MANY_TO_ONE and is a variation of the manual
channel. It is defined by more than one valid producer socket, a valid consumer socket, and a
predetermined amount of buffering; each of these is a user programmable parameter.
This type of channel is used when the data flow from many producers (at least 2) has to be directed
to one consumer in an interleaved fashion with CPU intervention.
One-to-Many Manual Channel

This channel is defined as DMA_TYPE_MANUAL_ONE_TO_MANY and is a variation of the manual
channel. It is defined by one valid producer socket, more than one valid consumer socket, and a
predetermined amount of buffering; each of these is a user programmable parameter.
This type of channel is used when the data flow from one producer has to be directed to more than
one consumer (at least 2) in an interleaved fashion with CPU intervention.
Multicast Channel

This channel is defined as DMA_TYPE_MULTICAST. It is defined by one valid producer socket,
more than once valid consumer socket, and a predetermined amount of buffering; each of these is a
user programmable parameter.
This type of channel is used when the data flow from one producer has to be directed to more than
one consumer. Here all the consumers receive the same data.

5.2.5.3

DMA Buffering
The buffering requirements of the DMA channels are handled by the channel functions. The amount
of buffering required (size of buffer and number of buffers) must be specified at the time of channel
creation. If channel creation is successful, the requisite buffers are successfully allocated. The
buffers are allocated from the block pool. The FX3 user application does not have to allocate any
buffers for the DMA channels.

5.2.5.4

DMA APIs
These consist of APIs to
■

Create and destroy a DMA channel

■

Set up a data transfer on a DMA channel

■

Suspend and resume a DMA channel

■

Abort and reset a DMA channel

■

Receive data into a specified buffer (override mode)

■

Transmit data from a specified buffer (override mode)

■

Wait for the current transfer to complete

■

Get the data buffers from the DMA channel

■

Commit the data buffers for transfer

■

Discard a buffer from the DMA channel

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

79

FX3 Firmware

5.2.6

RTOS and OS Primitives
The FX3 firmware uses ThreadX, a real-time operating system (RTOS). The firmware framework
invokes the RTOS as part of the overall system initialization.
All the ThreadX primitives are made available in the form of an RTOS library. The calls are presented
in a generic form; the ThreadX specific calls are covered with wrappers. These wrappers provide an
OS independent way of coding the user application.
These include APIs for:
■

■

■

■

■

■

■

80

Threads
❐

Thread create and delete

❐

Thread suspend and resume

❐

Thread priority change

❐

Thread sleep

❐

Thread information

Message queues
❐

Queue create and delete

❐

Message send and priority send

❐

Message get

❐

Queue flush

Semaphores
❐

Semaphore create and destroy

❐

Semaphore get and put

Mutex
❐

Mutex create and destroy

❐

Mutex get and put

Memory allocation
❐

Memory alloc and free

❐

Memset, memcopy and memcmp

❐

Byte pool creation

❐

Byte alloc and free

❐

Block pool creation

❐

Block alloc and free

Events
❐

Event creation and deletion

❐

Event get and set

Timer
❐

Timer creation and deletion

❐

Timer start and stop

❐

Timer modify

❐

Get/set time current time (in ticks)

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware

5.2.7

Debug Support
The FX3 device supports the standard JTAG interface for ARM processors. Any of the standard
JTAG debug probes (such as Segger J-Link) can be used to do run-time debugging of the FX3
firmware.
JTAG debugging is not always viable for USB applications as stopping at a breakpoint can cause
USB transfers to time out. Debug logs are a valuable tool to track down issues in applications where
JTAG debugging is not possible. The FX3 SDK supports a flexible debug logging scheme. All the
drivers and firmware functions implement a logging scheme where optional debug logs are written
into a reserved buffer area. This debug log can then be read out to an external device and analyzed.
The debug APIs provide the following functions:
■

Start and stop the debug logging mechanism

■

Print a debug message (a debug string)

■

Log a debug message (a debug value which gets mapped to string)

■

Flush the debug log to an external device (for example, UART)

■

Clear the debug log

■

Set the debug logging level (performed during init)

Typically, the UART interface on the FX3 device is used for the debug log output. However, if the
UART interface is not available or used for other purposes, the logs can be output using any of the
other interfaces such as a USB endpoint or a GPIF II socket. The only requirement is that the data
be read out from the other end regularly so that free buffers for logging are always available.
Verbose logs can be output using the CyU3PDebugPrint() function, as demonstrated in all of the
firmware examples. This function only supports the %c, %d, %u, %x, and %s conversion specifications and does not support floating point output. The function does not support any flags, precision,
or type modifiers. The standard C library sprintf routine can be used to format the output string if any
of these features are required.
Adding detailed verbose logs is not viable in most performance-critical applications. The SDK supports a coded log mechanism using the CyU3PDebugLog function for use in such applications. This
function queues up the log data into internal memory buffers and sends them out when the buffer is
full.
User code can also use the debug logging mechanism and use the debug log and print functions to
insert debug messages.

5.2.8

Power Management
Power management support is provided. APIs are provided to place the FX3 device into the lowpower Suspend and Standby modes. The conditions that would cause the device to resume to the
active state must be specified.
Standby mode can only be initiated after shutting down all of the FX3 device blocks, except GPIO.
When the device resumes from standby mode, the startup procedure is as in the case of a warm
reset.

5.2.9

Low Level DMA
The DMA architecture of the FX3 is defined in terms of sockets, buffers and descriptors. Each block
on the FX3 (USB, GPIF, Serial IOs) can support multiple independent data flows through it. A set of
sockets are supported on the block, where each socket serves as the access point for one of the
data flows. Each socket has a set of registers that identify the other end of the data flow and control
parameters such as buffer sizes. The connectivity between the producer and consumer is

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

81

FX3 Firmware

established through a shared data structure called a DMA descriptor. The DMA descriptor maintains
information about the memory buffer, the producer and consumer addresses etc.
The low level DMA APIs provide for:
■

Sockets

■

Set/get the socket configuration

■

Set other options on a given socket

■

Check if a given socket is valid

■

Buffers

■

Create/destroy buffer pools

■

Allocate/free buffers

■

Descriptors

■

Create/destroy descriptor lists and chains

■

Get/Set a descriptor configuration
Manipulate the descriptor chain

■

5.2.10

MIPI-CSI2 Configuration APIs
The MIPI-CSI2 configuration APIs are only intended for applications running on the CX3 device. The
APIs allow user applications to initialize, configure, and perform power management for the interface. All MIPI-CSI2 configuration APIs communicate with the interface over the I2C bus.
The MIPI-CSI2 configuration APIs are compiled into a separate API library (cyu3mipicsi.a) and need
to be linked with the application only if they are required. The API library provides APIs to:
■

Initialize the MIPI-CSI2 receiver interface.

■

Configure the MIPI-CSI2 interface clocks and interface settings.

■

Configure the fixed-function GPIF-2 bus widths.

■

Place the MIPI-CSI2 receiver in low-power standby mode.

■

Reset the MIPI-CSI2 receiver.

■

Drive the MIPI-CSI2 XRESET and XSHUTDOWN signals to the image sensor.

User code needs to be written to configure the image sensor. Configuration for two sensors (Aptina
AS0260 and Omnivision OV5640) is provided in the form of library files, which are used in the CX3
example projects that are part of the SDK.

82

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

6.

FX3 APIs

The FX3 APIs consist of APIs for programming the main hardware blocks of the FX3. These include
the USB, GPIF II, Storage, DMA, and the serial I/Os. Refer to the corresponding sections of the
FX3API Guide for information about these APIs.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

83

FX3 APIs

84

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

7.

FX3 Application Examples

The FX3 SDK includes various application examples in source form. These examples illustrate the
use of the APIs and firmware framework putting together a complete application. The examples illustrate the following:

7.1

■

Initialization and application entry

■

Creating and launching application threads

■

Programming the peripheral blocks (USB, GPIF, serial interfaces)

■

Programming the DMA engine and setting up data flows

■

Registering callbacks and callback handling

■

Error handling

■

Initializing and using the debug messages

■

Programming the FX3 device in Host/OTG mode

DMA Examples
The FX3 DMA engine is independent of the peripheral used. The DMA APIs provide the mechanism
for data transfer to and from the FX3 device.
These examples are essentially bulk loop-back examples where data received from the USB host
PC through the OUT EP is sent back through the IN EP. These examples explain the different DMA
channel configurations.

7.1.1

USBBulkLoopAuto
This example demonstrates the use of DMA AUTO channel to loop back data between the USB endpoints without any firmware intervention in actual data transfer. This type of channel provides the
maximum throughput and is the simplest of all DMA configurations.
Location: firmware/dma_examples/cyfxbulklpauto

7.1.2

USBBulkLoopAutoSignal
This example demonstrates the use of the DMA AUTO_SIGNAL channel with signaling to loop back
data between the USB endpoints without any firmware intervention in actual data transfer. This type
of channel is similar to the AUTO channel, except for the event signaling provided for every buffer
received by FX3.
Location: firmware/dma_examples/cyfxbulklpautosig

7.1.3

USBBulkLoopManual
This example demonstrates the use of the DMA MANUAL channel to loop back data between USB
endpoints with CPU intervention. In this type of channel, the CPU has to explicitly commit the

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

85

FX3 Application Examples

received data. The CPU can also modify the data received before sending it out of the device. The
data manipulation is done in place and does not require any memory-to-memory copy.
Location: firmware/dma_examples/cyfxbulklpmanual

7.1.4

USBBulkLoopManualInOut
This example demonstrates the use of the DMA MANUAL IN + DMA MANUAL OUT channel to loop
back data between USB endpoints. The data received from the OUT endpoint through the
MANUAL_IN channel is copied to IN endpoint through the MANUAL_OUT channel. In this type of
channel, the data has to be explicitly copied from the OUT endpoint to the IN endpoint by the firmware.
Location: firmware/dma_examples/cyfxbulklpmaninout

7.1.5

USBBulkLoopAutoOneToMany
This example demonstrates the use of multi-channel DMA AUTO ONE TO MANY to loop back data
between USB endpoints. This example has a single OUT endpoint and the data packets coming in
are split across a pair of IN endpoints. The data splitting and forwarding is done automatically by the
FX3 hardware without any firmware intervention.
Location: firmware/dma_examples/cyfxbulklpautoonetomany

7.1.6

USBBulkLoopManualOneToMany
This example demonstrates the use of multi-channel DMA MANUAL ONE to MANY loop back data
between USB endpoints. This is similar to the USBBulkLoopAutoOneToMany example, except for
the fact that the data has to be committed explicitly by the CPU and the CPU can modify the data
before being sent out.
Location: firmware/dma_examples/cyfxbulklpmanonetomany

7.1.7

USBBulkLoopAutoManyToOne
This example demonstrates the use of multi-channel DMA AUTO MANY TO ONE to loop back data
between USB endpoints. The data received from two OUT endpoints is committed in an interleaved
fashion to a single IN endpoint. Data interleaving is done automatically by the FX3 hardware without
any firmware intervention.
Location: firmware/dma_examples/cyfxbulklpautomanytoone

7.1.8

USBBulkLoopManualManyToOne
This example demonstrates the use of multi-channel DMA MANUAL MANY TO ONE to loop back
data between USB endpoints. This is similar to the USBBulkLoopAutoManyToOne example, except
for the fact that the data has to be committed explicitly by the CPU and the CPU can modify the data
before being sent out.
Location: firmware/dma_examples/cyfxbulklpmanmanytoone

7.1.9

USBBulkLoopMulticast
This example demonstrates the use of multi-channel DMA MULTICAST to loop back data between
USB endpoints. In this case, data coming in on an OUT endpoint is sent out on two different IN endpoints. Both IN EPs shall receive the same data. MULTICAST channels only support a MANUAL
mode of operation where the firmware has to forward each packet.

86

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Application Examples

Location: firmware/dma_examples/cyfxbulklpmulticast

7.1.10

USBBulkLoopManualAdd
This example demonstrates the use of DMA MANUAL channel to modify data flowing through FX3
by adding fixed-size headers and footers. The headers and footers can be added with minimal processing overheads as the bulk of the data does not need to be copied in memory.
Location: firmware/dma_examples/cyfxbulklpman_addition

7.1.11

USBBulkLoopManualRem
This example demonstrates the use of DMA MANUAL channels where a header and footer is
removed from the data before sending out. The data received on the OUT endpoint is looped back to
the IN endpoint after removing the header and footer. The removal of the header and footer does not
require data copying.
Location: firmware/dma_examples/cyfxbulklpman_removal

7.1.12

USBBulkLoopLowLevel
The DMA channel is a helpful construct that enables simple data transfer. The low-level DMA
descriptor and DMA socket APIs enable finer constructs. This example uses these APIs to implement a simple bulk loop back example.
Location: firmware/dma_examples/cyfxbulklplowlevel

7.1.13

USBBulkLoopManualDCache
The data cache is disabled by default in the FX3 device. The data cache is useful when the CPU
does a large amount of data modifications. But enabling the D-cache adds constraints for managing
the data cache. This example demonstrates how DMA transfers can be done with the data cache
enabled.
Location: firmware/dma_examples/cyfxbulklpmandcache

7.2

Basic Examples
The FX3 SDK includes basic USB examples that are meant to be a programming guide for the following:

7.2.1

■

Setting up the descriptors and USB enumeration

■

USB endpoint configuration

■

USB reset and suspend handling

RTOSExample
This example demonstrates the use of the ThreadX RTOS services such as Threads, Mutexes,
Semaphores, and Event Flag Groups. The example also provides a method to get a visual indication
of RTOS object state changes through GPIOs on the FX3 Development Kits.
The application does not perform any actual data transfers but makes use of multiple threads, which
operate on the other services such as Mutexes, Semaphores, and Event Flag Groups.
Location: firmware/basic_examples/cyfx_rtos_example

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

87

FX3 Application Examples

7.2.2

BulkLpAutoCpp
This example demonstrates the use of C++ with FX3 APIs using the DMA AUTO channel to loop
back data between the USB BULK endpoints.
Location: firmware/basic_examples/cyfxbulklpauto_cpp

7.2.3

USBBulkLoopAutoEnum
In most applications, the device's USB enumeration is handled by the Cypress-provided firmware
drivers using descriptors provided by the application. The firmware framework also allows the user
to handle the device enumeration by directly responding to USB control requests. This example is
similar to the USBBulkLpAuto example but demonstrates how the USB descriptor requests can be
handled from the firmware application. All control requests are handled from the USB Setup Callback function provided by the application.
Location: firmware/basic_examples/cyfxbulklpautoenum

7.2.4

USBBulkSourceSink
The example demonstrates the use of FX3 as a data source and a data sink using bulk endpoints.
This example makes use of a DMA MANUAL IN channel for sinking the data received from the Bulk
OUT endpoint, and a DMA MANUAL OUT Channel for sourcing the data to the Bulk IN endpoint.
Location: firmware/basic_examples/cyfxbulksrcsink

7.2.5

USBIsoSourceSink
The example demonstrates the use of FX3 as a data source and a data sink using ISO endpoints.
This is similar to the USBBulkSourceSink example but makes use of ISO endpoints. Multiple alternate interface settings are provided in this example to control the data rates.
Location: firmware/basic_examples/cyfxisosrcsink

7.2.6

USBIsochLoopAuto
This example demonstrates the loop back of data through ISO endpoints using the DMA AUTO
channel. This example is similar to the USBBulkLoopAuto except for the fact that the endpoints used
here are isochronous instead of bulk.
Location: firmware/basic_examples/cyfxisolpauto

7.2.7

USBIsochLoopManualInOut
This example demonstrates the loop back of data through ISO endpoints using a pair of DMA MANUAL IN and DMA MANUAL OUT channels. This example is similar to the USBBulkLoopManualInOut
except for the fact that the endpoints used here are isochronous instead of bulk.
Location: firmware/basic_examples/cyfxisolpmaninout

7.2.8

USBBulkStreams
This example illustrates the data source and data sink mechanism with two USB Bulk Endpoints
using the Bulk Streams. A set of Bulk Streams are defined for each of the endpoints (OUT and IN).
Data source and data sink happen through these streams. Streams are applicable to USB 3.0
SPEEDS ONLY. This example works similar to USBBulkSourceSink when connected to USB 2.0.

88

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Application Examples

This example makes use of the DMA MANUAL IN channel for sinking the data received from the
streams of the Bulk OUT endpoint and DMA MANUAL OUT Channel for the sourcing the data to the
streams of the Bulk IN endpoint.
Location: firmware/basic_examples/cyfxbulkstreams

7.2.9

USBFlashProg
The FX3 device supports boot modes where it boots itself by reading firmware binaries from I2Cbased EEPROM devices or SPI-based flash devices. To have the FX3 boot itself through I2C/SPI,
the firmware binaries generated by compiling the target application needs to be programmed on the
memory devices. This programming can be achieved using this example.
This example enumerates as a vendor-specific USB device with no endpoints, and provides a set of
pre-defined vendor commands for read/write operations through which the I2C EEPROM and SPI
flash devices can be programmed.
The binary produced by compiling this application is used by the Cypress Control Center tool to program I2C EEPROM and SPI Flash.
Location: firmware/basic_examples/cyfxflashprog

7.2.10

USBCDCDebug
This example demonstrates how the virtual COM port USB-CDC interface can be used to obtain
debug data from a FX3 device.
This example makes use of an USB Bulk endpoint to log the debug data from the FX3 device. The
default debug logging in all other examples is done through the UART port. This example shows how
the debug data can be pushed out through any outgoing interface.
Location: firmware/basic_examples/cyfxcdcdebug

7.2.11

USBDebug
This example demonstrates how a vendor-specific USB interface can be used to obtain debug data
from a FX3 device.
This example uses an USB Interrupt endpoint to log the debug data from the FX3 device. The
default debug logging in all other examples is done through the UART port. This example shows how
the debug data can be pushed out through any outgoing interface.
Location: firmware/basic_examples/cyfxusbdebug

7.2.12

USBHost
This example demonstrates how FX3 can be used as a USB 2.0 host controller. The example
detects the device connection, identifies the device type, and performs data transfers if the device
connected is either a USB mouse (HID) or a Mass Storage Class (Thumb drive) device. Full-fledged
class drivers for mouse and mass storage are not provided, and only limited command support is
provided.
This example can only work on the FX3 device variants that support the OTG host mode.
Location: firmware/basic_examples/cyfxusbhost

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

89

FX3 Application Examples

7.2.13

USBOtg
This example demonstrates the use of FX3 as an OTG device, which when connected to a USB host
is capable of doing bulk loop-back using a DMA AUTO channel. When connected to a USB mouse,
it can detect and use the mouse to track the three button states, X, Y, and scroll changes.
This example can only work on FX3 device variants that support the OTG host mode.
Location: firmware/basic_examples/cyfxusbotg

7.2.14

USBBulkLoopOtg
This example demonstrates the full OTG capabilities, such as Session Request Protocol (SRP) for
VBus control and Host Negotiation Protocol (HNP) for role change negotiation. This example
requires connecting a pair of FX3 devices using an OTG cable. Any one of the devices can function
as a bulk loop-back device and the other device will function as the host.
This example can only work on FX3 device variants that support the OTG host mode.
Location: firmware/basic_examples/cyfxbulklpotg

7.2.15

LowPowertest
This example illustrates how the FX3 device can be configured to be placed in the low-power
standby or suspend state. This example supports the use of the VBUS, UART_CTS, and USB D+ or
SSRX pins as wake-up sources from the low-power state. This application also implements a Bulk
Loopback function based on an AUTO DMA channel.
Location: firmware/basic_examples/cyfxlowpowertest

7.2.16

GpifToUsb
This example illustrates the use of a DMA channel to continuously transfer data from the GPIF port
to the USB host. A stub GPIF state machine, which does not require any external devices, is used to
continuously commit data into the DMA buffers. This state machine continues to push data into the
DMA channel whenever the thread is in the ready state.
The device enumerates as a vendor-specific USB device with one Bulk-IN endpoint. The data committed by the GPIF state machine is continuously streamed to this endpoint without any firmware
intervention.
Location: firmware/basic_examples/cyfxgpiftousb

7.2.17

USBIsoSource
This example illustrates the use of the FX3 firmware APIs to implement a variable data rate ISO IN
endpoint using a DMA MANUAL_OUT channel. A constant data pattern is continuously loaded into
the DMA MANUAL_OUT channel and sent to the host. Multiple alternate settings with different transfer rates are supported.
Location: firmware/basic_examples/cyfxisosrc

90

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Application Examples

7.3

Serial Interface Examples
The serial interface examples demonstrate data accesses to the Serial I/O interfaces: GPIO, UART,
I2C, SPI, and I2S.

7.3.1

GPIO Examples
These are simple starter applications that demonstrate how to initialize the FX3 device and the I/Os
on the device.

7.3.1.1

GpioApp
This example shows how to control output pins and sample the state of input pins on the FX3 device.
This application uses a generic application structure that initializes other device blocks and therefore, has a large memory footprint.
Location: firmware/serial_examples/cyfxgpioapp

7.3.1.2

GpioComplexApp
The FX3 device has eight complex GPIO blocks that can be used to implement various functions
such as timer, counter, and PWM. The example shows how to use the more advanced GPIO features of the FX3 device. The application demonstrates:
■

Driving an output pin with a Pulse Width Modulated (PWM) signal

■

Measuring the pulse duration on an input using an internal timer

■

Counting the number of edges on an input signal using a counter

Location: firmware/serial_examples/cyfxgpiocomplexapp

7.3.2

UART Examples
The FX3 UART block can be configured for discrete data transfers using a register interface to the
transfer FIFOs, or for block-based data transfers using a DMA connection to the transfer FIFOs.
These examples demonstrate the two different modes of operation for the UART block on the FX3
device. In the UART examples, the data is looped from the PC host back to the PC host through the
FX3 device. The loopback can be observed on the PC host.

7.3.2.1

UartLpDmaMode
This example uses a MANUAL DMA channel to loop any data received through the UART receiver
back to the UART transmitter.
Location: firmware/serial_examples/cyfxuartlpdmamode

7.3.2.2

UartLpRegMode
This example implements the firmware logic to receive data from the UART receiver block and to
loop it back to the UART transmitter side. Hardware interrupts are used to detect incoming data on
the UART side, and then a firmware task is enabled to take the received data and send it out.
Location: firmware/serial_examples/cyfxuartlpregmode

7.3.2.3

UsbUart
This example implements a CDC-ACM compliant USB-to-UART bridge device using the UART port
on the FX3 device.
Location: firmware/serial_examples/cyfxusbuart

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

91

FX3 Application Examples

7.3.3

I2C Examples
The I2C block on the FX3 device is a master-only interface. The I2C examples demonstrate how the
I2C interface can be used to transfer data to and from an I2C EEPROM device in the two modes of
operation: register mode and DMA mode. The examples enumerate as a vendor-specific USB
device bound to the CyUsb3 driver, and implement a set of vendor-specific control (EP0) requests to
perform transfers to and from the I2C EEPROM device.

7.3.3.1

UsbI2cDmaMode
This example shows how to use the I2C block in DMA mode to read and write data to and fromthe
I2C EEPROM.
Location: firmware/serial_examples/cyfxusbi2cdmamode

7.3.3.2

UsbI2cRegMode
This example shows how to use the I2C block in register (firmware-programmed) mode to read and
write data to and from the I2C EEPROM.
Location: firmware/serial_examples/cyfxusbi2cregmode

7.3.4

SPI Examples
As in the I2C example, FX3 supports a master-only SPI interface block. The SPI examples in the
SDK demonstrate how the FX3 can be used to read and write data on an SPI flash memory device.
The examples enumerate as a vendor-specific USB device and provide a set of vendor commands
to read, write, and erase the SPI flash memory blocks.

7.3.4.1

UsbSpiDmaMode
This example uses DMA channels to read and write data on the SPI flash memory.
Location: firmware/serial_examples/cyfxusbspidmamode

7.3.4.2

UsbSpiRegMode
This example uses the FX3 SPI block's register interface to read and write data on the SPI flash
memory.
Location: firmware/serial_examples/cyfxusbspiregmode

7.3.4.3

UsbSpiGpioMode
The SPI block on the FX3 device is not available for use when the GPIF-II interface is used with a
32-bit wide data bus. In such a case, a lower performance SPI interface can be implemented by bitbanging on the FX3 device I/Os. This example shows how a set of four GPIOs on the FX3 device
can be used as the SPI Clock, MOSI, MISO, and SSN# pins.
Location: firmware/serial_examples/cyfxusbspigpiomode

7.3.5

I2S Examples
The FX3 provides a master-only I2C interface, which can be used for audio output. The SDK provides a single I2C usage example, which shows how the I2C interface can be used to send data out.

7.3.5.1

UsbI2sDmaMode
This example demonstrates the use of I2S APIs. The example enumerates as a vendor-specific
USB device and receives the data from the left and right I2C channels through two different BULK

92

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Application Examples

OUT endpoints. AUTO DMA channels are used to forward the received data to the I2S device from
the FX3.
Location: firmware/serial_examples/cyfxusbi2sdmamode

7.4

USB Video Class Example
Video streaming is the most common application for devices in the FX3 family. The USB Video Class
(UVC) specification from USB-IF defines a standard for streaming video from sensors to a USB host.
The UVC specification requires the corresponding device firmware to support a number of classspecific requests, as well as to provide the data in a specific format.
The SDK provides a pair of examples that demonstrate how the UVC data packaging and class-specific request handling can be performed. These examples do not use an external image sensor, but
repeatedly send out pre-defined image data that is stored as part of the firmware image.

7.4.1

USBVideoClass
This example implements a USB Video Class "Camera" device, which streams MJPEG video data
using an ISOCHRONOUS IN endpoint. The FX3 device enumerates as a USB Video Class device
on the USB host and makes use of a DMA Manual Out channel to send the data. The video frames
are stored in the FX3 device memory and sent to the host in a cyclical fashion. The streaming of
these frames continuously from the device results in a video-like appearance on the USB host.
This is a low throughput application because the UVC class drivers on Windows 7 machines do not
support Burst-enabled ISOCHRONOUS endpoints. This means that a maximum of 3 KB can be
transferred from the device in a 125-µs microframe (Service interval).
Location: firmware/uvc_examples/cyfxuvcinmem

7.4.2

USBVideoClassBulk
This example is similar to the USBVideoClass example, but uses BULK endpoints to stream the
video data. As Burst-enabled BULK endpoints are supported on Windows 7, this example can
achieve much higher data rates than the ISOCHRONOUS example.
Location: firmware/uvc_examples/cyfxuvcinmem_bulk

7.5

Slave FIFO Examples
The Slave FIFO application examples demonstrate data loopback between the USB Host and an
external FPGA/Controller. These examples make use of an FPGA that connects to the GPIF-II port
of the FX3 device, and performs data transfers using the Cypress-defined Slave FIFO protocol (synchronous or asynchronous version).
Refer to AN65974 - Designing with the EZ-USB® FX3™ Slave FIFO Interface for details about how
to implement the Slave FIFO interface.

7.5.1

SlaveFifoAsync
Asynchronous mode Slave FIFO example using a 2-bit FIFO address. As a 2-bit address is used, a
maximum of four pipes on FX3 can be accessed by the FIFO master.
Location: firmware/slavefifo_examples/slfifoasync

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

93

FX3 Application Examples

7.5.2

SlaveFifoAsync5Bit
Asynchronous mode Slave FIFO example using a 5-bit FIFO address. In this case, additional signals
are used on the Slave FIFO interface to allow the master to address a maximum of 32 different pipes
on the FX3 side.
Location: firmware/slavefifo_examples/slfifoasync5bit

7.5.3

SlaveFifoSync
Synchronous mode Slave FIFO example using a 2-bit FIFO address. As a 2-bit address is used, a
maximum of four pipes on FX3 can be accessed by the FIFO master.
Location: firmware/slavefifo_examples/slfifosync

7.5.4

SlaveFifoSync5Bit
Synchronous mode Slave FIFO example using a 5-bit FIFO address. In this case, additional signals
are used on the Slave FIFO interface to allow the master to address a maximum of 32 different pipes
on the FX3 side.
Location: firmware/slavefifo_examples/slfifosync5bit

7.6

USB Audio Class Example

7.6.1

USBAudioClass
This example creates a USB Audio Class compliant microphone device, which streams PCM audio
data stored on the SPI flash memory to the USB host. Since the audio class does not require high
bandwidth, this example works only at USB 2.0 speeds.
Location: firmware/uac_examples/cyfxuac

7.7

CX3 Examples
These examples demonstrate the implementation of various USB video streaming modes using the
CX3 device and MIPI CSI-2 compliant image sensors. These examples will fail to start up properly if
run on devices other than CX3.

7.7.1

Cx3Rgb16AS0260
This example implements a Bulk-only RGB-565 video streaming example over the UVC protocol,
which illustrates the usage of the CX3 APIs using an Aptina AS0260 sensor. It streams uncompressed 16-Bit RGB-565 video from the image sensor over the CX3 to the host PC.
Location: firmware/cx3_examples/cycx3_rgb16_as0260

7.7.2

Cx3Rgb24AS0260
This example implements a Bulk-only RGB-888 video streaming example over the UVC protocol,
which illustrates the usage of the CX3 APIs using an Aptina AS0260 sensor. It streams uncompressed 16-bit RGB-565 video from the image sensor to the MIPI interface on the CX3, which upconverts the stream to 24-bit RGB-888, and transmits to the host PC over USB.
Location: firmware/cx3_examples/cycx3_rgb24_as0260

94

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Application Examples

7.7.3

Cx3UvcAS0260
This example implements a Bulk-only UVC 1.1 compliant example, which illustrates the use of the
CX3 APIs using an Aptina AS0260 sensor. This example streams uncompressed 16-Bit YUV video
from the image sensor over the CX3 to the host PC.
Location: firmware/cx3_examples/cycx3_uvc_as0260

7.7.4

Cx3UvcOV5640
This example implements a Bulk-only UVC 1.1 compliant example, which illustrates the use of the
CX3 APIs using an Omnivision OV5640 sensor. This example streams uncompressed 16-Bit YUV
video from the image sensor over the CX3 to the host PC.
Location: firmware/cx3_examples/cycx3_uvv_ov5640

7.8

Two-Stage Booter (boot_fw) Examples
The full-featured FX3 firmware libraries are based on the ThreadX RTOS. This provides a very powerful and flexible framework for firmware development. However, the embedded RTOS and associated code means that the memory requirement for applications is greater than 70 KB. This can be
seen using the simple GPIO example applications.
In rare cases, such a large footprint may not be desirable; and the user is willing to make use of a
simpler framework. The FX3 SDK facilitates such a usage model using a separate firmware library,
which is called the "Boot Firmware Library". This name is used because this library is mainly used to
create custom bootloader applications. However, this is a misnomer because the library supports
almost all device features and can also be used for building full-fledged applications. A set of applications that demonstrate the capabilities of this firmware library are also provided with the SDK.

7.8.1

BootLedBlink
This is the simplest possible FX3 firmware application. It demonstrates how to control an FX3 output
pin using an input pin. On the SuperSpeed Explorer board, this allows an LED to be controlled using
an on-board DIP switch.
Location: firmware/boot_fw/ledblink

7.8.2

FX3BootAppGcc
This example shows how the boot APIs can be used to implement a custom bootloader application.
The boot modes supported include SPI boot and USB boot. When USB boot is selected, this application supports loading and running a full firmware application; without going through a USB device
re-enumeration.
Location: firmware/boot_fw/src

7.8.3

BootGpifDemo
This example shows how the boot APIs can be used to implement a GPIF-II to USB data path. As
the boot library does not support DMA channel-level operation, this application shows how to create
and manage AUTO and MANUAL DMA channels using low-level constructs. The scope of the application is similar to the cyfxgpiftousb application, and the example requires the use of devices that
support 32-bit wide GPIF-II data.
Location: firmware/boot_fw/gpiftousb

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

95

FX3 Application Examples

7.9

Mass Storage Class Example

7.9.1

USBMassStorageDemo
This example illustrates the implementation of a USB mass storage class (Bulk Only Transport)
device using a small section of the FX3 device RAM as the storage device. The example shows how
a command/response protocol, such as the USB Mass Storage Protocol, can be implemented in
FX3 applications.
Location: firmware/msc_examples/cyfxmscdemo

7.9.2

FX3SMassStorage
This example provides a Mass Storage Class interface through which the USB host can access the
SD cards or eMMC devices connected to the FX3S device. The example shows how to implement
high-performance data transfers using the FX3S storage APIs, and also supports features such as
device hotplug handling, partitioning (multi-volume) support, and more.
Location: firmware/msc_examples/cyfx3s_msc

7.9.3

FX3SRaid0
This example implements a RAID-0 disk using a pair of SD cards or eMMC devices for storage.
Access to the RAID-0 disk is provided through a USB mass storage class (MSC) interface. This
implementation provided nearly twice the throughput of a MSC function using a single SD card or
eMMC device.
Location: firmware/msc_examples/cyfx3s_raid0

7.10

FX3S Storage Examples
The following examples demonstrate the use of FX3 APIs to access SD/eMMC storage devices connected to the FX3S device. These examples will only work on the FX3S, Benicia, or Bay controllers,
and fail to start up properly if attempted on the other device types.

7.10.1

GpifToStorage
An example that shows how to access SD/eMMC storage devices from an external processor that
connects to the FX3S device through the GPIF port.
Location: firmware/gpif_examples/cyfxgpiftostorage

7.10.2

FX3SFileSystem
An example that demonstrates the use of the FX3S storage API to integrate a file system into the
firmware application. The FatFs file system by Elm Chan is used here to manage FAT volumes
stored on the cards connected to FX3S.
Location: firmware/storage_examples/cyfx3s_fatfs

7.10.3

FX3SSdioUart
This example implements a USB Virtual COM port that uses an Arasan SDIO - UART bridge chip for
the UART functionality. This example shows how the SDIO APIs can be used to transfer data
between the USB host and a SDIO peripheral.
Location: firmware/storage_examples/cyfx3s_sdiouart

96

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Application Examples

7.11

GPIF-II Master Example
The Slave FIFO and other examples above make use of the GPIF-II interface in slave mode. The
GPIF-II block on FX3 is also capable of operating as the bus master.

7.11.1

SRAMMaster
This example demonstrates how the FX3 device can be used as a master accessing an asynchronous SRAM device. The CY7C1062DV33-10BGXI SRAM device on the CYUSB3KIT-003 is used for
this demonstration. Only 1 KB of the SRAM can be addressed by FX3 on this board, and the example provides a means to repeatedly write and read the content of this memory segment using a pair
of USB bulk endpoints.
Location: firmware/gpif_examples/cyfxsrammaster

7.12

FX2G2 Example
This is a dedicated firmware example for the USB 2.0 only FX2G2 device.

7.12.1

Fx2g2UvcDemo
This example demonstrates YUY2 uncompressed video streaming under USB 2.0 using the FX2G2
device. The example generates the video data patterns within the device memory instead of sourcing from an image sensor, so that the example can work directly on the development kits. The example supports UVC streaming over Bulk and Isochronous endpoints.
Location: firmware/fx2g2_examples/cyfx2_uvcdemo

7.13

Co-processor Mode Example
The FX3 device supports a MMC Slave (PMMC) interface, which can be used instead of the GPIF-II
interface to connect it to an external processor. In such a configuration, FX3 can serve as a co-processor that provides peripheral functions such as USB, SD/eMMC, UART, I2C, and SPI to the processor.

7.13.1

PibSlaveDemo
This example implements a slave mode firmware application, which allows a master processor to
control its operation through a MMC slave interface. The firmware allows the master to access SD/
eMMC storage devices, configure the USB device characteristics, and to connect the SD/eMMC
storage to the USB host. As the example supports SD/eMMC interfaces, it will only work with FX3S
devices.
Location: firmware/storage_examples/cyfx3_pmmc

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

97

FX3 Application Examples

98

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

8.

FX3 Firmware Application Structure

All FX3 firmware applications will consist of two parts:
■

Initialization code - This will be mostly common to all applications

■

Application code - This will be the application specific code

The synchronous slave FIFO application (SlaveFifoSync) is taken as an example to present the FX3
application structure. All the sample code shown below is from this example.

8.1

Firmware Application Structure
The Slave FIFO example comprises of the following files:

8.1.1

■

cyfxgpif_syncsf.h: This file contains the GPIF-II descriptors for the 16-bit and 32-bit Slave FIFO
interface.

■

cyfxslfifousbdscr.c: This file contains the USB descriptors.

■

cyfxslfifosync.h: This file contains the defines used in cyfxslfifosync.c. The constant
CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT is defined in this file. Setting this to 0 will
select 16 bit and 1 will select 32 bit. This constant is also used to configure the IO matrix for 16/32
bit GPIF in cyfxslfifosync.c.

■

cyfxslfifosync.c: This file contains the main application logic of the Slave FIFO example. The
application is explained in the subsequent sections.

Initialization Code
Figure 8-1 shows the initialization sequence of an FX3 application. Each of the main initialization
blocks is explained here.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

99

FX3 Firmware Application Structure

Figure 8-1. Initializing Sequence

8.1.1.1

Firmware Entry
The entry point for the FX3 firmware is CyU3PFirmwareEntry() function. The function is defined in
the FX3 API library and is not visible to the user. As part of the linker options, the entry point is be
specified as the CyU3PFirmwareEntry() function.
The firmware entry function performs the following actions:
1. Invalidates the caches (which were used by the bootloader)
2. Initialize the MMU (Memory Management Unit) and the caches
3. Initializes the SYS, FIQ, IRQ and SVC modes of stacks
4. The execution is then transferred to the Tool chain initialization (CyU3PToolChainInit()) function.

100

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware Application Structure

8.1.1.2

Tool Chain Initialization
The next step in the initialization sequence is the tool chain initialization. This is defined by the
specific Toolchain used and may provide a method to initialize the stacks and the C library.
As all the required stack initialization is performed by the firmware entry function, the toolchain init
does not need to perform these operations. The only operation performed by the
CyU3PToolChainInit function is to zero-out the contents of the BSS area, which holds all uninitialized data used by the firmware application.
The tool chain initialization function written for the GNU GCC compiler for ARM processors is
presented as an example below.
.global CyU3PToolChainInit
CyU3PToolChainInit:
# Clear the BSS area
__main:
mov
R0, #0
ldr
R1, =_bss_start
ldr
R2, =_bss_end
1:cmp R1, R2
strlo R0, [R1], #4
blo
1b
b
main

In this function, only two actions are performed:

8.1.1.3

■

The BSS area is cleared

■

The control is transferred to the main()

main() function
The main() function is the C programming language entry for the firmware application, and is defined
in the cyfxslfifosync.c file. Four main actions are performed in this function.
1. Device initialization: This is the first step in the firmware.
status = CyU3PDeviceInit (NULL);
if (status != CY_U3P_SUCCESS)
{
goto handle_fatal_error;
}
As part of the device initialization:

a. The CPU clock is setup. Passing NULL as the argument for CyU3PDeviceInit() selects the
default clock configuration.
b. The Vectored Interrupt Controller (VIC) is initialized
c. The GCTL and the PLLs are configured.
The CyU3PDeviceInit() function is part of the FX3 library
2. Device cache configuration: The second step is to enable the device caches. The device has
8KB data cache and 8KB instruction cache. In this example, only the instruction cache is enabled
as the data cache is useful only when there is a large amount of CPU based memory accesses.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

101

FX3 Firmware Application Structure

When used in simple cases, it can decrease performance due to large number of cache flushes
and cleans and it also adds complexity to the code.
status = CyU3PDeviceCacheControl (CyTrue, CyFalse, CyFalse);
{
goto handle_fatal_error;
}

3. I/O matrix configuration: The third step is the configuration of the I/Os that are required. This
includes the GPIF and the serial interfaces (SPI, I2C, I2S, GPIO, and UART).
o_cfg.useUart
io_cfg.useI2C
io_cfg.useI2S
io_cfg.useSpi

=
=
=
=

CyTrue;
CyFalse;
CyFalse;
CyFalse;

#if
(CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT == 0)
io_cfg.isDQ32Bit = CyFalse;
io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_UART_ONLY;
#else
io_cfg.isDQ32Bit = CyTrue;
io_cfg.lppMode = CY_U3P_IO_MATRIX_LPP_DEFAULT;
#endif
/* No GPIOs are enabled. */
io_cfg.gpioSimpleEn[0] = 0;
io_cfg.gpioSimpleEn[1] = 0;
io_cfg.gpioComplexEn[0] = 0;
io_cfg.gpioComplexEn[1] = 0;
io_cfg.s0Mode = CY_U3P_SPORT_INACTIVE;
status = CyU3PDeviceConfigureIOMatrix (&io_cfg);
if (status != CY_U3P_SUCCESS)
{
goto handle_fatal_error;
}

In this example:
a. The setting of CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT is used to configure the
GPIF in 32- or16-bit mode.
b. GPIO, I2C, I2S and SPI are not used.
c. UART is used.
d. Both S ports are not available and are therefore disabled.
The I/O matrix configuration data structure is initialized and the CyU3PDeviceConfigureIOMatrix
function (in the library) is invoked.
4. The final step in the main() function is invocation of the OS. This is done by issuing a call to the
CyU3PKernelEntry() function. This function is defined in the library and is a non returning call.
This function is a wrapper to the actual ThreadX OS entry call. This function:
a. Initializes the OS

102

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware Application Structure

b. Sets up the OS timer
c. Starts and transfers control to the RTOS scheduler

8.1.1.4

Application Definition
The function CyFxApplicationDefine() is called by the FX3 library after the OS is invoked. In this
function application specific threads are created.
In the Slave FIFO example, only one thread is created in the application define function. This is
shown below:
/* Allocate the memory for the thread */
ptr = CyU3PMemAlloc (CY_FX_SLFIFO_THREAD_STACK);
/* Create the thread for the application */
retThrdCreate = CyU3PThreadCreate (&slFifoAppThread,
/* Slave FIFO app thread structure
"21:Slave_FIFO_sync",
/* Thread ID and thread name
SlFifoAppThread_Entry,
/* Slave FIFO app thread entry function
0,
/* No input parameter to thread
ptr,
/* Pointer to the allocated thread stack
CY_FX_SLFIFO_THREAD_STACK,
/* App Thread stack size
CY_FX_SLFIFO_THREAD_PRIORITY,
/* App Thread priority
CY_FX_SLFIFO_THREAD_PRIORITY,
/* App Thread pre-emption threshold
CYU3P_NO_TIME_SLICE,
/* No time slice for the application thread
CYU3P_AUTO_START
/* Start the thread immediately
);

*/
*/
*/
*/
*/
*/
*/
*/
*/
*/

Note that more threads (as required by the user application) can be created in the application define
function. All other FX3 specific programming must be done only in the user threads.

8.1.2

Application Code
The Slave FIFO application code is composed of three parts:
■

The application thread function performs the application-specific initialization operations such as
GPIF-II and USB block configuration.

■

The CyFxSlFifoApplnStart function is called when a USB SET_CONFIGURATION request is
received, and sets up the endpoints and DMA channels required for the USB <-> GPIF data
transfers.

■

The CyFxSlFifoApplnStop function is called when a USB reset or disconnect is detected and disables the USB endpoints and frees up the DMA channels.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

103

FX3 Firmware Application Structure

Figure 8-2. Slave FIFO Application Code
Application Thread Entry
(SlFifoAppThread_Entry)

USB SET_CONFIG event
callback
CyFxSlFifoApplnDebugInit

Initialize UART
(CyU3PUartInit)

Configure OUT and IN endpoints
(CyU3PSetEpConfig)

Configure UART
(CyU3PUartSetConfig)

Create USB to GPIF DMA Channel
(CyU3PDmaChannelCreate)

Enable UART Transmitter
(CyU3PUartTxSetBlockXfer)

Create GPIF to USB DMA Channel
(CyU3PDmaChannelCreate)

Initialize Debug Logger
(CyU3PDebugInit)

Flush stale data in USB endpoints
(CyU3PUsbFlushEp)

Power on PIB (GPIF II) block
(CyU3PPibInit)

CyFxSlFifoApplnStart

Enable DMA channels for transfer
(CyU3PDmaChannelSetXfer)

CyFxSlFifoApplnInit

End of callback
Configure the GPIF II block
(CyU3PGpifLoad)
Start the GPIF II state machine
(CyU3PGpifSMStart)

USB RESET or DISCONNECT
event callback

Power on the USB block
(CyU3PUsbStart)

Flush stale data in USB endpoints
(CyU3PUsbFlushEp)

Register USB callbacks
(CyFxSlFifoApplnUSBSetupCB,
CyFxSlFifoApplnUSBEventCB,
CyFxApplnLPMRqtCB)

Destroy DMA channels
(CyU3PDmaChannelDestroy)

Register USB descriptors
(CyU3PUsbSetDesc)

Disable OUT and IN endpoints
(CyU3PSetEpConfig)

Enable USB 3.0 connection
(CyU3PConnectState)

End of callback

Sleep to 1 second
(CyU3PThreadSleep)

CyFxSlFifoApplnStop

Execution Loop

Print Status Log to UART
(CyU3PDebugPrint)

8.1.2.1

Application Thread
The Application entry point for the Slave FIFO example is the SlFifoAppThread_Entry () function.
void
SlFifoAppThread_Entry (uint32_t input)
{
/* Initialize the debug module */
CyFxSlFifoApplnDebugInit();
/* Initialize the slave FIFO application */
CyFxSlFifoApplnInit();

104

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware Application Structure

for (;;)
{
CyU3PThreadSleep (1000);
if (glIsApplnActive)
{
/* Print the number of buffers received so far from the USB host. */
CyU3PDebugPrint (6, "Data tracker: buffers received: %d, \
buffers sent: %d.\n", glDMARxCount, glDMATxCount);
}
}
}

The main actions performed in this thread are:
1. Initializing the debug mechanism
2. Initializing the main slave FIFO application
Each of these steps is explained below

8.1.2.2

Debug Initialization
■

The debug module uses the UART to output the debug messages. The UART has to be first
configured before the debug mechanism is initialized. This is done by invoking the UART init
function.

/* Initialize the UART for printing debug messages */
apiRetStatus = CyU3PUartInit();
■

The next step is to configure the UART. The UART data structure is first filled in and this is
passed to the UART SetConfig function.

/* Set UART Configuration */
uartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200;
uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;
uartConfig.parity = CY_U3P_UART_NO_PARITY;
uartConfig.txEnable = CyTrue;
uartConfig.rxEnable = CyFalse;
uartConfig.flowCtrl = CyFalse;
uartConfig.isDma = CyTrue;
apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL);
■

The UART transfer size is set next. This is configured to be infinite in size, so that the total debug
prints are not limited to any size.

/* Set the UART transfer */
apiRetStatus = CyU3PUartTxSetBlockXfer (0xFFFFFFFF);
■

Finally the Debug module is initialized. The two main parameters are:
❐

The destination for the debug prints, which is the UART socket

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

105

FX3 Firmware Application Structure

❐

The verbosity of the debug. This is set to level 8, so all debug prints which are below this level
(0 to 7) will be printed.
/* Initialize the Debug application */
apiRetStatus = CyU3PDebugInit (CY_U3P_LPP_SOCKET_UART_CONS, 8);

8.1.2.3

Application initialization
The application initialization consists of the following steps:
■

GPIF-II Initialization

■

USB Initialization

GPIF-II Initialization
The GPIF-II block is first initialized.
/* Initialize the P-port Block */
pibClock.clkDiv = 2;
pibClock.clkSrc = CY_U3P_SYS_CLK;
pibClock.isHalfDiv = CyFalse;
pibClock.isDllEnable = CyFalse;
apiRetStatus = CyU3PPibInit (CyTrue, &pibClock);

The slave FIFO descriptors are loaded into the GPIF-II registers and the state machine is started.
/* Load the GPIF configuration for Slave FIFO sync mode. */
apiRetStatus = CyU3PGpifLoad (&Sync_Slave_Fifo_2Bit_CyFxGpifConfig);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PGpifLoad failed, \
Error Code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Start the state machine. */
apiRetStatus = CyU3PGpifSMStart (SYNC_SLAVE_FIFO_2BIT_RESET,
SYNC_SLAVE_FIFO_2BIT_ALPHA_RESET);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PGpifSMStart failed, \
Error Code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Start the state machine. */
apiRetStatus = CyU3PGpifSMStart (SYNC_SLAVE_FIFO_2BIT_RESET,
SYNC_SLAVE_FIFO_2BIT_ALPHA_RESET);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PGpifSMStart failed, \
Error Code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}

106

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware Application Structure

USB Initialization
■

The USB stack in the FX3 library is first initialized. This is done by invoking the USB Start
function.

/* Start the USB functionality */
apiRetStatus = CyU3PUsbStart();
■

The next step is to register for callbacks. In this example, callbacks are registered for USB Setup
requests and USB Events.

/* The fast enumeration is the easiest way to setup a USB connection,
* where all enumeration phase is handled by the library. Only the
* class/vendor requests need to be handled by the application. */
CyU3PUsbRegisterSetupCallback (CyFxSlFifoApplnUSBSetupCB, CyTrue);
/* Setup the callback to handle the USB events. */
CyU3PUsbRegisterEventCallback (CyFxSlFifoApplnUSBEventCB);

The callback functions and the call back handling are described in later sections.
■

The USB descriptors are set. This is done by invoking the USB set descriptor call for each
descriptor.

/* Set the USB Enumeration descriptors */
/* Device Descriptor */
apiRetStatus = CyU3PUsbSetDesc (CY_U3P_USB_SET_HS_DEVICE_DESCR,
NULL, (uint8_t *)CyFxUSB20DeviceDscr);
.
.
.

The code snippet is for setting the Device Descriptor. The other descriptors set in the example are
Device Qualifier, Other Speed, Configuration, BOS (for Super Speed) and String Descriptors.
■

The USB pins are connected. The FX3 USB device is visible to the host only after this action.
Hence it is important that all setup is completed before the USB pins are connected.

/* Connect the USB Pins */
/* Enable Super Speed operation */
apiRetStatus = CyU3PConnectState(CyTrue, CyTrue);

8.1.2.4

Endpoint Setup
The endpoints are configured on receiving a SET_CONFIGURATION request. Two endpoints: 1 IN
and 1 OUT are configured as bulk endpoints. The endpoint maxPacketSize is updated based on the
USB connection speed.
CyU3PUSBSpeed_t usbSpeed = CyU3PUsbGetSpeed();
/* First identify the usb speed. Once that is identified,
* create a DMA channel and start the transfer on this.
* Based on the Bus Speed configure the endpoint packet size. */
switch (usbSpeed)

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

107

FX3 Firmware Application Structure

{
case CY_U3P_FULL_SPEED:
size = 64;
break;
case CY_U3P_HIGH_SPEED:
size = 512;
break;
case CY_U3P_SUPER_SPEED:
size = 1024;
break;
default:
CyU3PDebugPrint (4, "Error! Invalid USB speed.\n");
CyFxAppErrorHandler (CY_U3P_ERROR_FAILURE);
break;
}
CyU3PMemSet ((uint8_t *)&epCfg, 0, sizeof (epCfg));
epCfg.enable = CyTrue;
epCfg.epType = CY_U3P_USB_EP_BULK;
epCfg.burstLen = 1;
epCfg.streams = 0;
epCfg.pcktSize = size;
/* Producer endpoint configuration */
apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_PRODUCER, &epCfg);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, \
Error code = %d\n", apiRetStatus);
CyFxAppErrorHandler (apiRetStatus);
}
/* Consumer endpoint configuration */
apiRetStatus = CyU3PSetEpConfig(CY_FX_EP_CONSUMER, &epCfg);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PSetEpConfig failed, \
Error code = %d\n", apiRetStatus);
CyFxAppErrorHandler (apiRetStatus);
}

108

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware Application Structure

8.1.2.5

USB Setup Callback
This callback function is called whenever the USB driver in the FX3 firmware framework needs the
application to respond to a USB control request (SETUP command). Since the fast enumeration
model is used, only class- and vendor-specific requests and standard requests addressed to an
interface or endpoint need to be handled by the application. Other standard requests are handled by
the firmware library. This example does not implement class- or vendor-specific requests.
CyBool_t
CyFxSlFifoApplnUSBSetupCB (uint32_t setupdat0,
uint32_t setupdat1)
{
/* Fast enumeration is used. Only class, vendor and unknown
* requests are received by this function. These are not
* handled in this application. Hence return CyFalse. */
return CyFalse;
}

8.1.2.6

USB Event Callback
The USB events of interest are: Set Configuration, Reset and Disconnect. The slave FIFO loop is
started on receiving a SETCONF event and is stopped on a USB reset or USB disconnect.
/* This is the callback function to handle the USB events. */
void
CyFxSlFifoApplnUSBEventCB (CyU3PUsbEventType_t evtype,
uint16_t evdata)
{
switch (evtype)
{
case CY_U3P_USB_EVENT_SETCONF:
/* Stop the application before re-starting. */
if (glIsApplnActive)
{
CyFxSlFifoApplnStop ();
}
/* Start the loop back function. */
CyFxSlFifoApplnStart ();
break;
case CY_U3P_USB_EVENT_RESET:
case CY_U3P_USB_EVENT_DISCONNECT:
/* Stop the loop back function. */
if (glIsApplnActive)
{
CyFxSlFifoApplnStop ();
}
break;
default:
break;
}
}

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

109

FX3 Firmware Application Structure

8.1.2.7

DMA Setup
■

The Slave FIFO application uses 2 DMA Manual channels. These channels are setup once a Set
Configuration is received from the USB host. The DMA buffer size is fixed based on the USB
connection speed.

/* Create a DMA MANUAL channel for U2P transfer.
* DMA size is set based on the USB speed. */
dmaCfg.size = size;
dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT;
dmaCfg.prodSckId = CY_FX_PRODUCER_USB_SOCKET;
dmaCfg.consSckId = CY_FX_CONSUMER_PPORT_SOCKET;
dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
/* Enabling the callback for produce event. */
dmaCfg.notification = CY_U3P_DMA_CB_PROD_EVENT;
dmaCfg.cb = CyFxSlFifoUtoPDmaCallback;
dmaCfg.prodHeader = 0;
dmaCfg.prodFooter = 0;
dmaCfg.consHeader = 0;
dmaCfg.prodAvailCount = 0;
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP,
CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelCreate failed, \
Error code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Create a DMA MANUAL channel for P2U transfer. */
dmaCfg.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET;
dmaCfg.consSckId = CY_FX_CONSUMER_USB_SOCKET;
dmaCfg.cb = CyFxSlFifoPtoUDmaCallback;
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoPtoU,
CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelCreate failed, \
Error code = %d\n", apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
■

The DMA channel transfers are enabled

/* Set DMA Channel transfer size */
apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoUtoP,
CY_FX_SLFIFO_DMA_TX_SIZE);
/* Set DMA Channel transfer size */
apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleSlFifoPtoU,
CY_FX_SLFIFO_DMA_TX_SIZE);

110

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Firmware Application Structure

8.1.2.8

DMA Callback
In this example, there are two data paths
■

U to P

■

P to U

A DMA callback is registered for the DMA Produce Events on each path. This event will occur when
a DMA buffer is available (with data) from
■

The USB OUT endpoint

■

The GPIF-II socket

In the DMA callback, this buffer is committed, passing on the data to the
■

The GPIF-II socket

■

USB In Endpoint

The two call back functions are shown below
/* DMA callback function to handle the produce events for U to P
* transfers. */
void
CyFxSlFifoUtoPDmaCallback (CyU3PDmaChannel *chHandle,
CyU3PDmaCbType_t type,CyU3PDmaCBInput_t *input)
{
CyU3PReturnStatus_t status = CY_U3P_SUCCESS;
if (type == CY_U3P_DMA_CB_PROD_EVENT)
{
/* This is a produce event notification to the CPU.
* This notification is received upon reception of
* every buffer. The buffer will not be sent out
* unless it is explicitly committed. The call shall
* fail if there is a bus reset/usb disconnect or if
* there is any application error. */
status = CyU3PDmaChannelCommitBuffer (chHandle,
input->buffer_p.count, 0);
if (status != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelCommitBuffer failed, \
Error code = %d\n", status);
}
/* Increment the counter. */
glDMARxCount++;
}
}

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

111

FX3 Firmware Application Structure

112

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

9.

9.1

FX3 Serial Peripheral Register Access

Serial Peripheral (LPP) Registers
The EZ-USB FX3 device implements a set of serial peripheral interfaces (I2S, I2C, UART, and SPI)
that can be used to talk to other devices. This chapter lists the FX3 device registers that provide control and status information for each of these interfaces.

9.1.1

I2S Registers
The I2S interface on the FX3 device is a master interface that is can output stereophonic data at different sampling rates. This section documents the control and status registers related to the I2S
interface.
Name
I2S_CONFIG

Width (bits)
32

Address

Description

0xE0000000

Configurations and modes register

I2S_STATUS

32

0xE0000004

Status register

I2S_INTR

32

0xE0000008

Interrupt request (status) register

I2S_INTR_MASK

32

0xE000000C

Interrupt mask register

I2S_EGRESS_DATA_LEFT

32

0xE0000010

Left channel egress data register

I2S_EGRESS_DATA_RIGHT

32

0xE0000014

Right channel egress data register

I2S_COUNTER

32

0xE0000018

Sample counter register

I2S_SOCKET

32

0xE000001C

Socket register

I2S_ID

32

0xE00003F0

Block Id register

I2S_POWER

32

0xE00003F4

Power, clock and reset control register

Refer to Section 10.18 of EZ-USB® FX3™ Technical Reference Manual for details.

9.1.2

I2C Registers
The FX3 device provides an I2C master block that can be configured to talk to various slave devices
at different transfer rates. This section documents all of the registers related to the I2C interface.
Name

Width
(bits)

Address

Description

I2C_CONFIG

32

0xE0000400

Configuration and modes register

I2C_STATUS

32

0xE0000404

Status register

I2C_INTR

32

0xE0000408

Interrupt status register

I2C_INTR_MASK

32

0xE000040C

Interrupt mask register

I2C_TIMEOUT

32

0xE0000410

Bus timeout register

I2C_DMA_TIMEOUT

32

0xE0000414

DMA transfer timeout register

I2C_PREAMBLE_CTRL

32

0xE0000418

Specify start/stop bit locations during preamble (command and address) phase.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

113

FX3 Serial Peripheral Register Access

Width
(bits)

Name

Address

Description

I2C_PREAMBLE_DATA0

32

0xE000041C

Data to be sent during preamble phase –
Word 0

I2C_PREAMBLE_DATA1

32

0xE0000420

Data to be sent during preamble phase –
Word 1

I2C_PREAMBLE_RPT

32

0xE0000424

Settings for repeating the preamble for polling the device status.

I2C_COMMAND

32

0xE0000428

Command register to initiate I2C transfers

I2C_EGRESS_DATA

32

0xE000042C

Write data register

I2C_INGRESS_DATA

32

0xE0000430

Read data register

I2C_BYTE_COUNT

32

0xE0000438

Desired size of data transfer

I2C_BYTES_TRANSFERRED

32

0xE000043C

Remaining size for the current data transfer

I2C_SOCKET

32

0xE0000440

Selects DMA sockets for I2C data transfers

I2C_ID

32

0xE00007F0

Block ID register

I2C_POWER

32

0xE00007F4

Power and reset register

Refer to Section 10.19 of EZ-USB® FX3™ Technical Reference Manual for details.

9.1.3

UART Registers
The FX3 device implements a UART block that can communicate with other UART controllers at different baud rates and supports different communication parameters, parity settings, and flow control.
This section documents the UART related configuration and status registers.
Name
UART_CONFIG

Width
(bits)
32

Address

Description

0xE0000800

Configuration and modes register

UART_STATUS

32

0xE0000804

Status register

UART_INTR

32

0xE0000808

Interrupt status register

UART_INTR_MASK

32

0xE000080C

Interrupt mask register

UART_EGRESS_DATA

32

0xE0000810

Write data register

UART_INGRESS_DATA

32

0xE0000814

Read data register

UART_SOCKET

32

0xE0000818

Socket selection register

UART_RX_BYTE_COUNT

32

0xE000081C

Receive byte count register

UART_TX_BYTE_COUNT

32

0xE0000820

Transmit byte count register

UART_ID

32

0xE0000BF0

Block ID register

UART_POWER

32

0xE0000BF4

Power and reset control register

Refer to Section 10.20 of EZ-USB® FX3™ Technical Reference Manual for details.

114

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Serial Peripheral Register Access

9.1.4

SPI Registers
The SPI block on the FX3 device is a SPI master interface that can be configured with different word
sizes, clock frequencies and modes of operation. While the block automatically supports the use of
default Slave Select (SSN) pin, the firmware can use other GPIOs on the FX3 device to talk to other
slaves.
This section documents the SPI related configuration and status registers.
Width
(bits)
32
32
32
32
32
32
32
32
32
32
32

Name
SPI_CONFIG
SPI_STATUS
SPI_INTR
SPI_INTR_MASK
SPI_EGRESS_DATA
SPI_INGRESS_DATA
SPI_SOCKET
SPI_RX_BYTE_COUNT
SPI_TX_BYTE_COUNT
SPI_ID
SPI_POWER

Address
0xE0000C00
0xE0000C04
0xE0000C08
0xE0000C0C
0xE0000C10
0xE0000C14
0xE0000C18
0xE0000C1C
0xE0000C20
0xE0000FF0
0xE0000FF4

Description
Configuration and modes register
Status register
Interrupt status register
Interrupt mask register
Write data register
Read data register
Socket select register
Receive byte count register
Transmit byte count register
Block ID register
Power and reset register

Refer to Section 10.21 of EZ-USB® FX3™ Technical Reference Manual for details.

9.2

FX3 GPIO Register Interface
FX3 device has 61 I/Os, which can be individually configured as GPIOs or as dedicated peripheral
lines. The GPIO itself can be simple or complex according to the use case. A simple GPIO can act
as an output line or an input line with interrupt capability. A complex GPIO (pin) can act as a timer/
counter or PWM in addition to its input and output functionality.
Any I/O can be configured as a simple GPIO, but only eight of the I/Os can be used as complex
GPIOs. Only one of the I/Os with the same result for (GPIO number % 8) can be chosen as a complex GPIO.

9.2.1

Simple GPIO Registers
The following table lists key registers of the simple GPIO interface.
Table 9-1. Simple GPIO Registers
Address

Qty

Width

Name

Description

0xE0001100 +
GPIO_NUM * 0x04

61

32

GPIO_SIMPLE

0xE00013D0

1

32

GPIO_INVALUE0

GPIO input value vector

0xE00013D4

1

32

GPIO_INVALUE1

GPIO input value vector

0xE00013E0

1

32

GPIO_INTR0

GPIO interrupt vector

0xE00013E4

1

32

GPIO_INTR1

GPIO interrupt vector

0xE00013F0

1

32

GPIO_ID

0xE00013F4

1

32

GPIO_POWER

Simple general purpose i/o register (per GPIO)

Block identification and version number
Power, clock, and reset control

Refer to Section 10.22 of EZ-USB® FX3™ Technical Reference Manual for details.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

115

FX3 Serial Peripheral Register Access

9.3

Complex GPIO (PIN) Registers
The following table lists key registers of the complex GPIO interface.
Table 9-2. Complex GPIO Registers
Address

Qty

Width

Name

0xE0001000 +
(GPIO_ID MOD
8) * 0x10

8

128

PIN

0xE00013E8

1

32

GPIO_PIN_INTR

a.

Description
General purpose I/O registers (one pin)a
GPIO interrupt vector for PINs

See table 3 for further break up of each 128 bit register.

The following table lists the pins registers for complex GPIO interface.
Table 9-3. Complex GPIO Registers
Offset

Width

Name

0xE0001000 +
(GPIO_ID MOD
8) * 0x10

32

PIN_STATUS

0xE0001004 +
(GPIO_ID MOD
8) * 0x10

32

PIN_TIMER

0xE0001008 +
(GPIO_ID MOD
8) * 0x10

32

PIN_PERIOD

0xE000100C +
(GPIO_ID MOD
8) * 0x10

32

Description
Configuration, mode and status of I/O Pin.

Timer/counter for pulse and measurement modes.

Period length for revolving counter/timer (GPIO_TIMER).

PIN_THRESHOLD Threshold for measurement register.

Refer to Section 10.23 of EZ-USB® FX3™ Technical Reference Manual for details.

116

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

10. FX3 P-Port Register Access

FX3’s processor interface is a General Programmable parallel interface (GPIF) that can be programmed to operate with:
1. 8-bit address
2. 8-, 16-, or 32-bit data bus widths
3. Burst sizes: 2 thru 2^14
4. Buffer sizes: 16 * n; for n 1 thru 2048: Max buffer size of 32 KB
5. Buffer switching overhead 550 - 900 ns per buffer
The PP Register protocol enables data transfers between Application Processor and FX3’s parallel
port.
The PP Register protocol uses a special register map of 16-bit registers that can be accessed
through the GPIF interface. These addresses are not accessible internal to the device.
The PP register protocol as seen through GPIF uses the following mechanisms:
P-port addresses in the range 0x80-FF expose a bank of 128 16-bit registers. Some of these registers are used to implement the mechanisms mentioned below, and others control configuration, status and behavior of the P-Port.
Accesses to any address in the range 0x00-7F are used for FIFO-style read or write operations into
the ‘active’ socket (to be explained later).
Special registers implement the ‘mailbox’ protocol. These registers are use to transfer messages of
up to 8-bytes between the Application Processor and the FX3 CPU.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

117

FX3 P-Port Register Access

10.1

10.2

Glossary
Egress

Direction of transfer - out of FX3 to external device

Ingress

Direction of transfer – into FX3 from external device

Long transfer

DMA transfer spanning multiple buffers

Short transfer

DMA transfer spanning one buffer

Full Transfer

DMA transfer comprising of full buffer

Partial transfer

DMA transfer comprising of less than full buffer

Zero Length
transfer

Transfer of a zero length buffer (packet)

ZLB

Zero length buffer

Externally Visible PP Registers
The following table lists key registers of the P-port used in initialization and data transfer across the
P-port.
Table 10-1. PP Register
Description
Offset

Processor Port Register Map in GPIF space

Width

Name

Description

0x80

16

PP_ID

P-Port Device ID Register

0x81

16

PP_INIT

P-Port reset and power control

0x82

16

PP_CONFIG

P-Port Configuration Register

0x88

16

PP_INTR_MASK

P-Port Interrupt Mask Register

0x89

16

PP_DRQR5_MASK

P-Port DRQ/R5 Mask Register

0x8A

32

PP_SOCK_MASK

P-Port Socket Mask Register

0x8C

16

PP_ERROR

P-Port Error Indicator Register

0x8E

16

PP_DMA_XFER

P-Port DMA Transfer Register

0x8F

16

PP_DMA_SIZE

P-Port DMA Transfer Size Register

0x90

64

PP_WR_MAILBOX

P-Port Write (Ingress) Mailbox Registers

0x99

16

PP_EVENT

P-Port Event Register

0x9A

64

PP_RD_MAILBOX

P-Port Read (Egress) Mailbox Registers

0x9E

32

PP_SOCK_STAT

P-Port Socket Status Register

Refer to Section 10.8 of EZ-USB® FX3™ Technical Reference Manual for details.

10.3

INTR and DRQ Signaling
INTR signal is derived by a bitwise OR of (PP_EVENT & PP_INTR_MASK) registers. This allows AP
to selectively program PP_INTR_MASK for desired exception and socket events.
Typically, status bit DMA_WMARK_EV or DMA_READY_EV is made available as a DRQ signal by
configuring PP_DRQR5_MASK. It is possible to combine DMA_READY or DMA_WMARK with a
handshake DACK signal from AP, if required. This is done using a programmable GPIF state
machine. For the rest of this document use of DACK is not considered.
The polarity of both DRQ and INTR signals is configurable.

118

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 P-Port Register Access

10.4

Transferring Data In and Out of Sockets
The following section describes how the Application Processor transfers blocks of data into and out
of active sockets using the PP Register protocol. All GPIF PP-Mode-based transfers use the same
internal mechanisms, but may differ in the usage of DRQ/INTR signaling.
This section discusses how read and write transfers are implemented for full buffer, partial buffer,
zero-length packets and long transfers. A distinction is made between short (single buffer) and long
(multiple buffer) transfers. For long transfer it is assumed that a higher level protocol (for example,
through use of mailboxes) has communicated the need for transfer of large size between AP and
ARM CPU.
All transfers are based on the following command, config and status bits on PP_* interface:

10.4.1

■

PP_SOCK_STAT.SOCK_STAT[N]. For each socket this status bit indicates that a socket has a
buffer available to exchange data (it has either data or space available).

■

PP_DMA_XFER.DMA_READY. This status bit indicates whether the P-Port is ready to service
reads from or writes to the active socket (the active socket is selected through the
PP_DMA_XFER register). PP_EVENT.DMA_READY_EV mirrors
PP_DMA_XFER.DMA_READY with a short delay of a few cycles.

■

PP_EVENT.DMA_WMARK_EV. This status bit is similar to DMA_READY, but it de-asserts a programmable number of words before the current buffer is completely exchanged. It can be used to
create flow control signals with offset latencies in the signaling interface.

■

PP_DMA_XFER.LONG_TRANSFER. This config bit indicates if long (multi-buffer) transfers are
enabled. This bit is set by Application Processor as part of transfer initiation.

■

PP_DMA_XFER.DMA_ENABLE. This command and status indicates that DMA transfers are
enabled. This bit is set by Application Processor as part of transfer initiation and cleared by FX3
hardware upon transfer completion for short transfers and by Application Processor for long
transfers.

Bursting and DMA_WMARK
AP transfers data on the interface in bursts of 1 or more words at a time. The burst size for transfers
may be configured to be any power of 2 words.
The DMA_WMARK status is generated in the GPIF controller counting back a configurable number
of words from the end of the last burst needed to transfer all the data for a buffer (this may be fewer
bursts than fit the maximum buffer size).
Burst size and watermark distance is programmable across a range of values.

10.4.2

Short Transfer - Full Buffer
A full size write (ingress) transfer is defined as a transfer that fills the entire buffer space available. If
this buffer space is known in advance (due to higher level protocol), it is not required to read
DMA_SIZE.
A full size read (egress) transfer is defined as a transfer that reads all the available data from the buffer – this may be less than the actual max buffer size.
Note

In the figures that illustrate transfers:
Values of SOCK_STAT[N], DMA_ENABLE, DMA_READY and DMA_WMARK are shown as signals;
these are really values of status bits in PP_* registers.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

119

FX3 P-Port Register Access

R/W# indicates read or write operation on the interface. Interface protocol specific (such as, async,
sync SRAM, or ADMux) signals are not shown.
A/D depicts Address and Data bus independent of interface protocol.
Full size transfer is illustrated in the following figure.
Figure 10-1. Full-sized DMA Transfers

1. AP configures PP_SOCK_STAT[N] becomes active when data or space is available.
2. AP configures PP_SOCK_MASK and PP_INTR_MASK register to enable interrupt when socket
is ready with data or empty-buffer for data transfer.
3. Application processor detects this interrupt signaling and reads registers PP_EVENT and
PP_SOCK_STAT_x to know which socket to work on.
4. AP activates socket by writing socket-number, direction and DMA_ENABLE=1 to
PP_DMA_XFER. This causes DMA_ENABLE to assert1 in a few cycles. AP uses
LONG_TRANSFER=0 for short (single buffer) transfer.
5. Optional register reads are performed from PP_DMA_XFER until PP_DMA_XFER.SIZE_VALID
asserts, after which PP_DMA_SIZE is read to determine buffer/data size. Multiple reads may be
required before the SIZE_VALID asserts.
6. PP_EVENT.DMA_READY asserts after socket has been activated to indicate data transfer can
start. This can occur before, during or after the DMA_SIZE read mentioned above.
7. DMA_SIZE bytes are transferred in an integral number of full bursts. The number of bursts is
rounded up and data beyond the size of buffer for ingress is ignored; reads beyond the size of
data for egress return 0.
8. PP_EVENT.DMA_WMARK de-asserts shortly after the watermark has passed (see burst section
above). Due to pipelining of the interface it may take a couple of cycles before this signal physically de-assert in the GPIF state machine.
SOCK_STAT[N], DMA_READY and DMA_ENABLE all become zero a few cycles after the last word
of the last burst has been transferred.
If data words are written when DMA_READY=0 (beyond the end of the buffer or after an error condition occurred), data will be ignored. Reads under these circumstances will return 0. These reads or
writes themselves represent an error condition if one is not already flagged. Upon (any) error
DMA_ERROR becomes active and DMA_READY de-asserts.

1. Asserting a status bit implies setting status bit to 1; and de-asserting a status bit implies setting the status-bit to 0.

120

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 P-Port Register Access

The following diagrams illustrate the sequence of events at the P-Port for read and write transfers:
Figure 10-2. Short Transfer - DMA Transfer Sequence
AP gets interrrupted by
INTR#. AP reads
PP_SOCK_STAT and
determins sockets ready
for transfer.

Application
Processor
GPMC port

Processor writes
DMA_XFER with socketnumber, direction and
DMA_ENABLE=1.

FX3

Benicia
P-port
SOCKET N has a
empty (full) buffer
that causes
PP_SOCK_STAT[N]
to be set.

AP optionally polls
PP_DMA_XFER for
SIZE_VALID to become 1,
if PP_DMA_SIZE is
required to write (read).
AP polls for DMA_READY
AP configures
PP_DRQR5_MASK to
assign DMA_WMARK_EV
to DRQ signal.

AP may optionally set
PP_DMA_SIZE for short
transfers
AP starts bursting data
from (to) socket
DMA_WMARK_EV
deasserts indicating that
AP should stop/pause
bursting.
SOCK_STAT[N],
DMA_READY,
DMA_ENABLE all become
zero

10.4.3

Data produced
(consumed) on
socket N makes
filled (empty) buffer
available to other
peripherals or CPU.

Short Transfer – Partial Buffer
A partial write (ingress) transfer is defined as a transfer that writes fewer bytes than the available
space in the buffer.
A partial read (egress) transfer is defined as a transfer that transfers less than the number of bytes
available in the current buffer.
The normal mechanism for a partial transfer is to write the number of bytes to transfer into
DMA_SIZE. This can be done only after a DMA_XFER.SIZE_VALID asserted. It is also possible to
explicitly terminate a transfer by clearing DMA_ENABLE in DMA_XFER. Note that in that case, it is
not possible to transfer an odd number of bytes.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

121

FX3 P-Port Register Access

Note that simply reading or writing fewer than DMA_SIZE bytes does not terminate the transfer –
the remaining bytes can be read at any time. Only when DMA_SIZE bytes have been transferred or
when DMA_ENABLE is explicitly cleared (by writing to DMA_XFER) does the transfer end.
The following diagrams illustrate both the normal partial and aborted transfer:
Figure 10-3. Partial DMA Transfers
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

EVENT

SOCK_
STAT

DMA_
XFER

DMA_
XFER

DMA_
XFER

SIZE

DMA_
XFER

SIZE

Buffer N
Burst 0

Buffer N
Burst 1

N
2

0

Figure 10-4. Aborted DMA Transfers

SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

EVENT

SOCK_
STAT

DMA_
XFER

DMA_
XFER

Buffer N
Burst 0

Buffer N
Burst 1

N
2

DMA_
XFER

The following should be noted:
■

DMA_WMARK de-asserts when either its watermark position is reached or shortly after the transfer is aborted, whichever occurs earlier.

■

SOCK_STAT[N] de-asserts (and so will the INTR based on it) shortly after all data for the current
buffer is exchanged. However, DMA_READY and DMA_ENABLE remain asserted until the last
burst if fully completed (or the transfer is aborted).

A transfer can be aborted in the middle of a burst, assuming the AP is capable of transferring a partial burst.

10.4.4

Short Transfer – Zero Length Buffers
When a zero byte buffer is available for read (egress), no data words are transferred and
DMA_READY will never assert. AP observes this by reading DMA_SIZE=0.
When a zero length buffer needs to written (ingress), the AP will write DMA_SIZE=0. The transfer
terminates automatically with no data exchanged.
The AP can observe the completion of a ZLB transfer by polling the DMA_XFER register. This
should not take more than a couple of cycles.

122

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 P-Port Register Access

Figure 10-5. Zero Length Read (Egress) Transfer
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

EVENT

SOCK_
STAT_X

DMA_
XFER

DMA_
XFER

SIZE

Figure 10-6. Zero Length Write (Ingress) Transfer
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

EVENT

SOCK_
STAT_X

DMA_
XFER

DMA_
XFER

DMA_
XFER

SIZE

The following should be noted:
For read transfers, DMA_ENABLE de-asserts shortly after a DMA_XFER read with SIZE_VALID=1.
For write transfers, all signals de-assert shortly after the write of DMA_SIZE=0.

10.4.5

Long Transfer – Integral Number of Buffers
A long transfer is coordinated between AP and FX3 CPU using a higher layer protocol; for example,
built on mailbox messaging. The length of transfer is conveyed to FX3 CPU which configures buffers
and sockets required for transfer.
The following diagram illustrates the long transfer:

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

123

FX3 P-Port Register Access

Figure 10-7. Long Transfer With Integral Number Of Buffers
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

DMA_
XFER

Buffer 0
Burst 0

Buffer0
Burst 1

Buffer 0
Burst 2

Buffer 0
Burst 3

Buffer N
Burst 0

Buffer N
Burst 1

Buffer N
Burst 2

Buffer N
Burst 3

DMA_
XFER

The following should be noted:
The transfer is setup in the P-port socket by the FX3 CPU, resulting in SOCK_STAT[N] asserting at
some point into the transfer to initiate transfer of the first buffer.
The AP initiates the transfer by writing DMA_ENABLE=1, LONG_TRANSFER=1 along with
DMA_SOCK and DMA_DIRECTION to DMA_XFER. This may take place before, during or after
SOCK_STAT[N] asserts.
When both SOCK_STAT[N] and DMA_ENABLE are asserted, DMA_READY and DMA_WMARK
assert.
The AP now transfers data in full bursts until DMA_WMARK de-asserts. Each time this happens, the
AP must wait until DMA_READY and DMA_WMARK re-assert.
When enough data is transferred, the AP must terminate the transfer by writing DMA_ENABLE=0.

10.4.6

Long Transfer – Aborted by AP
A long transfer can be aborted by AP by writing DMA_ENABLE=0 at any time and follow it with a
mailbox message to wrap up the partially written buffer.
The following diagram illustrates the working of an aborted long transfer:
Figure 10-8. Aborted Long Transfer
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

DMA_
XFER

Buffer 0
Burst 0

Buffer0
Burst 1

Buffer 0
Burst 2

Buffer 0
Burst 3

Buffer N
Burst 0

Buffer N
Burst 1

N
2

DMA_
XFER

The following should be noted:
DMA_WMARK de-asserts when either DMA_ENABLE is cleared or the configured water mark position is reached, whichever occurs sooner.

124

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 P-Port Register Access

The AP may abort a transfer in the middle of a burst or at the end of a burst. Note that it is not possible to implement a transfer of a non-integral number of bursts using the AP abort mechanism. This
requires the adjustment of the DMA_SIZE register as illustrated in the next section.

10.4.7

Long Transfer – Partial Last Buffer on Ingress
When a long ingress transfer has a partial last buffer, this buffer can be preceded by an adjustment
by AP of DMA_SIZE. If no such adjustment is made and the transfer is shorter than the coordinated
transfer size (that is set into the DMA Adapter’s trans_size by firmware), it is possible to exchange
whole words/bursts only.
The following diagram illustrates this concept:
Figure 10-9. Ingress Long Transfer with a Partial Last Buffer
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

DMA_
XFER

Buffer 0
Burst 0

Buffer0
Burst 1

Buffer 0
Burst 2

Buffer 0
Burst 3

DMA_
SIZE

Buffer N
Burst 0

Buffer N
Burst 1

N
2

0

DMA_
XFER

The following should be noted:
Before transferring the last buffer, the AP adjusts DMA_SIZE. AP must assure that DMA_READY=1
or DMA_WMARK=1 before writing to DMA_SIZE. This can be done using the signals directly (for
example, through INTR/DRQ signaling) or by explicitly polling for DMA_SIZE.VALID=1.
If no adjustment of DMA_SIZE is made, but the long transfer itself was indicated to have a non-integral number of bursts, the DMA Adapter will truncate any data written by AP beyond the end of the
transfer. In other words, this mechanism is not required and AP may terminate the transfer after writing the last full burst.

10.4.8

Long Transfer – Partial Last Buffer on Egress
On egress, a partial last buffer results in early de-assertion of DMA_WMARK but is otherwise no different from a transfer of a whole number of buffers. The following diagram illustrates this:

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

125

FX3 P-Port Register Access

Figure 10-10. Egress Long Transfer - with Partial Last Buffer
SOCK_STAT[N]
DMA_ENABLE
DMA_READY
DMA_WMARK
R/W#
A/D

10.4.9

DMA_
XFER

Buffer 0
Burst 0

Buffer0
Burst 1

Buffer 0
Burst 2

Buffer0
Burst 3

Buffer N
Burst 0

Buffer N
Burst 1

N
2

0

DMA_
XFER

Odd-Sized Transfers
Whenever a packet is transferred that consists of an odd number of bytes, all words transferred are
full words except the last one. The last word will contain only the valid bytes padded with 0. In big
endian mode this will be the MSB in little endian mode this will be the LSB. The other bytes will contain 0 on read and will be ignored on write.
This scheme is independent of how the memory buffer is aligned in memory inside of FX3 (which is
irrelevant to the application processor). In other words the first word of a transfer is always a full
word, even if the buffer is misaligned in internal memory.

10.4.10

DMA transfer signalING on ADMUX interface
The figure illustrates DRQ# signaling on P-port interface for a long transfer. DMA_WMARK is
mapped to DRQ# signal. Note that DRQ is programmed active-low in this example. The bufferswitching time is illustrated as the time from the last data cycle for a buffer to the first cycle of next
buffer.
Figure 10-11. Long Transfer Using DMA_WMARK Mapped to DRQ# Signal

~DMA_WMARK

DRQ #

Buffer-switching time

AQ/DQ[15:0]

B0

B1

Bn-2

Bn-1

Bn

Bn+1

B2n-2

B2n-

Note:
B – Burst – refers to Burst Read or Burst Write

Each burst, Bx, in Figure 10-11 is comprises of one address and burst-size data cycles. One example for a burst-of-16-read on ADMux interface is illustrated in Figure 10-12. Note that the RDY signal
shown in the figure is the link level ready signal. This RDY signal is different from the higher level
DMA control DMA_READY/DRQ signaling.

126

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 P-Port Register Access

Figure 10-12. Burst of 16 Read on ADMux Interface
tCLKH

tCLKL

CLK
tCLK
tS

A[0:7]/DQ[0:31]

tDS tDH

tH

Valid
Address

D0

tDH
D1

D2

D3

D14

D15

tS tH

ADV#
tS

CE#
tAVWE

WE#
tKW

RDY

tKW

High-Z

tWZ

Note:
1. 2-cycle latency is shown .
2. RDY active high shown. RDY can be programmed to either active low or active high.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

127

FX3 P-Port Register Access

128

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

11. FX3 Boot Image Format

The FX3 bootloader is capable of booting various sources based on the PMODE pin setting. The
bootloader requires the firmware image to be created with the following format:

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

129

FX3 Boot Image Format

11.1

Firmware Image Storage Format
Binary Image
Header
wSignature

Length
(16-bit)
1

Description
Signature 2 bytes initialize with “CY” ASCII text
For I2C/SPI EEPROM boot:
Bit0 = 0: execution binary file; 1: data file type
Bit3:1 (I2C size. Not used when booting from SPI EEPROM)
7: 128 KB (Micro chip)
6: 64 KB (128K ATMEL)
5: 32 KB
4: 16 KB
3: 8 KB
2: 4 KB
Note
Options 1 and 0 are reserved for future usage. Unpredictable result will occurred
when booting in these modes.
Bit5:4(I2C speed on I2C Boot):

bImageCTL;

½

00: 100 kHz
01: 400 kHz
10: 1 MHz
11: 3.4MHz (reserved)
Bit5:4(SPI speed on SPI boot):
00: 10 MHz
01: 20 MHz
10: 30 MHz
11: 40 MHz (reserved).
Note
On I2C boot, bootloader power-up default will be set at 100 kHz and it will adjust
the I2C speed if needed. On SPI boot, bootloader power-up default is set to 10
MHz and it will adjust the SPI speed if needed.
Bit7:6: Reserved should be set to zero
bImageType=0xB0: normal FW binary image with checksum

bImageType;

½

bImageType=0xB1: Reserved for security image type
bImageType=0xB2: Boot with new VID and PID
1st section length, in long words (32-bit)

dLength 0

2

When bImageType=0xB2, the dLength 0 will contain PID and VID. Boot Loader
will ignore the rest of the any following data.
1st sections address of Program Code not the I2C address.

dAddress 0

2

Note

dData[dLength 0]

dLength
All Image Code/Data also must be 32-bit align
0*2

…
dLength N

130

Internal ARM address is byte addressable, so the address for each section
should be 32-bit align

More sections
2

0x00000000 (Last record: termination section)

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

FX3 Boot Image Format

Binary Image
Header

Length
(16-bit)

Description
Should contain valid Program Entry (Normally, it should be the startup code or the
RESET Vector)
Note

dAddress N

2

if bImageCTL.bit0 = 1, the Boot Loader will not transfer the execution to this Program Entry.
If bImageCTL.bit0 = 0, the Boot Loader will transfer the execution to this Program
Entry: This address should be in ITCM area or SYSTEM RAM area
Boot Loader does not validate the Program Entry

dCheckSum

2

32-bit unsigned little endian checksum data will start from the 1st sections to termination section. The checksum will not include the dLength, dAddress and
Image Header

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

131

FX3 Boot Image Format

132

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

12. FX3 Development Tools

A set of development tools is provided with the SDK, which includes the third party tool-chain and
IDE.
The firmware development environment will help the user to develop, build and debug firmware
applications for FX3. The third party ARM® software development tool provides an integrated
development environment (IDE) with compiler, linker, assembler and debugger (via JTAG). Free
GNU tool-chain and Eclipse IDE (to be used with the GNU tool-chain) is provided.

12.1

GNU Toolchain
The GNU Toolchain provided as part of the FX3 SDK comprises of
■

GCC compiler (gcc) – version 4.8.1

■

GNU Linker (ld) – version 2.23.52

■

GNU Assembler (as) – version 2.23.52

■

GNU Debugger (gdb) – version 7.6.50

These executables are invoked by the Eclipse IDE.

12.2

Eclipse IDE
The Eclipse IDE for C/C++ Developer is provided as part of the FX3 SDK. This IDE comprises of the
base Eclipse platform (4.3.2) and the C/C++ Development Toolchain (8.3.0). The eclipse plug-ins
required for firmware development and debugging are bundled with the IDE.
■

GNU ARM Eclipse Plug-in (2.4.2)

This plug-in ties the Eclipse IDE to the GNU ARM tool-chain, and supports managed firmware builds
and debug sessions using Segger J-Link and OpenOCD.
■

Java™ Platform, Standard Edition Runtime Environment Version 7

The JRE is required by eclipse.
Refer to the EZUSBSuite User Guide document in the doc/firmware folder of the FX3 SDK
installation for detailed instructions on using the Eclipse IDE for firmware development and
debugging.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

133

FX3 Development Tools

134

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

13. FX3 Host Software

13.1

FX3 Host Software
A comprehensive host side (Microsoft Windows) stack is included in the FX3 SDK. This stack
includes:

13.1.1

■

Cypress generic USB 3.0/2.0 driver (WDF) on Windows 7 (32/64 bit), Windows Vista (32/64 bit),
and Windows XP (32 bit only)

■

Convenience APIs that expose generic

■

USB driver APIs through C++ and C# interfaces

■

USB control center, a Windows utility that provides interfaces to interact with the device at low
levels

Cypress Generic Driver
The Cypress driver is general-purpose, understanding primitive USB commands, but not implementing higher-level, USB device-class specific commands. The driver is ideal for communicating with a
vendor-specific device from a custom USB application. It can be used to send low-level USB
requests to any USB device for experimental or diagnostic applications.
Refer to CyUSB.pdf in the Cypress SuperSpeed USBSuite installation for more details.

13.1.2

CYAPI Programmer’s Reference
CyAPI.lib provides a simple, powerful C++ programming interface to USB devices. It is a C++ class
library that provides a high-level programming interface to the CyUsb3.sys device driver. The library
is only able to communicate with USB devices that are served by this driver.
Kindly refer to the CyAPI.pdf in the Cypress SuperSpeed USBSuite installation for more details.

13.1.3

CYUSB.NET Programmer’s Reference
CyUSB.dll is a managed Microsoft .NET class library. It provides a high-level, powerful programming
interface to USB devices and allows access to USB devices via library methods. Because CyUSB.dll
is a managed .NET library, its classes and methods can be accessed from any of the Microsoft
Visual Stuido.NET managed languages such as Visual Basic.NET, C#, Visual J# and managed C++.
Refer to the CyUSB.NET.pdf in the Cypress SuperSpeed USBSuite installation for more details.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

135

FX3 Host Software

13.1.4

Cy Control Center
USB ControlCenter is a C Sharp application that is used to communicate with Cypress USB devices
that are served by CyUSB3.sys device driver.
Refer to the CyControlCenter.pdf in the Cypress SuperSpeed USBSuite installation for more details.

136

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

14. GPIF™ II Designer

GPIF™ II Designer provides a graphical user interface to configure the processor port of EZ-USB
FX3 to connect to external devices. The interface between EZ-USB FX3 and the external device can
be specified as a state machine, and the GPIF-II Designer tool will generate the register
configuration in the form of a header file that can be readily integrated with the FX3 firmware
application using the FX3 API library. Refer to the GPIF II Designer User Guide for more details on
the tool.
The FX3 SDK includes the GPIF-II configuration header files for various Slave-FIFO modes. Please
see the Getting Started Guide and the Application Note AN65974 - Designing with EX-USB FX3
Slave FIFO Interface for details on using these configuration headers. Contact the Cypress USB
support team for any queries on GPIF-II configuration.

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K

137

GPIF™ II Designer

138

FX3 Programmers Manual, Doc. # 001-64707 Rev. *K



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : Yes
Author                          : gnkk
Create Date                     : 2018:05:22 11:51:56Z
Modify Date                     : 2018:05:22 14:59:42Z
XMP Toolkit                     : Adobe XMP Core 5.2-c001 63.139439, 2010/09/27-13:37:26
Format                          : application/pdf
Creator                         : gnkk
Title                           : FX3 Manual.book
Creator Tool                    : FrameMaker 10.0.2
Producer                        : Acrobat Distiller 10.0.0 (Windows)
Document ID                     : uuid:c0f78a25-1835-4195-9db6-caf2b7a264ce
Instance ID                     : uuid:065fa47a-db81-44c9-a1fd-37eebf4571e7
Page Mode                       : UseOutlines
Page Count                      : 138
EXIF Metadata provided by EXIF.tools

Navigation menu