During the operation of a USB device, the host can initiate a flow of data between the client software and the device.
Data can be transferred between the host and only one device at a time (peer to peer communication). However, two hosts cannot communicate directly, nor can two USB devices (with the exception of On-The-Go (OTG) devices, where one device acts as the master (host) and the other as the slave.)
The data on the USB bus is transferred via pipes that run between software memory buffers on the host and endpoints on the device.
Data flow on the USB bus is half-duplex, i.e., data can be transmitted only in one direction at a given time.
An endpoint is a uniquely identifiable entity on a USB device, which
is the source or terminus of the data that flows from or to the device. Each
USB device, logical or physical, has a collection of independent endpoints.
The three USB speeds (low, full and high) all support one bi-directional
control endpoint (endpoint zero) and 15 unidirectional endpoints. Each
unidirectional endpoint can be used for either inbound or outbound transfers,
so theoretically there are 30 supported endpoints.
Each endpoint has the following attributes: bus access frequency, bandwidth requirement, endpoint number, error handling mechanism, maximum packet size that can be transmitted or received, transfer type and direction (into or out of the device).
A pipe is a logical component that represents an association between an endpoint on the USB device and software on the host. Data is moved to and from a device through a pipe. A pipe can be either a stream pipe or a message pipe, depending on the type of data transfer used in the pipe. Stream pipes handle interrupt, bulk and isochronous transfers, while message pipes support the control transfer type. The different USB transfer types are discussed below [3.6].