Subversion Repositories Kolibri OS

Rev

Rev 2288 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2007-2011. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  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.  
  59.         lea     eax, [req]
  60.         mov     ecx, [request]
  61.         mov     ebx, [requesttupe]
  62.         mov     edx, [value]
  63.         mov     esi, [index]
  64.         mov     edi, [size]
  65.  
  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
  71.  
  72.         stdcall usb_internal_control_msg, [dev], [pipe], \
  73.                 eax, [data], [size], [timeout]
  74.  
  75.         ret
  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;
  86.         int     retv;
  87.         int     length;
  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.  
  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. ;
  122.