Revision: 201037
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 17 Sep 2010 08:40:15 +0300
changeset 51 eaaed528d5fd
parent 46 613028a7da24
child 54 320d509f1a12
Revision: 201037 Kit: 201037
usb_plat/usb_shai_api/group/bld.inf
usb_plat/usb_shai_api/inc/usb_charger_detection_shai.h
usb_plat/usb_shai_api/inc/usb_charger_detection_shai_shared.h
usb_plat/usb_shai_api/inc/usb_host_shai.h
usb_plat/usb_shai_api/inc/usb_otg_shai.h
usb_plat/usb_shai_api/inc/usb_peripheral_shai.h
usb_plat/usb_shai_api/inc/usb_peripheral_shai_shared.h
usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp
usbdrv/peripheral/ldd/perilddsc/src/d_usbcsc.cpp
usbdrv/peripheral/pdd/pil/eabi/usbperipheralpilu.def
usbdrv/peripheral/pdd/pil/group/bld.inf
usbdrv/peripheral/pdd/pil/group/usbperipheralpil.mmp
usbdrv/peripheral/pdd/pil/src/ps_usbc.cpp
usbdrv/peripheral/public/d32usbc.h
usbdrv/peripheral/public/d32usbc.inl
usbdrv/peripheral/public/d32usbcsc.h
usbdrv/peripheral/public/d32usbcsc.inl
usbdrv/peripheral/public/d32usbcshared.h
usbdrv/peripheral/public/usbc.h
usbdrv/peripheral/public/usbcsc.h
usbdrv/peripheral/public/usbcshared.h
usbdrv/peripheral/public/usbcshared.inl
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/group/BLD.INF
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/group/ecacm_overdummyusbldd.mmp
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveDataAvailableNotifier.h
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveReadOneOrMoreReader.h
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveReader.h
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveWriter.h
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/CdcInterfaceBase.h
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveDataAvailableNotifier.cpp
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveReadOneOrMoreReader.cpp
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveReader.cpp
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveWriter.cpp
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/CdcControlInterfaceReader.cpp
usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/linkstatenotifier.cpp
usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/group/BLD.INF
usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/group/t_msclasscontroller.mmp
usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/src/CUsbMsClassController.cpp
usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/INC/CUsbWHCMClassController.h
usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/SRC/CUsbWHCMClassController.cpp
usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/group/bld.inf
usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/group/t_WHCMClassController.mmp
usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/group/bld.inf
usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/group/msfdc_overdummy.mmp
usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/inc/msfdc.h
usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc.cpp
usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc_overdummy.rss
usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdcmain.cpp
usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/subcommands.cpp
usbmgmt/usbmgr/usbman/client/BWINS/usbman_over_dummylddu.def
usbmgmt/usbmgr/usbman/client/EABI/usbman_over_dummylddu.def
usbmgmt/usbmgr/usbman/client/group/BLD.INF
usbmgmt/usbmgr/usbman/client/group/Usbman_over_dummyldd.mmp
usbmgmt/usbmgr/usbman/extensionplugin/BWINS/usbmanextensionplugindummyu.def
usbmgmt/usbmgr/usbman/extensionplugin/EABI/usbmanextensionplugindummyu.def
usbmgmt/usbmgr/usbman/extensionplugin/group/UsbManExtensionPlugin.mmp
usbmgmt/usbmgr/usbman/extensionplugin/group/UsbManExtensionPluginDummy.mmp
usbmgmt/usbmgr/usbman/extensionplugin/group/bld.inf
usbmgmt/usbmgr/usbman/extensionplugin/inc/CUsbManExtensionPluginDummy.h
usbmgmt/usbmgr/usbman/extensionplugin/inc/MUsbManExtensionPluginObserverDummy.h
usbmgmt/usbmgr/usbman/extensionplugin/src/CUsbManExtensionPlugin.cpp
usbmgmt/usbmgr/usbman/extensionplugin/src/MUsbManExtensionPluginObserver.cpp
usbmgmt/usbmgr/usbman/server/INC/CUsbDevice.h
usbmgmt/usbmgr/usbman/server/INC/CUsbDummyClassControllerLdd.h
usbmgmt/usbmgr/usbman/server/INC/CUsbOtg.h
usbmgmt/usbmgr/usbman/server/INC/cusbotgwatcher.h
usbmgmt/usbmgr/usbman/server/INC/featurediscovery.h
usbmgmt/usbmgr/usbman/server/SRC/20031D6F.rss
usbmgmt/usbmgr/usbman/server/SRC/CUsbDevice.cpp
usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassController.cpp
usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassControllerLdd.cpp
usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassImpCollection.cpp
usbmgmt/usbmgr/usbman/server/SRC/CUsbOtg.cpp
usbmgmt/usbmgr/usbman/server/SRC/CUsbServer.cpp
usbmgmt/usbmgr/usbman/server/SRC/CUsbSession.cpp
usbmgmt/usbmgr/usbman/server/SRC/usbmancenrepmanager.cpp
usbmgmt/usbmgr/usbman/server/group/BLD.INF
usbmgmt/usbmgr/usbman/server/group/UsbDummyClassControllerLdd.mmp
usbmgmt/usbmgr/usbman/server/group/t_Usbman_dummyCC.mmp
usbmgmt/usbmgr/usbman/server/group/usbsvr_dummyldd.mmp
usbmgmt/usbmgr/usbman/server/group/usbsvrotg_dummyusbdi.mmp
usbmgmt/usbmgr/usbman/server/public/UsbClassUids.h
usbmgmt/usbmgr/usbman/server/public/rusb.h
usbmgmt/usbmgr/usbman/server/traces_UsbDummyClassControllerLdd/OstTraceDefinitions.h
usbmgmt/usbmgr/usbman/server/traces_UsbDummyClassControllerLdd/fixed_id.definitions
usbmgmt/usbmgr/usbman/server/traces_t_Usbman_dummyCC/OstTraceDefinitions.h
usbmgmt/usbmgr/usbman/server/traces_t_Usbman_dummyCC/fixed_id.definitions
--- a/usb_plat/usb_shai_api/group/bld.inf	Thu Sep 02 22:23:37 2010 +0300
+++ b/usb_plat/usb_shai_api/group/bld.inf	Fri Sep 17 08:40:15 2010 +0300
@@ -19,6 +19,7 @@
 
 PRJ_PLATFORMS
 ARMV5
+ARMV5SMP
 
 PRJ_EXPORTS
 
@@ -30,3 +31,5 @@
 ../inc/usb_peripheral_shai.inl          SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(usb/)
 ../inc/usb_peripheral_shai_shared.h      SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(usb/)
 ../inc/usb_charger_detection_shai.h      SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(usb/)
+../inc/usb_charger_detection_shai_shared.h      SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(usb/)
+
--- a/usb_plat/usb_shai_api/inc/usb_charger_detection_shai.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usb_plat/usb_shai_api/inc/usb_charger_detection_shai.h	Fri Sep 17 08:40:15 2010 +0300
@@ -17,7 +17,7 @@
 
 /** @file
     @brief USB Charger Detection SHAI header
-    @version 0.2.0
+    @version 0.3.0
 
     This header specifies the USB Charger Detection SHAI.
 
@@ -30,6 +30,8 @@
 
 // System includes
 #include <kern_priv.h>
+#include <usb/usb_charger_detection_shai_shared.h>	// Common types shared with upper layers
+
 
 /**
  * This macro specifies the version of the USB Charger Detection SHAI
@@ -39,139 +41,12 @@
  * older environment with old USB SHAI version that is missing some
  * new definitions.
  */
-#define USB_CHARGER_DETECTION_SHAI_VERSION 0x020
+#define USB_CHARGER_DETECTION_SHAI_VERSION 0x030
 
 // The namespace is documented in file usb_common_shai.h, so it is not
 // repeated here
 namespace UsbShai
     {
-    // Data types
-
-    /**
-     * An enumeration listing the different port types that can be
-     * reported to the PIL layer by a registered Charger Detector
-     * PSL. The available types mostly correspond to those mentioned
-     * in the Battery Charging Specification Revision 1.1.
-     */
-    enum TPortType
-        {
-        /**
-         * This type is reported to indicate that the Charger Detector
-         * PSL has detected that we are no longer connected to a
-         * powered port. This situation occurs when VBUS driven from
-         * outside drops, or the Accessory Charger Adapter changes the
-         * RID state from RID_A to RID_GND (which usually also means
-         * that VBUS will drop very soon).
-         */
-        EPortTypeNone = 0,
-
-        /**
-         * This type is reported to indicate that the Charger
-         * Detector PSL has detected that our device is connected to
-         * an unsupported port. One common type of an unsupported port
-         * is a PS/2 to USB adapter connected to a PS/2 port of a
-         * computer.
-         */
-        EPortTypeUnsupported,
-
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to a charging port,
-         * but has not yet distinguished whether the port is a
-         * Charging Downstream Port or a Dedicated Charging Port.
-         *
-         * When this port type is detected, the upper layers will
-         * connect to the USB bus as the peripheral by requesting the
-         * Peripheral Controller PSL to assert the D+ pull-up. The
-         * Charger Detector PSL can then detect the exact port type by
-         * observing what happens to the level of the D- line, as
-         * specified in the Battery Charging Specification. Upon
-         * detecting the exact port type, the Charger Detector PSL can
-         * notify a new event with the correct type.
-         *
-         * If the Charger Detector PSL can directly distinguish the
-         * exact port type, the PSL does not need to report this
-         * generic charging port type, but can directly report the
-         * more specific type EPortTypeDedicatedChargingPort or
-         * EPortTypeChargingDownstreamPort.
-         */
-        EPortTypeChargingPort,
-
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to a Dedicated
-         * Charging Port.
-         *
-         * When this port type is detected, the upper layers will
-         * connect to the USB bus as the peripheral by requesting the
-         * Peripheral Controller PSL to assert the D+ pull-up, as
-         * specified in the Battery Charging Specification.
-         */
-        EPortTypeDedicatedChargingPort,
-            
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to a Charging
-         * Downstream Port.
-         *
-         * When this port type is detected, the upper layers will
-         * connect to the USB bus as the peripheral by requesting the
-         * Peripheral Controller PSL to assert the D+ pull-up, as
-         * specified in the Battery Charging Specification.
-         */
-        EPortTypeChargingDownstreamPort,
-            
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to a Standard
-         * Downstream Port.
-         *
-         * When this port type is detected, the upper layers will
-         * connect to the USB bus as the peripheral by requesting the
-         * Peripheral Controller PSL to assert the D+ pull-up, as
-         * specified in the Battery Charging Specification.
-         */
-        EPortTypeStandardDownstreamPort,
-
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to the OTG port of an
-         * Accessory Charger Adapter and the ID pin is in the RID_A
-         * range.
-         *
-         * When this port type is detected in an OTG-capable device,
-         * the OTG State Machine will default to the host role.
-         */
-        EPortTypeAcaRidA,
-
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to the OTG port of an
-         * Accessory Charger Adapter and the ID pin is in the RID_B
-         * range.
-         *
-         * When this port type is detected, the USB Peripheral PIL
-         * layer will ensure that the Peripheral Controller PSL is not
-         * allowed to connect to the bus, as required by the Battery
-         * Charging Specification.
-         */
-        EPortTypeAcaRidB,
-
-        /** 
-         * This type is reported when the Charger Detector PSL has
-         * detected that our device is connected to the OTG port of an
-         * Accessory Charger Adapter and the ID pin is in the RID_C
-         * range.
-         *
-         * When this port type is detected, the upper layers will
-         * connect to the USB bus as the peripheral by requesting the
-         * Peripheral Controller PSL to assert the D+ pull-up, as
-         * specified in the Battery Charging Specification.
-         */
-        EPortTypeAcaRidC,
-        };
-
-
     // Class declaration
 
     /**
@@ -204,17 +79,24 @@
          *    MUsbPeripheralPilCallbackIf::DeviceEventNotification(). For
          *    an OTG-capable port, the requirement is documented in
          *    usb_otg_shai.h, function
-         *    MOtgObserverIf::NotifyVbusState().
+         *    MOtgObserverIf::NotifyIdPinAndVbusState().
          *
          * 2. When VBUS is high, the Charger Detector PSL needs to
          *    observe changes in the ID pin state, if the Charger
-         *    Detector PSL support detecting the port types relevant
+         *    Detector PSL supports detecting the port types relevant
          *    to Accessory Charger Adapter. This requirement is
          *    documented in more detail in usb_otg_shai.h, function
-         *    MOtgObserverIf::NotifyIdPinState().
+         *    MOtgObserverIf::NotifyIdPinAndVbusState().
+         *
+         * 3. When our device has been detached from a reported port
+         *    type (for example, the Charger Detector PSL reported
+         *    port type for Standard Downstream Port and later VBUS
+         *    drops indicating disconnect), the Charger Detector PSL
+         *    must report the disconnection by notifying port type
+         *    EPortTypeNone.
          *
          * @param aPortType The type of the port detected
-         */    
+         */
         virtual void NotifyPortType( TPortType aPortType ) = 0;
         };
 
@@ -241,20 +123,20 @@
      * Controller PSL, or at least that the Peripheral Controller PSL
      * is communicating with the Charger Detector PSL. This is
      * necessary to ensure that the necessary parts of charger
-     * detection are run before reporting VBUS high, and that the
-     * Peripheral Controller and the charger detection can safely
-     * share the bus without conflict (as both will need to touch the
-     * line state). See usb_peripheral_shai.h,
+     * detection are run before reporting VBUS high (when Data Contact
+     * Detect is supported), and that the Peripheral Controller and
+     * the charger detection can safely share the bus without conflict
+     * (as both will need to touch the line state). See
+     * usb_peripheral_shai.h,
      * MUsbPeripheralPilCallbackIf::DeviceEventNotification() for
-     * description of the requirements.
+     * description of the requirements for peripheral-only PSLs.
      *
      * Similarly, it is expected that the Charger Detector interface
      * for an OTG-capable port is implemented by the OTG Controller
      * PSL, or at least that the OTG Controller PSL is communicating
      * with the Charger Detector PSL. See usb_otg_shai.h,
-     * MOtgObserverIf::NotifyIdPinState() and
-     * MOtgObserverIf::NotifyVbusState() for description of the
-     * requirements.
+     * MOtgObserverIf::NotifyIdPinAndVbusState() for description of
+     * the requirements for OTG-capable PSLs.
      *
      * When the PIL layer is ready to receive charger detection
      * notifications from the PSL, it will use this interface to
@@ -283,85 +165,6 @@
 
 
     /**
-     * This class specifies the information provided by a Charger
-     * Detector PSL when registering to the PIL layer.
-     *
-     * 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 UsbChargerDetectionPil::RegisterChargerDetector()
-     */
-    NONSHARABLE_CLASS( TChargerDetectorProperties )
-        {
-        public: // Types and constants
-        /**
-         * A bitmask type used to indicate the static capabilities of
-         * the Charger Detector.
-         */
-        typedef TUint32 TChargerDetectorCaps;
-
-        /**
-         * Capability bit to indicate whether the USB system below the
-         * SHAI (either in HW or in the low-level SW) supports
-         * automatically reducing charging current for the duration of
-         * the USB high-speed chirp signalling. See Battery Charging
-         * Specification Revision 1.1, Chapter 3.6.2 for description
-         * of the problem.
-         *
-         * If the system does not support this feature, the upper
-         * layer USB components that calculate available charging
-         * current will always limit the charging current taken from a
-         * Charging Downstream Port so that the maximum current during
-         * chirp is not violated.
-         *
-         * If the system supports this feature, the full available
-         * charging current from a Charging Downstream Port is
-         * utilized. It is then the responsibility of the HW or some
-         * low-level SW below to SHAI to ensure that the charging
-         * current is automatically reduced for the duration of chirp
-         * signalling.
-         *
-         * If the system 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 TChargerDetectorCaps KChargerDetectorCapChirpCurrentLimiting = 0x00000001;
-
-        public:
-        /**
-         * Inline constructor for the Charger Detector 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 TChargerDetectorProperties() :
-            iCapabilities(0)
-            {
-            };
-
-        public: // Data
-        /**
-         * A bitmask specifying the static capabilities of this
-         * Charger Detector. The PSL fills this field by bitwise
-         * OR'ing the TChargerDetectorCaps capability bits
-         * corresponding to supported features.
-         */
-        TChargerDetectorCaps iCapabilities;
-        };
-
-    /**
      * A static class implemented by the USB PIL layer to allow the
      * PSL layer to register its charger detector component to the PIL
      * layer.
@@ -383,13 +186,14 @@
          * bootup).
          *
          * @param aChargerDetector Reference to the Charger Detector
-         *   interface implemented by the registering PSL.
+         *   interface implemented by the registering PSL. The PIL
+         *   layer requires that the supplied reference remains valid
+         *   indefinitely, as the Charger Detector PSL cannot unregister.
          *
          * @param aProperties Reference to an object describing the
-         *   static properties of the Charger Detector. The PIL layer
-         *   requires that the supplied reference remains valid
-         *   indefinitely, as the registering Charger Detector cannot
-         *   unregister.
+         *   static properties of the Charger Detector. The PIL takes
+         *   a copy and the PSL is free to release the properties
+         *   object upon return.
          *
          * @lib usbperipheralpil.lib
          */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usb_plat/usb_shai_api/inc/usb_charger_detection_shai_shared.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,253 @@
+/*
+* 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 Charger Detection SHAI shared constants and types
+    @version 0.3.0
+
+    This header specifies USB Charger Detection SHAI common types and
+    constants used by both the kernel side code and user side code. It
+    is automatically included by the USB Charger Detection SHAI header
+    and is not intended to be directly included by SHAI
+    implementations.
+
+    The file is versioned for the sake of the human reader and follows
+    the version of the USB Charger Detection SHAI header
+    usb_charger_detection_shai.h.
+
+    @publishedDeviceAbstraction
+*/
+
+
+#ifndef USB_CHARGER_DETECTION_SHAI_SHARED_H
+#define USB_CHARGER_DETECTION_SHAI_SHARED_H
+
+
+// The namespace is documented in file usb_common_shai.h, so it is not
+// repeated here
+namespace UsbShai
+    {
+    // Data types
+
+    /**
+     * An enumeration listing the different port types that can be
+     * reported to the PIL layer by a registered Charger Detector
+     * PSL. The available types mostly correspond to those mentioned
+     * in the Battery Charging Specification Revision 1.1.
+     */
+    enum TPortType
+        {
+        /**
+         * This type is reported to indicate that the Charger Detector
+         * PSL has detected that we are no longer connected to a
+         * powered port. This situation occurs when VBUS driven from
+         * outside drops, or the Accessory Charger Adapter changes the
+         * RID state from RID_A to RID_GND (which usually also means
+         * that VBUS will drop very soon).
+         */
+        EPortTypeNone = 0,
+
+        /**
+         * This type is reported to indicate that the Charger
+         * Detector PSL has detected that our device is connected to
+         * an unsupported port. One common type of an unsupported port
+         * is a PS/2 to USB adapter connected to a PS/2 port of a
+         * computer.
+         */
+        EPortTypeUnsupported,
+
+        /** 
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to a charging port,
+         * but has not yet distinguished whether the port is a
+         * Charging Downstream Port or a Dedicated Charging Port.
+         *
+         * When this port type is detected, the upper layers will
+         * connect to the USB bus as the peripheral by requesting the
+         * Peripheral Controller PSL to assert the D+ pull-up. The
+         * Charger Detector PSL can then detect the exact port type by
+         * observing what happens to the level of the D- line, as
+         * specified in the Battery Charging Specification. Upon
+         * detecting the exact port type, the Charger Detector PSL can
+         * notify a new event with the correct type.
+         *
+         * If the Charger Detector PSL can directly distinguish the
+         * exact port type, the PSL does not need to report this
+         * generic charging port type, but can directly report the
+         * more specific type EPortTypeDedicatedChargingPort or
+         * EPortTypeChargingDownstreamPort.
+         */
+        EPortTypeChargingPort,
+
+        /** 
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to a Dedicated
+         * Charging Port.
+         *
+         * When this port type is detected, the upper layers will
+         * connect to the USB bus as the peripheral by requesting the
+         * Peripheral Controller PSL to assert the D+ pull-up, as
+         * specified in the Battery Charging Specification.
+         */
+        EPortTypeDedicatedChargingPort,
+            
+        /** 
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to a Charging
+         * Downstream Port.
+         *
+         * When this port type is detected, the upper layers will
+         * connect to the USB bus as the peripheral by requesting the
+         * Peripheral Controller PSL to assert the D+ pull-up, as
+         * specified in the Battery Charging Specification.
+         */
+        EPortTypeChargingDownstreamPort,
+            
+        /**
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to a Standard
+         * Downstream Port.
+         *
+         * When this port type is detected, the upper layers will
+         * connect to the USB bus as the peripheral by requesting the
+         * Peripheral Controller PSL to assert the D+ pull-up, as
+         * specified in the Battery Charging Specification.
+         */
+        EPortTypeStandardDownstreamPort,
+
+        /** 
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to the OTG port of an
+         * Accessory Charger Adapter and the ID pin is in the RID_A
+         * range.
+         *
+         * When this port type is detected in an OTG-capable device,
+         * the OTG State Machine will default to the host role.
+         */
+        EPortTypeAcaRidA,
+
+        /** 
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to the OTG port of an
+         * Accessory Charger Adapter and the ID pin is in the RID_B
+         * range.
+         *
+         * When this port type is detected, the USB Peripheral PIL
+         * layer will ensure that the Peripheral Controller PSL is not
+         * allowed to connect to the bus, as required by the Battery
+         * Charging Specification.
+         */
+        EPortTypeAcaRidB,
+
+        /** 
+         * This type is reported when the Charger Detector PSL has
+         * detected that our device is connected to the OTG port of an
+         * Accessory Charger Adapter and the ID pin is in the RID_C
+         * range.
+         *
+         * When this port type is detected, the upper layers will
+         * connect to the USB bus as the peripheral by requesting the
+         * Peripheral Controller PSL to assert the D+ pull-up, as
+         * specified in the Battery Charging Specification.
+         */
+        EPortTypeAcaRidC,
+        };
+
+
+     /**
+     * This class specifies the information provided by a Charger
+     * Detector PSL when registering to the PIL layer.
+     *
+     * 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 UsbChargerDetectionPil::RegisterChargerDetector()
+     */
+    NONSHARABLE_CLASS( TChargerDetectorProperties )
+        {
+        public: // Types and constants
+        /**
+         * A bitmask type used to indicate the static capabilities of
+         * the Charger Detector.
+         */
+        typedef TUint32 TChargerDetectorCaps;
+
+        /**
+         * Capability bit to indicate whether the USB system below the
+         * SHAI (either in HW or in the low-level SW) supports
+         * automatically reducing charging current for the duration of
+         * the USB high-speed chirp signalling. See Battery Charging
+         * Specification Revision 1.1, Chapter 3.6.2 for description
+         * of the problem.
+         *
+         * If the system does not support this feature, the upper
+         * layer USB components that calculate available charging
+         * current will always limit the charging current taken from a
+         * Charging Downstream Port so that the maximum current during
+         * chirp is not violated.
+         *
+         * If the system supports this feature, the full available
+         * charging current from a Charging Downstream Port is
+         * utilized. It is then the responsibility of the HW or some
+         * low-level SW below to SHAI to ensure that the charging
+         * current is automatically reduced for the duration of chirp
+         * signalling.
+         *
+         * If the system 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 TChargerDetectorCaps KChargerDetectorCapChirpCurrentLimiting = 0x00000001;
+
+        public:
+        /**
+         * Inline constructor for the Charger Detector 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 TChargerDetectorProperties() :
+            iCapabilities(0)
+            {
+            };
+
+        public: // Data
+        /**
+         * A bitmask specifying the static capabilities of this
+         * Charger Detector. The PSL fills this field by bitwise
+         * OR'ing the TChargerDetectorCaps capability bits
+         * corresponding to supported features.
+         */
+        TChargerDetectorCaps iCapabilities;
+        };
+    };
+
+#endif //USB_CHARGER_DETECTION_SHAI_SHARED_H
+// END of file
+
--- a/usb_plat/usb_shai_api/inc/usb_host_shai.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usb_plat/usb_shai_api/inc/usb_host_shai.h	Fri Sep 17 08:40:15 2010 +0300
@@ -17,7 +17,7 @@
 
 /** @file
     @brief USB Host SHAI header
-    @version 0.2.0
+    @version 0.3.0
 
     This header specifies the USB host SHAI.
 
@@ -40,7 +40,7 @@
  * environment with old USB SHAI version that is missing some new
  * definitions.
  */
