]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/libs4c/usb/base/usb.c
Update of system-less architecture and board support code to actual uLAN.sf.net version.
[lincan.git] / embedded / libs4c / usb / base / usb.c
index 2061c8c50095fcd1482060d7dc1cd383af31dec3..a45e8a124331a6d6f75982fa703288d2ca151f57 100644 (file)
 #include <usb/usb.h>
 #include <usb/usbdebug.h>
 
-#include <usb/usb_srq.h> /* temporary include - standard control request responses */
-
 /* ep0 buffer */
-  xdata unsigned char ep0_buffer[ MAX_CONTROL_XFER_DATA_SIZE];
+  __xdata unsigned char ep0_buffer[ MAX_CONTROL_XFER_DATA_SIZE];
+
 
-  
 /* usb initialize */
   int usb_init( usb_device_t *udev) {
     int ret = 0;
@@ -45,7 +43,7 @@
     return ret;
   }
 
-  
+
 // connecting to USB by SoftConnect
   int usb_connect( usb_device_t *udev) {
     int ret = 0;
@@ -63,7 +61,7 @@
     return ret;
   }
 
-  
+
   int usb_disconnect( usb_device_t *udev) {
     int ret = 0;
     usb_debug_print( DEBUG_LEVEL_LOW,("USB:OFF\n"));
@@ -80,7 +78,7 @@
     return ret;
   }
 
-  
+
   void usb_stall( usb_ep_t *ep) {
     usb_debug_print( DEBUG_LEVEL_HIGH, ("USB:STALL %1d\n", ep->epnum));
     if ( usb_udev_is_fnc(ep->udev,stall)) {
@@ -88,7 +86,7 @@
     }
   }
 
-  
+
   int usb_check_events( usb_device_t *udev)
   {
     int ret = 0;
     ep0->ptr = pData;
     ep0->actual = 0;
     if ( ep0->size > len) ep0->size = len;
-    
+
     /* Schedule TX processing for later execution */
     ep0->flags = (ep0->flags & ~USB_STATE_MASK) | USB_STATE_TRANSMIT;
     udev->flags |= USB_FLAG_EVENT_TX0;
     usb_udev_ack_setup(ep->udev);
   }
 
