I 'm writing a usb class driver for this device:usb host to host bridge, what is used to communicate PC-to-PC by usb cable. my program is following and i have some problems. Every time the returned value of usbd_select_interface is EIO, i don’t know why this is.Help me, please!
usbd_urb_status return EIO, too. WHY?
void insertion ( )
{
int i;
struct usbd_desc_node *node=NULL;
usbd_descriptors_t *desc=NULL;
usbd_device_descriptor_t *ddesc=NULL;
usbd_interface_descriptor_t *idesc=NULL;
usbd_configuration_descriptor_t *cdesc=NULL;
usbd_endpoint_descriptor_t *edesc=NULL;
struct usbd_pipe *pipe=NULL;
struct usbd_urb *urb=NULL;
struct usbd_urb *link=NULL;
char *usbd=NULL;
_uint32 status=0, len=0;
int bConfigurationValue = 1;
int bInterfaceNumber = 0;
int bAlternateSetting = 0;
printf("insertion beginning\n");
instance.path = 0;
instance.devno = 1;
instance.generation;
instance.ident = interest;
instance.config = 1;
instance.iface = 0;
instance.alternate = 0;
error = usbd_attach( connection, &instance, 0, &device );
printf("usbd_attach error=%d\n",error );
ddesc = usbd_device_descriptor(device,&node );
if (ddesc == NULL )
{
perror("usbd_device_descriptor");
}
cdesc = usbd_configuration_descriptor(device, bConfigurationValue, &node );
if (ddesc == NULL )
{
perror("usbd_configuration_descriptor");
}
idesc = usbd_interface_descriptor(device,bConfigurationValue,bInterfaceNumber,bAlternateSetting,&node);
if (idesc == NULL )
{
perror("usbd_interface_descriptor");
}
if ( usbd_select_config(device, bConfigurationValue ) )
{
perror("usbd_select_config");
}
sleep(1);
if (usbd_select_interface(device, bInterfaceNumber, bAlternateSetting ) )
{
perror("usbd_select_interface");
}
desc = usbd_parse_descriptors(device, node, USB_DESC_ENDPOINT,0, &node);
if (desc==NULL )
{
perror("usbd_parse_descriptors");
}
if ( usbd_open_pipe( device, desc, &pipe ))
{
perror("usbd_open_pipe");
}
i = usbd_pipe_endpoint( pipe );
printf("usbd_pipe_endpoint i=%d\n",i);
urb = usbd_alloc_urb(link );
if (urb==NULL )
{
perror("usbd_alloc_urb");
}
usbd = usbd_alloc( 64 );
if (usbd==NULL )
{
perror("usbd_alloc");
}
memset(usbd,0,64);
if ( usbd_setup_bulk(urb, URB_DIR_OUT, usbd, 64 ))
{
perror("usbd_setup_bulk");
}
memset(usbd,2,64);
if ( usbd_io( urb, pipe, write_complete, NULL, USBD_TIME_DEFAULT ))
{
perror("usbd_io");
}
pthread_sleepon_lock();
i = usbd_urb_status( urb, &status, &len );
printf("i=%d, status=%x, len=%d\n",i,status,len);
while (i )
{
pthread_sleepon_wait(urb);
i = usbd_urb_status( urb, &status, &len );
printf("i=%d, status=%x, len=%d\n",i,status,len);
}
pthread_sleepon_unlock();
usbd_free_urb(urb);
usbd_free(usbd);
usbd_close_pipe( pipe );
printf("insertion END !!\n");
}