Here are some fragments of my (1.try) code:
I used some professional USB sniffer (CATC USBChief) to get an idea what
the computer says to the camera and vice versa.
Then I replayed the packets (at least I hope so) to
achieve the same behaviour.
As I mentioned the TOC works.
--------- snip -----------
#define USB_REQ_RESERVED 0x04
static unsigned char TOC[10*512]; // some buffers
static unsigned char ThumbNail[5*0x1000]; // Thumbnail buffer
static int sx330z_open(struct inode *inode,struct file *file)
{
-snip
// some ususal checkings
-snip
// Don't know what this is for ? some initialization I think
pipe=usb_rcvctrlpipe(sx330z->dev,0);
res=usb_control_msg(sx330z->dev,
pipe,
USB_REQ_RESERVED, // traveler hack : 0x04???
USB_DIR_IN | USB_DIR_VENDOR, // 0xc0
0x0001,
0x0000,
buf,16,HZ);
printk("sx330z : 0x0001 (%d) : (%02x %02x..
%02x)\n",res,buf[0],buf[1],buf[8]);
// This one works fine
pipe=usb_rcvctrlpipe(sx330z->dev,0);
res=usb_control_msg(sx330z->dev,
pipe,
USB_REQ_RESERVED, // traveler hack ???
USB_DIR_IN | USB_DIR_VENDOR, //
0x0002, // get TOC size ??
0xd000,
buf,16,HZ);
TOCSize=(((buf[9]<<8)+buf[8]));
printk("sx330z : Get TOCsize (%d) ",res);
printk("sx330z : TOCSize %d \n",TOCSize);
// now read the TOC
res=usb_control_msg(sx330z->dev,
pipe,
USB_REQ_RESERVED, // traveler hack ??
USB_DIR_OUT | USB_DIR_VENDOR,
0x0003, // read TOC
0xd000,
&trq,32,HZ);
printk("sx330z : ReqTOCPage %d (%d) : (%02x)\n",TOCPage,res,buf[0]);
res=usb_bulk_msg(sx330z->dev,usb_rcvbulkpipe(sx330z->dev,2),buf,512,&length,2*HZ);
// Get 16Byte Ack
res=usb_bulk_msg(sx330z->dev,usb_rcvbulkpipe(sx330z->dev,2),buf,16,&length,2*HZ);
// Next : request ThumbNail
res=usb_control_msg(sx330z->dev,
usb_sndctrlpipe(sx330z->dev,0),
USB_REQ_RESERVED, // traveler hack ?????
USB_DIR_OUT | USB_DIR_VENDOR,
0x0004,
0xd000,
&trq,32,2*HZ);
// res has positive value here (shouldn't be?)
printk("sx330z : 0x0004 (%d) : \n",res);
//Here my error appears
res=usb_bulk_msg(sx330z->dev,usb_rcvbulkpipe(sx330z->dev,2),ThumbNail,4096,&length,2*HZ);
printk(KERN_INFO "sx330z : read TN (%d,%d bytes) \n", res,length);
// get 16 Byte Ack
res=usb_bulk_msg(sx330z->dev,usb_rcvbulkpipe(sx330z->dev,2),&buf,16,&length,2*HZ);
printk(KERN_INFO "sx330z : read ack? (%d,%d bytes)\n",res,length);
}
/* (kernel log file)
Apr 1 23:30:05 doku kernel: sx330z : read TOC (0,512 bytes) : 00 ... 30
Apr 1 23:30:05 doku kernel: sx330z : read ack? (0): 16 bytes
Apr 1 23:30:05 doku kernel: sx330z : 0x0004 (32)
Apr 1 23:30:05 doku kernel: uhci.c: d400: host system error, PCI problems?
Apr 1 23:30:09 doku kernel: usb_control/bulk_msg: timeout
Apr 1 23:30:09 doku kernel: sx330z : read TN (-110,0 bytes)
*/
------ snip ----------
These calls are made during the "open" fop on character device (180,65)
!only for testing!
Are the HZ parameters OK ? does it mean 1sec max blocking ?
the comment before usb_control_msg says, that it will return 0 or a negative
number, but I get positve numbers. Is this unusual?
How does the libusb work? Are there any howtos?
My understanding problem is :
I modprobe the UHCI module plug my camera in the USB
(Double A Cable <- forbidden according to the USB Spec)
and the lowlevel driver searches for an appropriate driver, that
claims the device (interface), but how does the libusb work with
this ? Does it have some "universal" kernel module that claims any
device?
Thank you for your effort.
Dominik
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel