--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/baseintegtests/baseintegrationtest/testsuites/sd/src/sdusb.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,266 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// Enables USB mass storage mode. Ends when disconnected by user.
+//
+//
+
+#include <massstorage.h>
+#include <d32usbc.h>
+#include "sdusb.h"
+
+/*
+Class constructor
+
+@param None
+@return None
+*/
+CBaseTestSDUsb::CBaseTestSDUsb()
+ {
+ SetTestStepName(KTestStepUsb);
+ }
+
+/*
+Test Step Preamble
+ - Initialise attribute iDrive
+ - Connect to the File Server
+
+@param None
+@return EPass if successful or EFail if not
+@see TVerdict
+*/
+TVerdict CBaseTestSDUsb::doTestStepPreambleL()
+ {
+ SetTestStepResult(EFail);
+
+ if (!InitDriveLetter())
+ return TestStepResult();
+ if (!InitFileServer())
+ return TestStepResult();
+
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+
+/*
+Test step
+
+@param None
+@return EPass if successful or EFail if not
+@see TVerdict
+*/
+TVerdict CBaseTestSDUsb::doTestStepL()
+ {
+ TInt r;
+ _LIT(KMsFsy, "MSFS.FSY");
+ _LIT(KMsFs, "MassStorageFileSystem");
+
+ // Add MS file system
+ r = iFs.AddFileSystem(KMsFsy);
+ if (r != KErrNone && r != KErrAlreadyExists)
+ {
+ ERR_PRINTF2(_L("AddFileSystem failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ RDevUsbcClient usb;
+
+ // Load the logical device
+ _LIT(KDriverFileName,"EUSBC.LDD");
+ r = User::LoadLogicalDevice(KDriverFileName);
+ if (r != KErrNone && r != KErrAlreadyExists)
+ {
+ ERR_PRINTF2(_L("LoadLogicalDevice failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ r = usb.Open(0);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RDevUsbcClient::Open failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ RUsbMassStorage UsbMs;
+ TBuf<8> t_vendorId(_L("vendor"));
+ TBuf<16> t_productId(_L("product"));
+ TBuf<4> t_productRev(_L("1.00"));
+
+ TMassStorageConfig msConfig;
+ msConfig.iVendorId.Copy(t_vendorId);
+ msConfig.iProductId.Copy(t_productId);
+ msConfig.iProductRev.Copy(t_productRev);
+
+ // Connect to Mass Storage
+ r = UsbMs.Connect();
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RUsbMassStorage::Connect failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ // Start Mass Storage
+ r = UsbMs.Start(msConfig);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RUsbMassStorage::Start failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ TBuf8<KUsbDescSize_Device> deviceDescriptor;
+ r = usb.GetDeviceDescriptor(deviceDescriptor);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RDevUsbcClient::GetDeviceDescriptor failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ const TInt KUsbSpecOffset = 2;
+ const TInt KUsbDeviceClassOffset = 4;
+ const TInt KUsbVendorIdOffset = 8;
+ const TInt KUsbProductIdOffset = 10;
+ const TInt KUsbDevReleaseOffset = 12;
+ //Change the USB spec number to 2.00
+ deviceDescriptor[KUsbSpecOffset] = 0x00;
+ deviceDescriptor[KUsbSpecOffset+1] = 0x02;
+ //Change the Device Class, Device SubClass and Device Protocol
+ deviceDescriptor[KUsbDeviceClassOffset] = 0x00;
+ deviceDescriptor[KUsbDeviceClassOffset+1] = 0x00;
+ deviceDescriptor[KUsbDeviceClassOffset+2] = 0x00;
+ //Change the device vendor ID (VID) to 0x0E22 (Symbian)
+ deviceDescriptor[KUsbVendorIdOffset] = 0x22; // little endian
+ deviceDescriptor[KUsbVendorIdOffset+1] = 0x0E;
+ //Change the device product ID (PID) to 0x1111
+ deviceDescriptor[KUsbProductIdOffset] = 0x12;
+ deviceDescriptor[KUsbProductIdOffset+1] = 0x11;
+ //Change the device release number to 3.05
+ deviceDescriptor[KUsbDevReleaseOffset] = 0x05;
+ deviceDescriptor[KUsbDevReleaseOffset+1] = 0x03;
+ r = usb.SetDeviceDescriptor(deviceDescriptor);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RDevUsbcClient::SetDeviceDescriptor failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+
+ _LIT16(productID_L, "Symbian USB Mass Storage Device");
+ TBuf16<KUsbStringDescStringMaxSize / 2> productID(productID_L);
+ // Set product string descriptor
+ r = usb.SetProductStringDescriptor(productID);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RDevUsbcClient::SetProductStringDescriptor failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ TRequestStatus enum_status;
+ INFO_PRINTF1(_L("Re-enumerating..."));
+ usb.ReEnumerate(enum_status);
+ User::WaitForRequest(enum_status);
+ INFO_PRINTF1(_L("Re-enumerating done"));
+
+ // Mount Mass Storage FS
+ r = iFs.DismountFileSystem(_L("fat"), iDrive);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RFs::DismountFileSystem (FAT) failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ r = iFs.MountFileSystem(KMsFs, iDrive);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RFs::MountFileSystem (MSFS) failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ // Wait until the USB cable is removed or device is suspended
+ TUsbcDeviceState initialStatus;
+ r = usb.DeviceStatus(initialStatus);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RDevUsbcClient::DeviceStatus failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+ if (initialStatus == EUsbcDeviceStateUndefined)
+ {
+ ERR_PRINTF1(_L("USB device status is undefined"));
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+ TUint deviceState = initialStatus;
+ do {
+ TRequestStatus rs;
+ usb.AlternateDeviceStatusNotify(rs, deviceState);
+ User::WaitForRequest(rs);
+ } while (deviceState != EUsbcDeviceStateUndefined && deviceState != EUsbcDeviceStateSuspended);
+
+ // Dismount Mass Storage FS
+ r = iFs.DismountFileSystem(KMsFs, iDrive);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RFs::DismountFileSystem (MSFS) failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ r = iFs.MountFileSystem(_L("fat"), iDrive);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RFs::MountFileSystem (FAT) failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ // Stop USB Mass Storage
+ r = UsbMs.Stop();
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RUsbMassStorage::Stop failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ UsbMs.Close();
+ usb.Close();
+ r = iFs.RemoveFileSystem(KMsFs);
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("RFs::RemoveFileSystem failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ r = User::FreeLogicalDevice(_L("USBC"));
+ if (r != KErrNone)
+ {
+ ERR_PRINTF2(_L("FreeLogicalDevice failed: %d"), r);
+ SetTestStepResult(EFail);
+ return TestStepResult();
+ }
+
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }