Ejemplo n.º 1
0
NTSTATUS
USBCCGP_SelectInterface(
    IN PDEVICE_OBJECT DeviceObject,
    IN PFDO_DEVICE_EXTENSION DeviceExtension,
    IN ULONG InterfaceIndex)
{
    NTSTATUS Status;
    PURB Urb;

    //
    // allocate urb
    //
    Urb = AllocateItem(NonPagedPool, GET_SELECT_INTERFACE_REQUEST_SIZE(DeviceExtension->InterfaceList[InterfaceIndex].InterfaceDescriptor->bNumEndpoints));
    if (!Urb)
    {
        //
        // no memory
        //
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    //
    // now prepare interface urb
    //
    UsbBuildSelectInterfaceRequest(Urb, GET_SELECT_INTERFACE_REQUEST_SIZE(DeviceExtension->InterfaceList[InterfaceIndex].InterfaceDescriptor->bNumEndpoints), DeviceExtension->ConfigurationHandle, DeviceExtension->InterfaceList[InterfaceIndex].InterfaceDescriptor->bInterfaceNumber, DeviceExtension->InterfaceList[InterfaceIndex].InterfaceDescriptor->bAlternateSetting);

    //
    // now select the interface
    //
    Status = USBCCGP_SyncUrbRequest(DeviceExtension->NextDeviceObject, Urb);

    //
    // did it succeeed
    //
    if (NT_SUCCESS(Status))
    {
        //
        // update configuration info
        //
        ASSERT(Urb->UrbSelectInterface.Interface.Length == DeviceExtension->InterfaceList[InterfaceIndex].Interface->Length);
        RtlCopyMemory(DeviceExtension->InterfaceList[InterfaceIndex].Interface, &Urb->UrbSelectInterface.Interface, Urb->UrbSelectInterface.Interface.Length);
    }

    //
    // free urb
    //
    FreeItem(Urb);

    //
    // done
    //
    return Status;
}
Ejemplo n.º 2
0
// Set the alternate setting of the interface.
NTSTATUS UsbDev::SetAlternate(UCHAR AlternateNo, UCHAR InterfaceNo)
{
	NTSTATUS ntStatus = STATUS_SUCCESS;
	PURB pUrb = NULL;
	PUSBD_INTERFACE_INFORMATION pInterfaceInfo = NULL;
	int i;

	DBGU_TRACE(">>>UsbDev::SetAlternate !\n");

	if (m_pInterface[InterfaceNo])
		pInterfaceInfo = m_pInterface[InterfaceNo];

	if(pInterfaceInfo)
	{//pInterfaceInfo != NULL
#ifdef __VIDEO_CLASS__
		// For Video Class Device
		DBGU_TRACE("Change information for ISO Interface\n");
		/*
		if (InterfaceNo == 1)
			pInterfaceInfo->NumberOfPipes = 1;

		if ((InterfaceNo == 1)&&(AlternateNo > 0))
			pInterfaceInfo->Length = sizeof(USBD_INTERFACE_INFORMATION);
		*/
		// james try M2TS.
		if (InterfaceNo == 1 || InterfaceNo == 2)
		{
			//if(TwoPipeEnable)
			if(BeST5R286)
			{
				pInterfaceInfo->NumberOfPipes = 2;

				if (AlternateNo > 0)
				{
					//2010/10/28 06:45下午 test
					pInterfaceInfo->Length = GET_USBD_INTERFACE_SIZE(2);//sizeof(USBD_INTERFACE_INFORMATION);
					
					//2010/11/18 03:17下午
					if(TwoPipeEnable)
					{
						m_StopIsoThread[0] = FALSE;
						m_StopIsoThread[1] = FALSE;
					}
					else
						m_StopIsoThread[0] = FALSE;
				}				
			}
			else
			{
					pInterfaceInfo->NumberOfPipes = 1;
					if (AlternateNo > 0)
						pInterfaceInfo->Length = sizeof(USBD_INTERFACE_INFORMATION);
					m_StopIsoThread[0] = FALSE;			
			}
		}
#endif
		pUrb = (PURB) ExAllocatePoolWithTag(NonPagedPool, GET_SELECT_INTERFACE_REQUEST_SIZE(pInterfaceInfo->NumberOfPipes), USBDEV_POOLTAG);

		if(pUrb) 
		{//pUrb != NULL
			pInterfaceInfo->AlternateSetting = AlternateNo;

			for(i=0;i<pInterfaceInfo->NumberOfPipes;i++)
			{
				if (m_fUSBHighSpeed)
					pInterfaceInfo->Pipes[i].MaximumTransferSize = MAX_TRANSFER_SIZE_2;
				else
					pInterfaceInfo->Pipes[i].MaximumTransferSize = MAX_TRANSFER_SIZE;

				pInterfaceInfo->Pipes[i].PipeFlags = 0;
			}

			RtlCopyMemory(&pUrb->UrbSelectInterface.Interface, pInterfaceInfo, pInterfaceInfo->Length);
			pUrb->UrbHeader.Length   = GET_SELECT_INTERFACE_REQUEST_SIZE(pInterfaceInfo->NumberOfPipes);
			pUrb->UrbHeader.Function = URB_FUNCTION_SELECT_INTERFACE;
			pUrb->UrbSelectInterface.ConfigurationHandle = m_hConfigureation;
			ntStatus = SendAwaitUrb(pUrb);

			if(!NT_SUCCESS(ntStatus))
			{//ntStatus != STATUS_SUCCESS
				DBGU_TRACE("ERR: Fail to set alternate setting !!\n");
				ntStatus = STATUS_UNSUCCESSFUL;
			}//ntStatus != STATUS_SUCCESS
			else
			{//ntStatus == STATUS_SUCCESS
				if(pInterfaceInfo->Length > pUrb->UrbSelectInterface.Interface.Length) 
					pInterfaceInfo->Length = pUrb->UrbSelectInterface.Interface.Length;

				RtlCopyMemory(pInterfaceInfo, &pUrb->UrbSelectInterface.Interface, pUrb->UrbSelectInterface.Interface.Length);
				//Display interface information
#if DBG
				DBGU_TRACE(" Interface Information\n");
				DBGU_TRACE(" -----------------------------------\n");
				DBGU_TRACE(" Length: %x\n",pUrb->UrbSelectInterface.Interface.Length);
				DBGU_TRACE(" InterfaceNumber: %x\n",pUrb->UrbSelectInterface.Interface.InterfaceNumber);
				DBGU_TRACE(" AlternateSetting: %x\n", pUrb->UrbSelectInterface.Interface.AlternateSetting);
				DBGU_TRACE(" NumberOfPipes: %x\n",pUrb->UrbSelectInterface.Interface.NumberOfPipes);
				DBGU_TRACE(" Class: %x\n",pUrb->UrbSelectInterface.Interface.Class);
				DBGU_TRACE(" SubClass: %x\n",	pUrb->UrbSelectInterface.Interface.SubClass);
				DBGU_TRACE(" Protocol: %x\n",pUrb->UrbSelectInterface.Interface.Protocol);
				DBGU_TRACE(" InterfaceHandle: %x\n",pUrb->UrbSelectInterface.Interface.InterfaceHandle);
				DBGU_TRACE(" -----------------------------------\n");

				for(i=0;i<pInterfaceInfo->NumberOfPipes;i++) 
				{// for loop i
					DBGU_TRACE(" Pipes (%x) Information\n",i);
					DBGU_TRACE(" -----------------------------------\n");	
					DBGU_TRACE(" EndpointAddress: %x\n",pUrb->UrbSelectInterface.Interface.Pipes[i].EndpointAddress);     
					DBGU_TRACE(" PipeType: %x\n",pUrb->UrbSelectInterface.Interface.Pipes[i].PipeType);
					DBGU_TRACE(" PipeHandle: %x\n",pUrb->UrbSelectInterface.Interface.Pipes[i].PipeHandle);
					DBGU_TRACE(" MaximumPacketSize: %x\n",pUrb->UrbSelectInterface.Interface.Pipes[i].MaximumPacketSize);
				}// for loop i

				DBGU_TRACE(" -----------------------------------\n");	
#endif
			}//ntStatus == STATUS_SUCCESS
		}//pUrb != NULL
		else
		{//pUrb == NULL
			ntStatus = STATUS_INSUFFICIENT_RESOURCES;
		}//pUrb == NULL
	}//pInterfaceInfo != NULL
	else
	{//pInterfaceInfo == NULL
		DBGU_TRACE("pInterfaceInfo == NULL !\n");
		ntStatus = STATUS_UNSUCCESSFUL;
	}//pInterfaceInfo == NULL

	if(pUrb)
		ExFreePoolWithTag(pUrb,USBDEV_POOLTAG);
	
	return ntStatus;
}