-  
+
 /*************************************************************
  *** Control endpoint0 responses
  *************************************************************/
   int usb_control_response( usb_device_t *udev) {
     int ret = 0;
     usb_ep_t *ep0 = &(udev->ep0);
-    
+
 /* response to interrupt BusReset */
     if ( udev->flags & USB_FLAG_BUS_RESET) {
       udev->flags &= ~(USB_FLAG_BUS_RESET | USB_FLAG_SUSPEND); // usb_flags.bus_reset = 0; usb_flags.configured = 0;
       ret = 1;
     }
 
-    
+
 /* response to interrupt SetupPacket execute response to standard device request or vendor request */
     if ( udev->flags & USB_FLAG_SETUP) {
-      unsigned char type, req;
+      unsigned char type;
       USB_DEVICE_REQUEST *preq = &(udev->request);
 
       ep0->ptr = NULL;
       ep0->next_pkt_fnc = NULL;
       ep0->complete_fnc = NULL;
      #endif /*USB_WITH_CB_FNC*/
-      
-      if ( usb_udev_read_endpoint(ep0, preq, sizeof( USB_DEVICE_REQUEST)) 
+
+      if ( usb_udev_read_endpoint(ep0, preq, sizeof( USB_DEVICE_REQUEST))
                                    != sizeof( USB_DEVICE_REQUEST)) {
         usb_udev_stall( ep0);
         return -1;
       preq->wLength = bswap_16( preq->wLength);
      #endif
       usb_debug_print( DEBUG_LEVEL_MEDIUM,( "SePa:x%02X,x%02X,x%04X,x%04X,x%04X\n", preq->bmRequestType, preq->bRequest, preq->wValue, preq->wIndex, preq->wLength));
-      
+
       // acknowledge setup here
       if(usb_udev_is_fnc( udev, ack_control_setup)) {
         usb_udev_ack_control_setup(udev);
       }
-      
+
       ep0->size = preq->wLength;
       if ((( preq->bmRequestType & USB_DATA_DIR_MASK) == USB_DATA_DIR_FROM_HOST) && preq->wLength) {
         ep0->ptr = ep0_buffer;
         ep0->flags = (ep0->flags & ~USB_STATE_MASK) | USB_STATE_RECEIVE;
       }
-      
+
       type = preq->bmRequestType & USB_REQUEST_TYPE_MASK;
-      req = preq->bRequest & USB_REQUEST_MASK;
       if ( type == USB_STANDARD_REQUEST) {
         int ret = -1;
-        usb_debug_print( DEBUG_LEVEL_HIGH, ( "StdReq-%d\n", req));
-/*        
-        if ( (udev->stdreq[ req]) != NULL) {
-          ret = udev->stdreq[ req]( udev);
-        }
-        if( ret < 0)
-          udev->ack_setup( udev);
-*/          
-        switch( req) {
-          case USB_REQUEST_GET_STATUS:        ret=usb_stdreq_get_status( udev); break;
-          case USB_REQUEST_CLEAR_FEATURE:     ret=usb_stdreq_clear_feature( udev); break;
-          case USB_REQUEST_SET_FEATURE:       ret=usb_stdreq_set_feature( udev); break;
-          case USB_REQUEST_SET_ADDRESS:       ret=usb_stdreq_set_address( udev); break;
-
-          case USB_REQUEST_GET_DESCRIPTOR:    ret=usb_stdreq_get_descriptor( udev); break;
-//          case USB_REQUEST_SET_DESCRIPTOR:    break;
-          case USB_REQUEST_GET_CONFIGURATION: ret=usb_stdreq_get_configuration( udev); break;
-          case USB_REQUEST_SET_CONFIGURATION: ret=usb_stdreq_set_configuration( udev); break;
-          case USB_REQUEST_GET_INTERFACE:     ret=usb_stdreq_get_interface( udev); break;
-          case USB_REQUEST_SET_INTERFACE:     ret=usb_stdreq_set_interface( udev); break;
-//          case USB_REQUEST_SYNC_FRAME:        break;
-//          default:                            ret=-1; break;
-        }
+       #ifdef USB_WITH_CB_FNC
+        if ( udev->standard_fnc != NULL)
+            ret = udev->standard_fnc( udev);
+        else
+       #endif /*USB_WITH_CB_FNC*/
+          ret = usb_standard_control_response( udev);
         if (ret<0)
           usb_udev_stall( ep0);
       } else {
         if ( type == USB_VENDOR_REQUEST) {
-//putchar('#');
          #ifdef USB_WITH_CB_FNC
           int ret = -1;
-//         if(USBVendorRequestCBFnc != NULL)
-//         ret = USBVendorRequestCBFnc(&usb_ep0, &dreq);
           if ( udev->vendor_fnc != NULL)
             ret = udev->vendor_fnc( udev);
           if ( ret < 0)
             usb_udev_stall( ep0);
-//         #else /*USB_WITH_CB_FNC*/
-//          if ( USBVendorRequest(&dreq) == -1)
-//          udev->ack_setup( udev);
          #endif /*USB_WITH_CB_FNC*/
         } else if ( type == USB_CLASS_REQUEST) {
          #ifdef USB_WITH_CB_FNC
           int ret = -1;
-//         if(USBClassRequestCBFnc != NULL)
-//         ret = USBClassRequestCBFnc(&usb_ep0, &dreq);
           if( udev->class_fnc != NULL)
             ret = udev->class_fnc( udev);
           if( ret < 0)
             usb_udev_stall( ep0);
-//         #else /*USB_WITH_CB_FNC*/
-//          if ( USBClassRequest(&dreq) == -1)
-//          udev->ack_setup( udev);
          #endif /*USB_WITH_CB_FNC*/
         } else
             usb_udev_stall( ep0);
       }
       ret = 1;
     }
-    
+
 /* response to interrupt Ep0RxInt  - receive data */
     if ( udev->flags & USB_FLAG_EVENT_RX0) {
       int i;
     }
 
 /* response to interrupt Ep0TxInt */
-    if ( udev->flags & USB_FLAG_EVENT_TX0) { 
+    if ( udev->flags & USB_FLAG_EVENT_TX0) {
       short i = ep0->size - ep0->actual;
       udev->flags &= ~USB_FLAG_EVENT_TX0;
 //usb_debug_print( DEBUG_LEVEL_LOW, ("0S-%d(%d){%d}\n", ep0->state, ep0->size, ep0->max_packet_size));
       usb_debug_print( DEBUG_LEVEL_MEDIUM, ( "EP0Tx:i=%d\n", i));
 
       if (( ep0->flags & USB_STATE_MASK) == USB_STATE_TRANSMIT) {
-      
+
         if(i > ep0->max_packet_size) i = ep0->max_packet_size;
 
         if ( i > 0 ) {