]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/libs4c/usb/more/usb_srq.c
Embedded code-base updated to actual version from uLan repository.
[lincan.git] / embedded / libs4c / usb / more / usb_srq.c
index 463f039d781ce0494b3dcb17d54280852820e35e..d235bb5de23f854950f8d10f227e7e67b4f0710f 100644 (file)
@@ -5,20 +5,19 @@
 /*****************************************************/
 
 #include <string.h>
-
+#include <cpu_def.h>
 #include <system_def.h>
 #include <usb/usb.h>
 #include <usb/usb_spec.h>
-#include <usb/pdiusb.h>
 #include <usb/usbdebug.h>
 #include <usb/usb_srq.h>
-#include <usb/usb_defs.h>
 
   // ****************************
   int usb_stdreq_get_status( usb_device_t *udev)
   {
     unsigned char c, buf[2] = { 0, 0};
     unsigned char epid = (unsigned char) udev->request.wIndex;
+    usb_ep_t *ep0 = &(udev->ep0);
 
     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetStatus\n"));
     switch( udev->request.bmRequestType & USB_RECIPIENT) {
@@ -31,6 +30,7 @@
       case USB_RECIPIENT_INTERFACE:
         break;
       case USB_RECIPIENT_ENDPOINT:
+       #if 0
         if ( epid & USB_ENDPOINT_DIRECTION_MASK)
           c = pdiSelectEp(pdiEp2Idx(epid)); // endpoint in
         else
           #else
           buf[0] = 0;
           #endif
+       #endif
+       #warning usb_stdreq_get_status is DUMMY
         break;
       default:
         return USB_COMPLETE_FAIL;
     }
-    pdiWriteEndpoint( PDI_EP0_TX, 2, buf);
+    usb_udev_write_endpoint( ep0, buf, 2);
     return USB_COMPLETE_OK;
   }
 
   int usb_stdreq_clear_feature( usb_device_t *udev)
   {
+    usb_ep_t *ep = NULL;
     USB_DEVICE_REQUEST *dreq = &(udev->request);
     unsigned char epid = (unsigned char) dreq->wIndex;
 
         }
         break;
       case USB_RECIPIENT_ENDPOINT:
+        if(!epid) {
+          ep = &udev->ep0;
+        } else {
+          unsigned char i;
+          for(i = 0; i < udev->cntep; i++) {
+            if(udev->ep[i].epnum == epid) {
+              ep = &udev->ep[i];
+            }
+          }
+          if(!ep)
+            break;
+        }
         if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
-          if ( epid & USB_ENDPOINT_DIRECTION_MASK)
-            pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear TX stall for IN on EPn
-          else
-            pdiSetEpStatus(pdiEp2Idx(epid), 0); // clear RX stall for OUT on EPn
+          usb_udev_unstall(ep);
           usb_udev_ack_setup( udev);
           return USB_COMPLETE_OK;
         }
@@ -78,6 +90,7 @@
 
   int usb_stdreq_set_feature( usb_device_t *udev)
   {
+    usb_ep_t *ep = NULL;
     USB_DEVICE_REQUEST *dreq = &(udev->request);
     unsigned char epid = (unsigned char) dreq->wIndex;
 
         }
         break;
       case USB_RECIPIENT_ENDPOINT:
+        if(!epid) {
+          ep = &udev->ep0;
+        } else {
+          unsigned char i;
+          for(i = 0; i < udev->cntep; i++) {
+            if(udev->ep[i].epnum == epid) {
+              ep = &udev->ep[i];
+            }
+          }
+          if(!ep)
+            break;
+        }
         if ( dreq->wValue == USB_FEATURE_ENDPOINT_STALL) {
-          if ( epid & USB_ENDPOINT_DIRECTION_MASK)
-            pdiSetEpStatus( pdiEp2Idx(epid), 1); // set TX stall for IN on EPn
-          else
-            pdiSetEpStatus( pdiEp2Idx(epid), 1);     // set RX stall for OUT on EPn
+          usb_udev_stall(ep);
           usb_udev_ack_setup( udev);
           return USB_COMPLETE_OK;
         }
 
   int usb_stdreq_set_address( usb_device_t *udev)
   {
+    int adr;
     USB_DEVICE_REQUEST *dreq = &(udev->request);
-    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr\n"));
+    adr=dreq->wValue & DEVICE_ADDRESS_MASK;
+    usb_debug_print( DEBUG_LEVEL_HIGH, ("SetAddr-%d\n",adr));
     usb_udev_ack_setup( udev);
-    pdiSetAddressEnable( (dreq->wValue & DEVICE_ADDRESS_MASK) + PDI_ENAD_ENABLE);
+    usb_udev_set_addr( udev, adr);
     return USB_COMPLETE_OK;
   }
 
   int usb_stdreq_get_configuration( usb_device_t *udev)
   {
     unsigned char buf = udev->configuration; //usb_flags.configured;
+    usb_ep_t *ep0 = &(udev->ep0);
     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetConfig\n"));
-    pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
+    usb_udev_write_endpoint( ep0, &buf, 1);
     return USB_COMPLETE_OK;
   }
 
     USB_DEVICE_REQUEST *dreq = &(udev->request);
     unsigned char iCfg = dreq->wValue & 0xff;
     usb_debug_print( DEBUG_LEVEL_HIGH, ("SetConfig\n"));
