I’m writing a driver for kodak dvc300 digital video camera,but can’t get its
device descriptor.The problem occurs in the function insertion:when I insert
the usb plug into the slot,screen display :“usb device
descriptor:input/output error”.Can anyone tell me how to settle it!(qnx rtp
6.1.0 and uddk1.0)
Thanks for your help!!
Yuqing Du
#include <stdio.h>
#include <errno.h>
#include <assert.h>
#include <stddef.h>
#include <signal.h>
#include <sys/usbdi.h>
void removal(struct usbd_connection *connection,usbd_device_instance_t
*instance)
{
struct usbd_device *dev;
int status;
dev = usbd_device_lookup(connection, instance);
assert(dev != NULL);
status = usbd_detach(dev);
assert(status == EOK);
}
void insertion(struct usbd_connection *connection,usbd_device_instance_t
*instance)
{
struct usbd_device *dev;
struct usbd_desc_node *node;
usbd_device_descriptor_t *ddesc;
usbd_interface_descriptor_t *idesc;
usbd_configuration_descriptor_t *cdesc;
if (usbd_attach(connection,instance,4096,&dev)) {
perror("usb attach: ");
return;
}
if ((ddesc=usbd_device_descriptor(dev,&node))==NULL){
perror("usb device descriptor: ");
usbd_detach(dev);
return;
}
else{
printf(“Vendor ID : 0x%04X\n”, ddesc->idVendor);
printf(“Device ID : 0x%04X\n”, ddesc->bcdDevice);
printf(“Product ID: 0x%04X\n”, ddesc->idProduct);
}
if ((cdesc=usbd_configuration_descriptor(dev,1&node))==NULL) {
perror("usb configuration descriptor: ");
usbd_detach(dev);
return;
}
if ((idesc=usbd_interface_descriptor(dev,1,0,0,&node))==NULL) {
perror("usb interface descriptor: ");
usbd_detach(dev);
return;
}
if (usbd_select_config(dev, 1)) {
perror("usbd select config: ");
usbd_detach(dev);
return;
}
if (usbd_select_interface(dev, 0, 0)) {
perror("usbd select interface: ");
usbd_detach(dev);
return;
}
}
int main(int argc, char *argv[])
{
int status;
usbd_connect_parm_t parm;
usbd_funcs_t funcs;
usbd_device_ident_t speci;
struct usbd_connection *connection;
funcs.nentries = _USBDI_NFUNCS;
funcs.insertion = insertion;
funcs.removal = removal;
funcs.event = NULL;
speci.vendor = USBD_CONNECT_WILDCARD;
speci.device = USBD_CONNECT_WILDCARD;
speci.dclass = USBD_CONNECT_WILDCARD;
speci.subclass = USBD_CONNECT_WILDCARD;
speci.protocol = USBD_CONNECT_WILDCARD;
parm.path = NULL;
parm.vusb = USB_VERSION;
parm.vusbd = USBD_VERSION;
parm.flags = 0;
parm.argc = 0;
parm.argv = NULL;
parm.evtbufsz = 0;
parm.ident = &speci;
parm.funcs = &funcs; /* the insertion/removal callbacks */
parm.connect_wait = USBD_CONNECT_WAIT;
status = usbd_connect(&parm, &connection);
assert(status == EOK);
while (1)sleep(60);
return 0;
}