kernel/eka/drivers/usbho/usbdi_utils/usbinterface.cpp
author hgs
Thu, 01 Jul 2010 17:57:33 +0100
changeset 189 a5496987b1da
permissions -rw-r--r--
201025_04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
a5496987b1da 201025_04
hgs
parents:
diff changeset
     2
// All rights reserved.
a5496987b1da 201025_04
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a5496987b1da 201025_04
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a5496987b1da 201025_04
hgs
parents:
diff changeset
     7
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
     8
// Initial Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    10
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    11
// Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    12
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    13
// Description:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    14
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    15
a5496987b1da 201025_04
hgs
parents:
diff changeset
    16
#include <d32usbdi.h>
a5496987b1da 201025_04
hgs
parents:
diff changeset
    17
a5496987b1da 201025_04
hgs
parents:
diff changeset
    18
#include <d32usbtransfers.h>
a5496987b1da 201025_04
hgs
parents:
diff changeset
    19
#include "usbtransferstrategy.h"
a5496987b1da 201025_04
hgs
parents:
diff changeset
    20
#include "zerocopytransferstrategy.h"
a5496987b1da 201025_04
hgs
parents:
diff changeset
    21
a5496987b1da 201025_04
hgs
parents:
diff changeset
    22
a5496987b1da 201025_04
hgs
parents:
diff changeset
    23
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
    24
Opens an interface identified by a token.  When the hub driver loads a driver (via function driver
a5496987b1da 201025_04
hgs
parents:
diff changeset
    25
framework), this token is generated to allow the driver to open the interface.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    26
a5496987b1da 201025_04
hgs
parents:
diff changeset
    27
This also causes the interface's descriptors to be parsed for future reference.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    28
a5496987b1da 201025_04
hgs
parents:
diff changeset
    29
@param[in] aToken The token for the interface to open.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    30
@return System-wide error code.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    31
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
    32
EXPORT_C TInt RUsbInterface::Open(TUint32 aToken, TOwnerType aType)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    33
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    34
	TPckgC<TUint32> token(aToken);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    35
	TInt err = DoCreate(Name(), VersionRequired(), KNullUnit, NULL, &token, aType);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    36
	if(err == KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    37
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    38
		// Create a transfer strategy
a5496987b1da 201025_04
hgs
parents:
diff changeset
    39
		iTransferStrategy = new RUsbZeroCopyTransferStrategy;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    40
		if(!iTransferStrategy)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    41
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    42
			Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    43
			return KErrNoMemory;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    44
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    45
a5496987b1da 201025_04
hgs
parents:
diff changeset
    46
		// Get descriptor size
a5496987b1da 201025_04
hgs
parents:
diff changeset
    47
		TInt interfaceDescSize = 0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    48
		err = DoControl(EGetInterfaceDescriptorSize, &interfaceDescSize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    49
		if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    50
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    51
			Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    52
			return err;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    53
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    54
		iInterfaceDescriptorData = HBufC8::New(interfaceDescSize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    55
a5496987b1da 201025_04
hgs
parents:
diff changeset
    56
		if(!iInterfaceDescriptorData)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    57
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    58
			Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    59
			return KErrNoMemory;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    60
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    61
a5496987b1da 201025_04
hgs
parents:
diff changeset
    62
		// Get descriptor data
a5496987b1da 201025_04
hgs
parents:
diff changeset
    63
		TPtr8 interfaceDesc = iInterfaceDescriptorData->Des();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    64
		err = DoControl(EGetInterfaceDescriptor, &interfaceDesc);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    65
		if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    66
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    67
			Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    68
			return err;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    69
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    70
a5496987b1da 201025_04
hgs
parents:
diff changeset
    71
		// Parse descriptor
a5496987b1da 201025_04
hgs
parents:
diff changeset
    72
		TUsbGenericDescriptor* parsed = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    73
		err = UsbDescriptorParser::Parse(*iInterfaceDescriptorData, parsed);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    74
		if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    75
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    76
			if(parsed)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    77
				{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    78
				parsed->DestroyTree(); //or however much has been completed
a5496987b1da 201025_04
hgs
parents:
diff changeset
    79
				delete parsed;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    80
				}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    81
			Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    82
			return err;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    83
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    84
a5496987b1da 201025_04
hgs
parents:
diff changeset
    85
		iHeadInterfaceDescriptor = TUsbInterfaceDescriptor::Cast(parsed);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    86
		if(!iHeadInterfaceDescriptor)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    87
			{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    88
			if(parsed)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    89
				{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    90
				parsed->DestroyTree();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    91
				delete parsed;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    92
				}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    93
			Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    94
			return KErrCorrupt;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    95
			}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    96
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    97
a5496987b1da 201025_04
hgs
parents:
diff changeset
    98
	return err;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    99
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   100
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   101
/**
a5496987b1da 201025_04
hgs
parents:
diff changeset
   102
Close handle to interface.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   103
a5496987b1da 201025_04
hgs
parents:
diff changeset
   104
Closes any pipe handles still open.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   105
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
   106
EXPORT_C void RUsbInterface::Close()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   107
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   108
	iAlternateSetting = 0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   109
	if(iHeadInterfaceDescriptor)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   110
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   111
		iHeadInterfaceDescriptor->DestroyTree();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   112
		delete iHeadInterfaceDescriptor;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   113
		iHeadInterfaceDescriptor = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   114
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   115
	if(iInterfaceDescriptorData)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   116
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   117
		delete iInterfaceDescriptorData;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   118
		iInterfaceDescriptorData = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   119
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   120
	if(iTransferStrategy)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   121
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   122
		iTransferStrategy->Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   123
		delete iTransferStrategy;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   124
		iTransferStrategy = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   125
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   126
	RBusLogicalChannel::Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   127
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   128
a5496987b1da 201025_04
hgs
parents:
diff changeset
   129
a5496987b1da 201025_04
hgs
parents:
diff changeset
   130
EXPORT_C TInt RUsbInterface::RegisterTransferDescriptor(RUsbTransferDescriptor& aTransfer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   131
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   132
	TTransferMemoryDetails details;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   133
	details.iType		= aTransfer.iType;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   134
	details.iSize		= aTransfer.iMaxSize;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   135
	details.iMaxPackets	= aTransfer.iMaxNumPackets;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   136
	TInt err = DoControl(EGetSizeAndAlignment, &details);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   137
	if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   138
		{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   139
		return err;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   140
		}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   141
	return iTransferStrategy->RegisterTransferDescriptor(aTransfer, details.iSize, details.iAlignment, details.iMaxPackets);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   142
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   143
	
a5496987b1da 201025_04
hgs
parents:
diff changeset
   144
EXPORT_C void RUsbInterface::ResetTransferDescriptors()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   145
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   146
	iTransferStrategy->ResetTransferDescriptors();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   147
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   148
a5496987b1da 201025_04
hgs
parents:
diff changeset
   149
EXPORT_C TInt RUsbInterface::InitialiseTransferDescriptors()
a5496987b1da 201025_04
hgs
parents:
diff changeset
   150
	{
a5496987b1da 201025_04
hgs
parents:
diff changeset
   151
	return iTransferStrategy->InitialiseTransferDescriptors(*this);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   152
	}
a5496987b1da 201025_04
hgs
parents:
diff changeset
   153
a5496987b1da 201025_04
hgs
parents:
diff changeset
   154