diff -r 947f0dc9f7a8 -r ef2a444a7410 kernel/eka/drivers/usbho/usbdi_utils/usbtransfers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/usbho/usbdi_utils/usbtransfers.cpp Mon May 03 13:47:38 2010 +0300 @@ -0,0 +1,205 @@ +// 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: +// + +#include + +#include +#include "usbtransferstrategy.h" +#include "usbdiutils.h" + + +// ======================== +// RUsbTransferDescriptor +// ======================== + +/** +Constructor protected to as this class is only intended as a base class. +*/ +RUsbTransferDescriptor::RUsbTransferDescriptor(TTransferType aType, TInt aMaxSize, TInt aMaxNumPackets) + : iHandle(KInvalidHandle) + , iType(aType) + , iMaxSize(aMaxSize) + , iMaxNumPackets(aMaxNumPackets) + { + } + +/** +Releases resources allocated to this transfer descriptor. +*/ +EXPORT_C void RUsbTransferDescriptor::Close() + { + // Do nothing - the buffer is owned by the {R,D}UsbInterface. + // This is provided in case the descriptor owns resources in future. + } + + +// ============================ +// RUsbIsocTransferDescriptor +// ============================ + +EXPORT_C RUsbIsocTransferDescriptor::RUsbIsocTransferDescriptor(TInt aMaxSize, TInt aMaxNumPackets) + : RUsbTransferDescriptor(EIsochronous, aMaxSize, aMaxNumPackets) + , iWriteHandle(KInvalidHandle) + { + } + +EXPORT_C void RUsbIsocTransferDescriptor::Reset() + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + iWriteHandle = iHandle; + iTransferStrategy->IsocReset(iHandle); + } + +EXPORT_C TPacketLengths RUsbIsocTransferDescriptor::Lengths() + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + return iTransferStrategy->IsocLengths(iHandle); + } + +EXPORT_C TPacketResults RUsbIsocTransferDescriptor::Results() + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + return iTransferStrategy->IsocResults(iHandle); + } + +EXPORT_C TInt RUsbIsocTransferDescriptor::MaxPacketSize() + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + return iTransferStrategy->IsocMaxPacketSize(iHandle); + } + +EXPORT_C TPtr8 RUsbIsocTransferDescriptor::WritablePackets(TInt aNumPacketsRequested, TInt& aMaxNumOfPacketsAbleToWrite) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + if(iWriteHandle == KInvalidHandle) + { + return TPtr8(NULL, 0); + } + return iTransferStrategy->IsocWritablePackets(iHandle, iWriteHandle, aNumPacketsRequested, aMaxNumOfPacketsAbleToWrite); + } + +EXPORT_C void RUsbIsocTransferDescriptor::SaveMultiple(TInt aNumOfPackets) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + __ASSERT_ALWAYS(iWriteHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorWriteHandle)); + TInt writeHandle = iTransferStrategy->IsocSaveMultiple(iHandle, iWriteHandle, aNumOfPackets); + iWriteHandle = (writeHandle < 0) ? KInvalidHandle : writeHandle; + } + +EXPORT_C TPtrC8 RUsbIsocTransferDescriptor::Packets(TInt aFirstPacketIndex, TInt aNumPacketsRequested, TInt& aNumOfPacketsReturned) const + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + return iTransferStrategy->IsocPackets(iHandle, aFirstPacketIndex, aNumPacketsRequested, aNumOfPacketsReturned); + } + +EXPORT_C void RUsbIsocTransferDescriptor::ReceivePackets(TInt aNumOfPackets) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIsocTransferDescriptorHandle)); + iTransferStrategy->IsocReceivePackets(iHandle, aNumOfPackets); + } + + +// ============================ +// RUsbBulkTransferDescriptor +// ============================ + +EXPORT_C RUsbBulkTransferDescriptor::RUsbBulkTransferDescriptor(TInt aMaxSize) + : RUsbTransferDescriptor(EBulk, aMaxSize, 0) + { + } + +/** +@return A modifiable pointer to the entire data buffer. +*/ +EXPORT_C TPtr8 RUsbBulkTransferDescriptor::WritableBuffer() + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadBulkTransferDescriptorHandle)); + return iTransferStrategy->BulkWritableBuffer(iHandle); + } + +/** +Update the transfer descriptor given the length of data supplied. +@param[in] aLength Length of data to write or expect. +*/ +EXPORT_C void RUsbBulkTransferDescriptor::SaveData(TInt aLength) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadBulkTransferDescriptorHandle)); + iTransferStrategy->BulkSaveData(iHandle, aLength); + } + +/** +@return A non-modifiable pointer to the entire data buffer. +*/ +EXPORT_C TPtrC8 RUsbBulkTransferDescriptor::Buffer() const + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadBulkTransferDescriptorHandle)); + return iTransferStrategy->BulkBuffer(iHandle); + } + +/** +@param aZlpStatus the ZLP type to use for the transfer +*/ +EXPORT_C void RUsbBulkTransferDescriptor::SetZlpStatus(TZlpStatus aZlpStatus) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadBulkTransferDescriptorHandle)); + iTransferStrategy->BulkSetZlpStatus(iHandle, aZlpStatus); + } + + +// ============================ +// RUsbIntrTransferDescriptor +// ============================ + +EXPORT_C RUsbIntrTransferDescriptor::RUsbIntrTransferDescriptor(TInt aMaxSize) + : RUsbTransferDescriptor(EInterrupt, aMaxSize, 0) + { + } + +/** +@return A modifiable pointer to the entire data buffer. +*/ +EXPORT_C TPtr8 RUsbIntrTransferDescriptor::WritableBuffer() + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIntrTransferDescriptorHandle)); + return iTransferStrategy->IntrWritableBuffer(iHandle); + } + +/** +Update the transfer descriptor given the length of data supplied. +@param[in] aLength Length of data to write or expect. +*/ +EXPORT_C void RUsbIntrTransferDescriptor::SaveData(TInt aLength) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIntrTransferDescriptorHandle)); + iTransferStrategy->IntrSaveData(iHandle, aLength); + } + +/** +@return A non-modifiable pointer to the entire data buffer. +*/ +EXPORT_C TPtrC8 RUsbIntrTransferDescriptor::Buffer() const + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIntrTransferDescriptorHandle)); + return iTransferStrategy->IntrBuffer(iHandle); + } + +/** +@param aZlpStatus the ZLP type to use for the transfer +*/ +EXPORT_C void RUsbIntrTransferDescriptor::SetZlpStatus(TZlpStatus aZlpStatus) + { + __ASSERT_ALWAYS(iHandle != KInvalidHandle, UsbdiUtils::Panic(UsbdiPanics::EBadIntrTransferDescriptorHandle)); + return iTransferStrategy->IntrSetZlpStatus(iHandle, aZlpStatus); + }