--- 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-