-    if ( iCfg < 2) {       // put device in unconfigured state or set configuration 1 ( no else)
-      usb_udev_ack_setup( udev);
-      pdiSetEndpointEnable( 0); // USBInitUnconfig();
-      if ( iCfg) {
-        pdiSetEndpointEnable( PDI_EPEN_ENABLE); //USBInitConfig();
-        udev->flags |= USB_FLAG_CONFIGURED;
-      } else {
-        udev->flags &= ~USB_FLAG_CONFIGURED;
+    while (1) {       // put device in unconfigured state or set configuration 1 ( no else)
+      const USB_DEVICE_CONFIGURATION_ENTRY *pcd = udev->devdes_table->pConfigurations;
+      if(iCfg) {
+        unsigned char i = udev->devdes_table->bNumConfigurations;
+        for(; i && (pcd->pConfigDescription->bConfigurationValue != iCfg); i--, pcd++);
+        if(!i)
+          break;
       }
+
+      udev->flags &= ~USB_FLAG_CONFIGURED;
+
+      usb_udev_ack_setup( udev);
+
+      usb_udev_set_configuration( udev, iCfg);
+
       udev->configuration = iCfg;  //usb_flags.configured = iCfg;
+
+      if(iCfg)
+        udev->flags |= USB_FLAG_CONFIGURED;
+
       return USB_COMPLETE_OK;
-    } else
-      return USB_COMPLETE_FAIL;
+    }
+    return USB_COMPLETE_FAIL;
   }
 
   int usb_stdreq_get_interface( usb_device_t *udev)
   {
     unsigned char buf = 0; /// udev->interface
+    usb_ep_t *ep0 = &(udev->ep0);
     usb_debug_print( DEBUG_LEVEL_HIGH, ("GetIface\n"));
-    pdiWriteEndpoint( PDI_EP0_TX, 1, &buf);
+    usb_udev_write_endpoint( ep0, &buf, 1);
     return USB_COMPLETE_OK;
   }
 
 
   int usb_stdreq_get_descriptor( usb_device_t *udev)
   {
+    unsigned char confidx;
     unsigned char *pDesc;
     unsigned short Len = 0;
     USB_DEVICE_REQUEST *dreq = &(udev->request);
+    const USB_DEVICE_CONFIGURATION_ENTRY *pconfent;
     int i;
 
     i = (dreq->wValue >> 8) & 0xff; /* MSB part of wValue */
 
     switch (i) {
       case USB_DESCRIPTOR_TYPE_DEVICE:
-        pDesc = (unsigned char *)&DeviceDescription;
+        pDesc = (unsigned char *)udev->devdes_table->pDeviceDescription;
         Len = sizeof( USB_DEVICE_DESCRIPTOR);
         break;
       case USB_DESCRIPTOR_TYPE_CONFIGURATION:
-        pDesc = (unsigned char *)&ConfigDescription;
-        Len = CONFIG_DESCRIPTOR_LENGTH;
+        /* FIXME confidx = udev->configuration; */
+        confidx = 0;
+        pconfent = &udev->devdes_table->pConfigurations[confidx];
+        pDesc = (unsigned char *)pconfent->pConfigDescription;
+        Len = pconfent->iConfigTotalLength;
         break;
       case USB_DESCRIPTOR_TYPE_INTERFACE:
-        pDesc = (unsigned char *)&ConfigDescription.interface;
+        /* FIXME multiple interfaces */
+        pDesc = (unsigned char *)udev->devdes_table->pInterfaceDescriptors[0];
         Len = sizeof( USB_INTERFACE_DESCRIPTOR);
         break;
       case USB_DESCRIPTOR_TYPE_STRING:
         i = dreq->wValue & 0xff; /* LSB part of wValue */
         /*printf("Get descriptor indx=0x%02x\n", i);*/
-        if ( i < CNT_STRINGS) {
-          pDesc = (unsigned char *) StringDescriptors[ i];
+        if ( i < udev->devdes_table->iNumStrings) {
+          pDesc = (unsigned char *) udev->devdes_table->pStrings[i];
           Len = *pDesc;
           /*usb_debug_print(0,("indx=0x%02x ptr=%p len=%d : '%c'\n", i, pDesc, Len, pDesc[2]));*/
         } else {