diff -r 000000000000 -r a41df078684a baseintegtests/baseintegrationtest/testsuites/sd/src/sdusb.cpp --- /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 +#include +#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 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 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(); + }