Subversion Repositories Kolibri OS

Rev

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

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