-#define USB_HOST_SHAI_VERSION 0x020
+#define USB_HOST_SHAI_VERSION 0x030
 
 // The namespace is documented in file usb_common_shai.h, so it is not
 // repeated here
@@ -56,99 +56,47 @@
     // 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).
+     * An enumeration listing the host role electrical test modes that
+     * require special support from the host controller. 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).
+     *
+     * The single-step control transfer tests are performed as
+     * transfers on the control pipe, but a special transfer flag
+     * THostTransfer::KSingleStepControlDelayedDataPhase requests the
+     * Host Controller PSL to delay the DATA phase when needed.
+     *
+     * Suspend and resume tests are performed using the normal suspend
+     * and resume functionality in the USB Host SHAI, so they are not
+     * a special case for the Host Controller PSL.
      *
      * @see MHostControllerIf::EnterHostTestMode()
      */
     enum THostTestMode
         {
         /**
-         * Drive SE0 until host controller is reset. The call returns
-         * immediately after enabling the test mode.
+         * Drive SE0 until the host controller is reset.
          */
         ETestModeTestSE0NAK = 0,
 
         /**
-         * Drive high-speed J until host controller is reset. The call
-         * returns immediately after enabling the test mode.
+         * Drive high-speed J until the host controller is reset.
          */
         ETestModeTestJ,
 
         /**
-         * Drive high-speed K until host controller is reset. The call
-         * returns immediately after enabling the test mode.
+         * Drive high-speed K until the host controller is reset.
          */
         ETestModeTestK,
 
         /**
-         * Send test packets until host controller is reset. The
+         * Send test packets until the 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
+        ETestModeTestPacket
         };
 
 
@@ -208,7 +156,13 @@
      */
     NONSHARABLE_CLASS( THostPipe )
         {
-        public:
+        public: // Types and constants
+        /**
+         * A bitmask type used to indicate some boolean properties of
+         * the endpoint targeted by this pipe.
+         */
+        typedef TUint32 TEndpointFlags;
+
         // 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
@@ -225,14 +179,14 @@
          * KHubHasMultipleTTs specifies whether the hub has been
          * configured to use multiple transaction translators.
          */
-        static const TUint32 KHubTranslates = 0x00000001;
+        static const TEndpointFlags 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;
+        static const TEndpointFlags KHubHasMultipleTTs = 0x00000002;
 
         public: // Data
         /**
@@ -245,7 +199,7 @@
         TUint iMaxPacketSize;
 
         /** Flags specifying some boolean parameters of the endpoint */
-        TUint32 iEndpointFlags;
+        TEndpointFlags iEndpointFlags;
 
         /**
          * The speed (low, full, high) to use for this endpoint. This
@@ -304,48 +258,88 @@
      */
     NONSHARABLE_CLASS( THostTransfer )
         {
-        public:
+        public: // Types and constants
+        /**
+         * A bitmask type used to indicate some boolean properties of
+         * a transfer.
+         */
+        typedef TUint32 TTransferFlags;
+
         // 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 flag is set or cleared by the PIL layer and is only
+         * relevant for bi-directional pipes, i.e. control pipes
+         * performing control transfers. The bit is not set for other
+         * endpoint types.
+         *
+         * For a control transfer, this bit is set to specify that the
+         * transfer direction is IN, i.e. the host is reading from the
+         * connected device. For a control transfer with the bit
+         * cleared, the transfer direction is OUT, i.e. the host is
+         * writing to the connected device.
          *
          * This bit is set or cleared by the USB Host stack before
          * issuing a new transfer.
          */
-        static const TUint32 KTransferDirIsIN = 0x00000001;
+        static const TTransferFlags 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.
+         * This flag is set or cleared by the PIL layer and is only
+         * relevant for bi-directional pipes, i.e. control pipes
+         * performing control transfers. The bit is not set for other
+         * endpoint types.
+         *
+         * For a control transfer, this bit is set to specify that the
+         * transfer is a special single-step transfer with a delayed
+         * data phase. This type of transfer is only used during the
+         * high-speed host electrical tests.
+         *
+         * When this flag is set, the Host Controller PSL should
+         * perform the transfer like it normally would, except that it
+         * must have a 15 second delay between the completion of the
+         * SETUP phase and the sending of the first IN token for the
+         * DATA phase.
+         *
+         * For description and background of the usage of this special
+         * transfer option, see the OTG 2.0 Supplement Section 6.4.1.1
+         * Test Modes, and specifically the test
+         * SINGLE_STEP_GET_DEVICE_DESCRIPTOR_DATA.
+         *
+         * This bit is set or cleared by the USB Host stack before
+         * issuing a new transfer.
+         */
+        static const TTransferFlags KSingleStepControlDelayedDataPhase = 0x00000002;
+
+        /**
+         * This flag is set or cleared by the PIL layer before issuing
+         * a new transfer and is relevant for OUT transfers on bulk,
+         * interrupt, and control pipes. It is never set for transfers
+         * on isochronous pipes.
+         *
+         * For bulk, interrupt, or control 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;
+        static const TTransferFlags KOutForceShortPacket = 0x00000002;
 
         /**
-         * For IN endpoint transfers, indicates whether the transfer
-         * was terminated with a ZLP (Zero-Length Packet).
+         * This flag is set or cleared by the Host Controller PSL
+         * before completing the transfer and is only relevant for IN
+         * pipes.
          *
-         * 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.
+         * For IN endpoint transfers, this flag indicates whether the
+         * transfer was terminated with a ZLP (Zero-Length Packet).
          */
-        static const TUint32 KInZlpReceived = 0x00000004;
+        static const TTransferFlags KInZlpReceived = 0x00000004;
 
         /**
          * Enumeration specifying the packet status values to be used
@@ -389,7 +383,7 @@
          * Request flags specifying some boolean parameters for the
          * transfer.
          */
-        TUint32 iRequestFlags;
+        TTransferFlags iRequestFlags;
 
         /**
          * Memory block specifying the memory buffer used for the data
@@ -579,6 +573,16 @@
          * the callback interface is provided in the member
          * THostTransfer::iTransferCbIf of the supplied aTransferInfo.
          *
+         * To maximize throughput, the PIL layer may call
+         * StartTransfer() directly from a previous completion call
+         * (see description in
+         * MHostTransferCallbackIf::CompleteTransfer()). To prevent
+         * recursion, the PSL should not call
+         * MHostTransferCallbackIf::CompleteTransfer() directly from
+         * within the MHostPipeIf::StartTransfer() call, but should
+         * instead queue a DFC to complete the transfer, if
+         * immediately completed.
+         *
          * The following rules shall be used by the Host Controller
          * PSL to assess the completeness of a transfer:
          *
@@ -710,13 +714,6 @@
          * 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].
@@ -737,12 +734,17 @@
          * 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.
+         * This function is synchronous and should return when the
+         * resume signalling on the port has completed.
+         *
+         * This function is also called when the Host Controller PSL
+         * has reported detection of a remote wakeup on a port of the
+         * root hub. This is to make sure the host port takes over
+         * driving the resume on the bus. The Host Controller PSL or
+         * the HW may have already started driving resume upon
+         * detecting the remote wakeup, in which case the PSL only
+         * needs to wait in this function until the resume signalling
+         * has been 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
@@ -887,18 +889,22 @@
         
         /**
          * Place the host controller to the USB suspend state where it
-         * does not send SOF packets.
+         * does not send SOF packets. The Host Controller PSL may also
+         * go into a power-saving mode where it for example shuts down
+         * some clocks needed by the host controller when active. The
+         * Host Controller PSL must still ensure that the host
+         * controller or the root hub will be capable of detecting
+         * device disconnection and remote wakeup when suspended.
          */
         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.
+         * Resume the host controller from the suspend state. If the
+         * Host Controller PSL put the host controller into a
+         * power-saving state by shutting down some clocks, the PSL
+         * can re-enable them in this call. This call shall not result
+         * in resume signalling to be driven on the bus, as that
+         * should be done from MRootHubIf::ResumePort().
          */
         virtual void ResumeController() = 0;
 
@@ -910,21 +916,17 @@
          * 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.
+         * The function shall return immediately when the controller
+         * has been set to the requested test mode. The host
+         * controller is expected to remain in the test mode until it
+         * is shutdown by a call to StopHostController().
          *
          * @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;
+        virtual TInt EnterHostTestMode( THostTestMode    aTestMode ) = 0;
 
         /**
          * Get the size and alignment requirements for the Host
@@ -1153,6 +1155,14 @@
          * Complete a transfer request that had been set up with
          * MHostPipeIf::StartTransfer().
          *
+         * To maximize throughput, the PIL layer may set up the next
+         * transfer by calling MHostPipeIf::StartTransfer()
+         * immediately from within this completion function. The PSL
+         * has to be prepared for this and make sure it does not upon
+         * return of the callback accidentally clean up some internal
+         * state belonging to a new transfer started during the
+         * callback.
+         *
          * @param aTransferInfo The transfer information that
          *   identifies the transfer that has completed
          */
@@ -1251,7 +1261,7 @@
 
     /**
      * A static class implemented by the USB Host PIL layer to allow
-     * the host controller PSL to register to the PIL layer.
+     * the Host Controller PSL to register to the PIL layer.
      */
     NONSHARABLE_CLASS( UsbHostPil )
         {
@@ -1270,12 +1280,14 @@
          * runs during bootup).
          *
          * @param aHostControllerIf Reference to the Host Controller
-         *   interface implemented by the registering PSL.
+         *   interface implemented by the registering PSL. The PIL layer
+         *   requires that the supplied reference remains valid
+         *   indefinitely, as the Host Controller cannot unregister.
          *
          * @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.
+         *   static properties of the Host Controller. The PIL takes a
+         *   copy and the PSL is free to release the properties object
+         *   upon return.
          *
          * @lib usbotghostpil.lib
          */
--- a/usb_plat/usb_shai_api/inc/usb_otg_shai.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usb_plat/usb_shai_api/inc/usb_otg_shai.h	Fri Sep 17 08:40:15 2010 +0300
@@ -17,7 +17,7 @@
 
 /** @file
     @brief USB OTG SHAI header
-    @version 0.2.0
+    @version 0.3.0
 
     This header specifies the USB OTG SHAI.
 
@@ -40,7 +40,7 @@
  * environment with old USB SHAI version that is missing some new
  * definitions.
  */
-#define USB_OTG_SHAI_VERSION 0x020
+#define USB_OTG_SHAI_VERSION 0x030
 
 // The namespace is documented in file usb_common_shai.h, so it is not
 // repeated here
@@ -74,10 +74,8 @@
      * Reporting an ACA state via the ID pin notification mechanism is
      * not a substitute for reporting port type detection via the USB
      * Charger Detection SHAI that is documented separately in
-     * usb_charger_detection_shai.h. When ACA is supported, it is
-     * required that the Charger Detector PSL guarantees that the OTG
-     * Observer gets notified of the ID pin state before reporting the
-     * port type to the Charger Detector Observer.
+     * usb_charger_detection_shai.h. See documentation of
+     * MOtgObserverIf::NotifyIdPinAndVbusState() for more details.
      *
      * @see usb_charger_detection_shai.h
      */
@@ -242,6 +240,14 @@
          * current VBUS and ID states to the observer to get the
          * status of the OTG stack up to date.
          *
+         * If the OTG Controller PSL has detected that we are attached
+         * to a bad device already before the OTG Observer was set by
+         * this function, the PSL needs to immediately report ID
+         * floating and VBUS low, and report the bad device by calling
+         * MOtgObserverIf::NotifyBadDeviceAttached(). See the
+         * documentation of MOtgObserverIf::NotifyBadDeviceAttached()
+         * for more information on the detection of bad devices.
+         *
          * @param aObserver Pointer to the observer interface to use,
          *   or NULL when the OTG stack is being unloaded.
          */
@@ -353,12 +359,13 @@
         {
         public:
         /**
-         * Notify the current ID-pin state to the OTG stack. This
-         * needs to be called by the OTG Controller PSL everytime
-         * there is a change in the ID pin level. Redundant
-         * notifications that don't change the previously reported
-         * state are silently ignored, so the function is safe to call
-         * without worrying about extra calls.
+         * Notify the current ID-pin and VBUS state to the OTG
+         * stack. This needs to be called by the OTG Controller PSL
+         * everytime there is a change in the ID pin or VBUS
+         * level. Redundant notifications that don't change the
+         * previously reported state are silently ignored, so the
+         * function is safe to call without worrying about extra
+         * calls.
          *
          * When USB Battery Charging is supported on the OTG-capable
          * port, there is a dependency between normal USB
@@ -369,52 +376,38 @@
          * communicate with the Charger Detector PSL (which it may
          * implement itself) with respect to VBUS and ID pin events.
          *
-         * For ID pin events that indicate connection to an Accessory
-         * Charger Adapter, it is required that the port type is first
-         * notified to the Charger Detector PSL Observer, followed by
-         * notifying the ID pin state to the OTG Observer (via this
-         * function).
-         *
-         * @param aIdPinState The current ID-pin state
-         */
-        virtual void NotifyIdPinState( TIdPinState aIdPinState ) = 0;
-
-        /**
-         * Notify the current VBUS state to the OTG stack. This needs
-         * to be called by the OTG Controller PSL everytime there is a
-         * change in the VBUS level. Redundant notifications that
-         * don't change the previously reported state are silently
-         * ignored, so the function is safe to call without worrying
-         * about extra calls.
-         *
-         * When USB Battery Charging is supported on the OTG-capable
-         * port, there is a dependency between normal USB
-         * functionality and USB Battery Charging (see
-         * usb_charger_detection_shai.h and specifically the
-         * description of class MChargerDetectorIf). In this case it
-         * is the responsibility of the OTG Controller PSL to
-         * communicate with the Charger Detector PSL (which it may
-         * implement itself) with respect to VBUS and ID pin events.
+         * Due to Accessory Charger Adapter specified in Battery
+         * Charging 1.1, the ID pin state is relevant for both
+         * charging and OTG. The USB OTG SHAI and the USB Charger
+         * Detection SHAI receive the ID pin notifications from the
+         * PSL independently. For ID and VBUS events that indicate
+         * connection to an Accessory Charger Adapter, it is required
+         * that a BC 1.1 capable PSL reports the state to both the
+         * Charger Detector PSL Observer (via
+         * MChargerDetectorObserverIf::NotifyPortType), and the OTG
+         * Observer (via this function). The reporting order is not
+         * significant and can be freely chosen by the PSL.
          *
          * When VBUS rises on the OTG-capable port that is currently
          * the B-device and fully supports Battery Charging
          * Specification Revision 1.1, the Charger Detector PSL and
          * the OTG Controller PSL need to together guarantee that Data
          * Contact Detect is completed and the port type detected
-         * before reporting VBUS rising. When the port type is known,
-         * the port type needs to be notified to the Charger Detector
-         * PSL Observer, followed by notifying the VBUS state to the
-         * OTG Observer (via this function).
+         * before reporting the ID and VBUS state. When the port type
+         * is known, the port type needs to be notified to the Charger
+         * Detector PSL Observer, followed by notifying the ID and
+         * VBUS state to the OTG Observer (via this function).
          *
-         * Where Data Contact Detect is not supported, the VBUS rise
-         * event needs to be notified to the OTG Observer (via this
-         * function) immediately and charger detection needs to
-         * proceed in parallel with the upper layers preparing the USB
-         * personality. This is necessary in order to ensure that we
-         * can fulfill the requirement to connect to the bus within a
-         * second, while still making as long as possible charger
-         * detection cycle to minimize the changes of false detections
-         * due to datalines not making contact yet.
+         * Where Data Contact Detect is not supported, the initial
+         * B-device VBUS rise event needs to be notified to the OTG
+         * Observer (via this function) immediately and charger
+         * detection needs to proceed in parallel with the upper
+         * layers preparing the USB personality. This is necessary in
+         * order to ensure that we can fulfill the requirement to
+         * connect to the bus within a second, while still making as
+         * long as possible charger detection cycle to minimize the
+         * chances of false detections due to datalines not making
+         * contact yet.
          *
          * The OTG Controller PSL, the Peripheral Controller PSL and
          * the Charger Detector PSL need to together guarantee that
@@ -425,9 +418,11 @@
          * MPeripheralControllerIf::PeripheralConnect(), the
          * Peripheral Controller PSL must connect to the bus.
          *
+         * @param aIdPinState The current ID-pin state
          * @param aVbusState The current VBUS state
          */
-        virtual void NotifyVbusState( TVbusState aVbusState ) = 0;
+        virtual void NotifyIdPinAndVbusState( TIdPinState aIdPinState,
+                                              TVbusState  aVbusState ) = 0;
 
         /**
          * When operating as the A-device with VBUS low, notify the
@@ -581,33 +576,38 @@
          * function (or an equivalent code that runs during bootup).
          *
          * @param aOtgControllerIf Reference to the OTG Controller
-         *   interface implemented by the registering PSL.
+         *   interface implemented by the registering PSL. The PIL
+         *   layer requires that the supplied reference remains valid
+         *   indefinitely, as the OTG Controller cannot unregister.
          *
          * @param aOtgProperties Reference to an object describing the
-         *   static properties of the OTG Controller. The PIL layer
-         *   requires that the supplied reference remains valid
-         *   indefinitely, as an OTG Controller cannot unregister.
+         *   static properties of the OTG Controller. The PIL takes a
+         *   copy and the PSL is free to release the properties object
+         *   upon return.
          *
          * @param aPeripheralControllerIf Reference to the Peripheral
          *   Controller interface implemented by the PSL controlling the
          *   Peripheral Controller associated with the registering OTG
-         *   port.
+         *   port. The PIL layer requires that the supplied reference
+         *   remains valid indefinitely, as the OTG Controller cannot
+         *   unregister.
          *
          * @param aPeripheralProperties Reference to an object
          *   describing the static properties of the Peripheral
-         *   Controller. The PIL layer requires that the supplied
-         *   reference remains valid indefinitely, as the registering
-         *   OTG Controller cannot unregister.
+         *   Controller. The PIL takes a copy and the PSL is free to
+         *   release the properties object upon return.
          *
          * @param aHostControllerIf Reference to the Host Controller
          *   interface implemented by the PSL controlling the Host
-         *   Controller associated with the registering OTG port.
+         *   Controller associated with the registering OTG port. The
+         *   PIL layer requires that the supplied reference remains
+         *   valid indefinitely, as the OTG Controller cannot
+         *   unregister.
          *
          * @param aHostProperties Reference to an object describing the
-         *   static properties of the Host Controller. The PIL layer
-         *   requires that the supplied reference remains valid
-         *   indefinitely, as the registering OTG Controller cannot
-         *   unregister.
+         *   static properties of the Host Controller. The PIL takes a
+         *   copy and the PSL is free to release the properties object
+         *   upon return.
          *
          * @lib usbotghostpil.lib
          */
--- a/usb_plat/usb_shai_api/inc/usb_peripheral_shai.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usb_plat/usb_shai_api/inc/usb_peripheral_shai.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,7 @@
     
     @brief USB Peripheral SHAI header
     
-    @version 0.3.0
+    @version 0.4.0
  
     Abstract interface for USB Peripheral Controller.
  
@@ -43,7 +43,7 @@
  * older environment with old USB SHAI version that is missing some
  * new definitions.
  */
-#define USB_PERIPHERAL_SHAI_VERSION 0x030
+#define USB_PERIPHERAL_SHAI_VERSION 0x040
 
 // The namespace is documented in file usb_common_shai.h, so it is not
 // repeated here
@@ -765,7 +765,7 @@
          *         the system-wide error codes.
          */
         virtual TInt ConfigureEndpoint(TInt aRealEndpoint, 
-                                     const TUsbPeripheralEndpointInfo& aEndpointInfo) = 0;
+                                       const TUsbPeripheralEndpointInfo& aEndpointInfo) = 0;
         
         /** 
          * De-configures (disables) an endpoint (incl. Ep0).
@@ -968,7 +968,7 @@
          *     - enabling the peripheral controller's clock
          *     - binding & enabling the peripheral controller (primary) interrupt
          *     - write meaningful values to some general controller registers
-         *     - enabling the USB Reset interrupt
+         *     - enabling the USB Reset, Suspend, and Resume interrupts
          *     - enabling the peripheral controller proper (for instance by 
          *       setting an Enable bit).
          *
@@ -1155,16 +1155,20 @@
          *
          * @param aPeripheralControllerIf Reference to the Peripheral
          *   Controller interface implemented by the registering PSL.
+         *   The PIL layer requires that the supplied reference
+         *   remains valid indefinitely, as the Peripheral Controller
+         *   cannot unregister.
          *
          * @param aProperties Reference to an object describing the
-         *   static properties of the Peripheral Controller. PIL
-         *   layer requires that the supplied reference remains valid
-         *   indefinitely, as a Peripheral Controller cannot unregister.
+         *   static properties of the Peripheral Controller. The PIL
+         *   takes a copy and the PSL is free to release the properties
+         *   object upon return.
          *
          * @lib usbperipheralpil.lib
          */
-        IMPORT_C static void RegisterPeripheralController(MPeripheralControllerIf& aPeripheralControllerIf, 
-                                                      const TPeripheralControllerProperties& aProperties );
+        IMPORT_C static void RegisterPeripheralController(
+            MPeripheralControllerIf& aPeripheralControllerIf, 
+            const TPeripheralControllerProperties& aProperties );
     
         private:
         /**
--- a/usb_plat/usb_shai_api/inc/usb_peripheral_shai_shared.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usb_plat/usb_shai_api/inc/usb_peripheral_shai_shared.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,6 +19,8 @@
 
     @brief USB Peripheral SHAI header shared part.
 
+    @version 0.4.0
+
     Some Non-kernel USB code will also use structure defined in this
     header.  Since usb_peripheral_shai.h always need to include
     <kern_priv.h> which is not visible to non-kernel layers, a
@@ -27,6 +29,10 @@
     This header is the one that defined all common structures used by
     kernel & non-kernel layers software.
     
+    The file is versioned for the sake of the human reader and follows
+    the version of the USB Peripheral SHAI header
+    usb_peripheral_shai.h.
+
     Peripheral SHAI header always include this header automatically.
     
     @publishedDeviceAbstraction
--- a/usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/ldd/perildd/src/d_usbc.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -127,6 +127,8 @@
                                   KUsbRequestCallbackPriority),
       iOtgFeatureChangePtr(NULL),
       iOtgFeatureCallbackInfo(this, DLddUsbcChannel::OtgFeatureChangeCallback, KUsbRequestCallbackPriority),
+      iChargerTypeChangePtr(NULL),
+      iChargerTypeCallbackInfo(this, DLddUsbcChannel::ChargerTypeChangeCallback, KUsbRequestCallbackPriority),
       iNumberOfEndpoints(0),
       iDeviceState(UsbShai::EUsbPeripheralStateUndefined),
       iOwnsDeviceControl(EFalse),
@@ -157,6 +159,7 @@
         iStatusCallbackInfo.Cancel();
         iEndpointStatusCallbackInfo.Cancel();
         iOtgFeatureCallbackInfo.Cancel();
+        iChargerTypeCallbackInfo.Cancel();
         iCompleteAllCallbackInfo.Cancel();
         AbortInterface();
         DestroyAllInterfaces();
@@ -170,7 +173,7 @@
         Kern::DestroyClientRequest(iStatusChangeReq);
         Kern::DestroyClientRequest(iEndpointStatusChangeReq);
         Kern::DestroyClientRequest(iOtgFeatureChangeReq);
-
+        Kern::DestroyClientRequest(iChargerTypeChangeReq);
         Kern::DestroyVirtualPinObject(iPinObj1);
         Kern::DestroyVirtualPinObject(iPinObj2);
         Kern::DestroyVirtualPinObject(iPinObj3);
@@ -231,29 +234,36 @@
     iStatusCallbackInfo.SetDfcQ(iDfcQ);                        // use the channel's dfcq for this dfc
     iEndpointStatusCallbackInfo.SetDfcQ(iDfcQ);                // use the channel's dfcq for this dfc
     iOtgFeatureCallbackInfo.SetDfcQ(iDfcQ);
-    iMsgQ.Receive();                                        //start up the message q
-    TInt r = iController->RegisterClientCallback(iCompleteAllCallbackInfo);
-    if (r != KErrNone)
-        return r;
-    r = iController->RegisterForStatusChange(iStatusCallbackInfo);
-    if (r != KErrNone)
-        return r;
-    r = iController->RegisterForEndpointStatusChange(iEndpointStatusCallbackInfo);
-    if (r != KErrNone)
-        return r;
-    r = iController->RegisterForOtgFeatureChange(iOtgFeatureCallbackInfo);
+    iChargerTypeCallbackInfo.SetDfcQ(iDfcQ);
+	iMsgQ.Receive();										//start up the message q
+	TInt r = iController->RegisterClientCallback(iCompleteAllCallbackInfo);
+	if (r != KErrNone)
+		return r;
+	r = iController->RegisterForStatusChange(iStatusCallbackInfo);
+	if (r != KErrNone)
+		return r;
+	r = iController->RegisterForEndpointStatusChange(iEndpointStatusCallbackInfo);
+	if (r != KErrNone)
+		return r;
+	r = iController->RegisterForOtgFeatureChange(iOtgFeatureCallbackInfo);
+	if (r != KErrNone)
+		return r;	
+    r = iController->RegisterChargingPortTypeNotify(iChargerTypeCallbackInfo);
     if (r != KErrNone)
-        return r;
-
-    r = Kern::CreateClientDataRequest(iStatusChangeReq);
+        return r;	
+	
+	r = Kern::CreateClientDataRequest(iStatusChangeReq);
+	if (r != KErrNone)
+		return r;
+	r = Kern::CreateClientDataRequest(iEndpointStatusChangeReq);
+	if (r != KErrNone)
+		return r;
+	r = Kern::CreateClientDataRequest(iOtgFeatureChangeReq);
+	if (r != KErrNone)
+		return r;
+    r = Kern::CreateClientDataRequest(iChargerTypeChangeReq);
     if (r != KErrNone)
-        return r;
-    r = Kern::CreateClientDataRequest(iEndpointStatusChangeReq);
-    if (r != KErrNone)
-        return r;
-    r = Kern::CreateClientDataRequest(iOtgFeatureChangeReq);
-    if (r != KErrNone)
-        return r;
+        return r;	
     
     Kern::CreateVirtualPinObject(iPinObj1);
     Kern::CreateVirtualPinObject(iPinObj2);
@@ -344,6 +354,11 @@
                 iOtgFeatureChangeReq->SetStatus(aStatus);
                 iOtgFeatureChangeReq->SetDestPtr(a1);
             break;
+            case RDevUsbcClient::ERequestChargingPortTypeNotify:
+                iChargerTypeChangeReq->Reset();
+                iChargerTypeChangeReq->SetStatus(aStatus);
+                iChargerTypeChangeReq->SetDestPtr(a1);
+            break;	
             case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
                 iStatusChangeReq->Reset();
                 iStatusChangeReq->SetStatus(aStatus);
@@ -477,6 +492,10 @@
                             iRequestStatus[aReqNo]=NULL;
                             Kern::QueueRequestComplete(iClient,iOtgFeatureChangeReq,r);
                         break;
+                        case RDevUsbcClient::ERequestChargingPortTypeNotify:
+                            iRequestStatus[aReqNo]=NULL;
+                            Kern::QueueRequestComplete(iClient,iChargerTypeChangeReq,r);
+                        break;
                         case RDevUsbcClient::ERequestAlternateDeviceStatusNotify:
                             iRequestStatus[aReqNo]=NULL;
                             Kern::QueueRequestComplete(iClient,iStatusChangeReq,r);
@@ -559,6 +578,24 @@
             r = KErrArgument;
         break;
         }
+    case RDevUsbcClient::ERequestChargingPortTypeNotify:
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ERequestChargingPortTypeNotify"));
+        if (a1 != NULL)
+            {
+            iChargerTypeChangePtr = a1;         
+            aNeedsCompletion = iChargerTypeCallbackInfo.PendingNotify();
+            if(aNeedsCompletion)
+                {
+                iChargerTypeChangeReq->Data()= iChargerTypeCallbackInfo.ChargerType();
+                iChargerTypeChangePtr = NULL;
+                iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+                }
+            }
+        else
+            r = KErrArgument;
+        break;
+        }
     default:
         r = KErrNotSupported;
         }
@@ -839,6 +876,16 @@
             Kern::QueueRequestComplete(iClient, iOtgFeatureChangeReq, KErrCancel);
             }
         }
+    else if (aReqNo == RDevUsbcClient::ERequestChargingPortTypeNotify)
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestChargingPortTypeNotify: 0x%x", aReqNo));
+        CancelNotifyChargerType();
+        if (iChargerTypeChangeReq->IsReady())
+            {
+            iRequestStatus[aReqNo] = NULL;
+            Kern::QueueRequestComplete(iClient, iChargerTypeChangeReq, KErrCancel);
+            }
+        }
     else
         {
         __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
@@ -881,6 +928,18 @@
         }
     }
 
+void DLddUsbcChannel::CancelNotifyChargerType()
+    {
+    if (iChargerTypeChangePtr)
+        {
+        TUint chargerType;
+        chargerType = iChargerTypeCallbackInfo.ChargerType();
+        iChargerTypeChangeReq->Data()=chargerType;
+        iChargerTypeChangePtr = NULL;
+        iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+        }
+    }
+
 TInt DLddUsbcChannel::PinMemory(TDesC8 *aDes, TVirtualPinObject *aPinObj)
     {
     TInt r = KErrNone;
@@ -940,6 +999,7 @@
     case RDevUsbcClient::EControlSetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgFeatures:
+    case RDevUsbcClient::EControlGetChargerDetectorCaps:
         r=PinMemory((TDesC8 *) a1, iPinObj1);
         if(r!=KErrNone)
             {
@@ -1070,6 +1130,7 @@
     case RDevUsbcClient::EControlSetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgDescriptor:
     case RDevUsbcClient::EControlGetOtgFeatures:
+    case RDevUsbcClient::EControlGetChargerDetectorCaps:		
         if(a1!=NULL)
             {
             Kern::UnpinVirtualMemory(iPinObj1);
@@ -1128,6 +1189,7 @@
     TUsbcIfcInfo ifcInfo;
     TCSDescriptorInfo desInfo;
     TUsbcEndpointResource epRes;
+	TUsbcChargerDetectorProperties chargingPro;	
     TInt bandwidthPriority;
 
     switch (aFunction)
@@ -1514,6 +1576,17 @@
             }
             
         break;
+		
+
+    case RDevUsbcClient::EControlGetChargerDetectorCaps:
+        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetChargerDetectorCaps"));
+		iController->ChargerDetectorCaps(chargingPro);          		
+        r = Kern::ThreadRawWrite(iClient, a1, &chargingPro, sizeof(chargingPro), iClient);
+        if (r != KErrNone)
+        	{
+            PanicClientThread(r);
+            }
+        break;		
 
     case RDevUsbcClient::EControlReleaseInterface:
         __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface"));
@@ -2246,6 +2319,32 @@
         }
     }
 
+void DLddUsbcChannel::ChargerTypeChangeCallback(TAny* aDLddUsbcChannel)
+    {
+    __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback"));
+    DLddUsbcChannel* dUsbc = (DLddUsbcChannel*) aDLddUsbcChannel;
+    if (dUsbc->iChannelClosing)
+        return;   
+    const TInt reqNo = (TInt) RDevUsbcClient::ERequestChargingPortTypeNotify;
+    if (dUsbc->iRequestStatus[reqNo])
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback Notify status"));        
+        Kern::Printf("ChargerTypeChangeCallback Notify status");        
+        TUint chargerType;
+        chargerType = dUsbc->iChargerTypeCallbackInfo.ChargerType();
+        dUsbc->iChargerTypeChangeReq->Data()=chargerType;
+        dUsbc->iRequestStatus[reqNo] = NULL;
+        Kern::QueueRequestComplete(dUsbc->iClient,dUsbc->iChargerTypeChangeReq,KErrNone);
+        dUsbc->iChargerTypeChangePtr = NULL;
+        dUsbc->iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+        }    
+    else
+        {
+        Kern::Printf("ChargerTypeChangeCallback Set pending notify");
+        __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback Set pending notify"));
+        dUsbc->iChargerTypeCallbackInfo.SetPendingNotify(ETrue);
+        }
+    }
 
 TInt DLddUsbcChannel::SelectAlternateSetting(TUint aAlternateSetting)
     {
@@ -2660,6 +2759,25 @@
                     }
 
                 }
+	        else if (i == RDevUsbcClient::ERequestChargingPortTypeNotify)
+	                {
+	                    
+	                if (iChargerTypeChangePtr)
+	                    {
+				        TUint chargerType;
+				        chargerType = iChargerTypeCallbackInfo.ChargerType();
+				        iChargerTypeChangeReq->Data()=chargerType;
+						iChargerTypeChangePtr = NULL;
+	                    }
+	                    
+	                if (iChargerTypeChangeReq->IsReady())
+	                    {
+	                    iRequestStatus[i] = NULL;
+	                    Kern::QueueRequestComplete(iClient, iChargerTypeChangeReq,
+	                            KErrDisconnected);
+	                    }
+
+	                }			
             else
                 {
                 CompleteBufferRequest(iClient, i, KErrDisconnected);
@@ -2671,8 +2789,9 @@
     iStatusCallbackInfo.Cancel();
     iEndpointStatusCallbackInfo.Cancel();
     iOtgFeatureCallbackInfo.Cancel();
-    return KErrNone;
-    }
+    iChargerTypeCallbackInfo.Cancel();
+	return KErrNone;
+	}
 
 
 void DLddUsbcChannel::PanicClientThread(TInt aReason)
--- a/usbdrv/peripheral/ldd/perilddsc/src/d_usbcsc.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/ldd/perilddsc/src/d_usbcsc.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -1175,6 +1175,8 @@
                                   KUsbRequestCallbackPriority),
       iOtgFeatureChangePtr(NULL),
       iOtgFeatureCallbackInfo(this, DLddUsbcScChannel::OtgFeatureChangeCallback, KUsbRequestCallbackPriority),
+      iChargerTypeChangePtr(NULL),
+      iChargerTypeCallbackInfo(this, DLddUsbcScChannel::ChargerTypeChangeCallback, KUsbRequestCallbackPriority),
       iNumberOfEndpoints(0),
       iDeviceState(UsbShai::EUsbPeripheralStateUndefined),
       iOwnsDeviceControl(EFalse),
@@ -1213,6 +1215,7 @@
         iStatusCallbackInfo.Cancel();
         iEndpointStatusCallbackInfo.Cancel();
         iOtgFeatureCallbackInfo.Cancel();
+	    iChargerTypeCallbackInfo.Cancel();
         iCompleteAllCallbackInfo.Cancel();
         DestroyAllInterfaces();
         if (iOwnsDeviceControl)
@@ -1288,6 +1291,7 @@
     iStatusCallbackInfo.SetDfcQ(iDfcQ);                        // use the channel's dfcq for this dfc
     iEndpointStatusCallbackInfo.SetDfcQ(iDfcQ);                // use the channel's dfcq for this dfc
     iOtgFeatureCallbackInfo.SetDfcQ(iDfcQ);
+	iChargerTypeCallbackInfo.SetDfcQ(iDfcQ);
     iMsgQ.Receive();                                        //start up the message q
     TInt r = iController->RegisterClientCallback(iCompleteAllCallbackInfo);
     if (r != KErrNone)
@@ -1301,6 +1305,9 @@
     r = iController->RegisterForOtgFeatureChange(iOtgFeatureCallbackInfo);
     if (r != KErrNone)
         return r;
+    r = iController->RegisterChargingPortTypeNotify(iChargerTypeCallbackInfo);
+    if (r != KErrNone)
+        return r;
 
     return r;
     }
@@ -1424,6 +1431,25 @@
         BREAK_IF_NULL_ARG(a1,r);
             
         iOtgFeatureChangePtr = a1;
+		break;
+		}
+    case RDevUsbcScClient::ERequestChargingPortTypeNotify:
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ERequestChargingPortTypeNotify"));
+        BREAK_IF_NULL_ARG(a1,r);
+            
+        iChargerTypeChangePtr = a1;
+        needsCompletion = iChargerTypeCallbackInfo.PendingNotify();
+        if(needsCompletion)
+            {
+            TUint chargerType;
+            chargerType = iChargerTypeCallbackInfo.ChargerType();
+            TInt r=Kern::ThreadRawWrite(iClient, iChargerTypeChangePtr, (TUint*)&chargerType, sizeof(chargerType), iClient);
+            if (r != KErrNone)
+                PanicClientThread(r);
+            iChargerTypeChangePtr = NULL;
+            iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+            }
         break;
         }
     default:
@@ -1649,10 +1675,15 @@
         CancelNotifyOtgFeatures();
     break;
 
-    default:
-        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
-        return KErrArgument;
-        }
+    case RDevUsbcScClient::ERequestChargingPortTypeNotifyCancel:
+        __KTRACE_OPT(KUSB, Kern::Printf("DoCancel ERequestChargingPortTypeNotify: 0x%x", aReqNo));
+        CancelNotifyChargerType();
+    break;	
+    
+	default:
+		__KTRACE_OPT(KUSB, Kern::Printf("DoCancel Unknown! 0x%x", aReqNo));
+		return KErrArgument;
+		}
 
     Kern::RequestComplete(iClient,iRequestStatus[aReqNo & ~RDevUsbcScClient::ERequestCancel], KErrCancel);
     return r;
@@ -1691,7 +1722,19 @@
         }
     }
 
-
+void DLddUsbcScChannel::CancelNotifyChargerType()
+    {
+    if (iChargerTypeChangePtr)
+        {
+        TUint chargerType;
+        chargerType = iChargerTypeCallbackInfo.ChargerType();
+        TInt r=Kern::ThreadRawWrite(iClient, iChargerTypeChangePtr, (TUint*)&chargerType, sizeof(chargerType), iClient);
+        if (r != KErrNone)
+            PanicClientThread(r);
+        iChargerTypeChangePtr = NULL;
+        iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+        }
+    }
 
 //
 // DoControl - Synchronous requests
@@ -1710,6 +1753,7 @@
     TUsbcScIfcInfo ifcInfo;
     TCSDescriptorInfo desInfo;
     TUsbcEndpointResource epRes;
+    TUsbcChargerDetectorProperties chargingPro;
 
     switch (aFunction)
         {
@@ -2061,6 +2105,17 @@
         r = SetInterface((TInt) a1, &ifcInfo);
         break;
 
+
+    case RDevUsbcScClient::EControlGetChargerDetectorCaps:
+        __KTRACE_OPT(KUSB, Kern::Printf("EControlGetChargerDetectorCaps"));
+		iController->ChargerDetectorCaps(chargingPro); 
+        r = Kern::ThreadRawWrite(iClient, a1, &chargingPro, sizeof(chargingPro), iClient);
+        if (r != KErrNone)
+        	{
+            PanicClientThread(r);
+            }
+        break;				
+
     case RDevUsbcScClient::EControlReleaseInterface: 
         __KTRACE_OPT(KUSB, Kern::Printf("EControlReleaseInterface"));
         if (!iRealizeCalled)
@@ -3056,6 +3111,32 @@
         }
     }
 
+void DLddUsbcScChannel::ChargerTypeChangeCallback(TAny* aDLddUsbcScChannel)
+    {
+    __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback"));
+    DLddUsbcScChannel* dUsbc = (DLddUsbcScChannel*) aDLddUsbcScChannel;
+    if (dUsbc->iChannelClosing)
+        return;    
+
+    const TInt reqNo = (TInt) RDevUsbcScClient::ERequestChargingPortTypeNotify;
+    if (dUsbc->iRequestStatus[reqNo])
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback Notify status"));
+        TUint chargerType;
+        chargerType = dUsbc->iChargerTypeCallbackInfo.ChargerType();
+        TInt r=Kern::ThreadRawWrite(dUsbc->iClient, dUsbc->iChargerTypeChangePtr, (TUint*)&chargerType, sizeof(chargerType), dUsbc->iClient);
+        if (r != KErrNone)
+            dUsbc->PanicClientThread(r);
+        Kern::RequestComplete(dUsbc->iClient, dUsbc->iRequestStatus[reqNo], r);
+        dUsbc->iChargerTypeChangePtr = NULL;
+        dUsbc->iChargerTypeCallbackInfo.SetPendingNotify(EFalse);
+        }    
+    else
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("ChargerTypeChangeCallback Set pending notify"));
+        dUsbc->iChargerTypeCallbackInfo.SetPendingNotify(ETrue);
+        }
+    }
 
 //
 // SelectAlternateSetting
@@ -3401,9 +3482,9 @@
     iStatusCallbackInfo.Cancel();
     iEndpointStatusCallbackInfo.Cancel();
     iOtgFeatureCallbackInfo.Cancel();
-
-    return KErrNone;
-    }
+    iChargerTypeCallbackInfo.Cancel();
+	return KErrNone;
+	}
 
 
 void DLddUsbcScChannel::PanicClientThread(TInt aReason)
--- a/usbdrv/peripheral/pdd/pil/eabi/usbperipheralpilu.def	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/pdd/pil/eabi/usbperipheralpilu.def	Fri Sep 17 08:40:15 2010 +0300
@@ -92,4 +92,7 @@
 	_ZNK20DUsbClientController18GetInterfaceNumberEPK5DBaseRi @ 91 NONAME
 	_ZNK20DUsbClientController21GetCurrentOtgFeaturesERh @ 92 NONAME
 	_ZNK20DUsbClientController26EndpointZeroMaxPacketSizesEv @ 93 NONAME
+	_ZN20DUsbClientController19ChargerDetectorCapsERN7UsbShai26TChargerDetectorPropertiesE @ 94 NONAME
+	_ZN20DUsbClientController30RegisterChargingPortTypeNotifyER24TUsbcChargerTypeCallback @ 95 NONAME
+	_ZN20DUsbClientController32DeRegisterChargingPortTypeNotifyEPK5DBase @ 96 NONAME
 
--- a/usbdrv/peripheral/pdd/pil/group/bld.inf	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/pdd/pil/group/bld.inf	Fri Sep 17 08:40:15 2010 +0300
@@ -16,6 +16,7 @@
 
 PRJ_PLATFORMS
 ARMV5
+ARMV5SMP
 
 PRJ_MMPFILES
 usbperipheralpil
--- a/usbdrv/peripheral/pdd/pil/group/usbperipheralpil.mmp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/pdd/pil/group/usbperipheralpil.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -21,7 +21,7 @@
 targettype      kext
 linkas          usbperipheralpil.dll
 deffile         ../~/usbperipheralpil.def
-VENDORID        0x70000001
+vendorid        0x70000001
 uid             0x00000000  0x2002E6DB
 capability      all
 epocallowdlldata
--- a/usbdrv/peripheral/pdd/pil/src/ps_usbc.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/pdd/pil/src/ps_usbc.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -101,6 +101,8 @@
 // Charger observer is the guy who want to monitor the chager type event.
 static UsbShai::MChargerDetectorObserverIf* gChargerObsever = NULL;
 
+static UsbShai::TChargerDetectorProperties gChargerDetectorProperties;
+
 
 // Those const variables are used to construct the default 
 // Usb descriptors, Upper layer can change them later.
@@ -352,6 +354,9 @@
     __KTRACE_OPT(KUSB, Kern::Printf("> DUsbClientController::DeviceCaps()"));
     TUsbDeviceCaps caps;
     caps().iTotalEndpoints = iDeviceUsableEndpoints;        // not DeviceTotalEndpoints()!
+
+    // In the SHAI API, all PSLs are required to support soft connection
+    caps().iConnect = ETrue;
     
     caps().iSelfPowered = iSelfPowered;
     caps().iRemoteWakeup = iRemoteWakeup;
@@ -404,6 +409,14 @@
     }
 
 
+
+EXPORT_C void DUsbClientController::ChargerDetectorCaps(UsbShai::TChargerDetectorProperties& aProperties)
+    {
+    aProperties = gChargerDetectorProperties;
+    }
+
+
+
 /** Creates a new USB interface (one setting), complete with endpoints, descriptors, etc.,
     and chains it into the internal device configuration tree.
 
@@ -923,6 +936,7 @@
     DeRegisterForEndpointStatusChange(aClientId);
     DeRegisterForOtgFeatureChange(aClientId);
     DeRegisterClientCallback(aClientId);
+    DeRegisterChargingPortTypeNotify(aClientId);
     // Delete the interface including all its alternate settings which might exist.
     // (If we release the default setting (0), all alternate settings are deleted as well.)
     const TInt r = ReleaseInterface(aClientId, 0);
@@ -2619,6 +2633,68 @@
     {
     return iController.SignalRemoteWakeup();
     }
+/** Registers client request for USB charger type notification. Client is notified when USB device is
+    attached to or detached from any USB charger, and the charger type is sent to client.
+    
+    @param aCallback A reference to a properly filled in charger type callback structure.
+
+    @return KErrNone if callback successfully registered, KErrGeneral if this callback is already registered
+    (it won't be registered twice).
+*/
+EXPORT_C TInt DUsbClientController::RegisterChargingPortTypeNotify(TUsbcChargerTypeCallback& aCallback)
+    {
+    __KTRACE_OPT(KUSB, Kern::Printf("DUsbClientController::RegisterChargingPortTypeNotify()"));
+    if (iChargerTypeCallbacks.Elements() == KUsbcMaxListLength)
+        {
+        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: In charger type list, the maximum list length reached: %d",
+                                          KUsbcMaxListLength));
+        return KErrGeneral;
+        }
+    if (IsInTheChargerTypeList(aCallback))
+        {
+        __KTRACE_OPT(KUSB, Kern::Printf("  Error: UsbcChargerTypeCallback @ 0x%x already registered", &aCallback));
+        return KErrGeneral;
+        }
+    const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock);
+    iChargerTypeCallbacks.AddLast(aCallback);
+    __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq);    
+    
+    if(iCurrentChargerType !=  UsbShai::EPortTypeNone)
+        {
+        aCallback.SetChargerType(iCurrentChargerType);
+        aCallback.SetPendingNotify(ETrue);
+        }
+    return KErrNone;
+    }
+
+/** De-registers (removes from the list of pending requests) a notification callback for
+    USB charger type change.
+
+    @param aClientId A pointer to the LDD owning the charger type callback.
+
+    @return KErrNone if callback successfully unregistered, KErrNotFound if the callback couldn't be found.
+*/
+EXPORT_C TInt DUsbClientController::DeRegisterChargingPortTypeNotify(const DBase* aClientId)
+    {
+    __KTRACE_OPT(KUSB, Kern::Printf("DUsbClientController::DeRegisterChargingPortTypeNotify()"));
+    __ASSERT_DEBUG((aClientId != NULL), Kern::Fault(KUsbPILPanicCat, __LINE__));
+    const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock);
+    TSglQueIter<TUsbcChargerTypeCallback> iter(iChargerTypeCallbacks);
+    TUsbcChargerTypeCallback* p;
+    while ((p = iter++) != NULL)
+        {
+        if (p->Owner() == aClientId)
+            {
+            __KTRACE_OPT(KUSB, Kern::Printf("  removing UsbcChargerTypeCallback @ 0x%x", p));
+            iChargerTypeCallbacks.Remove(*p);
+            __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq);
+            return KErrNone;
+            }
+        }
+    __KTRACE_OPT(KUSB, Kern::Printf("  client not found"));
+    __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq);
+    return KErrNotFound;
+    }
     
 EXPORT_C TBool DUsbClientController::CurrentlyUsingHighSpeed()
     {
@@ -2913,10 +2989,19 @@
       iUsbResetDeferred(EFalse),
       iEnablePullUpOnDPlus(NULL),
       iDisablePullUpOnDPlus(NULL),
-      iOtgContext(NULL)
+      iOtgContext(NULL),
+	  iChargerTypeCallbacks(_FOFF(TUsbcChargerTypeCallback, iLink)),
+	  iCurrentChargerType(UsbShai::EPortTypeNone)
     {
     __KTRACE_OPT(KUSB, Kern::Printf("DUsbClientController::DUsbClientController()"));
     
+    // Note that we take a direct copy of the controller properties in
+    // the initialization list for now. If fields are later added to
+    // the properties class in the SHAI, we need to start copying
+    // field-by-field and check the PSL reported capabilities before
+    // accessing a field that may not be present in an older PSL
+    // binary.
+
     iLastError = KErrNone;
     
 #ifndef SEPARATE_USB_DFC_QUEUE
@@ -4687,7 +4772,18 @@
 // Functions from UsbShai::MChargerDetectorObserverIf
 void DUsbClientController::NotifyPortType(UsbShai::TPortType aPortType)
     {
-    // FIXME: Not yet implemented!
+    __KTRACE_OPT(KUSB, Kern::Printf("DUsbClientController::NotifyPortType(), aPortType = %d", aPortType));
+
+    TSglQueIter<TUsbcChargerTypeCallback> iter(iChargerTypeCallbacks);
+    TUsbcChargerTypeCallback* p;
+    
+    iCurrentChargerType = aPortType;
+    
+    while ((p = iter++) != NULL)
+        {
+        p->SetChargerType(aPortType);
+        p->DoCallback();
+        }    
     }
 
 void DUsbClientController::Buffer2Setup(const TAny* aBuf, TUsbcSetup& aSetup) const
@@ -4818,8 +4914,14 @@
         {
         return ;
         }
-        
+
+    // We take a direct copy of the charger detector properties for
+    // now. If fields are later added to the properties classes in the
+    // SHAI, we need to start copying field-by-field and check the PSL
+    // reported capabilities before accessing a field that may not be
+    // present in an older PSL binary.
     gChargerDetector = &aChargerDetector;
+    gChargerDetectorProperties = aProperties;
     
     if(gChargerObsever != NULL)
         {
--- a/usbdrv/peripheral/public/d32usbc.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/d32usbc.h	Fri Sep 17 08:40:15 2010 +0300
@@ -206,6 +206,8 @@
 		ERequestEndpointStatusNotifyCancel = 1<<ERequestEndpointStatusNotify,
         ERequestOtgFeaturesNotify = 10,
         ERequestOtgFeaturesNotifyCancel = 1<<ERequestOtgFeaturesNotify,
+        ERequestChargingPortTypeNotify = 11,
+        ERequestChargingPortTypeNotifyCancel = 1<<ERequestChargingPortTypeNotify
 		};
 
 	enum TControl
@@ -285,7 +287,8 @@
 		EControlRemoveStringDescriptor,
         EControlSetOtgDescriptor,
         EControlGetOtgDescriptor,
-        EControlGetOtgFeatures
+        EControlGetOtgFeatures,
+        EControlGetChargerDetectorCaps
 		};
 
 public:
@@ -1152,7 +1155,18 @@
     /** Cancel pending OTG feature request.
     */
     inline void OtgFeaturesNotifyCancel();
+    /** Register for notification on USB charger type' change. If any usb charger
+        is detected, request completes and current charger type value is filled in aValue.
 
+        @param aStatus Request status object
+        @param aValue On request completion, it contains current charger type value
+    */
+    inline void ChargingPortTypeNotify(TRequestStatus& aStatus, TUint& aValue);
+
+    /** Cancel pending Charger Type request.
+    */
+    inline void ChargingPortTypeNotifyCancel();   
+	inline TInt ChargerDetectorCaps(TUsbcChargerDetectorProperties& aProperties);
 #endif // #ifndef __KERNEL_MODE__
 	};
 
