baseintegtests/baseintegrationtest/testsuites/sd/src/sdusb.cpp
changeset 0 a41df078684a
--- /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();
+	}