/*****************************************************/
#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) {
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;
}
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 {