--- a/usbdrv/peripheral/public/d32usbc.inl	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/d32usbc.inl	Fri Sep 17 08:40:15 2010 +0300
@@ -696,6 +696,22 @@
 	DoCancel(ERequestOtgFeaturesNotifyCancel);
 	}
 
+inline void RDevUsbcClient::ChargingPortTypeNotify(TRequestStatus& aStatus, TUint& aValue)
+    {
+    DoRequest(ERequestChargingPortTypeNotify, aStatus, &aValue);
+    }
+
+inline void RDevUsbcClient::ChargingPortTypeNotifyCancel()
+    {
+    DoCancel(ERequestChargingPortTypeNotifyCancel);
+    }
+
+inline TInt RDevUsbcClient::ChargerDetectorCaps(TUsbcChargerDetectorProperties& aProperties)
+	{
+	return DoControl(EControlGetChargerDetectorCaps, &aProperties);
+	}
+
+
 
 #endif // #ifndef __KERNEL_MODE__
 
--- a/usbdrv/peripheral/public/d32usbcsc.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/d32usbcsc.h	Fri Sep 17 08:40:15 2010 +0300
@@ -294,6 +294,7 @@
         ERequestReEnumerate = 4,
         ERequestEndpointStatusNotify = 5,
          ERequestOtgFeaturesNotify = 6,
