2
* FreeRDP: A Remote Desktop Protocol Implementation
3
* RemoteFX USB Redirection
5
* Copyright 2012 Atrust corp.
6
* Copyright 2012 Alfred Liu <alfred.liu@atruscorp.com>
8
* Licensed under the Apache License, Version 2.0 (the "License");
9
* you may not use this file except in compliance with the License.
10
* You may obtain a copy of the License at
12
* http://www.apache.org/licenses/LICENSE-2.0
14
* Unless required by applicable law or agreed to in writing, software
15
* distributed under the License is distributed on an "AS IS" BASIS,
16
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
* See the License for the specific language governing permissions and
18
* limitations under the License.
26
#include <sys/ioctl.h>
28
#include <sys/types.h>
30
#include "urbdrc_types.h"
31
#include "data_transfer.h"
33
static void usb_process_get_port_status(IUDEVICE* pdev, BYTE* OutputBuffer)
35
int bcdUSB = pdev->query_device_descriptor(pdev, BCD_USB);
40
data_write_UINT32(OutputBuffer, 0x303);
44
data_write_UINT32(OutputBuffer, 0x103);
48
data_write_UINT32(OutputBuffer, 0x503);
52
data_write_UINT32(OutputBuffer, 0x503);
59
static int func_check_isochronous_fds(IUDEVICE* pdev)
63
UINT32 size_temp, process_times = 2;
64
ISOCH_CALLBACK_QUEUE* isoch_queue = NULL;
65
ISOCH_CALLBACK_DATA* isoch = NULL;
66
URBDRC_CHANNEL_CALLBACK* callback;
68
isoch_queue = (ISOCH_CALLBACK_QUEUE*) pdev->get_isoch_queue(pdev);
74
if (isoch_queue == NULL || !pdev)
77
pthread_mutex_lock(&isoch_queue->isoch_loading);
79
if (isoch_queue->head == NULL)
81
pthread_mutex_unlock(&isoch_queue->isoch_loading);
86
isoch = isoch_queue->head;
89
if (!isoch || !isoch->out_data)
91
pthread_mutex_unlock(&isoch_queue->isoch_loading);
96
callback = (URBDRC_CHANNEL_CALLBACK*) isoch->callback;
97
size_temp = isoch->out_size;
98
data_temp = isoch->out_data;
100
ret = isoch_queue->unregister_data(isoch_queue, isoch);
103
LLOGLN(0, ("isoch_queue_unregister_data: Not found isoch data!!\n"));
105
pthread_mutex_unlock(&isoch_queue->isoch_loading);
107
if (pdev && !pdev->isSigToEnd(pdev))
109
callback->channel->Write(callback->channel, size_temp, data_temp, NULL);
120
static int urbdrc_process_register_request_callback(URBDRC_CHANNEL_CALLBACK* callback,
121
BYTE* data, UINT32 data_sizem, IUDEVMAN* udevman, UINT32 UsbDevice)
124
UINT32 NumRequestCompletion = 0;
125
UINT32 RequestCompletion = 0;
127
LLOGLN(urbdrc_debug, ("urbdrc_process_register_request_callback"));
129
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
136
data_read_UINT32(data + 0, NumRequestCompletion); /** must be 1 */
137
/** RequestCompletion:
138
* unique Request Completion interface for the client to use */
139
data_read_UINT32(data + 4, RequestCompletion);
140
pdev->set_ReqCompletion(pdev, RequestCompletion);
142
else /** Unregister the device */
144
data_read_UINT32(data + 0, RequestCompletion);
146
if (1)//(pdev->get_ReqCompletion(pdev) == RequestCompletion)
148
/** The wrong driver may also receive this message, So we
149
* need some time(default 3s) to check the driver or delete
152
callback->channel->Write(callback->channel, 0, NULL, NULL);
153
pdev->SigToEnd(pdev);
160
static int urbdrc_process_cancel_request(BYTE* data, UINT32 data_sizem, IUDEVMAN* udevman, UINT32 UsbDevice)
166
data_read_UINT32(data + 0, CancelId); /** RequestId */
168
LLOGLN(urbdrc_debug, ("urbdrc_process_cancel_request: id 0x%x", CancelId));
170
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
175
error = pdev->cancel_transfer_request(pdev, CancelId);
180
static int urbdrc_process_retract_device_request(BYTE* data, UINT32 data_sizem, IUDEVMAN* udevman, UINT32 UsbDevice)
183
LLOGLN(urbdrc_debug, ("urbdrc_process_retract_device_request"));
185
data_read_UINT32(data + 0, Reason); /** Reason */
189
case UsbRetractReason_BlockedByPolicy:
190
LLOGLN(urbdrc_debug, ("UsbRetractReason_BlockedByPolicy: now it is not support"));
195
LLOGLN(urbdrc_debug, ("urbdrc_process_retract_device_request: Unknown Reason %d", Reason));
203
static int urbdrc_process_io_control(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data,
204
UINT32 data_sizem, UINT32 MessageId, IUDEVMAN * udevman, UINT32 UsbDevice)
209
UINT32 IoControlCode;
210
UINT32 InputBufferSize;
211
UINT32 OutputBufferSize;
213
UINT32 usbd_status = USBD_STATUS_SUCCESS;
216
int i, offset, success = 0;
218
LLOGLN(urbdrc_debug, ("urbdrc_process__io_control"));
220
data_read_UINT32(data + 0, IoControlCode);
221
data_read_UINT32(data + 4, InputBufferSize);
222
data_read_UINT32(data + 8 + InputBufferSize, OutputBufferSize);
223
data_read_UINT32(data + 12 + InputBufferSize, RequestId);
225
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
230
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
233
OutputBuffer = (BYTE *)malloc(OutputBufferSize);
234
memset(OutputBuffer, 0, OutputBufferSize);
236
switch (IoControlCode)
238
case IOCTL_INTERNAL_USB_SUBMIT_URB: /** 0x00220003 */
239
LLOGLN(urbdrc_debug, ("ioctl: IOCTL_INTERNAL_USB_SUBMIT_URB"));
240
fprintf(stderr, " Function IOCTL_INTERNAL_USB_SUBMIT_URB: Unchecked\n");
243
case IOCTL_INTERNAL_USB_RESET_PORT: /** 0x00220007 */
244
LLOGLN(urbdrc_debug, ("ioctl: IOCTL_INTERNAL_USB_RESET_PORT"));
247
case IOCTL_INTERNAL_USB_GET_PORT_STATUS: /** 0x00220013 */
248
LLOGLN(urbdrc_debug, ("ioctl: IOCTL_INTERNAL_USB_GET_PORT_STATUS"));
250
success = pdev->query_device_port_status(pdev, &usbd_status, &OutputBufferSize, OutputBuffer);
254
if (pdev->isExist(pdev) == 0)
256
data_write_UINT32(OutputBuffer, 0);
260
usb_process_get_port_status(pdev, OutputBuffer);
261
OutputBufferSize = 4;
264
LLOGLN(urbdrc_debug, ("PORT STATUS(fake!):0x%02x%02x%02x%02x",
265
OutputBuffer[3], OutputBuffer[2], OutputBuffer[1], OutputBuffer[0]));
270
case IOCTL_INTERNAL_USB_CYCLE_PORT: /** 0x0022001F */
271
LLOGLN(urbdrc_debug, ("ioctl: IOCTL_INTERNAL_USB_CYCLE_PORT"));
272
fprintf(stderr, " Function IOCTL_INTERNAL_USB_CYCLE_PORT: Unchecked\n");
275
case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: /** 0x00220027 */
276
LLOGLN(urbdrc_debug, ("ioctl: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION"));
277
fprintf(stderr, " Function IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: Unchecked\n");
281
LLOGLN(urbdrc_debug, ("urbdrc_process_io_control: unknown IoControlCode 0x%X", IoControlCode));
287
out_size = offset + OutputBufferSize;
288
out_data = (BYTE *) malloc(out_size);
289
memset(out_data, 0, out_size);
290
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
291
data_write_UINT32(out_data + 4, MessageId); /** message id */
292
data_write_UINT32(out_data + 8, IOCONTROL_COMPLETION); /** function id */
293
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
294
data_write_UINT32(out_data + 16, USBD_STATUS_SUCCESS); /** HResult */
295
data_write_UINT32(out_data + 20, OutputBufferSize); /** Information */
296
data_write_UINT32(out_data + 24, OutputBufferSize); /** OutputBufferSize */
298
for (i=0;i<OutputBufferSize;i++)
300
data_write_BYTE(out_data + offset, OutputBuffer[i]); /** OutputBuffer */
304
if (!pdev->isSigToEnd(pdev))
305
callback->channel->Write(callback->channel, out_size, out_data, NULL);
313
static int urbdrc_process_internal_io_control(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data,
314
UINT32 data_sizem, UINT32 MessageId, IUDEVMAN* udevman, UINT32 UsbDevice)
318
UINT32 out_size, IoControlCode, InterfaceId, InputBufferSize;
319
UINT32 OutputBufferSize, RequestId, frames;
321
data_read_UINT32(data + 0, IoControlCode);
323
LLOGLN(urbdrc_debug, ("urbdrc_process_internal_io_control:0x%x", IoControlCode));
325
data_read_UINT32(data + 4, InputBufferSize);
326
data_read_UINT32(data + 8, OutputBufferSize);
327
data_read_UINT32(data + 12, RequestId);
329
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
334
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
336
/** Fixme: Currently this is a FALSE bustime... */
337
urbdrc_get_mstime(frames);
340
out_data = (BYTE *) malloc(out_size);
341
memset(out_data, 0, out_size);
342
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
343
data_write_UINT32(out_data + 4, MessageId); /** message id */
344
data_write_UINT32(out_data + 8, IOCONTROL_COMPLETION); /** function id */
345
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
346
data_write_UINT32(out_data + 16, 0); /** HResult */
347
data_write_UINT32(out_data + 20, 4); /** Information */
348
data_write_UINT32(out_data + 24, 4); /** OutputBufferSize */
349
data_write_UINT32(out_data + 28, frames); /** OutputBuffer */
351
if (!pdev->isSigToEnd(pdev))
352
callback->channel->Write(callback->channel, out_size, out_data, NULL);
359
static int urbdrc_process_query_device_text(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data,
360
UINT32 data_sizem, UINT32 MessageId, IUDEVMAN* udevman, UINT32 UsbDevice)
367
UINT32 bufferSize = 1024;
369
BYTE DeviceDescription[bufferSize];
372
LLOGLN(urbdrc_debug, ("urbdrc_process_query_device_text"));
374
data_read_UINT32(data + 0, TextType);
375
data_read_UINT32(data + 4, LocaleId);
377
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
382
pdev->control_query_device_text(pdev, TextType, LocaleId, &bufferSize, DeviceDescription);
384
InterfaceId = ((STREAM_ID_STUB << 30) | UsbDevice);
387
out_size = out_offset + bufferSize;
392
out_data = (BYTE*) malloc(out_size);
393
memset(out_data, 0, out_size);
395
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
396
data_write_UINT32(out_data + 4, MessageId); /** message id */
400
data_write_UINT32(out_data + 8, (bufferSize/2)+1); /** cchDeviceDescription */
402
memcpy(out_data + out_offset, DeviceDescription, bufferSize);
403
out_offset += bufferSize;
404
data_write_UINT16(out_data + out_offset, 0x0000);
409
data_write_UINT32(out_data + 8, 0); /** cchDeviceDescription */
413
data_write_UINT32(out_data + out_offset, 0); /** HResult */
415
if (!pdev->isSigToEnd(pdev))
416
callback->channel->Write(callback->channel, out_size, out_data, NULL);
423
static void func_select_all_interface_for_msconfig(IUDEVICE* pdev, MSUSB_CONFIG_DESCRIPTOR* MsConfig)
426
MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces = MsConfig->MsInterfaces;
427
BYTE InterfaceNumber, AlternateSetting;
428
UINT32 NumInterfaces = MsConfig->NumInterfaces;
430
for (inum = 0; inum < NumInterfaces; inum++)
432
InterfaceNumber = MsInterfaces[inum]->InterfaceNumber;
433
AlternateSetting = MsInterfaces[inum]->AlternateSetting;
434
pdev->select_interface(pdev, InterfaceNumber, AlternateSetting);
438
static int urb_select_configuration(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data,
439
UINT32 data_sizem, UINT32 MessageId, IUDEVMAN* udevman, UINT32 UsbDevice, int transferDir)
441
MSUSB_CONFIG_DESCRIPTOR * MsConfig = NULL;
442
IUDEVICE* pdev = NULL;
443
UINT32 out_size, InterfaceId, RequestId, NumInterfaces, usbd_status = 0;
444
BYTE ConfigurationDescriptorIsValid;
446
int MsOutSize = 0, offset = 0;
448
if (transferDir == 0)
450
fprintf(stderr, "urb_select_configuration: not support transfer out\n");
454
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
459
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
460
data_read_UINT32(data + 0, RequestId);
461
data_read_BYTE(data + 4, ConfigurationDescriptorIsValid);
462
data_read_UINT32(data + 8, NumInterfaces);
465
/** if ConfigurationDescriptorIsValid is zero, then just do nothing.*/
466
if (ConfigurationDescriptorIsValid)
468
/* parser data for struct config */
469
MsConfig = msusb_msconfig_read(data + offset, data_sizem - offset, NumInterfaces);
471
pdev->select_configuration(pdev, MsConfig->bConfigurationValue);
472
/* select all interface */
473
func_select_all_interface_for_msconfig(pdev, MsConfig);
474
/* complete configuration setup */
475
MsConfig = pdev->complete_msconfig_setup(pdev, MsConfig);
479
MsOutSize = MsConfig->MsOutSize;
482
out_size = 36 + MsOutSize;
485
out_data = (BYTE *) malloc(out_size);
486
memset(out_data, 0, out_size);
487
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
488
data_write_UINT32(out_data + 4, MessageId); /** message id */
489
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA); /** function id */
490
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
494
data_write_UINT32(out_data + 16, 8 + MsOutSize);
495
/** TS_URB_RESULT_HEADER Size*/
496
data_write_UINT16(out_data + 20, 8 + MsOutSize);
500
data_write_UINT32(out_data + 16, 16);
501
data_write_UINT16(out_data + 20, 16);
504
/** Padding, MUST be ignored upon receipt */
505
data_write_UINT16(out_data + 22, URB_FUNCTION_SELECT_CONFIGURATION);
506
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
508
/** TS_URB_SELECT_CONFIGURATION_RESULT */
511
msusb_msconfig_write(MsConfig, out_data, &offset);
515
data_write_UINT32(out_data + offset, 0); /** ConfigurationHandle */
516
data_write_UINT32(out_data + offset + 4, NumInterfaces); /** NumInterfaces */
519
data_write_UINT32(out_data + offset, 0); /** HResult */
520
data_write_UINT32(out_data + offset + 4, 0); /** OutputBufferSize */
522
if (!pdev->isSigToEnd(pdev))
523
callback->channel->Write(callback->channel, out_size, out_data, NULL);
528
static int urb_select_interface(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data, UINT32 data_sizem,
529
UINT32 MessageId, IUDEVMAN* udevman, UINT32 UsbDevice, int transferDir)
531
MSUSB_CONFIG_DESCRIPTOR* MsConfig;
532
MSUSB_INTERFACE_DESCRIPTOR* MsInterface;
534
UINT32 out_size, InterfaceId, RequestId, ConfigurationHandle;
535
UINT32 OutputBufferSize;
536
BYTE InterfaceNumber;
538
int out_offset, interface_size;
540
if (transferDir == 0)
542
fprintf(stderr, "urb_select_interface: not support transfer out\n");
546
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
551
InterfaceId = ((STREAM_ID_PROXY << 30) | pdev->get_ReqCompletion(pdev));
553
data_read_UINT32(data + 0, RequestId);
554
data_read_UINT32(data + 4, ConfigurationHandle);
557
MsInterface = msusb_msinterface_read(data + out_offset, data_sizem - out_offset, &out_offset);
559
data_read_UINT32(data + out_offset, OutputBufferSize);
561
pdev->select_interface(pdev, MsInterface->InterfaceNumber, MsInterface->AlternateSetting);
563
/* replace device's MsInterface */
564
MsConfig = pdev->get_MsConfig(pdev);
565
InterfaceNumber = MsInterface->InterfaceNumber;
566
msusb_msinterface_replace(MsConfig, InterfaceNumber, MsInterface);
568
/* complete configuration setup */
569
MsConfig = pdev->complete_msconfig_setup(pdev, MsConfig);
570
MsInterface = MsConfig->MsInterfaces[InterfaceNumber];
571
interface_size = 16 + (MsInterface->NumberOfPipes * 20);
573
out_size = 36 + interface_size ;
574
out_data = (BYTE*) malloc(out_size);
575
memset(out_data, 0, out_size);
577
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
578
data_write_UINT32(out_data + 4, MessageId); /** message id */
579
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA); /** function id */
580
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
581
data_write_UINT32(out_data + 16, 8 + interface_size); /** CbTsUrbResult */
582
/** TS_URB_RESULT_HEADER */
583
data_write_UINT16(out_data + 20, 8 + interface_size); /** Size */
584
/** Padding, MUST be ignored upon receipt */
585
data_write_UINT16(out_data + 22, URB_FUNCTION_SELECT_INTERFACE);
586
data_write_UINT32(out_data + 24, USBD_STATUS_SUCCESS); /** UsbdStatus */
589
/** TS_URB_SELECT_INTERFACE_RESULT */
590
msusb_msinterface_write(MsInterface, out_data + out_offset, &out_offset);
592
data_write_UINT32(out_data + out_offset, 0); /** HResult */
593
data_write_UINT32(out_data + out_offset + 4, OutputBufferSize); /** OutputBufferSize */
595
if (!pdev->isSigToEnd(pdev))
596
callback->channel->Write(callback->channel, out_size, out_data, NULL);
603
static int urb_control_transfer(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data,
604
UINT32 data_sizem, UINT32 MessageId, IUDEVMAN* udevman, UINT32 UsbDevice, int transferDir, int External)
607
UINT32 out_size, RequestId, InterfaceId, EndpointAddress, PipeHandle;
608
UINT32 TransferFlags, OutputBufferSize, usbd_status, Timeout;
609
BYTE bmRequestType, Request;
610
UINT16 Value, Index, length;
615
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
620
InterfaceId = ((STREAM_ID_PROXY << 30) | pdev->get_ReqCompletion(pdev));
621
data_read_UINT32(data + 0, RequestId);
622
data_read_UINT32(data + 4, PipeHandle);
623
data_read_UINT32(data + 8, TransferFlags); /** TransferFlags */
625
EndpointAddress = (PipeHandle & 0x000000ff);
631
case URB_CONTROL_TRANSFER_EXTERNAL:
632
data_read_UINT32(data + offset, Timeout); /** TransferFlags */
635
case URB_CONTROL_TRANSFER_NONEXTERNAL:
639
/** SetupPacket 8 bytes */
640
data_read_BYTE(data + offset, bmRequestType);
641
data_read_BYTE(data + offset + 1, Request);
642
data_read_UINT16(data + offset + 2, Value);
643
data_read_UINT16(data + offset + 4, Index);
644
data_read_UINT16(data + offset + 6, length);
645
data_read_UINT32(data + offset + 8, OutputBufferSize);
648
if (length != OutputBufferSize)
650
LLOGLN(urbdrc_debug, ("urb_control_transfer ERROR: buf != length"));
654
out_size = 36 + OutputBufferSize;
655
out_data = (BYTE *) malloc(out_size);
656
memset(out_data, 0, out_size);
658
buffer = out_data + 36;
660
/** Get Buffer Data */
661
if (transferDir == USBD_TRANSFER_DIRECTION_OUT)
662
memcpy(buffer, data + offset, OutputBufferSize);
664
/** process URB_FUNCTION_CONTROL_TRANSFER */
665
ret = pdev->control_transfer(
666
pdev, RequestId, EndpointAddress, TransferFlags,
677
LLOGLN(urbdrc_debug, ("control_transfer: error num %d!!\n", ret));
678
OutputBufferSize = 0;
683
if (transferDir == USBD_TRANSFER_DIRECTION_IN)
684
out_size = offset + OutputBufferSize;
688
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
689
data_write_UINT32(out_data + 4, MessageId); /** message id */
691
if(transferDir == USBD_TRANSFER_DIRECTION_IN && OutputBufferSize != 0)
692
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
694
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
695
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
696
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
697
/** TsUrbResult TS_URB_RESULT_HEADER */
698
data_write_UINT16(out_data + 20, 0x0008); /** Size */
700
/** Padding, MUST be ignored upon receipt */
701
data_write_UINT16(out_data + 22, URB_FUNCTION_CONTROL_TRANSFER);
702
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
704
data_write_UINT32(out_data + 28, 0); /** HResult */
705
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
707
if (!pdev->isSigToEnd(pdev))
708
callback->channel->Write(callback->channel, out_size, out_data, NULL);
715
static int urb_bulk_or_interrupt_transfer(URBDRC_CHANNEL_CALLBACK* callback, BYTE* data,
716
UINT32 data_sizem, UINT32 MessageId, IUDEVMAN* udevman, UINT32 UsbDevice, int transferDir)
722
UINT32 out_size, RequestId, InterfaceId, EndpointAddress, PipeHandle;
723
UINT32 TransferFlags, OutputBufferSize, usbd_status = 0;
725
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
730
InterfaceId = ((STREAM_ID_PROXY << 30) | pdev->get_ReqCompletion(pdev));
732
data_read_UINT32(data + 0, RequestId);
733
data_read_UINT32(data + 4, PipeHandle);
734
data_read_UINT32(data + 8, TransferFlags); /** TransferFlags */
735
data_read_UINT32(data + 12, OutputBufferSize);
737
EndpointAddress = (PipeHandle & 0x000000ff);
739
if (transferDir == USBD_TRANSFER_DIRECTION_OUT)
742
out_size = 36 + OutputBufferSize;
745
out_data = (BYTE*) malloc(out_size);
746
memset(out_data, 0, out_size);
750
case USBD_TRANSFER_DIRECTION_OUT:
751
Buffer = data + offset;
754
case USBD_TRANSFER_DIRECTION_IN:
755
Buffer = out_data + 36;
759
/** process URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER */
760
pdev->bulk_or_interrupt_transfer(
761
pdev, RequestId, EndpointAddress,
769
if (transferDir == USBD_TRANSFER_DIRECTION_IN)
770
out_size = offset + OutputBufferSize;
774
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
775
data_write_UINT32(out_data + 4, MessageId); /** message id */
776
if(transferDir == USBD_TRANSFER_DIRECTION_IN && OutputBufferSize != 0)
777
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
779
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
780
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
781
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
782
/** TsUrbResult TS_URB_RESULT_HEADER */
783
data_write_UINT16(out_data + 20, 0x0008); /** Size */
785
/** Padding, MUST be ignored upon receipt */
786
data_write_UINT16(out_data + 22, URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER);
787
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
789
data_write_UINT32(out_data + 28, 0); /** HResult */
790
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
792
if (pdev && !pdev->isSigToEnd(pdev))
793
callback->channel->Write(callback->channel, out_size, out_data, NULL);
801
static int urb_isoch_transfer(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data,
809
UINT32 RequestId, InterfaceId, EndpointAddress;
810
UINT32 PipeHandle, TransferFlags, StartFrame, NumberOfPackets;
811
UINT32 ErrorCount, OutputBufferSize, usbd_status = 0;
812
UINT32 RequestField, noAck = 0;
814
BYTE * iso_buffer = NULL;
815
BYTE * iso_packets = NULL;
816
BYTE * out_data = NULL;
817
int offset, nullBuffer = 0, iso_status;
819
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
822
if (pdev->isSigToEnd(pdev))
825
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
826
data_read_UINT32(data + 0, RequestField);
827
RequestId = RequestField & 0x7fffffff;
828
noAck = (RequestField & 0x80000000)>>31;
829
data_read_UINT32(data + 4, PipeHandle);
830
EndpointAddress = (PipeHandle & 0x000000ff);
831
data_read_UINT32(data + 8, TransferFlags); /** TransferFlags */
832
data_read_UINT32(data + 12, StartFrame); /** StartFrame */
833
data_read_UINT32(data + 16, NumberOfPackets); /** NumberOfPackets */
834
data_read_UINT32(data + 20, ErrorCount); /** ErrorCount */
835
offset = 24 + (NumberOfPackets * 12);
836
data_read_UINT32(data + offset, OutputBufferSize);
839
/** send data memory alloc */
840
if (transferDir == USBD_TRANSFER_DIRECTION_OUT) {
842
out_size = 48 + (NumberOfPackets * 12);
843
out_data = (BYTE *) malloc(out_size);
844
iso_packets = out_data + 40;
848
out_size = 48 + OutputBufferSize + (NumberOfPackets * 12);
849
out_data = (BYTE *) malloc(out_size);
850
iso_packets = out_data + 40;
854
memset(out_data, 0, out_size);
858
case USBD_TRANSFER_DIRECTION_OUT:
859
/** Get Buffer Data */
860
//memcpy(iso_buffer, data + offset, OutputBufferSize);
861
iso_buffer = data + offset;
863
case USBD_TRANSFER_DIRECTION_IN:
864
iso_buffer = out_data + 48 + (NumberOfPackets * 12);
868
LLOGLN(urbdrc_debug, ("urb_isoch_transfer: EndpointAddress: 0x%x, "
869
"TransferFlags: 0x%x, " "StartFrame: 0x%x, "
870
"NumberOfPackets: 0x%x, " "OutputBufferSize: 0x%x "
872
EndpointAddress, TransferFlags, StartFrame,
873
NumberOfPackets, OutputBufferSize, RequestId));
876
ISOCH_CALLBACK_QUEUE * isoch_queue = NULL;
877
ISOCH_CALLBACK_DATA * isoch = NULL;
880
isoch_queue = (ISOCH_CALLBACK_QUEUE *)pdev->get_isoch_queue(pdev);
881
isoch = isoch_queue->register_data(isoch_queue, callback, pdev);
885
iso_status = pdev->isoch_transfer(
886
pdev, RequestId, EndpointAddress,
910
OutputBufferSize = 0;
912
out_size += OutputBufferSize + (NumberOfPackets * 12);
913
/* fill the send data */
914
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
915
data_write_UINT32(out_data + 4, MessageId); /** message id */
916
if(OutputBufferSize != 0 && !nullBuffer)
917
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
919
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
920
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
921
data_write_UINT32(out_data + 16, 20 + (NumberOfPackets * 12)); /** CbTsUrbResult */
922
/** TsUrbResult TS_URB_RESULT_HEADER */
923
data_write_UINT16(out_data + 20, 20 + (NumberOfPackets * 12)); /** Size */
924
/** Padding, MUST be ignored upon receipt */
925
data_write_UINT16(out_data + 22, URB_FUNCTION_ISOCH_TRANSFER);
926
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
928
data_write_UINT32(out_data + 28, StartFrame); /** StartFrame */
931
/** NumberOfPackets */
932
data_write_UINT32(out_data + 32, NumberOfPackets);
933
data_write_UINT32(out_data + 36, ErrorCount); /** ErrorCount */
934
offset = 40 + (NumberOfPackets * 12);
938
data_write_UINT32(out_data + 32, 0); /** NumberOfPackets */
939
data_write_UINT32(out_data + 36, NumberOfPackets); /** ErrorCount */
943
data_write_UINT32(out_data + offset, 0); /** HResult */
944
data_write_UINT32(out_data + offset + 4, OutputBufferSize); /** OutputBufferSize */
948
pthread_mutex_lock(&isoch_queue->isoch_loading);
949
isoch->out_data = out_data;
950
isoch->out_size = out_size;
951
pthread_mutex_unlock(&isoch_queue->isoch_loading);
954
if (!pdev->isSigToEnd(pdev))
955
callback->channel->Write(callback->channel, out_size, out_data, NULL);
965
static int urb_control_descriptor_request(URBDRC_CHANNEL_CALLBACK* callback,
975
UINT32 out_size, InterfaceId, RequestId, OutputBufferSize, usbd_status;
976
BYTE bmRequestType, desc_index, desc_type;
982
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
987
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
988
data_read_UINT32(data + 0, RequestId);
989
data_read_BYTE(data + 4, desc_index);
990
data_read_BYTE(data + 5, desc_type);
991
data_read_UINT16(data + 6, langId);
992
data_read_UINT32(data + 8, OutputBufferSize);
994
out_size = 36 + OutputBufferSize;
995
out_data = (BYTE *) malloc(out_size);
996
memset(out_data, 0, out_size);
998
buffer = out_data + 36;
1000
bmRequestType = func_recipient;
1001
switch (transferDir)
1003
case USBD_TRANSFER_DIRECTION_IN:
1004
bmRequestType |= 0x80;
1006
case USBD_TRANSFER_DIRECTION_OUT:
1007
bmRequestType |= 0x00;
1009
memcpy(buffer, data + offset, OutputBufferSize);
1012
LLOGLN(urbdrc_debug, ("%s: get error transferDir", __func__));
1013
OutputBufferSize = 0;
1014
usbd_status = USBD_STATUS_STALL_PID;
1018
/** process get usb device descriptor */
1020
ret = pdev->control_transfer(
1021
pdev, RequestId, 0, 0, bmRequestType,
1022
0x06, /* REQUEST_GET_DESCRIPTOR */
1023
(desc_type << 8) | desc_index,
1032
LLOGLN(urbdrc_debug, ("%s:get_descriptor: error num %d", __func__, ret));
1033
OutputBufferSize = 0;
1037
out_size = offset + OutputBufferSize;
1038
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1039
data_write_UINT32(out_data + 4, MessageId); /** message id */
1040
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
1041
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1042
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
1043
/** TsUrbResult TS_URB_RESULT_HEADER */
1044
data_write_UINT16(out_data + 20, 0x0008); /** Size */
1045
/** Padding, MUST be ignored upon receipt */
1046
data_write_UINT16(out_data + 22, URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE);
1047
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1048
data_write_UINT32(out_data + 28, 0); /** HResult */
1049
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1051
if (!pdev->isSigToEnd(pdev))
1052
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1058
static int urb_control_get_status_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data,
1063
BYTE func_recipient,
1067
UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status;
1074
if (transferDir == 0){
1075
LLOGLN(urbdrc_debug, ("urb_control_get_status_request: not support transfer out\n"));
1079
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1082
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1084
data_read_UINT32(data + 0, RequestId);
1085
data_read_UINT16(data + 4, Index); /** Index */
1086
data_read_UINT32(data + 8, OutputBufferSize);
1088
out_size = 36 + OutputBufferSize;
1089
out_data = (BYTE *) malloc(out_size);
1090
memset(out_data, 0, out_size);
1092
buffer = out_data + 36;
1094
bmRequestType = func_recipient | 0x80;
1096
ret = pdev->control_transfer(
1097
pdev, RequestId, 0, 0, bmRequestType,
1098
0x00, /* REQUEST_GET_STATUS */
1107
LLOGLN(urbdrc_debug, ("%s:control_transfer: error num %d!!\n", __func__, ret));
1108
OutputBufferSize = 0;
1109
usbd_status = USBD_STATUS_STALL_PID;
1112
usbd_status = USBD_STATUS_SUCCESS;
1117
if (transferDir == USBD_TRANSFER_DIRECTION_IN)
1118
out_size = offset + OutputBufferSize;
1122
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1123
data_write_UINT32(out_data + 4, MessageId); /** message id */
1125
if(transferDir == USBD_TRANSFER_DIRECTION_IN && OutputBufferSize != 0)
1126
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
1128
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1130
data_write_UINT32(out_data + 12, RequestId); /** RequestId, include NoAck*/
1131
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
1132
/** TsUrbResult TS_URB_RESULT_HEADER */
1133
data_write_UINT16(out_data + 20, 0x0008); /** Size */
1134
/** Padding, MUST be ignored upon receipt */
1135
data_write_UINT16(out_data + 22, URB_FUNCTION_VENDOR_DEVICE);
1136
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1138
data_write_UINT32(out_data + 28, 0); /** HResult */
1139
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1141
if (!pdev->isSigToEnd(pdev))
1142
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1149
static int urb_control_vendor_or_class_request(URBDRC_CHANNEL_CALLBACK * callback,
1156
BYTE func_recipient,
1160
UINT32 out_size, RequestId, InterfaceId, TransferFlags, usbd_status;
1161
UINT32 OutputBufferSize;
1162
BYTE ReqTypeReservedBits, Request, bmRequestType;
1163
UINT16 Value, Index, Padding;
1167
/** control by vendor command */
1169
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1172
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1174
data_read_UINT32(data + 0, RequestId);
1175
data_read_UINT32(data + 4, TransferFlags); /** TransferFlags */
1176
data_read_BYTE(data + 8, ReqTypeReservedBits); /** ReqTypeReservedBids */
1177
data_read_BYTE(data + 9, Request); /** Request */
1178
data_read_UINT16(data + 10, Value); /** value */
1179
data_read_UINT16(data + 12, Index); /** index */
1180
data_read_UINT16(data + 14, Padding); /** Padding */
1181
data_read_UINT32(data + 16, OutputBufferSize);
1184
out_size = 36 + OutputBufferSize;
1185
out_data = (BYTE *) malloc(out_size);
1186
memset(out_data, 0, out_size);
1188
buffer = out_data + 36;
1191
if (transferDir == USBD_TRANSFER_DIRECTION_OUT)
1192
memcpy(buffer, data + offset, OutputBufferSize);
1194
/** vendor or class command */
1195
bmRequestType = func_type | func_recipient;
1197
if (TransferFlags & USBD_TRANSFER_DIRECTION)
1198
bmRequestType |= 0x80;
1200
LLOGLN(urbdrc_debug, ("urb_control_vendor_or_class_request: "
1201
"RequestId 0x%x TransferFlags: 0x%x ReqTypeReservedBits: 0x%x "
1202
"Request:0x%x Value: 0x%x Index: 0x%x OutputBufferSize: 0x%x bmRequestType: 0x%x!!",
1203
RequestId, TransferFlags, ReqTypeReservedBits, Request, Value,
1204
Index, OutputBufferSize, bmRequestType));
1206
ret = pdev->control_transfer(
1207
pdev, RequestId, 0, 0, bmRequestType,
1217
LLOGLN(urbdrc_debug, ("%s:control_transfer: error num %d!!", __func__, ret));
1218
OutputBufferSize = 0;
1219
usbd_status = USBD_STATUS_STALL_PID;
1222
usbd_status = USBD_STATUS_SUCCESS;
1226
if (transferDir == USBD_TRANSFER_DIRECTION_IN)
1227
out_size = offset + OutputBufferSize;
1231
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1232
data_write_UINT32(out_data + 4, MessageId); /** message id */
1234
if(transferDir == USBD_TRANSFER_DIRECTION_IN && OutputBufferSize != 0)
1235
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
1237
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1239
data_write_UINT32(out_data + 12, RequestId); /** RequestId, include NoAck*/
1240
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
1241
/** TsUrbResult TS_URB_RESULT_HEADER */
1242
data_write_UINT16(out_data + 20, 0x0008); /** Size */
1243
data_write_UINT16(out_data + 22, URB_FUNCTION_VENDOR_DEVICE); /** Padding, MUST be ignored upon receipt */
1244
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1246
data_write_UINT32(out_data + 28, 0); /** HResult */
1247
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1249
if (!pdev->isSigToEnd(pdev))
1250
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1258
static int urb_os_feature_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback,
1267
UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status;
1268
BYTE Recipient, InterfaceNumber, Ms_PageIndex;
1269
UINT16 Ms_featureDescIndex;
1274
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1279
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1281
data_read_UINT32(data + 0, RequestId);
1282
data_read_BYTE(data + 4, Recipient); /** Recipient */
1283
Recipient = Recipient && 0x1f;
1284
data_read_BYTE(data + 5, InterfaceNumber); /** InterfaceNumber */
1285
data_read_BYTE(data + 6, Ms_PageIndex); /** Ms_PageIndex */
1286
data_read_UINT16(data + 7, Ms_featureDescIndex); /** Ms_featureDescIndex */
1287
data_read_UINT32(data + 12, OutputBufferSize);
1290
out_size = 36 + OutputBufferSize;
1291
out_data = (BYTE *) malloc(out_size);
1292
memset(out_data, 0, out_size);
1294
buffer = out_data + 36;
1296
switch (transferDir)
1298
case USBD_TRANSFER_DIRECTION_OUT:
1299
fprintf(stderr, "Function urb_os_feature_descriptor_request: OUT Unchecked\n");
1300
memcpy(buffer, data + offset, OutputBufferSize);
1302
case USBD_TRANSFER_DIRECTION_IN:
1306
LLOGLN(urbdrc_debug, ("Ms descriptor arg: Recipient:0x%x, "
1307
"InterfaceNumber:0x%x, Ms_PageIndex:0x%x, "
1308
"Ms_featureDescIndex:0x%x, OutputBufferSize:0x%x",
1309
Recipient, InterfaceNumber, Ms_PageIndex,
1310
Ms_featureDescIndex, OutputBufferSize));
1311
/** get ms string */
1312
ret = pdev->os_feature_descriptor_request(
1313
pdev, RequestId, Recipient,
1316
Ms_featureDescIndex,
1323
LLOGLN(urbdrc_debug, ("os_feature_descriptor_request: error num %d", ret));
1326
out_size = offset + OutputBufferSize;
1328
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1329
data_write_UINT32(out_data + 4, MessageId); /** message id */
1330
if(OutputBufferSize!=0)
1331
data_write_UINT32(out_data + 8, URB_COMPLETION); /** function id */
1333
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1334
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1335
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
1336
/** TsUrbResult TS_URB_RESULT_HEADER */
1337
data_write_UINT16(out_data + 20, 0x0008); /** Size */
1339
/** Padding, MUST be ignored upon receipt */
1340
data_write_UINT16(out_data + 22, URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR);
1341
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1343
data_write_UINT32(out_data + 28, 0); /** HResult */
1344
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1346
if (!pdev->isSigToEnd(pdev))
1347
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1354
static int urb_pipe_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data,
1363
UINT32 out_size, RequestId, InterfaceId, PipeHandle, EndpointAddress;
1364
UINT32 OutputBufferSize, usbd_status = 0;
1366
int out_offset, ret;
1368
if (transferDir == 0){
1369
LLOGLN(urbdrc_debug, ("urb_pipe_request: not support transfer out\n"));
1373
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1378
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1380
data_read_UINT32(data + 0, RequestId);
1381
data_read_UINT32(data + 4, PipeHandle); /** PipeHandle */
1382
data_read_UINT32(data + 8, OutputBufferSize);
1383
EndpointAddress = (PipeHandle & 0x000000ff);
1388
LLOGLN(urbdrc_debug, ("urb_pipe_request: PIPE_CANCEL 0x%x ", EndpointAddress));
1390
ret = pdev->control_pipe_request(
1391
pdev, RequestId, EndpointAddress,
1396
LLOGLN(urbdrc_debug, ("PIPE SET HALT: error num %d", ret));
1402
LLOGLN(urbdrc_debug, ("urb_pipe_request: PIPE_RESET ep 0x%x ", EndpointAddress));
1404
ret = pdev->control_pipe_request(
1405
pdev, RequestId, EndpointAddress,
1410
LLOGLN(urbdrc_debug, ("PIPE RESET: error num %d!!\n", ret));
1414
LLOGLN(urbdrc_debug, ("urb_pipe_request action: %d is not support!\n", action));
1421
out_size = out_offset + OutputBufferSize;
1422
out_data = (BYTE *) malloc(out_size);
1423
memset(out_data, 0, out_size);
1424
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1425
data_write_UINT32(out_data + 4, MessageId); /** message id */
1427
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1428
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1429
data_write_UINT32(out_data + 16, 0x00000008); /** CbTsUrbResult */
1430
/** TsUrbResult TS_URB_RESULT_HEADER */
1431
data_write_UINT16(out_data + 20, 0x0008); /** Size */
1433
/** Padding, MUST be ignored upon receipt */
1434
data_write_UINT16(out_data + 22, URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL);
1435
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1437
data_write_UINT32(out_data + 28, 0); /** HResult */
1438
data_write_UINT32(out_data + 32, 0); /** OutputBufferSize */
1440
if (!pdev->isSigToEnd(pdev))
1441
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1447
static int urb_get_current_frame_number(URBDRC_CHANNEL_CALLBACK* callback,
1456
UINT32 out_size, RequestId, InterfaceId, OutputBufferSize;
1457
UINT32 dummy_frames;
1460
if (transferDir == 0){
1461
LLOGLN(urbdrc_debug, ("urb_get_current_frame_number: not support transfer out\n"));
1466
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1469
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1471
data_read_UINT32(data + 0, RequestId);
1472
data_read_UINT32(data + 4, OutputBufferSize);
1474
/** Fixme: Need to fill actual frame number!!*/
1475
urbdrc_get_mstime(dummy_frames);
1478
out_data = (BYTE *) malloc(out_size);
1479
memset(out_data, 0, out_size);
1480
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1481
data_write_UINT32(out_data + 4, MessageId); /** message id */
1483
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1484
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1485
data_write_UINT32(out_data + 16, 12); /** CbTsUrbResult */
1486
/** TsUrbResult TS_URB_RESULT_HEADER */
1487
data_write_UINT16(out_data + 20, 12); /** Size */
1489
/** Padding, MUST be ignored upon receipt */
1490
data_write_UINT16(out_data + 22, URB_FUNCTION_GET_CURRENT_FRAME_NUMBER);
1491
data_write_UINT32(out_data + 24, USBD_STATUS_SUCCESS); /** UsbdStatus */
1492
data_write_UINT32(out_data + 28, dummy_frames); /** FrameNumber */
1494
data_write_UINT32(out_data + 32, 0); /** HResult */
1495
data_write_UINT32(out_data + 36, 0); /** OutputBufferSize */
1497
if (!pdev->isSigToEnd(pdev))
1498
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1504
/* Unused function for current server */
1505
static int urb_control_get_configuration_request(URBDRC_CHANNEL_CALLBACK* callback,
1514
UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status;
1519
if (transferDir == 0)
1521
LLOGLN(urbdrc_debug, ("urb_control_get_configuration_request:"
1522
" not support transfer out\n"));
1526
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1531
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1533
data_read_UINT32(data + 0, RequestId);
1534
data_read_UINT32(data + 4, OutputBufferSize);
1536
out_size = 36 + OutputBufferSize;
1537
out_data = (BYTE *) malloc(out_size);
1538
memset(out_data, 0, out_size);
1540
buffer = out_data + 36;
1542
ret = pdev->control_transfer(
1543
pdev, RequestId, 0, 0, 0x80 | 0x00,
1544
0x08, /* REQUEST_GET_CONFIGURATION */
1553
LLOGLN(urbdrc_debug, ("%s:control_transfer: error num %d\n", __func__, ret));
1554
OutputBufferSize = 0;
1559
out_size = offset + OutputBufferSize;
1560
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1561
data_write_UINT32(out_data + 4, MessageId); /** message id */
1563
if (OutputBufferSize != 0)
1564
data_write_UINT32(out_data + 8, URB_COMPLETION);
1566
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1567
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1568
data_write_UINT32(out_data + 16, 8); /** CbTsUrbResult */
1569
/** TsUrbResult TS_URB_RESULT_HEADER */
1570
data_write_UINT16(out_data + 20, 8); /** Size */
1572
/** Padding, MUST be ignored upon receipt */
1573
data_write_UINT16(out_data + 22, URB_FUNCTION_GET_CONFIGURATION);
1574
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1576
data_write_UINT32(out_data + 28, 0); /** HResult */
1577
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1579
if (!pdev->isSigToEnd(pdev))
1580
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1585
/* Unused function for current server */
1586
static int urb_control_get_interface_request(URBDRC_CHANNEL_CALLBACK* callback,
1595
UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status;
1601
if (transferDir == 0){
1602
LLOGLN(urbdrc_debug, ("urb_control_get_interface_request: not support transfer out\n"));
1606
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1609
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1611
data_read_UINT32(data + 0, RequestId);
1612
data_read_UINT16(data + 4, interface);
1613
data_read_UINT32(data + 8, OutputBufferSize);
1615
out_size = 36 + OutputBufferSize;
1616
out_data = (BYTE *) malloc(out_size);
1617
memset(out_data, 0, out_size);
1619
buffer = out_data + 36;
1621
ret = pdev->control_transfer(pdev, RequestId, 0, 0, 0x80 | 0x01,
1622
0x0A, /* REQUEST_GET_INTERFACE */
1631
LLOGLN(urbdrc_debug, ("%s:control_transfer: error num %d\n", __func__, ret));
1632
OutputBufferSize = 0;
1636
out_size = offset + OutputBufferSize;
1637
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1638
data_write_UINT32(out_data + 4, MessageId); /** message id */
1640
if (OutputBufferSize != 0)
1641
data_write_UINT32(out_data + 8, URB_COMPLETION);
1643
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1644
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1645
data_write_UINT32(out_data + 16, 8); /** CbTsUrbResult */
1646
/** TsUrbResult TS_URB_RESULT_HEADER */
1647
data_write_UINT16(out_data + 20, 8); /** Size */
1649
/** Padding, MUST be ignored upon receipt */
1650
data_write_UINT16(out_data + 22, URB_FUNCTION_GET_INTERFACE);
1651
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1653
data_write_UINT32(out_data + 28, 0); /** HResult */
1654
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1656
if (!pdev->isSigToEnd(pdev))
1657
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1662
static int urb_control_feature_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data,
1667
BYTE func_recipient,
1672
UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status;
1673
UINT16 FeatureSelector, Index;
1674
BYTE bmRequestType, bmRequest;
1679
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1684
InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev));
1686
data_read_UINT32(data + 0, RequestId);
1687
data_read_UINT16(data + 4, FeatureSelector);
1688
data_read_UINT16(data + 6, Index);
1689
data_read_UINT32(data + 8, OutputBufferSize);
1692
out_size = 36 + OutputBufferSize;
1693
out_data = (BYTE *) malloc(out_size);
1694
memset(out_data, 0, out_size);
1696
buffer = out_data + 36;
1698
bmRequestType = func_recipient;
1699
switch (transferDir)
1701
case USBD_TRANSFER_DIRECTION_OUT:
1702
fprintf(stderr, "Function urb_control_feature_request: OUT Unchecked\n");
1703
memcpy(buffer, data + offset, OutputBufferSize);
1704
bmRequestType |= 0x00;
1706
case USBD_TRANSFER_DIRECTION_IN:
1707
bmRequestType |= 0x80;
1713
case URB_SET_FEATURE:
1714
bmRequest = 0x03; /* REQUEST_SET_FEATURE */
1716
case URB_CLEAR_FEATURE:
1717
bmRequest = 0x01; /* REQUEST_CLEAR_FEATURE */
1720
fprintf(stderr, "urb_control_feature_request: Error Command %x\n", command);
1724
ret = pdev->control_transfer(
1725
pdev, RequestId, 0, 0, bmRequestType, bmRequest,
1734
LLOGLN(urbdrc_debug, ("feature control transfer: error num %d", ret));
1735
OutputBufferSize = 0;
1739
out_size = offset + OutputBufferSize;
1740
data_write_UINT32(out_data + 0, InterfaceId); /** interface */
1741
data_write_UINT32(out_data + 4, MessageId); /** message id */
1743
if (OutputBufferSize != 0)
1744
data_write_UINT32(out_data + 8, URB_COMPLETION);
1746
data_write_UINT32(out_data + 8, URB_COMPLETION_NO_DATA);
1747
data_write_UINT32(out_data + 12, RequestId); /** RequestId */
1748
data_write_UINT32(out_data + 16, 8); /** CbTsUrbResult */
1749
/** TsUrbResult TS_URB_RESULT_HEADER */
1750
data_write_UINT16(out_data + 20, 8); /** Size */
1752
/** Padding, MUST be ignored upon receipt */
1753
data_write_UINT16(out_data + 22, URB_FUNCTION_GET_INTERFACE);
1754
data_write_UINT32(out_data + 24, usbd_status); /** UsbdStatus */
1756
data_write_UINT32(out_data + 28, 0); /** HResult */
1757
data_write_UINT32(out_data + 32, OutputBufferSize); /** OutputBufferSize */
1760
if (!pdev->isSigToEnd(pdev))
1761
callback->channel->Write(callback->channel, out_size, out_data, NULL);
1766
static int urbdrc_process_transfer_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data,
1776
UINT16 URB_Function;
1777
UINT32 OutputBufferSize;
1780
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
1783
data_read_UINT32(data + 0, CbTsUrb); /** CbTsUrb */
1784
data_read_UINT16(data + 4, Size); /** size */
1785
data_read_UINT16(data + 6, URB_Function);
1786
data_read_UINT32(data + 4 + CbTsUrb, OutputBufferSize);
1788
switch (URB_Function)
1790
case URB_FUNCTION_SELECT_CONFIGURATION: /** 0x0000 */
1791
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SELECT_CONFIGURATION"));
1792
error = urb_select_configuration(
1800
case URB_FUNCTION_SELECT_INTERFACE: /** 0x0001 */
1801
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SELECT_INTERFACE"));
1802
error = urb_select_interface(
1810
case URB_FUNCTION_ABORT_PIPE: /** 0x0002 */
1811
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_ABORT_PIPE"));
1812
error = urb_pipe_request(
1813
callback, data + 8, data_sizem - 8,
1820
case URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL: /** 0x0003 */
1821
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL"));
1822
error = -1; /** This URB function is obsolete in Windows 2000
1823
* and later operating systems
1824
* and is not supported by Microsoft. */
1826
case URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL: /** 0x0004 */
1827
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL"));
1828
error = -1; /** This URB function is obsolete in Windows 2000
1829
* and later operating systems
1830
* and is not supported by Microsoft. */
1832
case URB_FUNCTION_GET_FRAME_LENGTH: /** 0x0005 */
1833
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_FRAME_LENGTH"));
1834
error = -1; /** This URB function is obsolete in Windows 2000
1835
* and later operating systems
1836
* and is not supported by Microsoft. */
1838
case URB_FUNCTION_SET_FRAME_LENGTH: /** 0x0006 */
1839
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_FRAME_LENGTH"));
1840
error = -1; /** This URB function is obsolete in Windows 2000
1841
* and later operating systems
1842
* and is not supported by Microsoft. */
1844
case URB_FUNCTION_GET_CURRENT_FRAME_NUMBER: /** 0x0007 */
1845
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_CURRENT_FRAME_NUMBER"));
1846
error = urb_get_current_frame_number(
1854
case URB_FUNCTION_CONTROL_TRANSFER: /** 0x0008 */
1855
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CONTROL_TRANSFER"));
1856
error = urb_control_transfer(
1863
URB_CONTROL_TRANSFER_NONEXTERNAL);
1865
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: /** 0x0009 */
1866
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER"));
1867
error = urb_bulk_or_interrupt_transfer(
1875
case URB_FUNCTION_ISOCH_TRANSFER: /** 0x000A */
1876
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_ISOCH_TRANSFER"));
1877
error = urb_isoch_transfer(
1878
callback, data + 8, data_sizem - 8,
1884
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: /** 0x000B */
1885
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE"));
1886
error = urb_control_descriptor_request(
1895
case URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE: /** 0x000C */
1896
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE"));
1897
error = urb_control_descriptor_request(
1906
case URB_FUNCTION_SET_FEATURE_TO_DEVICE: /** 0x000D */
1907
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_FEATURE_TO_DEVICE"));
1908
error = urb_control_feature_request(callback,
1918
case URB_FUNCTION_SET_FEATURE_TO_INTERFACE: /** 0x000E */
1919
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_FEATURE_TO_INTERFACE"));
1920
error = urb_control_feature_request(
1930
case URB_FUNCTION_SET_FEATURE_TO_ENDPOINT: /** 0x000F */
1931
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_FEATURE_TO_ENDPOINT"));
1932
error = urb_control_feature_request(
1942
case URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE: /** 0x0010 */
1943
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE"));
1944
error = urb_control_feature_request(
1954
case URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE: /** 0x0011 */
1955
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE"));
1956
error = urb_control_feature_request(
1966
case URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT: /** 0x0012 */
1967
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT"));
1968
error = urb_control_feature_request(
1978
case URB_FUNCTION_GET_STATUS_FROM_DEVICE: /** 0x0013 */
1979
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_STATUS_FROM_DEVICE"));
1980
error = urb_control_get_status_request(
1989
case URB_FUNCTION_GET_STATUS_FROM_INTERFACE: /** 0x0014 */
1990
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_STATUS_FROM_INTERFACE"));
1991
error = urb_control_get_status_request(
2000
case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT: /** 0x0015 */
2001
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_STATUS_FROM_ENDPOINT"));
2002
error = urb_control_get_status_request(
2011
case URB_FUNCTION_RESERVED_0X0016: /** 0x0016 */
2012
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVED_0X0016"));
2015
case URB_FUNCTION_VENDOR_DEVICE: /** 0x0017 */
2016
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_VENDOR_DEVICE"));
2017
error = urb_control_vendor_or_class_request(
2023
(0x02 << 5), /* vendor type */
2027
case URB_FUNCTION_VENDOR_INTERFACE: /** 0x0018 */
2028
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_VENDOR_INTERFACE"));
2029
error = urb_control_vendor_or_class_request(
2035
(0x02 << 5), /* vendor type */
2039
case URB_FUNCTION_VENDOR_ENDPOINT: /** 0x0019 */
2040
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_VENDOR_ENDPOINT"));
2041
error = urb_control_vendor_or_class_request(
2047
(0x02 << 5), /* vendor type */
2051
case URB_FUNCTION_CLASS_DEVICE: /** 0x001A */
2052
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLASS_DEVICE"));
2053
error = urb_control_vendor_or_class_request(
2059
(0x01 << 5), /* class type */
2063
case URB_FUNCTION_CLASS_INTERFACE: /** 0x001B */
2064
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLASS_INTERFACE"));
2065
error = urb_control_vendor_or_class_request(
2071
(0x01 << 5), /* class type */
2075
case URB_FUNCTION_CLASS_ENDPOINT: /** 0x001C */
2076
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLASS_ENDPOINT"));
2077
error = urb_control_vendor_or_class_request(
2083
(0x01 << 5), /* class type */
2087
case URB_FUNCTION_RESERVE_0X001D: /** 0x001D */
2088
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVE_0X001D"));
2091
case URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL: /** 0x001E */
2092
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL"));
2093
error = urb_pipe_request(
2094
callback, data + 8, data_sizem - 8,
2101
case URB_FUNCTION_CLASS_OTHER: /** 0x001F */
2102
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLASS_OTHER"));
2103
error = urb_control_vendor_or_class_request(
2109
(0x01 << 5), /* class type */
2113
case URB_FUNCTION_VENDOR_OTHER: /** 0x0020 */
2114
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_VENDOR_OTHER"));
2115
error = urb_control_vendor_or_class_request(
2121
(0x02 << 5), /* vendor type */
2125
case URB_FUNCTION_GET_STATUS_FROM_OTHER: /** 0x0021 */
2126
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_STATUS_FROM_OTHER"));
2127
error = urb_control_get_status_request(
2136
case URB_FUNCTION_CLEAR_FEATURE_TO_OTHER: /** 0x0022 */
2137
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CLEAR_FEATURE_TO_OTHER"));
2138
error = urb_control_feature_request(
2148
case URB_FUNCTION_SET_FEATURE_TO_OTHER: /** 0x0023 */
2149
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_FEATURE_TO_OTHER"));
2150
error = urb_control_feature_request(
2160
case URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT: /** 0x0024 */
2161
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT"));
2162
error = urb_control_descriptor_request(
2171
case URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT: /** 0x0025 */
2172
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT"));
2173
error = urb_control_descriptor_request(
2182
case URB_FUNCTION_GET_CONFIGURATION: /** 0x0026 */
2183
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_CONFIGURATION"));
2184
error = urb_control_get_configuration_request(
2192
case URB_FUNCTION_GET_INTERFACE: /** 0x0027 */
2193
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_INTERFACE"));
2194
error = urb_control_get_interface_request(
2202
case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE: /** 0x0028 */
2203
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE"));
2204
error = urb_control_descriptor_request(
2213
case URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE: /** 0x0029 */
2214
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE"));
2215
error = urb_control_descriptor_request(
2224
case URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR: /** 0x002A */
2225
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR"));
2226
error = urb_os_feature_descriptor_request(
2234
case URB_FUNCTION_RESERVE_0X002B: /** 0x002B */
2235
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVE_0X002B"));
2238
case URB_FUNCTION_RESERVE_0X002C: /** 0x002C */
2239
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVE_0X002C"));
2242
case URB_FUNCTION_RESERVE_0X002D: /** 0x002D */
2243
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVE_0X002D"));
2246
case URB_FUNCTION_RESERVE_0X002E: /** 0x002E */
2247
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVE_0X002E"));
2250
case URB_FUNCTION_RESERVE_0X002F: /** 0x002F */
2251
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_RESERVE_0X002F"));
2254
/** USB 2.0 calls start at 0x0030 */
2255
case URB_FUNCTION_SYNC_RESET_PIPE: /** 0x0030 */
2256
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SYNC_RESET_PIPE"));
2257
error = urb_pipe_request(
2265
error = -9; /** function not support */
2267
case URB_FUNCTION_SYNC_CLEAR_STALL: /** 0x0031 */
2268
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_SYNC_CLEAR_STALL"));
2269
error = urb_pipe_request(
2279
case URB_FUNCTION_CONTROL_TRANSFER_EX: /** 0x0032 */
2280
LLOGLN(urbdrc_debug, ("URB_Func: URB_FUNCTION_CONTROL_TRANSFER_EX"));
2281
error = urb_control_transfer(
2288
URB_CONTROL_TRANSFER_EXTERNAL);
2291
LLOGLN(urbdrc_debug, ("URB_Func: %x is not found!", URB_Function));
2298
void* urbdrc_process_udev_data_transfer(void* arg)
2300
TRANSFER_DATA* transfer_data = (TRANSFER_DATA*) arg;
2301
URBDRC_CHANNEL_CALLBACK * callback = transfer_data->callback;
2302
BYTE * pBuffer = transfer_data->pBuffer;
2303
UINT32 cbSize = transfer_data->cbSize;
2304
UINT32 UsbDevice = transfer_data->UsbDevice;
2305
IUDEVMAN * udevman = transfer_data->udevman;
2310
pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice);
2311
if (pdev == NULL || pdev->isSigToEnd(pdev))
2315
if (transfer_data->pBuffer)
2316
zfree(transfer_data->pBuffer);
2317
zfree(transfer_data);
2322
pdev->push_action(pdev);
2324
/* USB kernel driver detach!! */
2325
pdev->detach_kernel_driver(pdev);
2327
data_read_UINT32(pBuffer + 0, MessageId);
2328
data_read_UINT32(pBuffer + 4, FunctionId);
2331
case CANCEL_REQUEST:
2332
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2333
" >>CANCEL_REQUEST<<0x%X", FunctionId));
2334
error = urbdrc_process_cancel_request(
2340
case REGISTER_REQUEST_CALLBACK:
2341
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2342
" >>REGISTER_REQUEST_CALLBACK<<0x%X", FunctionId));
2343
error = urbdrc_process_register_request_callback(
2351
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2352
" >>IO_CONTROL<<0x%X", FunctionId));
2353
error = urbdrc_process_io_control(
2358
udevman, UsbDevice);
2360
case INTERNAL_IO_CONTROL:
2361
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2362
" >>INTERNAL_IO_CONTROL<<0x%X", FunctionId));
2363
error = urbdrc_process_internal_io_control(
2368
udevman, UsbDevice);
2370
case QUERY_DEVICE_TEXT:
2371
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2372
" >>QUERY_DEVICE_TEXT<<0x%X", FunctionId));
2373
error = urbdrc_process_query_device_text(
2381
case TRANSFER_IN_REQUEST:
2382
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2383
" >>TRANSFER_IN_REQUEST<<0x%X", FunctionId));
2384
error = urbdrc_process_transfer_request(
2391
USBD_TRANSFER_DIRECTION_IN);
2393
case TRANSFER_OUT_REQUEST:
2394
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2395
" >>TRANSFER_OUT_REQUEST<<0x%X", FunctionId));
2396
error = urbdrc_process_transfer_request(
2403
USBD_TRANSFER_DIRECTION_OUT);
2405
case RETRACT_DEVICE:
2406
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2407
" >>RETRACT_DEVICE<<0x%X", FunctionId));
2408
error = urbdrc_process_retract_device_request(
2415
LLOGLN(urbdrc_debug, ("urbdrc_process_udev_data_transfer:"
2416
" unknown FunctionId 0x%X", FunctionId));
2423
if (transfer_data->pBuffer)
2424
zfree(transfer_data->pBuffer);
2425
zfree(transfer_data);
2431
/* check isochronous fds */
2432
func_check_isochronous_fds(pdev);
2434
/* close this channel, if device is not found. */
2435
pdev->complete_action(pdev);
2439
udevman->push_urb(udevman);
2443
udevman->push_urb(udevman);