X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/f8d7cde0d035f087f39c8076061bd8ef608e14f4..b2be2bbd665328f4ec3dc14d7d84fdbac4c58e11:/embedded/libs4c/usb/more/usb_srq.c diff --git a/embedded/libs4c/usb/more/usb_srq.c b/embedded/libs4c/usb/more/usb_srq.c index 463f039..d235bb5 100644 --- a/embedded/libs4c/usb/more/usb_srq.c +++ b/embedded/libs4c/usb/more/usb_srq.c @@ -5,20 +5,19 @@ /*****************************************************/ #include - +#include #include #include #include -#include #include #include -#include // **************************** 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 @@ -40,16 +40,19 @@ #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; @@ -63,11 +66,20 @@ } 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; @@ -91,11 +104,20 @@ } 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; } @@ -106,18 +128,21 @@ 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; } @@ -126,26 +151,37 @@ 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; } @@ -164,9 +200,11 @@ 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 */ @@ -175,22 +213,26 @@ 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 {