kerneltest/e32test/usb/t_usb_device/src/activecontrol.cpp
changeset 270 ea2cef07f9fe
parent 253 d37db4dcc88d
--- a/kerneltest/e32test/usb/t_usb_device/src/activecontrol.cpp	Tue Aug 31 11:40:45 2010 +0100
+++ b/kerneltest/e32test/usb/t_usb_device/src/activecontrol.cpp	Tue Sep 14 15:52:42 2010 +0100
@@ -24,6 +24,7 @@
 #include "activecontrol.h"
 #include "apitests.h"
 #include "activerw.h"
+#include "d32otgdi.h"
 #ifdef USB_SC
 #include "tranhandleserver.h"
 #endif
@@ -36,6 +37,12 @@
 
 void StartMassStorage(RDEVCLIENT* aPort);
 void StopMassStorage(RDEVCLIENT* aPort);
+void OpenStackIfOtg();
+void CloseStackIfOtg();
+
+_LIT(KOtgdiLddFilename, "otgdi");
+static TBool gSupportsOtg;
+static RUsbOtgDriver gOtgPort;
 
 enum Ep0Requests
 	{
@@ -287,6 +294,19 @@
 				}
 			}
 
+		// Check for OTG support
+		TBuf8<KUsbDescSize_Otg> otg_desc;
+		r = iPort[0].GetOtgDescriptor(otg_desc);
+		if (!(r == KErrNotSupported || r == KErrNone))
+			{
+			OstTrace1(TRACE_NORMAL, CACTIVECONTROL_CONSTRUCTL_DUP08, "Error %d while fetching OTG descriptor", r);
+			User::Leave(-1);
+			return;
+			}
+		gSupportsOtg = (r != KErrNotSupported) ? ETrue : EFalse;
+
+		OpenStackIfOtg();
+		
 		iTotalChannels += lddPtr->iNumChannels;
 		nextPort += lddPtr->iNumChannels;
 		lddPtr = lddPtr->iPtrNext;
@@ -1030,7 +1050,9 @@
 						{
 						PrintHostLog();
 						}
-
+						
+					CloseStackIfOtg();
+					
 					for (TInt portNumber = 0; portNumber < iTotalChannels; portNumber++)
 						{
 						// base class cancel -> calls our DoCancel
@@ -1372,6 +1394,8 @@
 					r = iPort[0].SendEp0StatusPacket();
 					test_KErrNone(r);
 
+					CloseStackIfOtg();
+					
 					for (TInt portNumber = 0; portNumber < iTotalChannels; portNumber++)
 						{
 						delete iDeviceStateNotifier[portNumber];
@@ -1415,6 +1439,8 @@
 					SetupDescriptors(iLddPtr, &iPort[0],value);
 					StartMassStorage(&iPort[0]);
 
+					OpenStackIfOtg();
+					
 					test.Next (_L("Enumeration..."));
 					r = ReEnumerate();
 					test_KErrNone(r);
@@ -2360,4 +2386,43 @@
 	}
 
 #endif
+
+void OpenStackIfOtg()
+	{
+	// On an OTG device we have to start the OTG driver, otherwise the Client
+	// stack will remain disabled forever.
+	if (gSupportsOtg)
+		{
+		test.Start(_L("Running on OTG device: loading OTG driver\n"));
+		test.Next(_L("Load OTG LDD"));
+		TInt r = User::LoadLogicalDevice(KOtgdiLddFilename);
+		test((r == KErrNone) || (r == KErrAlreadyExists));
+
+		test.Next(_L("Open OTG channel"));
+		r = gOtgPort.Open();
+		test(r == KErrNone);
+
+		test.Next(_L("Start OTG stack"));
+		r = gOtgPort.StartStacks();
+		test(r == KErrNone);
+		test.End();
+		}
+	}
+
+void CloseStackIfOtg()
+	{
+	if (gSupportsOtg)
+		{
+		test.Start(_L("Close OTG stack\n"));
+		test.Next(_L("Stop OTG stack"));
+		gOtgPort.StopStacks();
+		test.Next(_L("Close OTG Channel"));
+		gOtgPort.Close();
+		test.Next(_L("Free OTG LDD"));
+		TInt r = User::FreeLogicalDevice(RUsbOtgDriver::Name());
+		test(r == KErrNone);
+		test.End();
+		}
+	}
+	
 // -eof-