+ 		ERequestChargingPortTypeNotify = 7,
         ERequestMaxRequests, // 7
 
         ERequestCancel = 0x40000000,
@@ -303,7 +304,8 @@
         ERequestAlternateDeviceStatusNotifyCancel     = ERequestAlternateDeviceStatusNotify | ERequestCancel,
         ERequestReEnumerateCancel                     = ERequestReEnumerate                 | ERequestCancel,
         ERequestEndpointStatusNotifyCancel             = ERequestEndpointStatusNotify        | ERequestCancel,
-        ERequestOtgFeaturesNotifyCancel             = ERequestOtgFeaturesNotify           | ERequestCancel
+        ERequestOtgFeaturesNotifyCancel             = ERequestOtgFeaturesNotify           | ERequestCancel,
+        ERequestChargingPortTypeNotifyCancel             = ERequestChargingPortTypeNotify           | ERequestCancel
         };
 
     enum TControl
@@ -383,7 +385,8 @@
         EControlGetOtgDescriptor,
         EControlGetOtgFeatures, 
         EControlRealizeInterface,
-        EControlStartNextInAlternateSetting    
+        EControlStartNextInAlternateSetting,
+        EControlGetChargerDetectorCaps
         };
 
 
@@ -1215,12 +1218,24 @@
     /** Cancel pending OTG feature request.
     */
     inline void OtgFeaturesNotifyCancel();
+    
+    /** Register for notification on USB charger type' change. If any usb charger
+        is detected, request completes and current charger type value is filled in aValue.
 
-    /**    This function retrieves the alternate setting that the WriteData function can
-        write to.  After a host sets the alternate setting, writes to the IN endpoint
-        are not permitted by the LDD until this method has been called.
-        This function is not asynchronous nor blocking, and should not be used to
-        detect that an alternate setting has happened.
+        @param aStatus Request status object
+        @param aValue On request completion, it contains current charger type value
+    */
+    inline void ChargingPortTypeNotify(TRequestStatus& aStatus, TUint& aValue);
+
+    /** Cancel pending Charger Type request.
+    */
+    inline void ChargingPortTypeNotifyCancel();     
+    inline TInt ChargerDetectorCaps(TUsbcChargerDetectorProperties& aProperties);
+	/**	This function retrieves the alternate setting that the WriteData function can
+		write to.  After a host sets the alternate setting, writes to the IN endpoint
+		are not permitted by the LDD until this method has been called.
+		This function is not asynchronous nor blocking, and should not be used to
+		detect that an alternate setting has happened.
 
         If the BIL methods are being used (recommended), then this method should not be called directly. 
 
--- a/usbdrv/peripheral/public/d32usbcsc.inl	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/d32usbcsc.inl	Fri Sep 17 08:40:15 2010 +0300
@@ -709,6 +709,22 @@
 	DoControl(ERequestOtgFeaturesNotifyCancel);
 	}
 
+inline void RDevUsbcScClient::ChargingPortTypeNotify(TRequestStatus& aStatus, TUint& aValue)
+    {
+    DoRequest(ERequestChargingPortTypeNotify, aStatus, &aValue);
+    }
+
+inline void RDevUsbcScClient::ChargingPortTypeNotifyCancel()
+    {
+    DoControl(ERequestChargingPortTypeNotifyCancel);
+    }
+
+inline TInt RDevUsbcScClient::ChargerDetectorCaps(TUsbcChargerDetectorProperties& aProperties)
+	{
+	return DoControl(EControlGetChargerDetectorCaps, &aProperties);
+	}
+
+
 inline TInt RDevUsbcScClient::StartNextInAlternateSetting()
 	{
 	return DoControl(EControlStartNextInAlternateSetting);
--- a/usbdrv/peripheral/public/d32usbcshared.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/d32usbcshared.h	Fri Sep 17 08:40:15 2010 +0300
@@ -26,6 +26,8 @@
 #define __D32USBCSHARED_H__
 
 #include <usb/usb_peripheral_shai_shared.h>
+#include <usb/usb_charger_detection_shai_shared.h>
+
 
 // FIXME: for dummy dcd compitible, move this line to usbcshared.h
 // used by shared chunk version LDD's user app interface
@@ -121,6 +123,21 @@
 	TInt MinPacketSize() const;    
     };
 
+typedef UsbShai::TPortType TUsbcChargingPortType;
+typedef UsbShai::TChargerDetectorProperties TUsbcChargerDetectorProperties;
+const TUint KUsbChargingPortTypeNone = UsbShai::EPortTypeNone;
+const TUint KUsbChargingPortTypeUnsupported = UsbShai::EPortTypeUnsupported;
+const TUint KUsbChargingPortTypeChargingPort = UsbShai::EPortTypeChargingPort;
+const TUint KUsbChargingPortTypeDedicatedChargingPort = UsbShai::EPortTypeDedicatedChargingPort;
+const TUint KUsbChargingPortTypeChargingDownstreamPort = UsbShai::EPortTypeChargingDownstreamPort;
+const TUint KUsbChargingPortTypeStandardDownstreamPort = UsbShai::EPortTypeStandardDownstreamPort;
+const TUint KUsbChargingPortTypeAcaRidA = UsbShai::EPortTypeAcaRidA;
+const TUint KUsbChargingPortTypeAcaRidB = UsbShai::EPortTypeAcaRidB;
+const TUint KUsbChargingPortTypeAcaRidC = UsbShai::EPortTypeAcaRidC;
+const TUint KChargerDetectorCapChirpCurrentLimiting = UsbShai::TChargerDetectorProperties::KChargerDetectorCapChirpCurrentLimiting;
+
+
+	
 /** Endpoint resources/behaviours.
 
 	@see AllocateEndpointResource()
--- a/usbdrv/peripheral/public/usbc.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/usbc.h	Fri Sep 17 08:40:15 2010 +0300
@@ -51,7 +51,7 @@
 /** Must correspond to the max enum of TRequest + 1;
     currently this is ERequestOtgFeaturesNotify = 10.
 */
-const TInt KUsbcMaxRequests = 11;
+const TInt KUsbcMaxRequests = 12;
 
 //
 //########################### Logical Device Driver (LDD) #############################
@@ -297,9 +297,11 @@
     void ClosePhysicalChunk(DPlatChunkHw* &aHwChunk);
     void CancelNotifyEndpointStatus();
     void CancelNotifyOtgFeatures();
+	void CancelNotifyChargerType();
     static void StatusChangeCallback(TAny* aDLddUsbcChannel);
     static void EndpointStatusChangeCallback(TAny* aDLddUsbcChannel);
     static void OtgFeatureChangeCallback(TAny* aDLddUsbcChannel);
+    static void ChargerTypeChangeCallback(TAny* aDLddUsbcChannel);
     static void EmergencyCompleteDfc(TAny* aDLddUsbcChannel);
     void DeConfigure(TInt aErrorCode);
     TInt SelectAlternateSetting(TUint aAlternateSetting);
@@ -333,6 +335,8 @@
     TUsbcEndpointStatusCallback iEndpointStatusCallbackInfo;
     TAny* iOtgFeatureChangePtr;
     TUsbcOtgFeatureCallback iOtgFeatureCallbackInfo;
+    TAny* iChargerTypeChangePtr;
+    TUsbcChargerTypeCallback iChargerTypeCallbackInfo;
     TInt iNumberOfEndpoints;
     RArray<DPlatChunkHw*> iHwChunksEp0;
     RArray<DPlatChunkHw*> iHwChunks;
@@ -350,6 +354,7 @@
     TClientDataRequest<TUint> *iStatusChangeReq;
     TClientDataRequest<TUint> *iEndpointStatusChangeReq;
     TClientDataRequest<TUint> *iOtgFeatureChangeReq;
+    TClientDataRequest<TUint> *iChargerTypeChangeReq;
     TEndpointTransferInfo iTfrInfo;
     };
 
--- a/usbdrv/peripheral/public/usbcsc.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/usbcsc.h	Fri Sep 17 08:40:15 2010 +0300
@@ -322,9 +322,11 @@
     TInt SetupEp0();
     void CancelNotifyEndpointStatus();
     void CancelNotifyOtgFeatures();
+    void CancelNotifyChargerType();
     static void StatusChangeCallback(TAny* aDLddUsbcChannel);
     static void EndpointStatusChangeCallback(TAny* aDLddUsbcChannel);
     static void OtgFeatureChangeCallback(TAny* aDLddUsbcChannel);
+    static void ChargerTypeChangeCallback(TAny* aDLddUsbcChannel);	
     static void EmergencyCompleteDfc(TAny* aDLddUsbcChannel);
     void DeConfigure(TInt aErrorCode);
     TInt SelectAlternateSetting(TUint aAlternateSetting);
@@ -354,6 +356,8 @@
     TUsbcEndpointStatusCallback iEndpointStatusCallbackInfo;
     TAny* iOtgFeatureChangePtr;
     TUsbcOtgFeatureCallback iOtgFeatureCallbackInfo;
+    TAny* iChargerTypeChangePtr;
+    TUsbcChargerTypeCallback iChargerTypeCallbackInfo;
     TUint8* iBufferBaseEp0;
     TInt iBufferSizeEp0;
     TInt iNumberOfEndpoints;
--- a/usbdrv/peripheral/public/usbcshared.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/usbcshared.h	Fri Sep 17 08:40:15 2010 +0300
@@ -351,6 +351,29 @@
     TDfc iDfc;
     TUint8 iValue;
     };
+/** USB Charger Type change callback.
+*/
+class TUsbcChargerTypeCallback
+    {
+public:
+    inline TUsbcChargerTypeCallback (DBase* aOwner, TDfcFn aCallback, TInt aPriority);
+    inline void SetChargerType(TUint aType);
+    inline TUint ChargerType () const;
+	inline void SetPendingNotify(TBool aPendingNotify);
+	inline TBool PendingNotify () const;
+    inline DBase* Owner() const;
+    inline TInt DoCallback();
+    inline void Cancel();
+    inline void SetDfcQ(TDfcQue* aDfcQ);
+public:
+    /** Used by the PIL to queue callback objects into a TSglQue. */
+    TSglQueLink iLink;
+private:
+    DBase* iOwner;
+    TDfc iDfc;
+    TUint iChargerType;
+	TBool iPendingNotify;
+    };
 
 //
 //########################### Physical Device Driver (PIL + PSL) ######################
@@ -686,6 +709,9 @@
     IMPORT_C TBool QueryEndpointResource(const DBase* aClientId, TInt aEndpointNum,
                                          TUsbcEndpointResource aResource);
     IMPORT_C TInt EndpointPacketSize(const DBase* aClientId, TInt aEndpointNum);
+    IMPORT_C TInt RegisterChargingPortTypeNotify(TUsbcChargerTypeCallback& aCallback);
+    IMPORT_C TInt DeRegisterChargingPortTypeNotify(const DBase* aClientId);
+	IMPORT_C void ChargerDetectorCaps(UsbShai::TChargerDetectorProperties& aProperties);
     
     // Called by LDD
     IMPORT_C TDfcQue*  DfcQ(TInt aIndex);
@@ -873,6 +899,7 @@
     inline TBool IsInTheEpStatusList(const TUsbcEndpointStatusCallback& aCallback);
     inline TBool IsInTheOtgFeatureList(const TUsbcOtgFeatureCallback& aCallback);
     inline TBool IsInTheRequestList(const TUsbcRequestCallback& aCallback);
+    inline TBool IsInTheChargerTypeList(const TUsbcChargerTypeCallback& aCallback);
     static void ReconnectTimerCallback(TAny* aPtr);
     static void CableStatusTimerCallback(TAny* aPtr);
     static void PowerUpDfc(TAny* aPtr);
@@ -934,7 +961,7 @@
     NFastMutex iMutex;                                          // To pretect interface set with NFastMutex
     UsbShai::MPeripheralControllerIf& iController;              // PSL code
     
-    const UsbShai::TPeripheralControllerProperties& iControllerProperties;   // Static configuration from PSL
+    const UsbShai::TPeripheralControllerProperties iControllerProperties;   // Static configuration from PSL
     TBool iIsOtgPort;                                               // Is this instance a driver for otg port,
                                                                     // Set at construction time.
 
@@ -974,6 +1001,9 @@
     TInt (*iEnablePullUpOnDPlus)(TAny* aOtgContext);
     TInt (*iDisablePullUpOnDPlus)(TAny* aOtgContext);
     TAny* iOtgContext;
+private:	
+    TSglQue<TUsbcChargerTypeCallback> iChargerTypeCallbacks;  // list of USB charger type notification requests
+    TUint iCurrentChargerType;
     };
     
 /** Simple queue of status changes to be recorded.
--- a/usbdrv/peripheral/public/usbcshared.inl	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbdrv/peripheral/public/usbcshared.inl	Fri Sep 17 08:40:15 2010 +0300
@@ -186,6 +186,23 @@
 	return EFalse;
 	}
 
+TBool DUsbClientController::IsInTheChargerTypeList(const TUsbcChargerTypeCallback& aCallback)
+    {
+    const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock);
+    TSglQueIter<TUsbcChargerTypeCallback> iter(iChargerTypeCallbacks);
+    TUsbcChargerTypeCallback* p;
+    while ((p = iter++) != NULL)
+        {
+        if (p == &aCallback)
+            {
+            __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq);
+            return ETrue;
+            }
+        }
+    __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq);
+    return EFalse;    
+    }
+
 //
 // --- Misc classes ---
 //
@@ -545,6 +562,91 @@
 	}
 
 
+// --- TUsbcChargerTypeCallback
+
+/** Constructor.
+ */
+TUsbcChargerTypeCallback::TUsbcChargerTypeCallback(DBase* aOwner, TDfcFn aCallback,
+                                                 TInt aPriority)
+    : iOwner(aOwner),
+      iDfc(aCallback, aOwner, aPriority),
+      iChargerType(UsbShai::EPortTypeNone),
+      iPendingNotify(EFalse)
+    {}
+
+/** Set charger type which is to be notified to client.
+    @param Charger type to be set
+*/
+void TUsbcChargerTypeCallback::SetChargerType(TUint aType)
+    {
+    iChargerType = aType;    
+    }
+
+
+/** Returns a pointer to the owner of this request.
+    @return A pointer to the owner of this request.
+*/
+DBase* TUsbcChargerTypeCallback::Owner() const
+    {
+    return iOwner;
+    }
+
+
+/** Charger type which is to be notified to client.
+    @return Value of Charger Type
+*/
+TUint TUsbcChargerTypeCallback::ChargerType() const
+    {
+    return iChargerType;
+    }
+
+
+/** Set whether there is an pending charger type which is to be notified to client.
+    @param whether there is an pending charger type
+*/
+void TUsbcChargerTypeCallback::SetPendingNotify(TBool aPendingNotify) 
+    {
+    iPendingNotify = aPendingNotify;
+    }
+
+/** return whether there is an pending charger type which is to be notified to client.
+    @return whether there is an pending charger type
+*/
+TBool TUsbcChargerTypeCallback::PendingNotify() const
+    {
+    return iPendingNotify;
+    }
+
+/** Executes the callback function set by the owner of this request.
+    @return KErrNone.
+*/
+TInt TUsbcChargerTypeCallback::DoCallback()
+    {
+    if (NKern::CurrentContext() == NKern::EThread)
+        iDfc.Enque();
+    else
+        iDfc.Add();
+    return KErrNone;
+    }
+
+
+/** Cancels the callback function set by the owner of this request.
+ */
+void TUsbcChargerTypeCallback::Cancel()
+    {
+    iDfc.Cancel();
+    }
+
+
+/** Set DFC queue.
+    @param aDfcQ  DFC queue to be set
+*/
+void TUsbcChargerTypeCallback::SetDfcQ(TDfcQue* aDfcQ)
+    {
+    iDfc.SetDfcQ(aDfcQ);
+    }
+
+
 /** Returns a pointer to the currently selected (active) setting of this interface.
 
 	@return A pointer to the currently selected (active) setting of this interface.
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/group/BLD.INF	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/group/BLD.INF	Fri Sep 17 08:40:15 2010 +0300
@@ -32,3 +32,6 @@
 
 PRJ_TESTEXPORTS
 ../public/acmserverconsts.h 	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(usb/acmserverconsts.h)
+
+PRJ_TESTMMPFILES
+ecacm_overdummyusbldd.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/group/ecacm_overdummyusbldd.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 1997-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:
+* Top-level project file for ECACM.CSY
+* ecacm.csy Comms server plug-in for USB
+*
+*/
+
+/**
+ @file
+*/
+
+
+TARGET			ecacm.csy
+CAPABILITY CommDD PowerMgmt ReadDeviceData WriteDeviceData TrustedUI ProtServ NetworkControl NetworkServices LocalServices ReadUserData WriteUserData
+TARGETTYPE		dll
+
+NOEXPORTLIBRARY
+
+//
+// We have a laggard, ill-defined UID3 which must be kept
+// for old platforms for BC.  For newer platforms, we use
+// KUidECACM = 0x10201EF6
+//
+uid			0x10005054 0x10201EF6
+
+MACRO __OVER_DUMMYUSBLDD__
+
+SOURCEPATH		../src
+SOURCE			AcmPort.cpp
+SOURCE			AcmPortFactory.cpp 
+SOURCE			AcmReader.cpp
+SOURCE			AcmWriter.cpp
+SOURCE			linkstatenotifier.cpp
+SOURCE			ActiveReader.cpp 
+SOURCE			ActiveReadOneOrMoreReader.cpp
+SOURCE			ActiveWriter.cpp
+SOURCE			BreakController.cpp
+SOURCE			CdcAcmClass.cpp 
+SOURCE			CdcInterfaceBase.cpp		
+SOURCE			CdcControlInterface.cpp 	
+SOURCE			CdcControlInterfaceReader.cpp 
+SOURCE			CdcDataInterface.cpp		
+SOURCE			ClassDescriptor.cpp 
+SOURCE			DllMain.cpp 
+SOURCE			RegistrationPort.cpp 
+SOURCE			RequestHeader.cpp 
+SOURCE			acmserver.cpp
+SOURCE			acmsession.cpp
+SOURCE			ActiveDataAvailableNotifier.cpp
+
+USERINCLUDE 	../inc
+USERINCLUDE 	../public
+USERINCLUDE 	../traces
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+LIBRARY 		euser.lib 
+LIBRARY 		c32.lib
+LIBRARY			efsrv.lib
+LIBRARY                 dummyusblddapi.lib
+
+VENDORID 0x70000001
+
+UNPAGED
+
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveDataAvailableNotifier.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveDataAvailableNotifier.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,11 @@
 #define __ACTIVEDATAAVAILABLENOTIFIER_H__
 
 #include <e32base.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 
 class RDevUsbcClient;
 class MNotifyDataAvailableObserver;
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveReadOneOrMoreReader.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveReadOneOrMoreReader.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,11 @@
 #define __ACTIVEREADONEORMOREREADER_H__
 
 #include <e32base.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 
 class RDevUsbcClient;
 class MReadOneOrMoreObserver;
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveReader.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveReader.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,11 @@
 #define __ACTIVEREADER_H__
 
 #include <e32base.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 
 class RDevUsbcClient;
 class MReadObserver;
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveWriter.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/ActiveWriter.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,11 @@
 #define __ACTIVEWRITER_H__
 
 #include <e32base.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 
 class RDevUsbcClient;
 class MWriteObserver;
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/CdcInterfaceBase.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/inc/CdcInterfaceBase.h	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,11 @@
 #define __CDCINTERFACEBASE_H__
 
 #include <e32base.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 
 NONSHARABLE_CLASS(CCdcInterfaceBase) : public CBase
 /**
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveDataAvailableNotifier.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveDataAvailableNotifier.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 #include <e32std.h>
-#include <d32usbc.h>
 #include "ActiveDataAvailableNotifier.h"
 #include "AcmConstants.h"
 #include "AcmPanic.h"
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveReadOneOrMoreReader.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveReadOneOrMoreReader.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 #include <e32std.h>
-#include <d32usbc.h>
 #include "ActiveReadOneOrMoreReader.h"
 #include "AcmConstants.h"
 #include "AcmPanic.h"
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveReader.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveReader.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 #include <e32std.h>
-#include <d32usbc.h>
 #include "ActiveReader.h"
 #include "AcmConstants.h"
 #include "AcmPanic.h"
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveWriter.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/ActiveWriter.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -16,7 +16,6 @@
 */
 
 #include <e32std.h>
