Robin, Just incase your not already aware of it, the spca50x usb camera driver supports the intel CS330 camera's since they are apparently based on the spca501 chipset...
They live here: http://spca50x.sourceforge.net/ Maybe you could shift your focus from getting the camera working at all with a new driver, to getting it working better with an existing one. Gef :] On Sun, 17 Mar 2002 23:51:35 +0000 Robin Cull <[EMAIL PROTECTED]> wrote: > Hi all, > > I've been lurking this list for a while. I'm writing a device driver for > the Intel PC Camera webcam (aka ViewQuest CS330). I'm attempting to > reverse engineer the protocol using output from a CATC analyser running > from Windows 2000, I'm lucky enough to have access to one at work. > > The camera uses a vast number of vendor specific commands and while I hope > to be able to decode them all in the end I am initially just attempting to > copy what is sent during start-up to see if I can get the camera to start > streaming. I have a function in my driver code to allow me to send a > vendor specific command string (code to follow). However whatever I send > down to the device I get returned an error -12. > > I have three questions: > > 1) What does -12 mean when it is returned in purb->status? > 2) Is there a function in the kernel API to resolve a numeric error return > to a textual description (kinda like perror() in the C library)? > 3) Have I got the syntax of the call right in the first place? I am > unsure what goes in purb->setup_packet, purb->transfer_buffer and > purb->transfer_buffer_length. > > I am calling this function like: > > cs330_send_vendor_control_packet( pcs330_dev, (unsigned long > int)0x4000010010000000 ); > > The string of hex is whatever I get in the CATC output in a SETUP type > packet. For example: > > DATA > 40 00 01 00 10 00 00 00 > > I have hardcoded the endpoint address etc. in the routine as this > doesn't change. When the completion routine is called, purb->status is > always -12. > > Do you have any suggestions on what I am doing wrong? I'd appreciate any > help. > > Cheers, > > Robin > > ---START CODE FRAGMENT--- > > /* URB Completion Routine */ > void cs330_control_packet_complete( urb_t *purb ) { > > struct cs330_dev *pcs330_dev = (struct cs330_dev *)purb->context; > > printk( "cs330: vendor control packet completed\n" ); > > printk( "cs330: status %d\n", purb->status ); > > wake_up( &pcs330_dev->wait ); > > } > > /************************************************************************ > ******* * Function: cs330_send_vendor_control_packet > * > * Arguments: struct usb_device *pcs330_dev - to send to > * char *packet - contains setup packet data, 8 hex numbers > * Returns: int - whatever usb_submit_urb returns > */ > int cs330_send_vendor_control_packet( struct cs330_dev *pcs330_dev, > unsigned long int packet ) { > urb_t *purb = NULL; > unsigned char *psetup_packet; > int return_value; > > printk( "cs330: vendor control packet submitted\n" ); > > psetup_packet = (unsigned char *)kmalloc( sizeof( char ) * 8, > SLAB_KERNEL ); > memcpy( psetup_packet, &packet, 8 ); > > purb = usb_alloc_urb( 0 ); > > purb->next = NULL; > purb->dev = pcs330_dev->usb_dev; > purb->pipe = usb_sndctrlpipe( pcs330_dev->usb_dev, 0 ); > purb->transfer_flags = 0; > purb->setup_packet = psetup_packet; > purb->transfer_buffer = psetup_packet; > purb->transfer_buffer_length = 8; > purb->context = pcs330_dev; > purb->complete = cs330_control_packet_complete; > > return_value = usb_submit_urb( purb ); > > sleep_on( &pcs330_dev->wait ); > > usb_free_urb( purb ); > > kfree( psetup_packet ); > > return return_value; > > } > > ---END CODE FRAGMENT--- > > _______________________________________________ > [EMAIL PROTECTED] > To unsubscribe, use the last form field at: > https://lists.sourceforge.net/lists/listinfo/linux-usb-devel _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
