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