Rev 2434 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2465 | Serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) KolibriOS team 2007-2011. All rights reserved. ;; |
||
4 | ;; Distributed under terms of the GNU General Public License ;; |
||
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
572 | serge | 7 | |
8 | struc URB |
||
9 | { |
||
10 | .fd dd ? |
||
11 | .bk dd ? |
||
12 | .dev dd ? ; pointer to associated device |
||
13 | .pipe dd ? ; pipe information |
||
14 | .status dd ? ; non-ISO status |
||
15 | .transfer_flags dd ? ; URB_SHORT_NOT_OK | ... |
||
16 | .transfer_buffer dd ? ; associated data buffer |
||
17 | .transfer_dma dd ? ; dma addr for transfer_buffer |
||
18 | .transfer_buffer_length dd ? ; data buffer length |
||
19 | .actual_length dd ? ; actual transfer length |
||
20 | .setup_packet dd ? ; setup packet (control only) |
||
21 | .setup_dma dd ? ; dma addr for setup_packet |
||
22 | .start_frame dd ? ; start frame (ISO) |
||
23 | .number_of_packets dd ? ; number of ISO packets |
||
24 | .interval dd ? ; transfer interval |
||
25 | |||
26 | .error_count dd ? ; number of ISO errors |
||
27 | .context dd ? ; context for completion |
||
28 | .complete dd ? ; (in) completion routine |
||
29 | .iso_frame_desc: |
||
30 | } |
||
31 | |||
32 | virtual at 0 |
||
33 | URB URB |
||
34 | end virtual |
||
35 | |||
36 | |||
37 | struc REQ ;usb request |
||
38 | { |
||
39 | .request_type db ? |
||
40 | .request db ? |
||
41 | .value dw ? |
||
42 | .index dw ? |
||
43 | .length dw ? |
||
44 | } |
||
45 | |||
46 | virtual at 0 |
||
47 | REQ REQ |
||
48 | end virtual |
||
49 | |||
50 | align 4 |
||
51 | proc usb_control_msg stdcall, dev:dword, pipe:dword, request:dword,\ |
||
52 | requesttype:dword, value:dword, index:dword,\ |
||
53 | data:dword, size:dword, timeout:dword |
||
54 | |||
55 | locals |
||
56 | req REQ |
||
57 | endl |
||
58 | |||
2434 | Serge | 59 | lea eax, [req] |
60 | mov ecx, [request] |
||
61 | mov ebx, [requesttupe] |
||
62 | mov edx, [value] |
||
63 | mov esi, [index] |
||
64 | mov edi, [size] |
||
572 | serge | 65 | |
2434 | Serge | 66 | mov [eax+REQ.request_type], bl |
67 | mov [eax+REQ.request], cl |
||
68 | mov [eax+REQ.value], dx |
||
69 | mov [eax+REQ.index], si |
||
70 | mov [eax+REQ.length], di |
||
572 | serge | 71 | |
2434 | Serge | 72 | stdcall usb_internal_control_msg, [dev], [pipe], \ |
73 | eax, [data], [size], [timeout] |
||
572 | serge | 74 | |
2434 | Serge | 75 | ret |
572 | serge | 76 | endp |
77 | |||
78 | |||
79 | ; returns status (negative) or length (positive) |
||
80 | static int usb_internal_control_msg(struct usb_device *usb_dev, |
||
81 | unsigned int pipe, |
||
82 | struct usb_ctrlrequest *cmd, |
||
83 | void *data, int len, int timeout) |
||
84 | { |
||
85 | struct urb *urb; |
||
2434 | Serge | 86 | int retv; |
87 | int length; |
||
572 | serge | 88 | |
89 | urb = usb_alloc_urb(0, GFP_NOIO); |
||
90 | if (!urb) |
||
91 | return -ENOMEM; |
||
92 | usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char *)cmd, data, |
||
93 | len, usb_api_blocking_completion, NULL); |
||
94 | |||
95 | retv = usb_start_wait_urb(urb, timeout, &length); |
||
96 | if (retv < 0) |
||
97 | return retv; |
||
98 | else |
||
99 | return length; |
||
100 | } |
||
101 | |||
102 | |||
2434 | Serge | 103 | ;void usb_fill_control_urb (struct urb *urb, |
104 | ; struct usb_device *dev, |
||
105 | ; unsigned int pipe, |
||
106 | ; unsigned char *setup_packet, |
||
107 | ; void *transfer_buffer, |
||
108 | ; int buffer_length, |
||
109 | ; usb_complete_t complete_fn, |
||
110 | ; void *context) |
||
111 | ;{ |
||
112 | ; |
||
113 | ; urb->dev = dev; |
||
114 | ; urb->pipe = pipe; |
||
115 | ; urb->setup_packet = setup_packet; |
||
116 | ; urb->transfer_buffer = transfer_buffer; |
||
117 | ; urb->transfer_buffer_length = buffer_length; |
||
118 | ; urb->complete = complete_fn; |
||
119 | ; urb->context = context; |
||
120 | ;} |
||
121 | ;> |