Subversion Repositories Kolibri OS

Rev

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
;