-#include <d32usbc.h>
 #include "ActiveWriter.h"
 #include "AcmConstants.h"
 #include "AcmPanic.h"
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/CdcControlInterfaceReader.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/CdcControlInterfaceReader.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -16,7 +16,11 @@
 */
 
 #include <e32std.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 #include "CdcControlInterfaceReader.h"
 #include "AcmPanic.h"
 #include "AcmUtils.h"
--- a/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/linkstatenotifier.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/acm/classimplementation/ecacm/src/linkstatenotifier.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -16,7 +16,11 @@
 */
 
 #include <e32base.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 #include "AcmPanic.h"
 #include "linkstatenotifier.h"
 #include "OstTraceDefinitions.h"
--- a/usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/group/BLD.INF	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/group/BLD.INF	Fri Sep 17 08:40:15 2010 +0300
@@ -20,3 +20,7 @@
 #if !(defined(WINS) || defined(WINSCW))	
 msclasscontroller.mmp	// Mass Storage Class Controller plugin
 #endif
+
+
+PRJ_TESTMMPFILES
+t_msclasscontroller.mmp	// Mass Storage Class Controller plugin
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/group/t_msclasscontroller.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2004-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:
+* usbmassstorageclient.dll USB mass storage server client side API
+*
+*/
+
+/**
+ @file
+*/
+
+target			msclasscontroller.dll //Recommended unpaged
+CAPABILITY CommDD NetworkControl NetworkServices LocalServices ProtServ
+targettype		plugin
+
+
+uid			0x10009d8d 0x10204bbb
+
+
+MACRO __OVER_DUMMYUSBLDD__
+sourcepath		../src
+source			CUsbMsClassController.cpp
+source			CUsbMsClassImpCollection.cpp
+
+USERINCLUDE			../inc
+USERINCLUDE			../traces
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+
+start resource usbms.rss
+targetpath /private/101fe1db  //10204bbb 
+header
+end
+
+start resource 10204bbb.rss
+target msclasscontroller.rsc
+end
+
+library			euser.lib
+LIBRARY			usbclasscontroller.lib
+LIBRARY			efsrv.lib
+LIBRARY			bafl.lib
+
+VENDORID 0x70000001
--- a/usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/src/CUsbMsClassController.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/ms/classcontroller/src/CUsbMsClassController.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -122,9 +122,12 @@
 
 	iState = EUsbServiceStarting;
 
+#ifndef __OVER_DUMMYUSBLDD__
 	// Connect to USB Mass Storage server
 	TInt err = iUsbMs.Connect();
-
+#else
+	TInt err = KErrNone;
+#endif
 	if (err != KErrNone)
 		{
 		iState = EUsbServiceIdle;
@@ -135,8 +138,12 @@
 		return;
 		}
 
+#ifndef __OVER_DUMMYUSBLDD__
 	// Start mass storage device
 	err = iUsbMs.Start(iMsConfig);
+#else
+	err = KErrNone;
+#endif
 
 	if (err != KErrNone)
 		{
@@ -174,6 +181,7 @@
 		}
 
 	TRequestStatus* reportStatus = &aStatus;
+#ifndef __OVER_DUMMYUSBLDD__
 	TInt err = iUsbMs.Stop();
 	
 	if (err != KErrNone)
@@ -187,6 +195,9 @@
 		}	
 
 	iUsbMs.Close();
+#else
+	iState = EUsbServiceIdle;
+#endif
 	User::RequestComplete(reportStatus, KErrNone);
 	OstTraceFunctionExit0( CUSBMSCLASSCONTROLLER_START_STOP_DUP1 );
 	}
--- a/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/INC/CUsbWHCMClassController.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/INC/CUsbWHCMClassController.h	Fri Sep 17 08:40:15 2010 +0300
@@ -28,7 +28,11 @@
 
 #include <e32std.h>
 #include <cusbclasscontrollerplugin.h>
+#ifndef __OVER_DUMMYUSBLDD__
 #include <d32usbc.h>
+#else
+#include <dummyusblddapi.h>
+#endif
 
 const TInt KWHCMPriority = 1;
 const TInt KWHCMSubClass = 0x08;
--- a/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/SRC/CUsbWHCMClassController.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/SRC/CUsbWHCMClassController.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -86,6 +86,7 @@
 void CUsbWHCMClassController::ConstructL()
 	{
 	OstTraceFunctionEntry0( CUSBWHCMCLASSCONTROLLER_CONSTRUCTL_ENTRY );
+#ifndef __OVER_DUMMYUSBLDD__
 	// Load the device driver
 	TInt err = User::LoadLogicalDevice(KUsbLDDName);
 	if (err != KErrNone && err != KErrAlreadyExists) 
@@ -94,8 +95,9 @@
 					"CUsbWHCMClassController::ConstructL;err=%d", err );   
 		User::Leave(err);
 		} 
