baseintegtests/baseintegrationtest/testsuites/sd/src/sdusb.cpp
author Simon Howkins <simonh@symbian.org>
Fri, 27 Nov 2009 12:28:52 +0000
changeset 6 248107124823
parent 0 a41df078684a
permissions -rw-r--r--
Updated to support the WHAT and CLEAN commands by declaring that the FLM will generate 3 output files (IMG, LOG and OBY).

// 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();
	}