Subversion Repositories Kolibri OS

Rev

Rev 2434 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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