usb_plat/usb_shai_api/inc/usb_host_shai.h
branchRCL_3
changeset 15 f92a4f87e424
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usb_plat/usb_shai_api/inc/usb_host_shai.h	Tue Aug 31 17:01:47 2010 +0300
@@ -0,0 +1,1290 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+/** @file
+    @brief USB Host SHAI header
+    @version 0.2.0
+
+    This header specifies the USB host SHAI.
+
+    @publishedDeviceAbstraction
+*/
+
+
+#ifndef USB_HOST_SHAI_H
+#define USB_HOST_SHAI_H
+
+// System includes
+#include <kern_priv.h>
+#include <usb/usb_common_shai.h> // Common types shared between the USB SHAIs
+
+/**
+ * This macro specifies the version of the USB Host SHAI header in
+ * binary coded decimal format. This allows the PSL layer to confirm a
+ * certain definition is available, if needed. This can for example
+ * make it possible for a new PSL to support compilation in an older
+ * environment with old USB SHAI version that is missing some new
+ * definitions.
+ */
+#define USB_HOST_SHAI_VERSION 0x020
+
+// The namespace is documented in file usb_common_shai.h, so it is not
+// repeated here
+namespace UsbShai
+    {
+    // Forward declarations
+
+    class MHostControllerIf;
+    class MHostTransferCallbackIf;
+    class MRootHubCallbackIf;
+    class MRootHubIf;
+
+    // Data types
+
+    /**
+     * An enumeration listing the host role electrical test modes
+     * supported. These correspond to the test modes specified in
+     * Section "6.4.1.1 Test Modes" of the "On-The-Go and Embedded
+     * Host Supplement to the USB Revision 2.0 Specification" Revision
+     * 2.0 (a.k.a. USB OTG 2.0).
+     *
+     * @see MHostControllerIf::EnterHostTestMode()
+     */
+    enum THostTestMode
+        {
+        /**
+         * Drive SE0 until host controller is reset. The call returns
+         * immediately after enabling the test mode.
+         */
+        ETestModeTestSE0NAK = 0,
+
+        /**
+         * Drive high-speed J until host controller is reset. The call
+         * returns immediately after enabling the test mode.
+         */
+        ETestModeTestJ,
+
+        /**
+         * Drive high-speed K until host controller is reset. The call
+         * returns immediately after enabling the test mode.
+         */
+        ETestModeTestK,
+
+        /**
+         * Send test packets until host controller is reset. The
+         * format of the required test packet is specified in Section
+         * "7.1.20 Test Mode Support" of the USB 2.0 specification.
+         *
+         * The call returns immediately after enabling the test
+         * mode.
+         */
+        ETestModeTestPacket,
+
+        /**
+         * Suspend and resume the port with 15 second delays to allow
+         * the operator to adjust test tool settings. The Host
+         * Controller PSL must perform the following test steps:
+         *
+         * 1. Allow SOFs to continue for 15 seconds.
+         *
+         * 2. Suspend the port under test.
+         *
+         * 3. Wait for 15 seconds.
+         *
+         * 4. Resume the port under test.
+         *
+         * This test mode is synchronous, i.e. the call returns after
+         * the test has been completed.
+         */
+        ETestModeHsHostPortSuspendResume,
+
+        /**
+         * Perform a single-step GetDescriptor(Device) transfer.  This
+         * is called after the USB Host Stack has enumerated a device
+         * with VID=0x1A0A and PID=0x0107. The Host Controller PSL
+         * must perform the following test steps:
+         *
+         * 1. Allow SOFs to continue for 15 seconds.
+         *
+         * 2. Send a complete GetDescriptor(Device) transfer
+         *
+         * This test mode is synchronous, i.e. the call returns after
+         * the test has been completed.
+         */
+        ETestModeSingleStepGetDeviceDescriptor,
+
+        /**
+         * Perform a single-step GetDescriptor(Device) transfer with a
+         * delayed data phase. This is called after the USB Host Stack
+         * has enumerated a device with VID=0x1A0A and PID=0x0108. The
+         * Host Controller PSL must perform the following test steps:
+         *
+         * 1. Send the SETUP packet for GetDescriptor(Device). The
+         *    device ACKs the packet as usual.
+         *
+         * 2. Allow SOFs to continue for 15 seconds.
+         *
+         * 3. Send the IN token for the data phase of
+         *    GetDescriptor(Device). The device responds with
+         *    the data.
+         *
+         * 4. Send the acknowledgement (zero-length OUT data) in
+         *    response to the data.
+         *
+         * This test mode is synchronous, i.e. the call returns after
+         * the test has been completed.
+         */
+        ETestModeSingleStepGetDeviceDescriptorData
+        };
+
+
+    // Class declaration
+
+    /**
+     * This class specifies a memory block that is used for USB
+     * transfers. The memory pointers and the buffer length are filled
+     * by the USB Host stack before issuing the transfer to the Host
+     * Controller PSL.
+     */
+    NONSHARABLE_CLASS( TUsbMemoryBlock )
+        {
+        public:
+        /**
+         * Linear (virtual) start address of the memory buffer. This
+         * address is always provided.
+         */
+        TLinAddr iLinAddr;
+
+        /**
+         * Physical start address of the memory buffer. This address
+         * is always provided, but it is the responsibility of the
+         * Host Controller PSL to guarantee that the memory is
+         * physically contiguous, if contiguous memory is needed. The
+         * PSL can guarantee this by implementing
+         * MHostControllerIf::ChunkCreate() to allocate physically
+         * contiguous memory.
+         *
+         * @see MHostControllerIf::ChunkCreate()
+         */
+        TPhysAddr iPhysAddr;
+
+        /**
+         * Pointer to an array of physical addresses each pointing to
+         * one physical page of the memory block. This address is
+         * always provided.
+         *
+         * The size of each page matches the size reported in
+         * THostControllerProperties::iControllerPageSize by the Host
+         * Controller PSL when it registered to the PIL.
+         */
+        TPhysAddr* iPhysPages;
+
+        /** The length of the memory buffer in bytes */
+        TUint iLength;
+        };
+
+
+    /**
+     * This class specifies the enumerated types for different endpoint
+     * configuration items and specifies the structure of the endpoint
+     * configuration. Instances of this class are used to specify the
+     * endpoint information when opening a pipe.
+     *
+     * @see MHostControllerIf::OpenPipe()
+     */
+    NONSHARABLE_CLASS( THostPipe )
+        {
+        public:
+        // These are flag constants that specify the values that can
+        // be bitwise OR'ed to the endpoint flags field iEndpointFlags
+        // to indicate some boolean parameters of the endpoint
+
+        /**
+         * This flag specifies whether the targeted endpoint is behind
+         * a hub that is performing transaction translation. This
+         * occurs when the attached device is a low/full-speed device
+         * attached to a high-speed hub.
+         *
+         * When this flag is set, the iHubAddr and iHubPort members
+         * specify the hub address and the port to which the targeted
+         * device is connected, and the iEndpointFlags flag
+         * KHubHasMultipleTTs specifies whether the hub has been
+         * configured to use multiple transaction translators.
+         */
+        static const TUint32 KHubTranslates = 0x00000001;
+
+        /**
+         * When the iEndpointFlags flag KHubTranslates is set, this
+         * flag is set if the hub has multiple transaction
+         * translators.
+         */
+        static const TUint32 KHubHasMultipleTTs = 0x00000002;
+
+        public: // Data
+        /**
+         * The type of the endpoint (control, bulk, interrupt,
+         * isochronous)
+         */
+        TEndpointType iType;
+
+        /** Maximum packet size to be used on this endpoint */
+        TUint iMaxPacketSize;
+
+        /** Flags specifying some boolean parameters of the endpoint */
+        TUint32 iEndpointFlags;
+
+        /**
+         * The speed (low, full, high) to use for this endpoint. This
+         * may differ from the current speed of the local port if the
+         * targeted device is a low-speed or full-speed device
+         * connected to a high-speed hub.
+         */
+        TSpeed iSpeed;
+
+        /**
+         * The polling interval specified as number of frames or
+         * microframes, depending on the speed. This is used for
+         * interrupt and isochronous endpoints only.
+         */
+        TUint iPollingInterval;
+
+        /**
+         * The USB address of the remote device that we are
+         * communicating with
+         */
+        TUint8 iRemoteAddr;
+
+        /**
+         * The remote endpoint number that we are communicating
+         * with. This is the physical endpoint number in the USB 2.0
+         * descriptor format, i.e. the most significant bit indicates
+         * the direction (1 for IN, 0 for OUT), and the least
+         * significant bits indicate the endpoint number.
+         */
+        TUint8 iRemoteEpNum;
+
+        /**
+         * For cases where the attached device is a low/full-speed
+         * device attached to a high-speed hub that does the necessary
+         * transaction translation, this member records the address of
+         * the hub doing the translation.
+         */
+        TUint8 iHubAddr;
+
+        /**
+         * For cases where the attached device is a low/full-speed
+         * device attached to a high-speed hub that does the necessary
+         * transaction translation, this member records the number of
+         * the port where the device is connected on the hub that does
+         * the transaction translation.
+         */
+        TUint8 iHubPort;
+        };
+
+
+    /**
+     * This class specifies the structure of the endpoint transfer
+     * requests. The USB Host Stack passes the Host Controller PSL a
+     * reference to an object of this class when setting up a new transfer
+     * with MHostPipeIf::StartTransfer().
+     */
+    NONSHARABLE_CLASS( THostTransfer )
+        {
+        public:
+        // These are public constants that specify the values that can
+        // be bitwise OR'ed to the request flags field iRequestFlags
+        // to indicate some boolean parameters of the transfer
+
+        /**
+         * When set, specifies that the transfer direction is IN,
+         * i.e. the host is reading from the connected device. This is
+         * needed for endpoint zero, which is bi-directional and
+         * cannot implicitly know the direction of the transfer.
+         *
+         * This bit is set or cleared by the USB Host stack before
+         * issuing a new transfer.
+         */
+        static const TUint32 KTransferDirIsIN = 0x00000001;
+
+        /**
+         * For OUT endpoint transfers, indicates whether the Host
+         * Controller PSL is required to force a short packet at the
+         * end of the transfer.
+         *
+         * When the bit is set, the Host Controller PSL must send a
+         * ZLP (Zero-Length Packet) after the last packet of the
+         * transfer, if and only if the last packet was a full packet,
+         * i.e. had the same size as the maximum packet size for the
+         * endpoint.
+         *
+         * This bit is set or cleared by the USB Host stack before
+         * issuing a new transfer.
+         */
+        static const TUint32 KOutForceShortPacket = 0x00000002;
+
+        /**
+         * For IN endpoint transfers, indicates whether the transfer
+         * was terminated with a ZLP (Zero-Length Packet).
+         *
+         * This bit is set by the Host Controller PSL before
+         * completing the transfer if the transfer ended due to a
+         * ZLP. Otherwise the bit is cleared by the Host Controller
+         * PSL.
+         */
+        static const TUint32 KInZlpReceived = 0x00000004;
+
+        /**
+         * Enumeration specifying the packet status values to be used
+         * for isochronous transfers.
+         */
+        enum TIsocPacketStatus
+            {
+            /** No error has occurred, transfer succesful */
+            ESuccess = 0,
+
+            /**
+             * Data error has occurred in a data transfer, i.e. the
+             * CRC did not match
+             */
+            EDataError,
+
+            /** Overrun has occurred */
+            EOverrun,
+
+            /** Underrun has occurred */
+            EUnderrun,
+            };
+
+        public: // Data
+        /**
+         * Pointer to the information of the pipe that this transfer
+         * is being made on. This is the same information that was
+         * used when opening the pipe that the transfer is being made
+         * on.
+         */
+        THostPipe* iPipeInfo;
+
+        /**
+         * A pointer to the callback interface to be used for
+         * indicating the completion of the transfer. This is set by
+         * the USB Host Stack before making a transfer request.
+         */
+        MHostTransferCallbackIf* iTransferCbIf;
+
+        /**
+         * Request flags specifying some boolean parameters for the
+         * transfer.
+         */
+        TUint32 iRequestFlags;
+
+        /**
+         * Memory block specifying the memory buffer used for the data
+         * transfer. This is filled by the USB Host Stack before
+         * making a transfer request.
+         *
+         * The memory block used here will be part of a chunk
+         * previously created by a call to
+         * MHostControllerIf::ChunkCreate() and the block will
+         * fullfill the alignment requirements reported by the call to
+         * MHostControllerIf::GetSizeAndAlignment().
+         *
+         * For control transfers, this specifies the buffer for the
+         * data stage and has zero length and NULL pointers if the
+         * transaction does not include a data stage.
+         */
+        TUsbMemoryBlock iDataBuffer;
+
+        /**
+         * For control transfers, this memory block specifies the
+         * contents of the setup packet to be sent. For other than
+         * control transfers, it is not used, and it has zero length
+         * and NULL pointers.
+         */
+        TUsbMemoryBlock iSetupBuffer;
+
+        /**
+         * For isochronous transfers, this sets the number of
+         * isochronous packets to send/receive. This is set by the
+         * USB Host Stack before making a transfer request.
+         */
+        TInt iNumIsocPackets;
+
+        /**
+         * The number of bytes successfully transferred during the
+         * data transfer. This is set by the Host Controller PSL
+         * before completing the transfer.
+         */
+        TUint iTransferLength;
+
+        /**
+         * The status code of a completed transfer. This is set by the
+         * Host Controller PSL before completing the request to the
+         * transfer callback interface.
+         */
+        TInt iStatus;
+
+        /**
+         * For isochronous transfers, a pointer to an array of
+         * iNumIsoPackets entries that specify the length of each
+         * packet in the transfer. For OUT transfers, the array is
+         * filled by the USB Host Stack and is read by the Host
+         * Controller PSL to decide the length for each packet. For IN
+         * transfers, the array is filled by the Host Controller PSL
+         * to record to length of each received packet.
+         */
+        TUint16* iIsocPacketLengths;
+
+        /**
+         * For isochronous transfers, a pointer to an array of
+         * iNumIsoPackets entries that specify the status of each
+         * packet in the transfer. The array is filled by the Host
+         * Controller PSL to record to success or failure of each
+         * received packet.
+         */
+        TIsocPacketStatus* iIsocPacketStatuses;
+        };
+
+
+    /**
+     * This class specifies the structure and contents of root hub
+     * information that is filled by the adaptation to let the USB Host
+     * Stack hub driver learn the capabilities of the root hub.
+     *
+     * @see MHostControllerIf::OpenRootHub
+     */
+    NONSHARABLE_CLASS( TRootHubInfo )
+        {
+        public: // Types and constants
+        /**
+         * A bitmask type used to indicate the static capabilities of
+         * the root hub.
+         */
+        typedef TUint32 TRootHubCaps;
+
+        /**
+         * Capability bit to indicate whether the root hub supports
+         * user-visible port indications such as LEDs.
+         *
+         * If the root hub supports this feature, the PSL shall set
+         * the corresponding bit in iCapabilities (by bitwise OR'ing
+         * this value). Otherwise the PSL shall clear the
+         * corresponding bit in iCapabilities.
+         */
+        static const TRootHubCaps KRootHubCapPortIndication = 0x00000001;
+
+        public: // Data
+        /**
+         * A bitmask specifying the static capabilities of this root
+         * hub. The PSL fills this field by bitwise OR'ing the
+         * TRootHubCaps capability bits corresponding to supported
+         * features.
+         */
+        TRootHubCaps iCapabilities;
+
+        /** Number of ports in this root hub */
+        TUint iNumberOfPorts;
+
+        /**
+         * Maximum number of milliamps of current that this root hub
+         * can supply to VBUS.
+         */
+        TUint iMaxSuppliedVbusCurrentMA;
+
+        /**
+         * Time taken by this root hub between starting to power up a
+         * port and power being good on that port. This is expressed
+         * in units of one millisecond.
+         */
+        TUint iTimePowerOnToPowerGoodMs;
+
+        /**
+         * The maximum speed supported by the root hub.
+         */
+        TSpeed iMaxSpeed;
+
+        /** Pointer to the root hub interface */
+        MRootHubIf* iRootHubIf;
+        };
+
+
+    /**
+     * An interface class used by the USB Host Stack to perform data
+     * transfers on a USB pipe. The Host Controller PSL must implement
+     * this interface and provide a pointer to a pipe-specific
+     * instance when the USB Host Stack creates the pipe by calling
+     * MHostControllerIf::OpenPipe().
+     *
+     * The USB Host Stack will call the functions of this interface
+     * from a DFC queued on the DFC queue supplied by the Host
+     * Controller in THostControllerProperties::iControllerDfcQueue when the
+     * Host Controller PSL registered.
+     *
+     * @see MHostControllerIf::OpenPipe()
+     */
+    NONSHARABLE_CLASS( MHostPipeIf )
+        {
+        public:
+        /**
+         * Close the USB pipe. This is called by the USB Host Stack
+         * when the pipe is no longer used and the Host Controller PSL
+         * may release any resources that were allocated for this
+         * instance, including deleting the object itself.
+         *
+         * @param aPipeInfo Information describing the target endpoint
+         *   of the pipe. This is the same information passed to
+         *   MHostControllerIf::OpenPipe() when creating the
+         *   pipe.
+         *
+         * @post After calling the function, the USB Host stack will
+         *   consider the invoked instance to have been deleted and will
+         *   no longer call any of the functions.
+         */
+        virtual void ClosePipeD( const THostPipe& aPipeInfo ) = 0;
+
+        /**
+         * Clear the data toggle bit of this pipe. This is used for
+         * interrupt and bulk pipes when the host stack needs to
+         * guarantee that the host controller will start the next
+         * interrupt or bulk transfer with data toggle value zero.
+         *
+         * @param aPipeInfo Information describing the target endpoint
+         *   of the pipe. This is the same information passed to
+         *   MHostControllerIf::OpenPipe() when creating the
+         *   pipe.
+         */
+        virtual void ClearDataToggle( const THostPipe& aPipeInfo ) = 0;
+
+        /**
+         * Start a transfer on this pipe.
+         *
+         * When the transfer is considered completed, the Host
+         * Controller PSL must update the transfer information object
+         * with the actual length and status of the transfer and then
+         * complete it to the callback interface by calling
+         * MHostTransferCallbackIf::CompleteTransfer(). The pointer to
+         * the callback interface is provided in the member
+         * THostTransfer::iTransferCbIf of the supplied aTransferInfo.
+         *
+         * The following rules shall be used by the Host Controller
+         * PSL to assess the completeness of a transfer:
+         *
+         * 1. A read or write transfer on a control pipe is completed
+         * when all the stages (two or three) of the control transfer
+         * have been completed successfully, or when an error
+         * occurs. It is the responsibility of the upper layers to
+         * guarantee that there is sufficient buffer space for a read
+         * request, so the buffer should not run out.
+         *
+         * 2. A read or write transfer on an isochronous pipe is
+         * completed when the number of isochronous packets specified
+         * in the member THostTransfer::iNumIsocPackets of the
+         * supplied aTransferInfo have been sent or received
+         * successfully, or if a fatal error occurs. It is the
+         * responsibility of the upper layers to guarantee that there
+         * is sufficient buffer space for a read request, so the
+         * buffer should not run out.
+         *
+         * 3. A read transfer on a bulk or interrupt pipe is completed
+         * when the buffer space is exhausted, a short packet (a
+         * packet smaller than the maximum packet size of the pipe) is
+         * received, or an error occurs.
+         *
+         * 4. A write transfer on a bulk or interrupt pipe is
+         * completed when the requested buffer has been fully sent, or
+         * an error occurs.
+         *
+         * @param aTransferInfo Information specifying the transfer to perform
+         *
+         * @return KErrNone if the transfer was started successfully,
+         *   otherwise a system-wide error code
+         */
+        virtual TInt StartTransfer( THostTransfer& aTransferInfo ) = 0;
+
+        /**
+         * Cancel a transfer that was previously started with
+         * StartTransfer(). The Host Controller PSL must flush any
+         * pending data (either received or about to be sent) and
+         * discard the transfer. The PSL must not attempt to complete
+         * the canceled transfer by calling
+         * MHostTransferCallbackIf::CompleteTransfer().
+         *
+         * @param aTransferInfo Information specifying the transfer to
+         *   cancel. This is the same information passed to
+         *   StartTransfer() when the transfer as started.
+         */
+        virtual void CancelTransfer( THostTransfer& aTransferInfo ) = 0;
+        };
+
+
+    /**
+     * An interface class used by the USB Host Stack hub driver to
+     * operate on the root hub ports. The Host Controller PSL must
+     * implement this interface and provide a pointer when the USB
+     * Host Stack opens the root hub by calling
+     * MHostControllerIf::OpenRootHub().
+     *
+     * The USB Host Stack will call the functions of this interface
+     * from a DFC queued on the DFC queue supplied by the Host
+     * Controller in THostControllerProperties::iControllerDfcQueue
+     * when the Host Controller PSL registered.
+     *
+     * @see MHostControllerIf::OpenRootHub()
+     */
+    NONSHARABLE_CLASS( MRootHubIf )
+        {
+        public:
+        /**
+         * Close the connection to the root hub. This is called by the
+         * USB Host Stack when the Host Controller is about to be
+         * deleted and the root hub is no longer used. The Host
+         * Controller PSL may release any resources that were
+         * allocated for this instance, including deleting the object
+         * itself.
+         *
+         * @post After calling the function, the USB Host stack will
+         *   consider the invoked instance to have been deleted and will
+         *   no longer call any of the functions.
+         */
+        virtual void CloseRootHubD() = 0;
+
+        /**
+         * Enable the power supply, i.e. raise VBUS, on the specified
+         * root hub port.
+         *
+         * If there are problems raising VBUS, the Host Controller PSL
+         * must report a VBUS error by notifying the root hub callback
+         * interface MRootHubCallbackIf of an over-current condition
+         * on the port.
+         *
+         * @param aPort The number of the root hub port to operate
+         *   on. For a root hub with N ports, the port numbers are in
+         *   range [1..N].
+         *
+         * @see MRootHubCallbackIf::OverCurrentDetected()
+         */
+        virtual void PowerOnPort( TUint aPort ) = 0;
+
+        /**
+         * Stop session (A-device only).
+         *
+         * @param aPort The number of the root hub port to operate
+         *   on. For a root hub with N ports, the port numbers are in
+         *   range [1..N].
+         */
+        virtual void PowerOffPort( TUint aPort ) = 0;
+
+        /**
+         * Reset the specified root hub port. The total reset length
+         * has to be at least 50 milliseconds and the reset signalling
+         * must follow the requirements specified in USB 2.0
+         * Specification Section 7.1.7.5 Reset Signaling.
+         *
+         * This function is synchronous and should return when the
+         * reset signalling on the port has completed.
+         *
+         * @param aPort The number of the root hub port to operate
+         *   on. For a root hub with N ports, the port numbers are in
+         *   range [1..N].
+         */
+        virtual void ResetPort( TUint aPort ) = 0;
+
+        /**
+         * Place the specified root hub port to the USB suspend state
+         * where it does not send SOF packets to the connected device.
+         *
+         * When all ports of the root hub have been suspended, the USB
+         * Host Stack will suspend the entire host controller by
+         * calling MHostControllerIf::SuspendController().
+         *
+         * When the root hub only has one port and SOFs cannot be
+         * gated on the port without suspending the whole controller,
+         * the Host Controller PSL should ignore the port-specific
+         * suspend and resume calls and instead suspend/resume the
+         * controller based on the controller-specific suspend and
+         * resume calls in MHostControllerIf.
+         *
+         * @param aPort The number of the root hub port to operate
+         *   on. For a root hub with N ports, the port numbers are in
+         *   range [1..N].
+         */
+        virtual void SuspendPort( TUint aPort ) = 0;
+
+        /**
+         * Resume the specified root hub port from the USB suspend
+         * state by driving the resume signalling on the port. The
+         * signalling must last at least 20 milliseconds and follow
+         * the requirements specified in USB 2.0 Specification Section
+         * 7.1.7.7 Resume Signaling. After the resume signalling has
+         * completed, the port must allow SOFs to be sent to the
+         * connected device again.
+         *
+         * Before resuming the first port of a completely suspended
+         * controller, the USB Host Stack will first resume the entire
+         * host controller by calling
+         * MHostControllerIf::ResumeController().
+         *
+         * When the root hub only has one port and SOFs cannot be
+         * gated on the port without suspending the whole controller,
+         * the Host Controller PSL should ignore the port-specific
+         * suspend and resume calls and instead suspend/resume the
+         * controller based on the controller-specific suspend and
+         * resume calls in MHostControllerIf.
+         *
+         * @param aPort The number of the root hub port to operate
+         *   on. For a root hub with N ports, the port numbers are in
+         *   range [1..N].
+         */
+        virtual void ResumePort( TUint aPort ) = 0;
+
+        /**
+         * Query whether a device (a hub or a function) is currently
+         * connected to the specified root hub port, and what speed it
+         * is.
+         *
+         * @param aPort The number of the root hub port to check for a
+         *   connected device on. For a root hub with N ports, the port
+         *   numbers are in range [1..N].
+         *
+         * @param aSpeed Variable to fill with the speed, if connected
+         *
+         * @return ETrue if a device is currently connected and aSpeed
+         *   has been set to the speed of the connected device. EFalse
+         *   otherwise.
+         */
+        virtual TBool IsDeviceConnected( TUint   aPort,
+                                         TSpeed& aSpeed ) = 0;
+        };
+
+
+    /**
+     * An interface class that needs to be implemented by each Host
+     * Controller PSL that registers to the USB stack.
+     *
+     * This interface is used by the USB Host Stack to do controller level
+     * operations like suspending and resuming the host controller. It is
+     * also used to open the root hub interface upon creating the SHAI
+     * Host Controller, and to open USB pipes to connected devices.
+     *
+     * The USB Host Stack will call the functions of this interface
+     * from a DFC queued on the DFC queue supplied by the Host
+     * Controller in THostControllerProperties::iControllerDfcQueue when the
+     * Host Controller PSL registered.
+     */
+    NONSHARABLE_CLASS( MHostControllerIf )
+        {
+        public:
+        /**
+         * Open a pipe to an endpoint on a remote USB peripheral.
+         *
+         * This function is called by the USB host stack when it wants
+         * to communicate with a certain endpoint on a discovered USB
+         * peripheral. The opened pipe is then used to read or write
+         * from/to the peripheral until the pipe is later closed by
+         * MHostPipeIf::ClosePipeD().
+         *
+         * @param aPipeInfo Information describing the target endpoint
+         *   that the USB host stack wants to create a pipe to. The
+         *   ownership of the info object remains with the USB host
+         *   stack and the Host Controller PSL must not refer to data
+         *   inside this after the function has returned. All
+         *   MHostPipeIf functions that operate on the pipe will be
+         *   passed the same pipe information so that the Host
+         *   Controller PSL does not necessarily need to take a copy.
+         *
+         * @param aPipe Upon success, set by the Host Controller PSL
+         *   to point to an instance that implements the SHAI pipe
+         *   interface for the opened pipe. This interface will then be
+         *   used by the USB Host Stack to perform transfers until the
+         *   pipe is eventually closed by the USB Host Stack calling
+         *   MHostPipeIf::ClosePipeD().
+         *
+         * @return KErrNone if successful, otherwise a system error code
+         */
+        virtual TInt OpenPipe( const THostPipe& aPipeInfo,
+                               MHostPipeIf*&    aPipe ) = 0;
+
+        /**
+         * Open the root hub for the Host Controller.
+         *
+         * This is called by the USB Host Stack after creating the
+         * Host Controller PSL to learn the capabilities of the
+         * respective root hub and to establish the communication
+         * between the hub driver in the USB Host Stack and the root
+         * hub ports controlled by the Host Controller PSL.
+         *
+         * @param aRootHubInfo Reference to a root hub information
+         *   object to be filled by the adaptation.
+         *
+         * @param aRootHubCbIf Reference to the callback interface of
+         *   the root hub driver in the USB stack. The root hub
+         *   implementation of the Host Controller PSL shall use this
+         *   interface to report events of this root hub.
+         *
+         * @return KErrNone if successful, otherwise a system error code
+         */
+        virtual TInt OpenRootHub( TRootHubInfo&       aRootHubInfo,
+                                  MRootHubCallbackIf& aRootHubCbIf ) = 0;
+
+        /**
+         * Start and enable the host controller. This is called prior
+         * to powering up any port of the root hub to allow to Host
+         * Controller PSL to perform any preparation that may be
+         * necessary to activate the controller. This may include
+         * actions such as enabling clocks or power to the host
+         * controller HW.
+         *
+         * This function is also used in an OTG environment when the
+         * host stack becomes enabled and the controller needs to be
+         * started and enabled for host use. If the HW platform shares
+         * resources such as clocks and power between the host and
+         * peripheral HW, it is probably easiest for the PSL to handle
+         * the role switch based on the
+         * MOtgControllerIf::SetControllerRole() call to the OTG
+         * Controller interface.
+         *
+         * @return KErrNone if the host controller was successfully started,
+         *         otherwise a system-wide error code.
+         *
+         * @see usb_otg_shai.h, MOtgControllerIf::SetControllerRole()
+         */
+        virtual TInt StartHostController() = 0;
+
+        /**
+         * Disable and stop the host controller. This is called after
+         * powering down all ports of the root hub to allow to Host
+         * Controller PSL to release any HW resources needed by the
+         * controller. This may include actions such as disabling
+         * clocks or power to the host controller HW.
+         *
+         * This function is also used in an OTG environment when the
+         * host stack becomes disabled and the host HW resources can
+         * be released. If the HW platform shares resources such as
+         * clocks and power between the host and peripheral HW, it is
+         * probably easiest for the PSL to handle the role switch
+         * based on the MOtgControllerIf::SetControllerRole() call to
+         * the OTG Controller interface.
+         *
+         * @return KErrNone if the host controller was successfully started,
+         *         otherwise a system-wide error code.
+         *
+         * @see usb_otg_shai.h, MOtgControllerIf::SetControllerRole()
+         */
+        virtual TInt StopHostController() = 0;
+        
+        /**
+         * Place the host controller to the USB suspend state where it
+         * does not send SOF packets.
+         */
+        virtual void SuspendController() = 0;
+
+        /**
+         * Resume the host controller from the USB suspend state by
+         * driving the resume signalling towards the root hub. The
+         * signalling must last at least 20 milliseconds and follow
+         * the requirements specified in USB 2.0 Specification Section
+         * 7.1.7.7 Resume Signaling. After the resume signalling has
+         * completed, the controller must allow SOFs to be sent to the
+         * connected device again.
+         */
+        virtual void ResumeController() = 0;
+
+        /**
+         * Force the controller into a specific high-speed host test
+         * mode. This function needs to be implemented only by Host
+         * Controller PSLs for high-speed capable controllers. The
+         * function will only be called when the controller is
+         * operating in high-speed mode and a special test device has
+         * been enumerated.
+         *
+         * When called, the Host Controller PSL shall synchronously
+         * run the selected test as specified for each tests in the
+         * documentation of THostTestMode.
+         *
+         * @param aTestMode Specifies the test mode to enter
+         *
+         * @param aDefaultPipe Information of the default pipe (the
+         *   control pipe to endpoint zero) of the connected test
+         *   device.
+         *
+         * @return KErrNone if the specified test mode was entered
+         *   successfully, otherwise a system-wide error
+         */
+        virtual TInt EnterHostTestMode( THostTestMode    aTestMode,
+                                        const THostPipe& aDefaultPipe ) = 0;
+
+        /**
+         * Get the size and alignment requirements for the Host
+         * Controller. The reference parameters are both input and
+         * output. Upon input, they describe the values requested by
+         * the client, but they may be increased by this function if
+         * the Host Controller requires additional memory or has some
+         * alignment requirements.
+         *
+         * @param aType The type of the endpoint that the memory will
+         *   be used for.
+         *
+         * @param aAlignment Output for required alignment in bytes
+         *
+         * @param aSize Input/output for buffer size (may be increased
+         *   in this function)
+         *
+         * @param aMaxPackets Input/output for maximum number of
+         *   packets in the transfer (may be increased in this function)
+         *
+         * @return KErrNone if successful, otherwise a system-wide
+         *   error code
+         */
+        virtual TInt GetSizeAndAlignment( TEndpointType aType,
+                                          TUint&        aAlignment,
+                                          TInt&         aSize,
+                                          TInt&         aMaxPackets ) = 0;
+
+        /**
+         * Creates a shared chunk and commits memory to it. The memory
+         * allocated with this function will later be used when making
+         * data transfers with this Host Controller (see
+         * THostTransfer::iDataBuffer).
+         *
+         * The adaptation shall create a chunk by calling
+         * Kern::ChunkCreate(), and then commit memory to it with one
+         * of the Commit functions Kern::ChunkCommit(),
+         * Kern::ChunkCommitContiguous(), and Kern::ChunkCommitPhysical().
+         *
+         * This task is delegated to the adaptation so that it can
+         * allocate the correct type of memory. For example, if the
+         * Host Controller requires the memory to be physically
+         * contiguous, the implementation of this function must commit
+         * contiguous memory to the chunk.
+         *
+         * @param aChunk Output handle to the chunk that was created.
+         *   The adaptation must pass this value as the aChunk argument
+         *   to the Kern::ChunkCreate() call.
+         *
+         * @param aOffset The offset (in bytes) from start of chunk,
+         *   which indicates the start of the memory region to be
+         *   committed. This will be a multiple of the MMU page
+         *   size. The adaptation must pass this value as the aOffset
+         *   argument to the used Commit call.
+         *
+         * @param aSize Number of bytes to commit. This will be a
+         *   multiple of the MMU page size. The adaptation must pass
+         *   this value as the aSize argument to the used Commit call.
+         *
+         * @param aInfo At input, specifies the chunk properties
+         *   requested by the upper layers. The adaptation is allowed
+         *   to change the attributes in aInfo.iMapAttr to match the
+         *   requirements of the Host Controller. The adaptation must
+         *   pass this value as the aInfo argument to the
+         *   Kern::ChunkCreate() call. If the adaptation commits
+         *   cached memory, it is the responsibility of the adaptation
+         *   to deal with cache synchronization when making data
+         *   transfers. If the adaptation needs special cleanup when
+         *   the chunk is deleted, the adaptation can set a cleanup
+         *   DFC pointer in aInfo.iDestroyedDfc.
+         *
+         * @param aPhysicalAddress On success, will be set to the
+         *   physical address of the chunk as referenced by the HC
+         *
+         * @return KErrNone if successful, otherwise a system-wide
+         *   error code
+         *
+         * @see System documentation for Kern::ChunkCreate(),
+         *   Kern::ChunkCommit(), Kern::ChunkCommitContiguous(), and
+         *   Kern::ChunkCommitPhysical()
+         */
+        virtual TInt ChunkCreate( DChunk*&          aChunk,
+                                  TUint             aOffset,
+                                  TUint             aSize,
+                                  TChunkCreateInfo& aInfo,
+                                  TPhysAddr&        aPhysicalAddress ) = 0;
+
+        /**
+         * Maps virtual to physical addresses. If the memory addresses
+         * used by the host controller are different to the ones of
+         * the main memory bus (e.g. due to memory mapping or use of
+         * different address spaces), this method is used to translate
+         * from kernel physical addresses to host controller physical
+         * addresses.
+         *
+         * @param aPhysicalAddressList On entering, the list of
+         *   physical addresses as used kernel-side, on successful
+         *   return it contains the list of physical addresses as
+         *   referenced by the HC
+         *
+         * @param aPhysicalAddressListSize Number of elements in
+         *   aPhysicalAddressList
+         *
+         * @return KErrNone if successful, otherwise a system-wide
+         *   error code
+         */
+        virtual TInt MapPhysicalAddresses( TPhysAddr*& aPhysicalAddressList, 
+                                           TInt        aPhysicalAddressListSize ) = 0;
+        };
+
+
+    /**
+     * An interface class implemented by the USB stack to allow the
+     * host controller to report events to the root hub. This includes
+     * notifications of a device being connected or disconnected on a
+     * port, and other port conditions such as seeing a remote wakeup
+     * signalling, an error on the port (such as babble from a
+     * peripheral), or VBUS over-current.
+     *
+     * It is required that the Host Controller PSL calls these
+     * functions in the context of the DFC queue supplied by the Host
+     * Controller PSL in
+     * THostControllerProperties::iControllerDfcQueue when the Host
+     * Controller PSL registered.
+     */
+    NONSHARABLE_CLASS( MRootHubCallbackIf )
+        {
+        public:
+        /**
+         * A constant to specify an unknown port. In those port
+         * notifications where this is explicitly specified to be OK,
+         * this value is allowed to be used as the port number where
+         * the real port number is unknown.
+         */
+        static const TUint KPortUnknown = 0;
+
+        /**
+         * Informs the root hub that a device (a hub or function) has
+         * been connected to the specified root hub port.
+         *
+         * The Host Controller PSL uses this function to inform device
+         * connection also during HNP role switch when the remote
+         * device connects in peripheral role.
+         *
+         * @param aPort The number of the root hub port that the event
+         *   occurred on. For a root hub with N ports, the port numbers
+         *   are in range [1..N].
+         */
+        virtual void DeviceConnected( TUint aPort ) = 0;
+
+        /**
+         * Informs the root hub that a device (a hub or function) has
+         * been disconnected from the specified root hub port.
+         *
+         * The Host Controller PSL uses this function to inform device
+         * disconnection also during HNP role switch when the remote
+         * peripheral disconnects to start the role switch.
+         *
+         * The Host Controller PSL must report device disconnection by
+         * calling this function even if the port is currently
+         * suspended. A disconnection that is part of an HNP role
+         * switch will always occur in suspended state, and even a
+         * normal peripheral may be physically disconnected at any
+         * time.
+         *
+         * @param aPort The number of the root hub port that the event
+         *   occurred on. For a root hub with N ports, the port numbers
+         *   are in range [1..N].
+         */
+        virtual void DeviceDisconnected( TUint aPort ) = 0;
+
+        /**
+         * Informs the root hub that a device connected to the
+         * specified root hub port has requested remote wakeup.
+         *
+         * @param aPort The number of the root hub port that the event
+         *   occurred on. For a root hub with N ports, the port numbers
+         *   are in range [1..N].
+         */
+        virtual void RemoteWakeupRequested( TUint aPort ) = 0;
+
+        /**
+         * Informs the root hub that a port error (such as babble) has
+         * been detected on the specified root hub port. The
+         * adaptation is expected to disable the port that has caused
+         * the error condition.
+         *
+         * @param aPort The number of the root hub port that the event
+         *   occurred on. For a root hub with N ports, the port numbers
+         *   are in range [1..N].
+         */
+        virtual void PortErrorDetected( TUint aPort ) = 0;
+
+        /**
+         * Informs the root hub that an over-current condition has
+         * been detected on the specified port.
+         *
+         * It may not always be possible to see which port out of
+         * several caused the overcurrent. In this case the Host
+         * Controller PSL may use the port number
+         * MRootHubCallbackIf::KPortUnknown.
+         *
+         * @param aPort The number of the root hub port that the event
+         *   occurred on, if known. For a root hub with N ports, the
+         *   port numbers are in range [1..N]. If the exact port is
+         *   not known, the Host Controller PSL root hub may report
+         *   the port number MRootHubCallbackIf::KPortUnknown.
+         */
+        virtual void OverCurrentDetected( TUint aPort ) = 0;
+        };
+
+
+    /**
+     * An interface class implemented by the USB Host Stack to allow the
+     * host controller to complete transfers to the USB Host Stack.
+     *
+     * It is required that the Host Controller PSL calls these
+     * functions in the context of the DFC queue supplied by the Host
+     * Controller PSL in THostControllerProperties::iControllerDfcQueue when
+     * the Host Controller PSL registered.
+     */
+    NONSHARABLE_CLASS( MHostTransferCallbackIf )
+        {
+        public:
+        /**
+         * Complete a transfer request that had been set up with
+         * MHostPipeIf::StartTransfer().
+         *
+         * @param aTransferInfo The transfer information that
+         *   identifies the transfer that has completed
+         */
+        virtual void CompleteTransfer( const THostTransfer& aTransferInfo ) = 0;
+        };
+
+
+    /**
+     * This class specifies the static information provided by a Host
+     * Controller PSL when registering to the USB Host stack.
+     *
+     * The PSL should prepare for the possibility that members may be
+     * added to the end of this class in later SHAI versions if new
+     * information is needed to support new features. The PSL should
+     * not use this class as a direct member in an object that is not
+     * allowed to grow in size due to binary compatibility reasons.
+     *
+     * @see UsbHostPil::RegisterHostController()
+     */
+    NONSHARABLE_CLASS( THostControllerProperties )
+        {
+        public: // Types and constants
+        /**
+         * A bitmask type used to indicate the static capabilities of
+         * the Host Controller.
+         */
+        typedef TUint32 THostCaps;
+
+        public:
+        /**
+         * Inline constructor for the Host Controller properties
+         * object. This is inline rather than an exported function to
+         * prevent a binary break in a case where an older PSL binary
+         * might provide the constructor a smaller object due to the
+         * PSL being compiled against an older version of the SHAI
+         * header. When it's inline, the function is always in sync
+         * with the object size.
+         *
+         * We slightly violate the coding conventions which say that
+         * inline functions should be in their own file. We don't want
+         * to double the number of USB SHAI headers just for sake of a
+         * trivial constructor.
+         */
+        inline THostControllerProperties() :
+            iCapabilities(0),
+            iControllerDfcQueue(NULL),
+            iControllerPageSize(0)
+            {
+            };
+
+        public: // Data
+        /**
+         * A bitmask specifying the static capabilities of this Host
+         * Controller. No capabilities are specified at the moment and
+         * the PSL shall fill this field with a zero value.
+         *
+         * The field is added for sake of future proofing the binary
+         * compatibility of the Host SHAI. By having a field reserved
+         * for capability bits, we can later specify bits to indicate
+         * added virtual functions or extension to this controller
+         * properties structure. The PIL layer can then at runtime
+         * confirm the existence of the new functions or fields and
+         * safely support an older binary, if we choose to.
+         */
+        THostCaps iCapabilities;
+
+        /**
+         * Pointer to a DFC queue that will be used for DFCs of this
+         * controller.
+         *
+         * A stand-alone (one not associated with an OTG-port) Host
+         * Controller PSL must supply a pointer to a dedicated DFC
+         * queue that has been created for this controller. Both the
+         * PSL itself and the PIL layer must queue their DFCs for this
+         * controller in this DFC queue to ensure the code is running
+         * in the same context.
+         *
+         * A Host Controller PSL that is part of an OTG port will be
+         * registered by the OTG PSL. In this case, the DFC queue
+         * supplied here must be the same DFC queue as the one
+         * supplied in the properties of the OTG Controller.
+         */
+        TDfcQue* iControllerDfcQueue;
+
+        /**
+         * The page size used by this Host Controller. The host stack
+         * will fill scatter-gather lists with pages of this size. If
+         * the Host Controller does not have specific page
+         * requirements itself, the registering Host Controller PSL
+         * must supply here the CPU MMU page size that can be obtained
+         * by the call Kern::RoundToPageSize(1).
+         */
+        TInt iControllerPageSize;
+        };
+
+
+    /**
+     * A static class implemented by the USB Host PIL layer to allow
+     * the host controller PSL to register to the PIL layer.
+     */
+    NONSHARABLE_CLASS( UsbHostPil )
+        {
+        public:
+        /**
+         * Registration function to be used by a stand-alone (non-OTG
+         * port) Host Controller PSL to register itself to the PIL
+         * layer. Host Controllers that are part of an OTG-port are
+         * registered by the OTG Controller PSL (see usb_otg_shai.h,
+         * function UsbOtgPil::RegisterOtgController).
+         *
+         * The intended usage is that each stand-alone Host Controller
+         * PSL is a kernel extension that registers itself to the USB
+         * Host PIL layer by making this call from their own kernel
+         * extension entry point function (or an equivalent code that
+         * runs during bootup).
+         *
+         * @param aHostControllerIf Reference to the Host Controller
+         *   interface implemented by the registering PSL.
+         *
+         * @param aProperties Reference to an object describing the
+         *   static properties of the Host Controller. The PIL layer
+         *   requires that the supplied reference remains valid
+         *   indefinitely, as a Host Controller cannot unregister.
+         *
+         * @lib usbotghostpil.lib
+         */
+        IMPORT_C static void RegisterHostController(
+            MHostControllerIf&               aHostControllerIf,
+            const THostControllerProperties& aProperties );
+        };
+    };
+
+#endif // USB_HOST_SHAI_H
+
+/* End of File */