-
-	
+#else
+	TInt err = KErrNone;
+#endif
 	err = iLdd.Open(0);
 	if (err < 0)
 		{
--- a/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/group/bld.inf	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/group/bld.inf	Fri Sep 17 08:40:15 2010 +0300
@@ -25,3 +25,6 @@
 #if !(defined(WINS) || defined(WINSCW))	
 WHCMClassController.mmp	// WHCM Class Controller plugin
 #endif
+
+PRJ_TESTMMPFILES
+t_WHCMClassController.mmp	// Mass Storage Class Controller plugin
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/device/classdrivers/whcm/classcontroller/group/t_WHCMClassController.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 1997-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:
+* WHCMClassController.dll USB Plugin, must be include in ROM if producing a WHCM device
+*
+*/
+
+/**
+ @file
+*/
+
+
+target whcmclasscontroller.dll //Recommended unpaged
+CAPABILITY CommDD NetworkControl NetworkServices LocalServices ProtServ
+targettype plugin
+
+// ECom Dll recognition UID followed by the unique dll UID 
+UID              	0x10009d8d 0x101fbf23
+VENDORID 0x70000001
+
+MACRO __OVER_DUMMYUSBLDD__
+
+SOURCEPATH		../SRC
+SOURCE			CUsbWHCMClassImpCollection.cpp
+SOURCE			CUsbWHCMClassController.cpp
+
+USERINCLUDE			../INC
+USERINCLUDE 		../traces
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+
+start resource 101fbf23.rss
+target whcmclasscontroller.rsc
+END
+
+LIBRARY			euser.lib 
+LIBRARY			usbclasscontroller.lib
+LIBRARY	   dummyusblddapi.lib
--- a/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/group/bld.inf	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/group/bld.inf	Fri Sep 17 08:40:15 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-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"
@@ -23,12 +23,13 @@
 PRJ_PLATFORMS
 ARMV5
 
-
 PRJ_MMPFILES
 
 #if defined(SYMBIAN_ENABLE_USB_OTG_HOST) && !defined(WINS) && !defined(X86GCC)
 msfdc.mmp
 #endif
+PRJ_EXPORTS
+msfdc.iby				/epoc32/rom/include/msfdc.iby
 
-PRJ_EXPORTS
-msfdc.iby				/epoc32/rom/include/msfdc.iby
\ No newline at end of file
+PRJ_TESTMMPFILES
+msfdc_overdummy.mmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/group/msfdc_overdummy.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* 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:
+* dummymsfdc.dll Dummy Mass Storage FDC plugin for FDF.
+* dummymsfdc.rsc Dummy Resource file for Mass Storage FDC plugin.
+*
+*/
+
+/**
+ @file
+ @internalComponent
+*/
+
+TARGET			msfdc_overdummy.dll
+TARGETTYPE		PLUGIN
+// UID2 = 0x10009d8d for ECOM plugins.
+// UID3 = the 'DLL UID' (see resource file)
+UID 			0x10009d8d 0x10285B0C
+MACRO			__DUMMYFDF__
+SOURCEPATH		../src
+SOURCE			msfdc.cpp
+SOURCE			msfdcmain.cpp
+
+RESOURCE		msfdc_overdummy.rss
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+USERINCLUDE		../inc
+USERINCLUDE		../../msmm/client/public
+USERINCLUDE		../../msmm/server/public
+USERINCLUDE		../traces
+
+
+LIBRARY 		euser.lib 
+
+LIBRARY			fdcbase_overdummy.lib 
+LIBRARY			usbmsmmclient_dummy.lib 
+LIBRARY			usbdescriptors.lib 
+LIBRARY			usbdi_utils_dummy.lib
+NOEXPORTLIBRARY
+
+#include <usbhost/internal/fdfcaps.mmh>
--- a/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/inc/msfdc.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/inc/msfdc.h	Fri Sep 17 08:40:15 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2008-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"
@@ -24,9 +24,14 @@
 #define MSFDC_H
 
 #include <e32base.h>
+#include <usbhost/internal/fdcinterface.h>
+#ifndef __DUMMYFDF__
 #include <usbhost/internal/fdcplugin.h>
-#include <usbhost/internal/fdcinterface.h>
 #include "msmmclient.h"
+#else
+#include <dummymsmmclient.h>
+#include <usbhost/internal/dummyfdcplugin.h>
+#endif
 
 /**
   The CMsFdc class
--- a/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -23,8 +23,13 @@
 #include "msfdc.h"
 #include "utils.h"
 #include <d32usbc.h>
+#ifndef __DUMMYFDF__
 #include <usbhost/internal/fdcpluginobserver.h>
 #include <d32usbdi.h>
+#else
+#include <dummyfdcpluginobserver.h>
+#include <dummyusbinterface.h>
+#endif
 #include <d32usbdescriptors.h>
 #include "OstTraceDefinitions.h"
 #ifdef OST_TRACE_COMPILER_IN_USE
@@ -223,11 +228,11 @@
     	}
 
     error = interface_ep0.GetInterfaceDescriptor(ifDescriptor);
-	interface_ep0.Close();
     if (error)
     	{
         OstTrace0( TRACE_ERROR, CMSFDC_MFI1NEWFUNCTION_DUP14, 
                         "***** Mass Storage FDC get interface descriptor Failed" );
+ 		interface_ep0.Close();
 		delete data;
 		OstTraceFunctionExit0( CMSFDC_MFI1NEWFUNCTION_EXIT_DUP7 );
 		return error;
@@ -261,6 +266,7 @@
 	
 	error = iMsmmSession.AddFunction(*data, aInterfaces[0], token);
 	
+	interface_ep0.Close();
 	delete data;
 	OstTraceFunctionExit0( CMSFDC_MFI1NEWFUNCTION_EXIT_DUP8 );
 	return error;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdc_overdummy.rss	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,47 @@
+/*
+* 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
+ @internalComponent
+*/
+
+#include <ecom/registryinfo.rh>
+#include <usbhost/internal/fdcplugin.hrh>
+
+RESOURCE REGISTRY_INFO theInfo
+{
+dll_uid = 0x10285B0C;
+interfaces =
+	{
+	INTERFACE_INFO
+		{
+		interface_uid = KFdcEcomInterfaceUid;
+		implementations =
+			{
+			IMPLEMENTATION_INFO
+				{
+				implementation_uid = 0x20031DF7;
+				version_no = 1;
+				display_name = "Dummy MS FDC";	
+				default_data = "IC0x08ISC0x06IP0x50";
+				opaque_data = "";
+				}
+			};
+		}
+	};
+}
--- a/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdcmain.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msfdc/src/msfdcmain.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -25,7 +25,11 @@
 
 const TImplementationProxy ImplementationTable[] =
 	{
+#ifndef __DUMMYFDF__
 	IMPLEMENTATION_PROXY_ENTRY(0x10285B0D, CMsFdc::NewL),
+#else
+	IMPLEMENTATION_PROXY_ENTRY(0x20031DF7, CMsFdc::NewL),
+#endif
 	};
 /**
   A factory method that returns the number of implementation of an interfaces
--- a/usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/subcommands.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/host/functiondrivers/ms/msmm/server/src/subcommands.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -152,6 +152,9 @@
     {
     OstTraceFunctionEntry0( TREGISTERINTERFACE_DOCANCELASYNCCMD_ENTRY );
 
+	TRequestStatus* status = &iHandler.Status();
+    User::RequestComplete(status, KErrCancel);
+
     if(iInterfaceNode)
         {
         iInterfaceNode->iUsbMsDevice.Remove();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/client/BWINS/usbman_over_dummylddu.def	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,52 @@
+EXPORTS
+	?BusRespondSrp@RUsb@@QAEHXZ @ 1 NONAME ; int RUsb::BusRespondSrp(void)
+	?HostEventNotificationCancel@RUsb@@QAEXXZ @ 2 NONAME ; void RUsb::HostEventNotificationCancel(void)
+	?DeviceStateNotificationCancel@RUsb@@QAEXXZ @ 3 NONAME ; void RUsb::DeviceStateNotificationCancel(void)
+	?CancelInterest@RUsb@@QAEHW4TUsbReqType@1@@Z @ 4 NONAME ; int RUsb::CancelInterest(enum RUsb::TUsbReqType)
+	?__DbgMarkEnd@RUsb@@QAEHH@Z @ 5 NONAME ; int RUsb::__DbgMarkEnd(int)
+	?StateNotification@RUsb@@QAEXIAAW4TUsbDeviceState@@AAVTRequestStatus@@@Z @ 6 NONAME ; void RUsb::StateNotification(unsigned int, enum TUsbDeviceState &, class TRequestStatus &)
+	?BusRequest@RUsb@@QAEHXZ @ 7 NONAME ; int RUsb::BusRequest(void)
+	?panic@@YAXXZ @ 8 NONAME ; void panic(void)
+	?StateNotificationCancel@RUsb@@QAEXXZ @ 9 NONAME ; void RUsb::StateNotificationCancel(void)
+	?Connect@RUsb@@QAEHXZ @ 10 NONAME ; int RUsb::Connect(void)
+	?GetCurrentState@RUsb@@QAEHAAW4TUsbServiceState@@@Z @ 11 NONAME ; int RUsb::GetCurrentState(enum TUsbServiceState &)
+	?Version@RUsb@@QBE?AVTVersion@@XZ @ 12 NONAME ; class TVersion RUsb::Version(void) const
+	??0RUsb@@QAE@XZ @ 13 NONAME ; RUsb::RUsb(void)
+	?RequestSession@RUsb@@QAEHXZ @ 14 NONAME ; int RUsb::RequestSession(void)
+	?TryStart@RUsb@@QAEXHAAVTRequestStatus@@@Z @ 15 NONAME ; void RUsb::TryStart(int, class TRequestStatus &)
+	?GetSupportedClasses@RUsb@@QAEHHAAV?$RArray@VTUid@@@@@Z @ 16 NONAME ; int RUsb::GetSupportedClasses(int, class RArray<class TUid> &)
+	?DeviceStateNotification@RUsb@@QAEXIAAW4TUsbDeviceState@@AAVTRequestStatus@@@Z @ 17 NONAME ; void RUsb::DeviceStateNotification(unsigned int, enum TUsbDeviceState &, class TRequestStatus &)
+	?TryStop@RUsb@@QAEXAAVTRequestStatus@@@Z @ 18 NONAME ; void RUsb::TryStop(class TRequestStatus &)
+	?__DbgAlloc@RUsb@@QAEHXZ @ 19 NONAME ; int RUsb::__DbgAlloc(void)
+	?DisableFunctionDriverLoading@RUsb@@QAEXXZ @ 20 NONAME ; void RUsb::DisableFunctionDriverLoading(void)
+	?ServiceStateNotificationCancel@RUsb@@QAEXXZ @ 21 NONAME ; void RUsb::ServiceStateNotificationCancel(void)
+	?Stop@RUsb@@QAEXAAVTRequestStatus@@@Z @ 22 NONAME ; void RUsb::Stop(class TRequestStatus &)
+	?ServiceStateNotification@RUsb@@QAEXAAW4TUsbServiceState@@AAVTRequestStatus@@@Z @ 23 NONAME ; void RUsb::ServiceStateNotification(enum TUsbServiceState &, class TRequestStatus &)
+	??1RUsb@@QAE@XZ @ 24 NONAME ; RUsb::~RUsb(void)
+	?StartCancel@RUsb@@QAEXXZ @ 25 NONAME ; void RUsb::StartCancel(void)
+	?EnableFunctionDriverLoading@RUsb@@QAEHXZ @ 26 NONAME ; int RUsb::EnableFunctionDriverLoading(void)
+	?HostEventNotification@RUsb@@QAEXAAVTRequestStatus@@AAVTDeviceEventInformation@@@Z @ 27 NONAME ; void RUsb::HostEventNotification(class TRequestStatus &, class TDeviceEventInformation &)
+	?ClassSupported@RUsb@@QAEHHVTUid@@AAH@Z @ 28 NONAME ; int RUsb::ClassSupported(int, class TUid, int &)
+	?__DbgCheckHeap@RUsb@@QAEHH@Z @ 29 NONAME ; int RUsb::__DbgCheckHeap(int)
+	?GetPersonalityProperty@RUsb@@QAEHHAAK@Z @ 30 NONAME ; int RUsb::GetPersonalityProperty(int, unsigned long &)
+	?Stop@RUsb@@QAEXXZ @ 31 NONAME ; void RUsb::Stop(void)
+	?GetDetailedDescription@RUsb@@QAEHHAAPAVHBufC16@@@Z @ 32 NONAME ; int RUsb::GetDetailedDescription(int, class HBufC16 * &)
+	?GetServiceState@RUsb@@QAEHAAW4TUsbServiceState@@@Z @ 33 NONAME ; int RUsb::GetServiceState(enum TUsbServiceState &)
+	?MessageNotificationCancel@RUsb@@QAEXXZ @ 34 NONAME ; void RUsb::MessageNotificationCancel(void)
+	?BusDrop@RUsb@@QAEHXZ @ 35 NONAME ; int RUsb::BusDrop(void)
+	?GetPersonalityIds@RUsb@@QAEHAAV?$RArray@H@@@Z @ 36 NONAME ; int RUsb::GetPersonalityIds(class RArray<int> &)
+	?GetSupportedLanguages@RUsb@@QAEHIAAV?$RArray@I@@@Z @ 37 NONAME ; int RUsb::GetSupportedLanguages(unsigned int, class RArray<unsigned int> &)
+	?SetCtlSessionMode@RUsb@@QAEHH@Z @ 38 NONAME ; int RUsb::SetCtlSessionMode(int)
+	?StopCancel@RUsb@@QAEXXZ @ 39 NONAME ; void RUsb::StopCancel(void)
+	?Start@RUsb@@QAEXAAVTRequestStatus@@@Z @ 40 NONAME ; void RUsb::Start(class TRequestStatus &)
+	?__DbgFailNext@RUsb@@QAEHH@Z @ 41 NONAME ; int RUsb::__DbgFailNext(int)
+	?GetManufacturerStringDescriptor@RUsb@@QAEHIIAAV?$TBuf@$0IA@@@@Z @ 42 NONAME ; int RUsb::GetManufacturerStringDescriptor(unsigned int, unsigned int, class TBuf<128> &)
+	?MessageNotification@RUsb@@QAEXAAVTRequestStatus@@AAH@Z @ 43 NONAME ; void RUsb::MessageNotification(class TRequestStatus &, int &)
+	?BusClearError@RUsb@@QAEHXZ @ 44 NONAME ; int RUsb::BusClearError(void)
+	?GetProductStringDescriptor@RUsb@@QAEHIIAAV?$TBuf@$0IA@@@@Z @ 45 NONAME ; int RUsb::GetProductStringDescriptor(unsigned int, unsigned int, class TBuf<128> &)
+	?GetDescription@RUsb@@QAEHHAAPAVHBufC16@@@Z @ 46 NONAME ; int RUsb::GetDescription(int, class HBufC16 * &)
+	?__DbgMarkHeap@RUsb@@QAEHXZ @ 47 NONAME ; int RUsb::__DbgMarkHeap(void)
+	?GetDeviceState@RUsb@@QAEHAAW4TUsbDeviceState@@@Z @ 48 NONAME ; int RUsb::GetDeviceState(enum TUsbDeviceState &)
+	?GetCurrentPersonalityId@RUsb@@QAEHAAH@Z @ 49 NONAME ; int RUsb::GetCurrentPersonalityId(int &)
+	?GetOtgDescriptor@RUsb@@QAEHIAAVTOtgDescriptor@@@Z @ 50 NONAME ; int RUsb::GetOtgDescriptor(unsigned int, class TOtgDescriptor &)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/client/EABI/usbman_over_dummylddu.def	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,54 @@
+EXPORTS
+	_Z5panicv @ 1 NONAME
+	_ZN4RUsb10BusRequestEv @ 2 NONAME
+	_ZN4RUsb10StopCancelEv @ 3 NONAME
+	_ZN4RUsb10__DbgAllocEv @ 4 NONAME
+	_ZN4RUsb11StartCancelEv @ 5 NONAME
+	_ZN4RUsb12__DbgMarkEndEi @ 6 NONAME
+	_ZN4RUsb13BusClearErrorEv @ 7 NONAME
+	_ZN4RUsb13BusRespondSrpEv @ 8 NONAME
+	_ZN4RUsb13__DbgFailNextEi @ 9 NONAME
+	_ZN4RUsb13__DbgMarkHeapEv @ 10 NONAME
+	_ZN4RUsb14CancelInterestENS_11TUsbReqTypeE @ 11 NONAME
+	_ZN4RUsb14ClassSupportedEi4TUidRi @ 12 NONAME
+	_ZN4RUsb14GetDescriptionEiRP7HBufC16 @ 13 NONAME
+	_ZN4RUsb14GetDeviceStateER15TUsbDeviceState @ 14 NONAME
+	_ZN4RUsb14RequestSessionEv @ 15 NONAME
+	_ZN4RUsb14__DbgCheckHeapEi @ 16 NONAME
+	_ZN4RUsb15GetCurrentStateER16TUsbServiceState @ 17 NONAME
+	_ZN4RUsb15GetServiceStateER16TUsbServiceState @ 18 NONAME
+	_ZN4RUsb16GetOtgDescriptorEjR14TOtgDescriptor @ 19 NONAME
+	_ZN4RUsb17GetPersonalityIdsER6RArrayIiE @ 20 NONAME
+	_ZN4RUsb17SetCtlSessionModeEi @ 21 NONAME
+	_ZN4RUsb17StateNotificationEjR15TUsbDeviceStateR14TRequestStatus @ 22 NONAME
+	_ZN4RUsb19GetSupportedClassesEiR6RArrayI4TUidE @ 23 NONAME
+	_ZN4RUsb19MessageNotificationER14TRequestStatusRi @ 24 NONAME
+	_ZN4RUsb21GetSupportedLanguagesEjR6RArrayIjE @ 25 NONAME
+	_ZN4RUsb21HostEventNotificationER14TRequestStatusR23TDeviceEventInformation @ 26 NONAME
+	_ZN4RUsb22GetDetailedDescriptionEiRP7HBufC16 @ 27 NONAME
+	_ZN4RUsb22GetPersonalityPropertyEiRm @ 28 NONAME
+	_ZN4RUsb23DeviceStateNotificationEjR15TUsbDeviceStateR14TRequestStatus @ 29 NONAME
+	_ZN4RUsb23GetCurrentPersonalityIdERi @ 30 NONAME
+	_ZN4RUsb23StateNotificationCancelEv @ 31 NONAME
+	_ZN4RUsb24ServiceStateNotificationER16TUsbServiceStateR14TRequestStatus @ 32 NONAME
+	_ZN4RUsb25MessageNotificationCancelEv @ 33 NONAME
+	_ZN4RUsb26GetProductStringDescriptorEjjR4TBufILi128EE @ 34 NONAME
+	_ZN4RUsb27EnableFunctionDriverLoadingEv @ 35 NONAME
+	_ZN4RUsb27HostEventNotificationCancelEv @ 36 NONAME
+	_ZN4RUsb28DisableFunctionDriverLoadingEv @ 37 NONAME
+	_ZN4RUsb29DeviceStateNotificationCancelEv @ 38 NONAME
+	_ZN4RUsb30ServiceStateNotificationCancelEv @ 39 NONAME
+	_ZN4RUsb31GetManufacturerStringDescriptorEjjR4TBufILi128EE @ 40 NONAME
+	_ZN4RUsb4StopER14TRequestStatus @ 41 NONAME
+	_ZN4RUsb4StopEv @ 42 NONAME
+	_ZN4RUsb5StartER14TRequestStatus @ 43 NONAME
+	_ZN4RUsb7BusDropEv @ 44 NONAME
+	_ZN4RUsb7ConnectEv @ 45 NONAME
+	_ZN4RUsb7TryStopER14TRequestStatus @ 46 NONAME
+	_ZN4RUsb8TryStartEiR14TRequestStatus @ 47 NONAME
+	_ZN4RUsbC1Ev @ 48 NONAME
+	_ZN4RUsbC2Ev @ 49 NONAME
+	_ZN4RUsbD1Ev @ 50 NONAME
+	_ZN4RUsbD2Ev @ 51 NONAME
+	_ZNK4RUsb7VersionEv @ 52 NONAME
+
--- a/usbmgmt/usbmgr/usbman/client/group/BLD.INF	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/client/group/BLD.INF	Fri Sep 17 08:40:15 2010 +0300
@@ -29,4 +29,5 @@
 */
 PRJ_TESTMMPFILES
 Usbman_over_dummyusbdi.mmp
+usbman_over_dummyldd.mmp
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/client/group/Usbman_over_dummyldd.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 1997-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:
+* usbman_over_dummyldd.mmp
+* usbman_over_dummyldd.dll USB Client side RUsb Class
+*
+*/
+
+/**
+ @file
+*/
+
+MACRO	__DUMMY_LDD__
+
+target			usbman_over_dummyldd.dll
+CAPABILITY All -Tcb
+targettype		dll
+
+uid			0x1000008d 0x101fe1da
+
+sourcepath		../SRC
+source			RUsb.cpp
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+userinclude		../../server/public 
+userinclude		../traces
+
+library			euser.lib
+
+VENDORID 0x70000001
+
+UNPAGED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/BWINS/usbmanextensionplugindummyu.def	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,8 @@
+EXPORTS
+	??1CUsbmanExtensionPlugin@@UAE@XZ @ 1 NONAME ; CUsbmanExtensionPlugin::~CUsbmanExtensionPlugin(void)
+	?NewL@CUsbmanExtensionPlugin@@SAPAV1@VTUid@@AAVMUsbmanExtensionPluginObserver@@@Z @ 2 NONAME ; class CUsbmanExtensionPlugin * CUsbmanExtensionPlugin::NewL(class TUid, class MUsbmanExtensionPluginObserver &)
+	?RegisterStateObserverL@MUsbmanExtensionPluginObserver@@QAEXAAVMUsbDeviceNotify@@@Z @ 3 NONAME ; void MUsbmanExtensionPluginObserver::RegisterStateObserverL(class MUsbDeviceNotify &)
+	?Observer@CUsbmanExtensionPlugin@@IAEAAVMUsbmanExtensionPluginObserver@@XZ @ 4 NONAME ; class MUsbmanExtensionPluginObserver & CUsbmanExtensionPlugin::Observer(void)
+	?DevUsbcClient@MUsbmanExtensionPluginObserver@@QAEAAVRDevUsbcClient@@XZ @ 5 NONAME ; class RDevUsbcClient & MUsbmanExtensionPluginObserver::DevUsbcClient(void)
+	??0CUsbmanExtensionPlugin@@IAE@AAVMUsbmanExtensionPluginObserver@@@Z @ 6 NONAME ; CUsbmanExtensionPlugin::CUsbmanExtensionPlugin(class MUsbmanExtensionPluginObserver &)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/EABI/usbmanextensionplugindummyu.def	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,12 @@
+EXPORTS
+	_ZN22CUsbmanExtensionPlugin4NewLE4TUidR30MUsbmanExtensionPluginObserver @ 1 NONAME
+	_ZN22CUsbmanExtensionPlugin8ObserverEv @ 2 NONAME
+	_ZN22CUsbmanExtensionPluginC2ER30MUsbmanExtensionPluginObserver @ 3 NONAME
+	_ZN22CUsbmanExtensionPluginD0Ev @ 4 NONAME
+	_ZN22CUsbmanExtensionPluginD1Ev @ 5 NONAME
+	_ZN22CUsbmanExtensionPluginD2Ev @ 6 NONAME
+	_ZN30MUsbmanExtensionPluginObserver13DevUsbcClientEv @ 7 NONAME
+	_ZN30MUsbmanExtensionPluginObserver22RegisterStateObserverLER16MUsbDeviceNotify @ 8 NONAME
+	_ZTI22CUsbmanExtensionPlugin @ 9 NONAME
+	_ZTV22CUsbmanExtensionPlugin @ 10 NONAME
+
--- a/usbmgmt/usbmgr/usbman/extensionplugin/group/UsbManExtensionPlugin.mmp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/group/UsbManExtensionPlugin.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -39,4 +39,5 @@
 LIBRARY 		euser.lib
 LIBRARY 		ecom.lib
 
+
 //macro __USB_LOG_TO_RDEBUG__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/group/UsbManExtensionPluginDummy.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,43 @@
+/*
+* 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:
+* usbmanextensionplugindummy.dll Base DLL for UsbMan extension plugins
+* Plugins to UsbMan.
+*
+*/
+
+/**
+ @file
+ @internalComponent
+*/
+
+TARGET			usbmanextensionplugindummy.dll
+TARGETTYPE		dll
+// UID2 = 0x1000008d for static interface DLLs.
+// UID3 = unique for UsbMan system
+UID 			0x1000008d 0x101f9067
+VENDORID		0x70000001
+CAPABILITY CommDD NetworkControl NetworkServices LocalServices ProtServ
+
+SOURCEPATH		../src
+SOURCE			CUsbManExtensionPlugin.cpp
+SOURCE			MUsbManExtensionPluginObserver.cpp
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+LIBRARY 		euser.lib
+LIBRARY 		ecom.lib
+MACRO 			__DUMMY_LDD__
+
+//macro __USB_LOG_TO_RDEBUG__
--- a/usbmgmt/usbmgr/usbman/extensionplugin/group/bld.inf	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/group/bld.inf	Fri Sep 17 08:40:15 2010 +0300
@@ -19,5 +19,11 @@
 ../public/CUsbManExtensionPlugin.h				SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(cusbmanextensionplugin.h)
 ../public/MUsbManExtensionPluginObserver.h		SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(musbmanextensionpluginobserver.h)
 
+PRJ_TESTEXPORTS
+../inc/CUsbManExtensionPluginDummy.h				SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(cusbmanextensionplugindummy.h)
+../inc/MUsbManExtensionPluginObserverDummy.h		SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(musbmanextensionpluginobserverdummy.h)
+
 PRJ_MMPFILES
 UsbManExtensionPlugin.mmp
+PRJ_TESTMMPFILES
+UsbManExtensionPluginDummy.mmp
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/inc/CUsbManExtensionPluginDummy.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,87 @@
+/*
+* 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:
+* Abstract base class for usbman extension plugins.
+*
+*/
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef USBMANEXTENSIONPLUGINDUMMY_H
+#define USBMANEXTENSIONPLUGINDUMMY_H
+
+#include <e32base.h>
+#include "dummyusblddapi.h"
+
+class MUsbmanExtensionPluginObserver;
+class MUsbDeviceNotify;
+
+/**
+The UID of the Usbman Extension Plugin interface.
+*/
+const TInt KUsbmanExtensionPluginInterfaceUid = 0x10208DD6;
+
+class CUsbmanExtensionPlugin : public CBase
+	{
+public:
+	/** 
+	Constructor.
+	@param aImplementationUid The UID of the implementation.
+	@param aObserver The observer of the plugin.
+	*/
+	IMPORT_C static CUsbmanExtensionPlugin* NewL(const TUid aImplementationUid, 
+		MUsbmanExtensionPluginObserver& aObserver);
+
+	/** Destructor. */
+	IMPORT_C ~CUsbmanExtensionPlugin();
+
+public:
+	/**
+	Called by Usbman server to get a pointer to an object which implements the 
+	ExtensionPlugin interface with UID aUid. This is a mechanism for allowing future 
+	change to the plugin API without breaking BC in existing (non-updated) 
+	plugins.
+	*/
+	virtual TAny* GetInterface(TUid aUid) = 0;
+
+protected:
+	/** 
+	Constructor.
+	@param aObserver The observer of the plugin.
+	*/
+	IMPORT_C CUsbmanExtensionPlugin(MUsbmanExtensionPluginObserver& aObserver);
+
+protected:
+	/**
+	Accessor for the observer.
+	@return The observer.
+	*/
+	IMPORT_C MUsbmanExtensionPluginObserver& Observer();
+
+private: // owned
+	/**
+	UID set by ECOM when the instance is created. Used when the instance is 
+	destroyed.
+	*/
+	TUid iInstanceId;
+
+private: // unowned
+	MUsbmanExtensionPluginObserver& iObserver;
+	};
+
+#endif // USBMANEXTENSIONPLUGINDUMMY_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/inc/MUsbManExtensionPluginObserverDummy.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* 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:
+* Interface presented by Usbman down to the concrete Usbman Extension Plugins.
+*
+*/
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef USBMANEXTENSIONPLUGINOBSERVERDUMMY_H
+#define USBMANEXTENSIONPLUGINOBSERVERDUMMY_H
+
+#include <e32base.h>
+#include "dummyusblddapi.h"
+
+class MUsbDeviceNotify;
+
+class MUsbmanExtensionPluginObserver
+	{
+
+public:
+	/**
+	Called by the plugin to get a RDevUsbcClient handle from its owner
+	@return RDevUsbcClient handle
+	*/
+	IMPORT_C RDevUsbcClient& DevUsbcClient();
+
+	/**
+	Called by the plugin to register for device/service state changes from its owner
+	@param aObserver The observer to register for state changes
+	*/
+	IMPORT_C void RegisterStateObserverL(MUsbDeviceNotify& aObserver);
+
+private:
+	/**
+	@see DevUsbcClient.
+	*/
+	virtual RDevUsbcClient& MuepoDoDevUsbcClient() = 0;
+
+	/**
+	@see RegisterStateObserverL.
+	*/
+	virtual void MuepoDoRegisterStateObserverL(MUsbDeviceNotify& aObserver) = 0;
+	};
+
+#endif // USBMANEXTENSIONPLUGINOBSERVERDUMMY_H
--- a/usbmgmt/usbmgr/usbman/extensionplugin/src/CUsbManExtensionPlugin.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/src/CUsbManExtensionPlugin.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -20,9 +20,13 @@
  @file
  @internalComponent
 */
-
+#ifndef __DUMMY_LDD__
 #include "cusbmanextensionplugin.h"
 #include "musbmanextensionpluginobserver.h"
+#else
+#include <cusbmanextensionplugindummy.h>
+#include <musbmanextensionpluginobserverdummy.h>
+#endif
 #include <ecom/ecom.h>
 
 EXPORT_C CUsbmanExtensionPlugin::~CUsbmanExtensionPlugin()
--- a/usbmgmt/usbmgr/usbman/extensionplugin/src/MUsbManExtensionPluginObserver.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/extensionplugin/src/MUsbManExtensionPluginObserver.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -21,8 +21,11 @@
  @publishedPartner
  @released
 */
-
+#ifndef __DUMMY_LDD__
 #include "musbmanextensionpluginobserver.h"
+#else
+#include "musbmanextensionpluginobserverdummy.h"
+#endif
 
 EXPORT_C RDevUsbcClient& MUsbmanExtensionPluginObserver::DevUsbcClient()
 	{
--- a/usbmgmt/usbmgr/usbman/server/INC/CUsbDevice.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/INC/CUsbDevice.h	Fri Sep 17 08:40:15 2010 +0300
@@ -30,10 +30,18 @@
 #include <usbstates.h>
 #include <musbclasscontrollernotify.h>
 #include <ecom/ecom.h>
+#ifndef __DUMMY_LDD__
 #include <d32usbc.h>
+#else
+#include "dummyusblddapi.h"
+#endif
 #include <e32std.h>
 #include <usb/usblogger.h>
+#ifndef __DUMMY_LDD__
 #include <musbmanextensionpluginobserver.h>
+#else
+#include <musbmanextensionpluginobserverdummy.h>
+#endif
 
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/INC/CUsbDummyClassControllerLdd.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,89 @@
+/**
+* Copyright (c) 1997-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:
+* Adheres to the UsbMan USB Class Controller API.
+* 
+*
+*/
+
+
+
+/**
+ @file
+*/
+
+#ifndef CUSBDUMMYCLASSCONTROLLERLDD_H__
+#define CUSBDUMMYCLASSCONTROLLERLDD_H__
+#include <e32std.h>
+#include <e32property.h>
+#include <cusbclasscontrollerplugin.h>
+
+NONSHARABLE_CLASS(CUsbDummyClassControllerLdd) : public CUsbClassControllerPlugIn
+
+	{
+public:
+	static CUsbDummyClassControllerLdd* NewL(MUsbClassControllerNotify& aOwner, TUint aIndex);
+	~CUsbDummyClassControllerLdd();
+
+private:
+	CUsbDummyClassControllerLdd(MUsbClassControllerNotify& aOwner, TUint aIndex);
+	CUsbDummyClassControllerLdd(MUsbClassControllerNotify& aOwner,TUint aIndex, TInt aPriority);
+	void ConstructL();
+
+private: // from CActive
+	void RunL();
+	void DoCancel();
+	TInt RunError(TInt aError);
+
+private: // from CUsbClassControllerBase
+	void Start(TRequestStatus& aStatus);
+	void Stop(TRequestStatus& aStatus);
+	void GetDescriptorInfo(TUsbDescriptor& aDescriptorInfo) const;
+
+private:
+	enum TSynchronicity 
+		{
+		EUndefined = 0,
+		ESynchronous,
+		EAsynchronous,
+		ENever,
+		};
+	
+	NONSHARABLE_STRUCT( TBehaviour )
+	/** 
+	 * Defines the behaviour for a startup or a shutdown.
+	 */
+		{
+		TSynchronicity iSynchronicity;
+		TTimeIntervalMicroSeconds32 iDelay;
+		TInt iErrorCode;
+		};
+
+private: // utility
+	void GetConfig();
+	void DoGetConfigL();
+
+private: // unowned
+	TRequestStatus* iReportStatus;
+
+private: // owned
+	RTimer iTimer;
+	const TUint iIndex;
+	RProperty iProperty;
+	TBool     iPropertyExist;
+	TBehaviour iStartupBehaviour;
+	TBehaviour iShutdownBehaviour;
+	};
+
+#endif // CUSBDUMMYCLASSCONTROLLER_H__
--- a/usbmgmt/usbmgr/usbman/server/INC/CUsbOtg.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/INC/CUsbOtg.h	Fri Sep 17 08:40:15 2010 +0300
@@ -26,7 +26,12 @@
 #ifndef __CUSBOTG_H__
 #define __CUSBOTG_H__
 
+#ifndef __OVER_DUMMYUSBDI__
 #include <d32otgdi.h>
+#else
+#include <usbhost/dummyotgdi/d32otgdi.h>
+#endif
+
 #include <d32otgdi_errors.h>
 #include <e32std.h>
 #include <usb/usblogger.h>
--- a/usbmgmt/usbmgr/usbman/server/INC/cusbotgwatcher.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/INC/cusbotgwatcher.h	Fri Sep 17 08:40:15 2010 +0300
@@ -27,7 +27,13 @@
 #define __CUSBOTGWATCHER_H__
 
 #include <e32def.h>
+
+#ifndef __OVER_DUMMYUSBDI__
 #include <d32otgdi.h>
+#else
+#include <usbhost/dummyotgdi/d32otgdi.h>
+#endif
+
 #include <e32property.h> //Publish & Subscribe header
 
 class MUsbOtgObserver;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/INC/featurediscovery.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,34 @@
+/**
+* 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:
+* .
+* 
+*
+*/
+
+#ifndef FEATUREDISCOVERY_H_
+#define FEATUREDISCOVERY_H_
+class CFeatureDiscovery : public CBase
+    {
+    public:
+
+        
+       inline static TBool IsFeatureSupportedL( TUid aFeature )
+           {
+               return true;
+           }
+
+    } ;
+
+#endif /* FEATUREDISCOVERY_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/SRC/20031D6F.rss	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 1997-2009 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:
+*
+*/
+
+#include <ecom/registryinfo.rh>
+
+RESOURCE REGISTRY_INFO theInfo
+	{
+	dll_uid = 0x20031D6F;
+	interfaces =
+		{
+		INTERFACE_INFO
+			{
+			interface_uid = 0x101fbf21;
+			implementations =
+				{
+				IMPLEMENTATION_INFO
+					{
+					implementation_uid = 0x20031D70;
+					version_no = 1;
+					display_name = "DUMMY";
+					default_data = "";
+					opaque_data = "";
+					}
+				};
+			}
+		};
+	}
--- a/usbmgmt/usbmgr/usbman/server/SRC/CUsbDevice.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbDevice.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -23,7 +23,6 @@
 #include <cusbclasscontrolleriterator.h>
 #include <cusbclasscontrollerbase.h>
 #include <cusbclasscontrollerplugin.h>
-#include <cusbmanextensionplugin.h>
 #include <bafl/sysutil.h>
 #include <usb/usblogger.h>
 #include <e32svr.h>
@@ -33,6 +32,11 @@
 #include <barsc.h>
 #include <barsread.h>
 #include <bautils.h>
+#ifndef __DUMMY_LDD__
+#include <cusbmanextensionplugin.h>
+#else
+#include <cusbmanextensionplugindummy.h>
+#endif
 #include <e32property.h> //Publish & Subscribe header
 #ifdef USE_DUMMY_CLASS_CONTROLLER
 #include "CUsbDummyClassController.h"
@@ -182,9 +186,11 @@
 #ifndef __OVER_DUMMYUSBDI__	
 #ifndef __WINS__
 	OstTrace0( TRACE_NORMAL, CUSBDEVICE_CONSTRUCTL, "CUsbDevice::ConstructL; About to load LDD" );
-	
+#ifndef __DUMMY_LDD__	
 	TInt err = User::LoadLogicalDevice(KUsbLDDName);
-
+#else
+	TInt err = KErrNone;
+#endif
 	if (err != KErrNone && err != KErrAlreadyExists)
 		{
         OstTrace1( TRACE_NORMAL, CUSBDEVICE_CONSTRUCTL_DUP10, "CUsbDevice::ConstructL;err=%d", err );
@@ -291,10 +297,12 @@
 
 	for (TInt i=0; i<implementations.Count(); i++)
 		{
+#ifndef __DUMMY_LDD__
 		CUsbmanExtensionPlugin* plugin = CUsbmanExtensionPlugin::NewL(implementations[i]->ImplementationUid(), *this);
 		CleanupStack::PushL(plugin);
 		iExtensionPlugins.AppendL(plugin); // transfer ownership to iExtensionPlugins
 		CleanupStack::Pop(plugin);
+#endif
 		OstTrace1( TRACE_NORMAL, CUSBDEVICE_INSTANTIATEEXTENSIONPLUGINSL_DUP1, 
 		        "CUsbDevice::InstantiateExtensionPluginsL;Added extension plugin with UID 0x%08x", 
 		        implementations[i]->ImplementationUid().iUid );
--- a/usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassController.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassController.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -269,7 +269,7 @@
 
 	// Always use dummy.ini. The entity setting up the test is responsible for 
 	// copying the correct file to c:\\dummy.ini. The first found 
-	// by FindByDir will be used. TODO: enforce c:\\.
+	// by FindByDir will be used.
 	TRAPD(err, DoGetConfigL());
 	if ( err != KErrNone )
 		{
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassControllerLdd.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,260 @@
+/*
+* Copyright (c) 1997-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:
+* Implements part of UsbMan USB Class Framework.
+*
+*/
+
+/**
+ @file
+*/
+
+#include <usb_std.h>
+#include <cusbclasscontrolleriterator.h>
+#include <musbclasscontrollernotify.h>
+#include "CUsbDummyClassControllerLdd.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "CUsbDummyClassControllerLddTraces.h"
+#endif
+
+
+
+const TInt32 KDummyLDDTestServUid = 0x20031D88;
+const TUint KCCErrorTestStepPublishedDeviceEventKey = 0x20031D6F;
+// Panic codes
+enum
+	{
+	// Bad value for the iSynchronicity member.
+	EDummyPanicBadSynchronicity = 0,
+	
+	// Used for environment errors we do not handle.
+	EDummyPanicUnhandledError = 1,
+	
+	// Used for bad iStatus and other state errors.
+	EDummyPanicBadState = 2,
+	
+	// Error reading ini file.
+	EDummyPanicBadIniFile = 3,
+	
+	// We already have our async request active.
+	EDummyPanicAlreadyActive = 4,
+	
+	// We already have a request outstanding from the device class. 
+	EDummyPanicOutstandingRequestFromDevice = 5,
+	
+	// Attempt to call Start() when in illegal state
+	EDummyPanicBadApiCallStart = 6,
+	
+	// Attempt to call Stop() when in illegal state
+	EDummyPanicBadApiCallStop = 7,
+	};
+
+const TInt KDummyClassPriority = 1;
+
+
+
+CUsbDummyClassControllerLdd* CUsbDummyClassControllerLdd::NewL(
+		MUsbClassControllerNotify& aOwner,
+		TUint aIndex)
+
+/**
+ * Constructs a CUsbDummyClassControllerLdd object.
+ *
+ * @param aOwner USB Device that owns and manages the class
+ * @param aIndex The index number of the instance
+ * @return Ownership of a new CUsbDummyClassControllerLdd object
+ */
+
+	{
+	CUsbDummyClassControllerLdd* self = new(ELeave) CUsbDummyClassControllerLdd(aOwner, aIndex);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+
+CUsbDummyClassControllerLdd::CUsbDummyClassControllerLdd(
+		MUsbClassControllerNotify& aOwner,
+		TUint aIndex)
+/**
+ * Constructor.
+ *
+ * @param aOwner USB Device that owns and manages the class
+ * @param aIndex The index number of the instance
+ */
+ :	CUsbClassControllerPlugIn(aOwner, KDummyClassPriority),
+	iIndex(aIndex)
+	{
+	iState = EUsbServiceIdle; // needs explicit initialisation as non-zero
+    iPropertyExist = EFalse;
+	}
+
+CUsbDummyClassControllerLdd::CUsbDummyClassControllerLdd(
+		MUsbClassControllerNotify& aOwner,
+		TUint aIndex, TInt aPriority)
+		
+/**
+ * Constructor.
+ *
+ * @param aOwner USB Device that owns and manages the class
+ * @param aIndex The index number of the instance
+ * @param aPriority a startup priority for the class controller
+ */		
+ : 	CUsbClassControllerPlugIn(aOwner, aPriority),
+ 	iIndex(aIndex)
+ 	{
+ 	iState = EUsbServiceIdle; // needs explicit initialisation as non-zero
+    iPropertyExist = EFalse;
+ 	}
+		
+void CUsbDummyClassControllerLdd::ConstructL()
+/**
+ * Method to perform second phase construction.
+ */
+	{
+    OstTraceFunctionEntry0( CUSBDUMMYCLASSCONTROLLERLDD_CONSTRUCTL_ENTRY );
+
+	OstTraceFunctionExit0( CUSBDUMMYCLASSCONTROLLERLDD_CONSTRUCTL_EXIT );
+	}
+
+CUsbDummyClassControllerLdd::~CUsbDummyClassControllerLdd()
+/**
+ * Destructor.
+ */
+	{
+    OstTraceFunctionEntry0( CUSBDUMMYCLASSCONTROLLERLDD_CUSBDUMMYCLASSCONTROLLERLDD_ENTRY );
+    
+	Cancel();
+    iPropertyExist = EFalse;
+	OstTraceFunctionExit0( CUSBDUMMYCLASSCONTROLLERLDD_CUSBDUMMYCLASSCONTROLLERLDD_EXIT );
+	}
+
+void CUsbDummyClassControllerLdd::DoGetConfigL()
+/**
+ * Reads the config from the ini file.
+ */
+	{
+	
+
+	}
+
+void CUsbDummyClassControllerLdd::GetConfig()
+/**
+ * Reads the config from the ini file.
+ * Note that this is assumed to succeed. Any failure will break the test and 
+ * it's much cleaner to panic out of the test entirely rather than leave it to 
+ * the user to figure out what's gone wrong.
+ */
+	{
+	
+
+
+	}
+
+void CUsbDummyClassControllerLdd::Start(TRequestStatus& aStatus)
+/**
+ * Called by UsbMan to start this class.
+ *
+ * @param aStatus Will be completed with success or failure.
+ */
+	{
+    OstTraceFunctionEntry0( CUSBDUMMYCLASSCONTROLLERLDD_START_ENTRY );
+    
+    CUsbClassControllerIterator *iterator = NULL;
+    TRAPD(ret,iterator = Owner().UccnGetClassControllerIteratorL());
+    if(ret == KErrNone)
+    	{
+    	delete iterator;
+    	}
+    TRequestStatus* tmp = &aStatus;
+	User::RequestComplete(tmp, KErrNone);
+	if(!iPropertyExist)
+        {
+          TInt err = iProperty.Attach(TUid::Uid(KDummyLDDTestServUid),
+                            KCCErrorTestStepPublishedDeviceEventKey);
+     
+
+        iProperty.Subscribe(iStatus);
+        SetActive();
+        iPropertyExist = ETrue;
+        }
+	
+	OstTraceFunctionExit0( CUSBDUMMYCLASSCONTROLLERLDD_START_EXIT );
+	}
+
+void CUsbDummyClassControllerLdd::Stop(TRequestStatus& aStatus)
+/**
+ * Called by UsbMan to stop this class.
+ *
+ * @param aStatus Will be completed with success or failure.
+ */
+	{
+    OstTraceFunctionEntry0( CUSBDUMMYCLASSCONTROLLERLDD_STOP_ENTRY );
+    
+    TRequestStatus* tmp = &aStatus;
+	User::RequestComplete(tmp, KErrNone);
+			
+	OstTraceFunctionExit0( CUSBDUMMYCLASSCONTROLLERLDD_STOP_EXIT );
+	}
+
+void CUsbDummyClassControllerLdd::GetDescriptorInfo(TUsbDescriptor& aDescriptorInfo) const
+/**
+ * Returns information about the interfaces supported by this class.
+ *
+ * @param aDescriptorInfo Will be filled in with interface information.
+ */
+	{
+	aDescriptorInfo.iNumInterfaces = 0;
+	aDescriptorInfo.iLength = 0;
+	}
+
+void CUsbDummyClassControllerLdd::RunL()
+/**
+ * Standard active object RunL. 
+ */
+	{
+         OstTraceFunctionEntry0( CUSBDUMMYCLASSCONTROLLERLDD_RUNL_ENTRY );
+    TInt num;
+    iProperty.Get(num);
+    if(num < 0)
+        User::Leave(num);
+    iProperty.Subscribe(iStatus);
+    SetActive();
+	OstTraceFunctionExit0( CUSBDUMMYCLASSCONTROLLERLDD_RUNL_EXIT );
+	}
+
+void CUsbDummyClassControllerLdd::DoCancel()
+/**
+ * Standard active object cancellation function. 
+ */
+	{
+    iProperty.Cancel();
+	}
+
+TInt CUsbDummyClassControllerLdd::RunError(TInt aError)
+/**
+ * Standard active object error-handling function. 
+ *
+ * Should return KErrNone to avoid an active scheduler panic. This function
+ * should never be called as there is another mechanism for catching errors.
+ */
+	{
+    Owner().UccnError(KErrNone);
+    return KErrNone;
+	}
+
+//
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbDummyClassImpCollection.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,34 @@
+/*
+* 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:
+*
+*/
+
+#include <e32base.h>
+#include <e32std.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+#include "CUsbDummyClassControllerLdd.h"
+// Define the private interface UIDs
+const TImplementationProxy UsbCCImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY(0x20031D70, CUsbDummyClassControllerLdd::NewL),
+    };
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+    {
+    aTableCount = sizeof(UsbCCImplementationTable) / sizeof(TImplementationProxy);
+
+    return UsbCCImplementationTable;
+    }
--- a/usbmgmt/usbmgr/usbman/server/SRC/CUsbOtg.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbOtg.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -34,8 +34,10 @@
 #endif
 
 
+#ifndef __OVER_DUMMYUSBDI__
 //Name used in call to User::LoadLogicalDevice/User::FreeLogicalDevice
 _LIT(KUsbOtgLDDName,"otgdi");
+#endif
 
 
 
@@ -145,6 +147,7 @@
 		
 		}
 
+#ifndef __OVER_DUMMYUSBDI__
 	OstTrace0( TRACE_NORMAL, CUSBOTG_CUSBOTG_DUP13, "CUsbOtg::~CUsbOtg; Freeing logical device" );
 	
 	TInt err = User::FreeLogicalDevice(KUsbOtgLDDName);
@@ -155,6 +158,7 @@
 		OstTrace1( TRACE_NORMAL, CUSBOTG_CUSBOTG_DUP14, "CUsbOtg::~CUsbOtg;     User::FreeLogicalDevice returned %d", err );
 		
 		}
+#endif
 	
 	iCriticalSection.Close();
 	OstTraceFunctionExit0( CUSBOTG_CUSBOTG_DES_EXIT );
@@ -179,6 +183,7 @@
 	{
 	OstTraceFunctionEntry0( CUSBOTG_CONSTRUCTL_ENTRY );
 	
+#ifndef __OVER_DUMMYUSBDI__
 	OstTrace0( TRACE_NORMAL, CUSBOTG_CONSTRUCTL, "CUsbOtg::ConstructL; About to open LDD" );
 	
 	iLastError = User::LoadLogicalDevice(KUsbOtgLDDName);
@@ -190,6 +195,8 @@
             User::Leave(iLastError);
             }
 		}
+#endif
+	
 	OstTrace0( TRACE_NORMAL, CUSBOTG_CONSTRUCTL_DUP3, "CUsbOtg::ConstructL; About to open RUsbOtgDriver" );
 	
 	iLastError = iOtgDriver.Open();
--- a/usbmgmt/usbmgr/usbman/server/SRC/CUsbServer.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbServer.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -80,7 +80,6 @@
 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
 	delete iUsbHost;
 	
-#ifndef __OVER_DUMMYUSBDI__
 	// Check that this is A-Device
 	OstTrace0( TRACE_NORMAL, CUSBSERVER_CUSBSERVER, "CUsbServer::~CUsbServer; Checking Id-Pin state..." );
 	TInt value = 0;
@@ -126,11 +125,9 @@
 		{
 		OstTraceExt2( TRACE_NORMAL, CUSBSERVER_CUSBSERVER_DUP7, "CUsbServer::~CUsbServer;No Id-Pin is found or an error occured: err = %d, value = %d", err, value );
 		}
-	
+
 	delete iUsbOtg;
-#endif
 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
-
 	OstTraceFunctionExit0( CUSBSERVER_CUSBSERVER_DES_EXIT );
 	}
 
@@ -162,10 +159,8 @@
 	iShutdownTimer->ConstructL(); 
 
 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
-#ifndef __OVER_DUMMYUSBDI__
 	iUsbOtg = CUsbOtg::NewL();
 	iUsbOtg->StartL();
-#endif
 #endif // SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
 
 	iUsbDevice = CUsbDevice::NewL(*this);
--- a/usbmgmt/usbmgr/usbman/server/SRC/CUsbSession.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/SRC/CUsbSession.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -95,10 +95,8 @@
 	iUsbServer->Device().DeRegisterObserver(*this);
 
 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
-#ifndef __OVER_DUMMYUSBDI__
 	OstTrace1( TRACE_NORMAL, CUSBSESSION_CUSBSESSION_DUP1, "CUsbSession::~CUsbSession;About to Otg().DeRegisterObserver(%08x)", this );
 	iUsbServer->Otg().DeRegisterObserver(*this);
-#endif
 
 	OstTrace1( TRACE_NORMAL, CUSBSESSION_CUSBSESSION_DUP2, "CUsbSession::~CUsbSession;About to Host().DeRegisterObserver(%08x)", this );
 	iUsbServer->Host().DeregisterObserver(*this);
@@ -147,10 +145,8 @@
 	iUsbServer->Device().RegisterObserverL(*this);
 
 #ifdef SYMBIAN_ENABLE_USB_OTG_HOST_PRIV
-#ifndef __OVER_DUMMYUSBDI__
 	OstTrace0( TRACE_NORMAL, CUSBSESSION_CREATEL_DUP1, "CUsbSession::CreateL;Registering OTG Observer" );
 	iUsbServer->Otg().RegisterObserverL(*this);
-#endif
 
 	OstTrace0( TRACE_NORMAL, CUSBSESSION_CREATEL_DUP2, "CUsbSession::CreateL;Registering HOST Observer" );
 	iUsbServer->Host().RegisterObserverL(*this);
@@ -582,7 +578,6 @@
 	case EUsbCancelMessageObserver:
 		ret = DeRegisterMsgObserver();
 		break;
-#ifndef __OVER_DUMMYUSBDI__
 	case EUsbBusRequest:
 		ret = BusRequest();
 		break;
@@ -595,14 +590,6 @@
 	case EUsbBusDrop:
 		ret = BusDrop();
 		break;
-#else
-	case EUsbBusRequest:
-	case EUsbBusRespondSrp:
-	case EUsbBusClearError:
-	case EUsbBusDrop:
-		ret = KErrNone;
-		break;
-#endif
 	case EUsbRegisterHostObserver:
 		ret = RegisterHostObserver(aMessage, complete);
 		break;
--- a/usbmgmt/usbmgr/usbman/server/SRC/usbmancenrepmanager.cpp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/SRC/usbmancenrepmanager.cpp	Fri Sep 17 08:40:15 2010 +0300
@@ -19,7 +19,11 @@
 #include <usb/usblogger.h>
 #ifdef SYMBIAN_FEATURE_MANAGER
     #include <featureuids.h>
-    #include <featdiscovery.h>
+    #ifndef __DUMMY_LDD__
+        #include <featdiscovery.h>
+    #else
+        #include "featurediscovery.h"
+    #endif
 #endif
 #include "usbmanprivatecrkeys.h"
 #include "UsbSettings.h"
--- a/usbmgmt/usbmgr/usbman/server/group/BLD.INF	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/group/BLD.INF	Fri Sep 17 08:40:15 2010 +0300
@@ -62,6 +62,8 @@
 // Special USBSVR with no class controllers except 3 instances of the dummy 
 // class controller, for GT171 tests.
 t_Usbman_dummyCC.mmp
+usbsvr_dummyldd.mmp
+UsbDummyClassControllerLdd.mmp
 
 #if defined(SYMBIAN_ENABLE_USB_OTG_HOST)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/group/UsbDummyClassControllerLdd.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 1997-2009 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:
+* usbclassconstroller.mmp
+* USBClassController.dll USB Class Controller Plugin Framework
+*
+*/
+
+/**
+ @file
+*/
+
+
+target			msdummyclasscontroller.dll //Recommended unpaged
+
+targettype		plugin
+CAPABILITY CommDD NetworkControl NetworkServices LocalServices ProtServ
+UID 0x10009d8d 0x20031D6F
+VENDORID 0x70000001
+
+userinclude		../inc 
+userinclude     ../../../inifile/inc 
+userinclude     ../traces_UsbDummyClassControllerLdd
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+sourcepath		../SRC
+source			CUsbDummyClassControllerLdd.cpp
+source			CUsbDummyClassImpCollection.cpp 
+
+start resource 20031D6F.rss
+target msdummyclasscontroller.rsc
+end
+
+
+library			euser.lib
+LIBRARY			usbclasscontroller.lib
+LIBRARY			efsrv.lib
+LIBRARY			bafl.lib
+
+
+VENDORID 0x70000001
--- a/usbmgmt/usbmgr/usbman/server/group/t_Usbman_dummyCC.mmp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/group/t_Usbman_dummyCC.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 1997-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"
@@ -17,19 +17,50 @@
 * is used for GT171 automated tests.
 *
 */
+target t_usbman_dummycc.exe
+CAPABILITY CommDD NetworkControl NetworkServices LocalServices ProtServ
 
-target t_usbman_dummycc.exe
+targettype exe
+
+uid 0x0 0x101fe1db
+VENDORID 0x70000001
 
-#include "usbsvrbase.mmp"
 
-userinclude		../../../inifile/inc
+userinclude     ../INC
+userinclude		../public
+userinclude		../../../host/fdf/production/client/public 
+userinclude		../../../inifile/inc 
+userinclude     ../traces_t_Usbman_dummyCC 
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
 sourcepath		../SRC
+source			UsbSvr.cpp
+source			CUsbServer.cpp
+source			CUsbSession.cpp
+source			CUsbScheduler.cpp
+source			CUsbDevice.cpp
+source			CUsbDeviceStateWatcher.cpp
+source			UsbUtils.cpp
+source			CPersonality.cpp
+source          usbmancenrepmanager.cpp
 source			CUsbDummyClassController.cpp
 
 sourcepath		../../../inifile/src
 source			inifile.cpp
 
+library			euser.lib
+library			usbclasscontroller.lib
+library			ecom.lib
+library			efsrv.lib
+library			bafl.lib
+library			usbmanextensionplugin.lib
+library			sysutil.lib
+library         centralrepository.lib 
+
+#ifdef SYMBIAN_FEATURE_MANAGER
+library         featdiscovery.lib
+#endif
+
 // This is the crucial difference between this and usbsvr.mmp.
 MACRO USE_DUMMY_CLASS_CONTROLLER
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/group/usbsvr_dummyldd.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,65 @@
+/*
+* 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:
+* usbsvr_dummyldd.mmp
+* usbsvr_over_dummyldd.exe USB server with USB Host and OTG support
+*
+*/
+
+/**
+ @file
+*/
+
+
+
+MACRO	__DUMMY_LDD__
+CAPABILITY CommDD NetworkControl NetworkServices LocalServices ProtServ
+target usbsvr_over_dummyldd.exe
+targettype exe
+
+UID 0 0x101fe1db
+
+sourcepath		../SRC
+source			UsbSvr.cpp
+source			CUsbServer.cpp
+source			CUsbSession.cpp
+source			CUsbScheduler.cpp
+source			CUsbDevice.cpp
+source			CUsbDeviceStateWatcher.cpp
+source			UsbUtils.cpp
+source			CPersonality.cpp
+source          	usbmancenrepmanager.cpp
+
+userinclude		../INC
+userinclude		../public
+userinclude		../../../host/fdf/production/client/public 
+userinclude		../traces
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+library			euser.lib
+library			usbclasscontroller.lib
+library			ecom.lib
+library			efsrv.lib
+library			bafl.lib
+library			usbmanextensionplugindummy.lib
+library			sysutil.lib
+library         centralrepository.lib 
+
+#ifdef SYMBIAN_FEATURE_MANAGER
+library         featdiscovery.lib
+#endif
+library 		dummyusblddapi.lib
+library			usbman_over_dummyldd.lib
+
+UNPAGED
--- a/usbmgmt/usbmgr/usbman/server/group/usbsvrotg_dummyusbdi.mmp	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/group/usbsvrotg_dummyusbdi.mmp	Fri Sep 17 08:40:15 2010 +0300
@@ -37,9 +37,8 @@
 source			cusbotgwatcher.cpp
 source			cusbhost.cpp
 source			cusbhostwatcher.cpp
-//source			CUsbDummyClassController.cpp
-//source			INIFILE.CPP
 
+library			dummyotgdi.lib
 library			usbhoststack_over_dummyusbdi.lib
 
 UNPAGED
--- a/usbmgmt/usbmgr/usbman/server/public/UsbClassUids.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/public/UsbClassUids.h	Fri Sep 17 08:40:15 2010 +0300
@@ -41,4 +41,5 @@
 const TUid KUSBMSUid={0x10204bbc};
 
 
+const TUid KUSBDUMMYid={0x20031D70}
 #endif // USBCLASSUIDS_H
--- a/usbmgmt/usbmgr/usbman/server/public/rusb.h	Thu Sep 02 22:23:37 2010 +0300
+++ b/usbmgmt/usbmgr/usbman/server/public/rusb.h	Fri Sep 17 08:40:15 2010 +0300
@@ -35,10 +35,14 @@
 
 const TInt KUsbMaxSupportedPersonalities = 64;	// Max number of supported personalities
 
-#ifndef __OVER_DUMMYUSBDI__
+#ifdef __OVER_DUMMYUSBDI__ 
+_LIT(KUsbServerName, "!usbman_over_dummyusbdi");
+#else
+#ifdef  __DUMMY_LDD__
+_LIT(KUsbServerName, "!usbman_over_dummyldd");
+#else
 _LIT(KUsbServerName, "!usbman");
-#else
-_LIT(KUsbServerName, "!usbman_over_dummyusbdi");
+#endif
 #endif
 
 enum TUsbMessages
@@ -109,11 +113,16 @@
 
 #else
 
-#ifndef __OVER_DUMMYUSBDI__
-_LIT(KUsbmanImg, "z:\\system\\programs\\usbsvr.exe");
+#ifdef __OVER_DUMMYUSBDI__ 
+_LIT(KUsbmanImg, "z:\\system\\programs\\usbsvr_over_dummyusbdi.exe");
 #else
-_LIT(KUsbmanImg, "z:\\system\\programs\\usbsvr_over_dummyusbdi.exe");
+#ifdef  __DUMMY_LDD__
+_LIT(KUsbmanImg, "z:\\system\\programs\\usbsvr_over_dummyldd.exe");
+#else
+_LIT(KUsbmanImg, "z:\\system\\programs\\usbsvr.exe");
 #endif
+#endif
+
 
 #endif //__USBMAN_NO_PROCESSES__
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/traces_UsbDummyClassControllerLdd/OstTraceDefinitions.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* This is Default Licence added by TraceCompiler
+* 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: 
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+// #define OST_TRACE_COMPILER_IN_USE
+#include <opensystemtrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/traces_UsbDummyClassControllerLdd/fixed_id.definitions	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,29 @@
+##
+# This is Default Licence added by TraceCompiler
+# 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_FLOW=0x8a
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_CONSTRUCTL_ENTRY=0x1
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_CONSTRUCTL_EXIT=0x2
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_CUSBDUMMYCLASSCONTROLLERLDD_ENTRY=0x3
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_CUSBDUMMYCLASSCONTROLLERLDD_EXIT=0x4
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_RUNL_ENTRY=0x9
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_RUNL_EXIT=0xa
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_START_ENTRY=0x5
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_START_EXIT=0x6
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_STOP_ENTRY=0x7
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLERLDD_STOP_EXIT=0x8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/traces_t_Usbman_dummyCC/OstTraceDefinitions.h	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,24 @@
+/*
+* This is Default Licence added by TraceCompiler
+* 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: 
+*
+*/
+#ifndef __OSTTRACEDEFINITIONS_H__
+#define __OSTTRACEDEFINITIONS_H__
+// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
+// REMOVE BEFORE CHECK-IN TO VERSION CONTROL
+//#define OST_TRACE_COMPILER_IN_USE
+#include <opensystemtrace.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/usbman/server/traces_t_Usbman_dummyCC/fixed_id.definitions	Fri Sep 17 08:40:15 2010 +0300
@@ -0,0 +1,529 @@
+##
+# This is Default Licence added by TraceCompiler
+# 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: 
+#
+##
+#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt.
+[GROUP]TRACE_DUMP=0x89
+[GROUP]TRACE_FATAL=0x81
+[GROUP]TRACE_FLOW=0x8a
+[GROUP]TRACE_NORMAL=0x86
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR=0x1
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP1=0x2
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP10=0xb
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP11=0xc
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP12=0xd
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP2=0x3
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP3=0x4
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP4=0x5
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP5=0x6
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP6=0x7
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP7=0x8
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP8=0x9
+[TRACE]TRACE_DUMP[0x89]_CUSBDEVICE_PRINTDESCRIPTOR_DUP9=0xa
+[TRACE]TRACE_FATAL[0x81]_CPERSONALITY_CLASSSUPPORTED=0x2
+[TRACE]TRACE_FATAL[0x81]_CPERSONALITY_SUPPORTEDCLASSES=0x1
+[TRACE]TRACE_FATAL[0x81]_CUSBDEVICE_CONVERTUIDSL=0x6
+[TRACE]TRACE_FATAL[0x81]_CUSBDEVICE_DOCANCEL=0x4
+[TRACE]TRACE_FATAL[0x81]_CUSBDEVICE_RUNERROR_DUP1=0x5
+[TRACE]TRACE_FATAL[0x81]_CUSBDEVICE_RUNL_DUP5=0x3
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_CONSTRUCTL=0x7
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL=0x1a
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL_DUP1=0x1b
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL_DUP2=0x1c
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL_DUP3=0x1d
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL_DUP4=0x1e
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP2=0x8
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP4=0x9
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP6=0xa
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP8=0xb
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP7=0xc
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_RUNERROR=0x1f
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_RUNL_DUP1=0x15
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_RUNL_DUP2=0x16
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_RUNL_DUP3=0x17
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_RUNL_DUP4=0x18
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_RUNL_DUP5=0x19
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_START=0xd
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_START_DUP1=0xe
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_START_DUP2=0xf
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_START_DUP3=0x10
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_STOP=0x11
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_STOP_DUP1=0x12
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_STOP_DUP2=0x13
+[TRACE]TRACE_FATAL[0x81]_CUSBDUMMYCLASSCONTROLLER_STOP_DUP3=0x14
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_ISFEATURESUPPORTEDL=0x2a
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL=0x26
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_DUP4=0x27
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_DUP5=0x28
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_DUP5=0x23
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_READPERSONALITIESL=0x24
+[TRACE]TRACE_FATAL[0x81]_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP5=0x25
+[TRACE]TRACE_FATAL[0x81]_CUSBSERVER_DECREMENTSESSIONCOUNT_DUP1=0x21
+[TRACE]TRACE_FATAL[0x81]_CUSBSERVER_INCREMENTSESSIONCOUNT_DUP1=0x20
+[TRACE]TRACE_FATAL[0x81]_CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS=0x22
+[TRACE]TRACE_FATAL[0x81]_DUP1_CUSBMANCENREPMANAGER_ISCLASSCONFIGURABLEL_DUP1=0x29
+[TRACE]TRACE_FLOW[0x8A]_CINIFILE_CINIFILE_CONS_ENTRY=0x1
+[TRACE]TRACE_FLOW[0x8A]_CINIFILE_NEWL_TDESC_ENTRY=0x2
+[TRACE]TRACE_FLOW[0x8A]_CINIFILE_NEWL_TDESC_EXIT=0x3
+[TRACE]TRACE_FLOW[0x8A]_CINIFILE_NEWL_TDESC_TDESC_ENTRY=0x4
+[TRACE]TRACE_FLOW[0x8A]_CINIFILE_NEWL_TDESC_TDESC_EXIT=0x5
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITYCONFIGURATIONS_CPERSONALITYCONFIGURATIONS_DES_ENTRY=0xc
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITYCONFIGURATIONS_CPERSONALITYCONFIGURATIONS_DES_EXIT=0xd
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITY_CONSTRUCTL_ENTRY=0x8
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITY_CONSTRUCTL_EXIT=0x9
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITY_CPERSONALITY_DES_ENTRY=0xa
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITY_CPERSONALITY_DES_EXIT=0xb
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITY_NEWL_ENTRY=0x6
+[TRACE]TRACE_FLOW[0x8A]_CPERSONALITY_NEWL_EXIT=0x7
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICESTATEWATCHER_DOCANCEL_ENTRY=0x51
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICESTATEWATCHER_DOCANCEL_EXIT=0x52
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICESTATEWATCHER_NEWL_ENTRY=0x4f
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICESTATEWATCHER_NEWL_EXIT=0x50
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICESTATEWATCHER_START_ENTRY=0x53
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICESTATEWATCHER_START_EXIT=0x54
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_ADDCLASSCONTROLLERL_ENTRY=0x19
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_ADDCLASSCONTROLLERL_EXIT=0x1a
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_BUSENUMERATIONCOMPLETED_ENTRY=0x27
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_BUSENUMERATIONCOMPLETED_EXIT=0x28
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CONSTRUCTL_ENTRY=0x12
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CONSTRUCTL_EXIT=0x13
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CONVERTUIDSL_ENTRY=0x44
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CONVERTUIDSL_EXIT=0x45
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CREATECLASSCONTROLLERSL_ENTRY=0x4a
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CURRENTPERSONALITYID_ENTRY=0x3b
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CUSBDEVICE_DES_ENTRY=0x10
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_CUSBDEVICE_DES_EXIT=0x11
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_DEREGISTEROBSERVER_ENTRY=0x1d
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_DEREGISTEROBSERVER_EXIT=0x1e
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_DOCANCEL_ENTRY=0x31
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_DOCANCEL_EXIT=0x32
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_ENUMERATECLASSCONTROLLERSL_ENTRY=0x17
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_ENUMERATECLASSCONTROLLERSL_EXIT=0x18
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_GETPERSONALITY_ENTRY=0x3d
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_GETPERSONALITY_EXIT=0x3e
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_GETPERSONALITY_EXIT_DUP1=0x3f
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_INSTANTIATEEXTENSIONPLUGINSL=0x15
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_INSTANTIATEEXTENSIONPLUGINSL_ENTRY=0x14
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_INSTANTIATEEXTENSIONPLUGINSL_EXIT=0x16
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_LOADFALLBACKCLASSCONTROLLERSL_ENTRY=0x4d
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_LOADFALLBACKCLASSCONTROLLERSL_EXIT=0x4e
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_NEWL_ENTRY=0xe
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_NEWL_EXIT=0xf
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_PERSONALITIES_ENTRY=0x3c
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_POWERUPANDCONNECT_ENTRY=0x2d
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_POWERUPANDCONNECT_EXIT=0x2e
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_READPERSONALITIESL_ENTRY=0x46
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_READPERSONALITIESL_EXIT=0x47
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_REGISTEROBSERVERL_ENTRY=0x1b
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_REGISTEROBSERVERL_EXIT=0x1c
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_RUNL_ENTRY=0x2f
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_RUNL_EXIT=0x30
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SELECTCLASSCONTROLLERSL_ENTRY=0x48
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SELECTCLASSCONTROLLERSL_EXIT=0x49
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETCURRENTPERSONALITYL_ENTRY=0x40
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETCURRENTPERSONALITYL_EXIT=0x41
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETDEFAULTPERSONALITYL_ENTRY=0x4b
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETDEFAULTPERSONALITYL_EXIT=0x4c
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETDEVICEDESCRIPTORL_ENTRY=0x36
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETDEVICEDESCRIPTORL_EXIT=0x37
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETDEVICESTATE_ENTRY=0x25
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETDEVICESTATE_EXIT=0x26
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETSERVICESTATE_ENTRY=0x23
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETSERVICESTATE_EXIT=0x24
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_ENTRY=0x38
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STARTCURRENTCLASSCONTROLLER_ENTRY=0x29
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STARTCURRENTCLASSCONTROLLER_EXIT=0x2a
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STARTL_ENTRY=0x1f
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STARTL_EXIT=0x20
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STOPCURRENTCLASSCONTROLLER_ENTRY=0x2b
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STOPCURRENTCLASSCONTROLLER_EXIT=0x2c
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STOP_ENTRY=0x21
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_STOP_EXIT=0x22
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_TRYSTARTL_ENTRY=0x39
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_TRYSTARTL_EXIT=0x3a
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_UCCNERROR_ENTRY=0x34
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_UCCNERROR_EXIT=0x35
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_UCCNGETCLASSCONTROLLERITERATORL_ENTRY=0x33
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_VALIDATEPERSONALITIESL_ENTRY=0x42
+[TRACE]TRACE_FLOW[0x8A]_CUSBDEVICE_VALIDATEPERSONALITIESL_EXIT=0x43
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL_ENTRY=0x65
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_DOCANCEL_EXIT=0x66
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_DOGETCONFIGL_ENTRY=0x5b
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_DOGETCONFIGL_EXIT=0x5c
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_ENTRY=0x59
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_EXIT=0x5a
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_ENTRY=0x5d
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_EXIT=0x5e
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_NEWL_MUSBCLASSCONTROLLERNOTIFY_TUINT_ENTRY=0x55
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_NEWL_MUSBCLASSCONTROLLERNOTIFY_TUINT_EXIT=0x56
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_NEWL_MUSBCLASSCONTROLLERNOTIFY_TUINT_TINT_ENTRY=0x57
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_NEWL_MUSBCLASSCONTROLLERNOTIFY_TUINT_TINT_EXIT=0x58
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_RUNL_ENTRY=0x63
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_RUNL_EXIT=0x64
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_START_ENTRY=0x5f
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_START_EXIT=0x60
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_STOP_ENTRY=0x61
+[TRACE]TRACE_FLOW[0x8A]_CUSBDUMMYCLASSCONTROLLER_STOP_EXIT=0x62
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CHECKSIGNATUREL_ENTRY=0x103
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CHECKSIGNATUREL_EXIT=0x104
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CONSTRUCTL_ENTRY=0xfb
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CONSTRUCTL_EXIT=0xfc
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CUSBMANCENREPMANAGER_CONS_ENTRY=0xf7
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CUSBMANCENREPMANAGER_CONS_EXIT=0xf8
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CUSBMANCENREPMANAGER_DES_ENTRY=0xfd
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_CUSBMANCENREPMANAGER_DES_EXIT=0xfe
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_ISCLASSCONFIGURABLEL_ENTRY=0x10b
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_ISCLASSCONFIGURABLEL_EXIT=0x10c
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_ISFEATURESUPPORTEDL_ENTRY=0x10d
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_ISFEATURESUPPORTEDL_EXIT=0x10e
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_ISFEATURESUPPORTEDL_EXIT_DUP1=0x10f
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_NEWL_ENTRY=0xf9
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_NEWL_EXIT=0xfa
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_ENTRY=0x109
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_EXIT=0x10a
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_ENTRY=0x105
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_EXIT=0x106
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READKEYL_ENTRY=0x101
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READKEYL_EXIT=0x102
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READPERSONALITIESL_ENTRY=0x107
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READPERSONALITIESL_EXIT=0x108
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READSTRINGKEYLC_ENTRY=0xff
+[TRACE]TRACE_FLOW[0x8A]_CUSBMANCENREPMANAGER_READSTRINGKEYLC_EXIT=0x100
+[TRACE]TRACE_FLOW[0x8A]_CUSBSCHEDULER_NEWL_ENTRY=0x67
+[TRACE]TRACE_FLOW[0x8A]_CUSBSCHEDULER_NEWL_EXIT=0x68
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_CUSBSERVER_DES_ENTRY=0x6b
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_CUSBSERVER_DES_EXIT=0x6c
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_INCREMENTSESSIONCOUNT_ENTRY=0x6f
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_INCREMENTSESSIONCOUNT_EXIT=0x70
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS_ENTRY=0x71
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_LAUNCHSHUTDOWNTIMERIFNOSESSIONS_EXIT=0x72
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_NEWLC_ENTRY=0x69
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_NEWLC_EXIT=0x6a
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_NEWSESSIONL_ENTRY=0x6d
+[TRACE]TRACE_FLOW[0x8A]_CUSBSERVER_NEWSESSIONL_EXIT=0x6e
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSCLEARERROR_ENTRY=0xd1
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSCLEARERROR_EXIT=0xd2
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSDROP_ENTRY=0xd3
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSDROP_EXIT=0xd4
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSREQUEST_ENTRY=0xcd
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSREQUEST_EXIT=0xce
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSRESPONDSRP_ENTRY=0xcf
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_BUSRESPONDSRP_EXIT=0xd0
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CANCELINTEREST_ENTRY=0xb5
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CANCELINTEREST_EXIT=0xb6
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CANCELINTEREST_EXIT_DUP1=0xb7
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CLASSSUPPORTED_ENTRY=0xc8
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CLASSSUPPORTED_EXIT=0xc9
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CLASSSUPPORTED_EXIT_DUP1=0xca
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CREATEL_ENTRY=0x7a
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CREATEL_EXIT=0x7b
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CUSBSESSION_CONS_ENTRY=0x74
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CUSBSESSION_CONS_EXIT=0x75
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CUSBSESSION_DES_ENTRY=0x76
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_CUSBSESSION_DES_EXIT=0x77
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERDEVICEOBSERVER_ENTRY=0xa0
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERDEVICEOBSERVER_EXIT=0xa1
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERDEVICEOBSERVER_EXIT_DUP1=0xa2
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERHOSTOBSERVER_ENTRY=0xe6
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERHOSTOBSERVER_EXIT=0xe7
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERHOSTOBSERVER_EXIT_DUP1=0xe8
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERMSGOBSERVER_ENTRY=0xec
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERMSGOBSERVER_EXIT=0xed
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERMSGOBSERVER_EXIT_DUP1=0xee
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERSERVICEOBSERVER_ENTRY=0xa3
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERSERVICEOBSERVER_EXIT=0xa4
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DEREGISTERSERVICEOBSERVER_EXIT_DUP1=0xa5
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DISABLEFUNCTIONDRIVERLOADING_ENTRY=0xd7
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DISABLEFUNCTIONDRIVERLOADING_EXIT=0xd8
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DISPATCHMESSAGEL_ENTRY=0x86
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_DISPATCHMESSAGEL_EXIT=0x87
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_ENABLEFUNCTIONDRIVERLOADING_ENTRY=0xd5
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_ENABLEFUNCTIONDRIVERLOADING_EXIT=0xd6
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETCURRENTDEVICESTATE_ENTRY=0x9f
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETCURRENTPERSONALITYID_ENTRY=0xb8
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETCURRENTPERSONALITYID_EXIT=0xb9
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETCURRENTSERVICESTATE_ENTRY=0x9e
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETDESCRIPTION_ENTRY=0xc2
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETDESCRIPTION_EXIT=0xc3
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETDESCRIPTION_EXIT_DUP1=0xc4
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETMANUFACTURERSTRINGDESCRIPTOR_ENTRY=0xdd
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETMANUFACTURERSTRINGDESCRIPTOR_EXIT=0xde
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETOTGDESCRIPTOR_ENTRY=0xe1
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETOTGDESCRIPTOR_EXIT=0xe2
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPERSONALITYIDS_ENTRY=0xbf
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPERSONALITYIDS_EXIT=0xc0
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPERSONALITYIDS_EXIT_DUP1=0xc1
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPERSONALITYPROPERTY_ENTRY=0xc5
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPERSONALITYPROPERTY_EXIT=0xc6
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPERSONALITYPROPERTY_EXIT_DUP2=0xc7
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPRODUCTSTRINGDESCRIPTOR_ENTRY=0xdf
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETPRODUCTSTRINGDESCRIPTOR_EXIT=0xe0
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDCLASSES_ENTRY=0xba
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDCLASSES_EXIT=0xbb
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDCLASSES_EXIT_DUP1=0xbc
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDCLASSES_EXIT_DUP2=0xbd
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDCLASSES_EXIT_DUP3=0xbe
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDLANGUAGESL_ENTRY=0xdb
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDLANGUAGESL_EXIT=0xdc
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDLANGUAGES_ENTRY=0xd9
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_GETSUPPORTEDLANGUAGES_EXIT=0xda
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTARTING_ENTRY=0x7e
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTARTING_EXIT=0x7f
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTOPPING_ENTRY=0x80
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTOPPING_EXIT=0x81
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_NEWL_ENTRY=0x73
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERDEVICEOBSERVER_ENTRY=0x98
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERDEVICEOBSERVER_EXIT=0x99
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERDEVICEOBSERVER_EXIT_DUP1=0x9a
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERHOSTOBSERVER_ENTRY=0xe3
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERHOSTOBSERVER_EXIT=0xe4
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERHOSTOBSERVER_EXIT_DUP1=0xe5
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERMSGOBSERVER_ENTRY=0xe9
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERMSGOBSERVER_EXIT=0xea
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERMSGOBSERVER_EXIT_DUP1=0xeb
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERSERVICEOBSERVER_ENTRY=0x9b
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERSERVICEOBSERVER_EXIT=0x9c
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_REGISTERSERVICEOBSERVER_EXIT_DUP1=0x9d
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_SERVICEL_ENTRY=0x78
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_SERVICEL_EXIT=0x79
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_SETCTLSESSIONMODE_ENTRY=0xcb
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_SETCTLSESSIONMODE_EXIT=0xcc
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTCANCEL_ENTRY=0x91
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTCANCEL_EXIT=0x92
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTCANCEL_EXIT_DUP1=0x93
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTDEVICEL_ENTRY=0x88
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTDEVICEL_EXIT=0x89
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTDEVICEL_EXIT_DUP1=0x8a
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STARTDEVICEL_EXIT_DUP2=0x8b
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPCANCEL_ENTRY=0x94
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPCANCEL_EXIT=0x95
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPCANCEL_EXIT_DUP1=0x96
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPCANCEL_EXIT_DUP2=0x97
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPDEVICEL_ENTRY=0x8c
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPDEVICEL_EXIT=0x8d
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPDEVICEL_EXIT_DUP1=0x8e
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPDEVICEL_EXIT_DUP2=0x8f
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_STOPDEVICEL_EXIT_DUP3=0x90
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_ENTRY=0xa6
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT=0xa7
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT_DUP1=0xa8
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT_DUP2=0xa9
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT_DUP3=0xaa
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT_DUP4=0xab
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT_DUP5=0xac
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTARTDEVICEL_EXIT_DUP6=0xad
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_ENTRY=0xae
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_EXIT=0xaf
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_EXIT_DUP1=0xb0
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_EXIT_DUP2=0xb1
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_EXIT_DUP3=0xb2
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_EXIT_DUP4=0xb3
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_TRYSTOPDEVICEL_EXIT_DUP5=0xb4
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBDEVICEDEQUEUEEVENT_ENTRY=0x84
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBDEVICEDEQUEUEEVENT_EXIT=0x85
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBDEVICESTATECHANGE_ENTRY=0x82
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBDEVICESTATECHANGE_EXIT=0x83
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBHOSTEVENTDEQUEUE_ENTRY=0xf5
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBHOSTEVENTDEQUEUE_EXIT=0xf6
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBHOSTEVENT_ENTRY=0xf1
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBHOSTEVENT_EXIT=0xf2
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBMSGDEQUEUE_ENTRY=0xf3
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBMSGDEQUEUE_EXIT=0xf4
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBOTGHOSTMESSAGE_ENTRY=0xef
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBOTGHOSTMESSAGE_EXIT=0xf0
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBSERVICESTATECHANGE_ENTRY=0x7c
+[TRACE]TRACE_FLOW[0x8A]_CUSBSESSION_USBSERVICESTATECHANGE_EXIT=0x7d
+[TRACE]TRACE_NORMAL[0x86]_CINIFILE_CONSTRUCTL=0x2
+[TRACE]TRACE_NORMAL[0x86]_CINIFILE_CONSTRUCTL_DUP1=0x3
+[TRACE]TRACE_NORMAL[0x86]_CINIFILE_CONSTRUCTL_DUP2=0x4
+[TRACE]TRACE_NORMAL[0x86]_CINIFILE_CONSTRUCTL_DUP3=0x5
+[TRACE]TRACE_NORMAL[0x86]_CINIFILE_CONSTRUCTL_DUP4=0x6
+[TRACE]TRACE_NORMAL[0x86]_CINIFILE_PANIC=0x1
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICESTATEWATCHER_CUSBDEVICESTATEWATCHER=0x44
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICESTATEWATCHER_RUNL=0x45
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICESTATEWATCHER_RUNL_DUP1=0x46
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICESTATEWATCHER_RUNL_DUP2=0x47
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICESTATEWATCHER_RUNL_DUP3=0x48
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_ADDCLASSCONTROLLERL=0x1e
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_BUSENUMERATIONCOMPLETED=0x23
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_BUSENUMERATIONFAILED=0x24
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_BUSENUMERATIONFAILED_DUP1=0x25
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL=0xb
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP1=0xd
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP10=0xc
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP11=0x10
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP12=0x16
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP13=0x13
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP2=0xf
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP3=0x11
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP4=0x12
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP5=0x14
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP6=0x15
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP7=0x17
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP8=0x18
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONSTRUCTL_DUP9=0xe
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CONVERTUIDSL_DUP1=0x40
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CREATECLASSCONTROLLERSL=0x41
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CREATECLASSCONTROLLERSL_DUP1=0x42
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CUSBDEVICE=0x7
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CUSBDEVICE_DUP1=0x8
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CUSBDEVICE_DUP2=0x9
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_CUSBDEVICE_DUP3=0xa
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_ENUMERATECLASSCONTROLLERSL=0x1b
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_ENUMERATECLASSCONTROLLERSL_DUP1=0x1c
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_ENUMERATECLASSCONTROLLERSL_DUP2=0x1a
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_ENUMERATECLASSCONTROLLERSL_DUP3=0x1d
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_INSTANTIATEEXTENSIONPLUGINSL_DUP1=0x19
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_MUEPODOREGISTERSTATEOBSERVERL=0x43
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_POWERUPANDCONNECT=0x26
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_POWERUPANDCONNECT_DUP1=0x27
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_POWERUPANDCONNECT_DUP2=0x28
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_REGISTEROBSERVERL=0x1f
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_RUNERROR=0x2e
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_RUNL=0x29
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_RUNL_DUP1=0x2b
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_RUNL_DUP2=0x2c
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_RUNL_DUP3=0x2d
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_RUNL_DUP4=0x2a
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETCURRENTPERSONALITYL=0x3c
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETDEVICEDESCRIPTORL=0x2f
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETDEVICEDESCRIPTORL_DUP1=0x30
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETDEVICEDESCRIPTORL_DUP2=0x32
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETDEVICEDESCRIPTORL_DUP3=0x31
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETDEVICESTATE=0x22
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETSERVICESTATE=0x21
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL=0x33
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP1=0x36
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP2=0x38
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP3=0x37
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP4=0x3a
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP5=0x39
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP6=0x35
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_SETUSBDEVICESETTINGSFROMPERSONALITYL_DUP7=0x34
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_STARTL=0x20
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_TRYSTARTL=0x3b
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_VALIDATEPERSONALITIESL=0x3f
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_VALIDATEPERSONALITIESL_DUP1=0x3d
+[TRACE]TRACE_NORMAL[0x86]_CUSBDEVICE_VALIDATEPERSONALITIESL_DUP2=0x3e
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR=0x49
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP1=0x4a
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP3=0x4b
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP5=0x4c
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETBEHAVIOUR_DUP7=0x4d
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG=0x4e
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP1=0x4f
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP2=0x50
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP3=0x51
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP4=0x52
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP5=0x53
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_GETCONFIG_DUP6=0x54
+[TRACE]TRACE_NORMAL[0x86]_CUSBDUMMYCLASSCONTROLLER_RUNL=0x55
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_CHECKSIGNATUREL=0xa3
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_ISCLASSCONFIGURABLEL=0xb2
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_ISCLASSCONFIGURABLEL_DUP2=0xb3
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_ISFEATURESUPPORTEDL_DUP2=0xb5
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_DUP1=0xaf
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_DUP2=0xb0
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READCONFIGURATIONSFORPERSONALITYL_DUP3=0xb1
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL=0xa4
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_DUP1=0xa5
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_DUP2=0xa6
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_DUP3=0xa7
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READDEVICECONFIGURATIONL_DUP4=0xa8
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READKEYL=0xa1
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READKEYL_DUP1=0xa2
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP1=0xaa
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP3=0xa9
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP4=0xac
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP6=0xad
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP7=0xae
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READSTRINGKEYLC=0x9f
+[TRACE]TRACE_NORMAL[0x86]_CUSBMANCENREPMANAGER_READSTRINGKEYLC_DUP1=0xa0
+[TRACE]TRACE_NORMAL[0x86]_CUSBSCHEDULER_ERROR=0x56
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CONSTRUCTL=0x5f
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CONSTRUCTL_DUP1=0x60
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CONSTRUCTL_DUP2=0x61
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CONSTRUCTL_DUP3=0x62
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER=0x57
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP1=0x58
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP2=0x59
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP3=0x5a
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP4=0x5b
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP5=0x5c
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP6=0x5d
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_CUSBSERVER_DUP7=0x5e
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_DECREMENTSESSIONCOUNT=0x67
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_ERROR=0x65
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_INCREMENTSESSIONCOUNT=0x66
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_NEWSESSIONL=0x63
+[TRACE]TRACE_NORMAL[0x86]_CUSBSERVER_NEWSESSIONL_DUP1=0x64
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CREATEL=0x6c
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CREATEL_DUP1=0x6d
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CREATEL_DUP2=0x6e
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CUSBSESSION=0x68
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CUSBSESSION_DUP1=0x69
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CUSBSESSION_DUP2=0x6a
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_CUSBSESSION_DUP3=0x6b
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DEREGISTERHOSTOBSERVER=0x94
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DEREGISTERHOSTOBSERVER_DUP1=0x95
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL=0x7b
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL_DUP1=0x7c
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL_DUP2=0x7d
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL_DUP3=0x7e
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL_DUP4=0x7f
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL_DUP5=0x80
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_DISPATCHMESSAGEL_DUP6=0x81
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETCURRENTDEVICESTATE=0x84
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETCURRENTPERSONALITYID=0x85
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETCURRENTSERVICESTATE=0x83
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETMANUFACTURERSTRINGDESCRIPTOR=0x8e
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETMANUFACTURERSTRINGDESCRIPTOR_DUP1=0x8f
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETOTGDESCRIPTOR=0x92
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETPERSONALITYIDS=0x89
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETPRODUCTSTRINGDESCRIPTOR=0x90
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETPRODUCTSTRINGDESCRIPTOR_DUP1=0x91
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETSUPPORTEDCLASSES=0x86
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETSUPPORTEDCLASSES_DUP1=0x87
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETSUPPORTEDCLASSES_DUP2=0x88
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETSUPPORTEDLANGUAGESL=0x8b
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETSUPPORTEDLANGUAGESL_DUP1=0x8c
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_GETSUPPORTEDLANGUAGESL_DUP2=0x8d
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTARTING=0x70
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTARTING_DUP1=0x71
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTARTING_DUP2=0x72
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTARTING_DUP3=0x73
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTOPPING=0x74
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTOPPING_DUP1=0x75
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTOPPING_DUP2=0x76
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_HANDLESERVICESTATECHANGEWHILESTOPPING_DUP3=0x77
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_REGISTERDEVICEOBSERVER=0x82
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_REGISTERHOSTOBSERVER=0x93
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_REGISTERMSGOBSERVER=0x96
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_SETCTLSESSIONMODE=0x8a
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBDEVICEDEQUEUEEVENT=0x7a
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBDEVICESTATECHANGE=0x78
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBDEVICESTATECHANGE_DUP1=0x79
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBHOSTEVENT=0x98
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBHOSTEVENTDEQUEUE=0x9c
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBHOSTEVENTDEQUEUE_DUP1=0x9d
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBHOSTEVENT_DUP1=0x99
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBHOSTEVENT_DUP2=0x9a
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBMSGDEQUEUE=0x9b
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBOTGHOSTMESSAGE=0x97
+[TRACE]TRACE_NORMAL[0x86]_CUSBSESSION_USBSERVICESTATECHANGE=0x6f
+[TRACE]TRACE_NORMAL[0x86]_DUP1_CUSBMANCENREPMANAGER_ISFEATURESUPPORTEDL_DUP1=0xb4
+[TRACE]TRACE_NORMAL[0x86]_DUP2_CUSBMANCENREPMANAGER_READPERSONALITIESL_DUP2=0xab
+[TRACE]TRACE_NORMAL[0x86]_USBSVR_RUNSERVERL=0x9e