I hope I'm using this system correctly by just hitting reply-all in my email client :s
Thanks very much Michael, I've been a bit thin on the other details I see. My platform is Mac Os 10.4, I'm using USB snooper to get the data I need, I'll post it at the end of this message. Forgive me, I've been trying to be bloody-minded about getting this to work and haven't read the USB spec. I'm not the sort of person to sit down and read pages of information before I get to the stuff I need, as I loose interest fast, I'd much rather bash away until I start seeing results. Regarding the actual hardware, here's a pic: http://www.maplin.co.uk/images/Full/tf06g_new.jpg I brought it from Maplin, here's a link (note that the first picture shown ISN'T the same cable): http://www.maplin.co.uk/Search.aspx?criteria=TF06G&DOY=20m3 I can't actually find the manufacturers site, but I have since learned that Prolific Tech. are the company responsible for the chip that deals with the routing, I believe it goes usb a -> serial -> chip -> serial -> usb a When I run my script, I am definately connecting, if I don't have the cable plugged in it tells me so, when I plug the cable in and run it, I get the following output: //some help description 8 (160,160,160,160,160,160,160,160) I'm using bulk read/write just because it sounded right, your insight has definately opened my eyes a bit, I guess I really need to help myself by spoffing up on the books. The cable documentation is extremely basic and poor. Where can I get the information I need specifically on how to get the cable to accept data sent from my mac? Here's the snoop: Full Speed device @ 3 (0x1D100000): ............................................. Composite device from Prolific Technology, Inc. Device Descriptor Descriptor Version Number: 0x0100 Device Class: 0 (Composite) Device Subclass: 0 Device Protocol: 0 Device MaxPacketSize: 8 Device VendorID/ProductID: 0x067B/0x0000 (Prolific Technology, Inc.) Device Version Number: 0x0000 Number of Configurations: 1 Manufacturer String: 1 "Prolific Technology Inc." Product String: 0 (none) Serial Number String: 0 (none) Configuration Descriptor Length (and contents): 39 Raw Descriptor (hex) 0000: 09 02 27 00 01 01 00 A0 32 09 04 00 00 03 FF 00 Raw Descriptor (hex) 0010: 00 00 07 05 81 03 01 00 01 07 05 02 02 40 00 00 Raw Descriptor (hex) 0020: 07 05 83 02 40 00 00 Number of Interfaces: 1 Configuration Value: 1 Attributes: 0xA0 (bus-powered, remote wakeup) MaxPower: 100 ma Interface #0 - Vendor-specific Alternate Setting 0 Number of Endpoints 3 Interface Class: 255 (Vendor-specific) Interface Subclass; 0 (Vendor-specific) Interface Protocol: 0 Endpoint 0x81 - Interrupt Input Address: 0x81 (IN) Attributes: 0x03 (Interrupt no synchronization data endpoint) Max Packet Size: 1 Polling Interval: 1 ms Endpoint 0x02 - Bulk Output Address: 0x02 (OUT) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms Endpoint 0x83 - Bulk Input Address: 0x83 (IN) Attributes: 0x02 (Bulk no synchronization data endpoint) Max Packet Size: 64 Polling Interval: 0 ms Michael Langford wrote: > Btw, the win32 version of libusb is not maintained anymore, and bogus > in my experience. I didn't really get to use libusb much on linux, but > it seemed to get a descriptor at least. IIRC, they were upset with > their interface and in the middle of vastly changing it. > > --Michael > > On Wed, Mar 19, 2008 at 7:26 PM, Michael Langford > <[EMAIL PROTECTED]> wrote: > >> I've never heard of the type of cable you're using. Can you send a >> link to one to the list? >> >> You're missing most of the USB ideas more than the python ideas. >> >> USB is very very complicated. The USB spec (of which you care about >> chapter 9) is nothing like how most people actually use USB. Most >> people use a HID device (even for things that have nothing to do with >> human interfaces) and communicate that way. >> >> If you're going to go with a raw control then: >> First off: Are you sure you're getting handle to the device? What is >> the fault you are seeing? >> >> Secondly: How do you know what endpoints your device has? Are you sure >> you have the right addresses for them? You should be able to see this >> with a USB snooping utility. >> >> Control is used to use channel 0 on the USB. It only allows 8 bytes of >> data and a time and is usually used to switch between modes on a >> device in my experience. You may have to do a write here to put the >> device in a mode to do something . This is incredibly device specific. >> >> Secondly, why are you using two different endpoints for read and >> write? Usually you can use 82 and 02 both. Is this something in the >> cable documentation that tells you to do this? >> >> As you have bulk endpoints, you should be using bulk read/write. There >> are 4 types of USB endpoints: Control, Isochronous, Interrupt and >> Bulk. >> >> Control Transfers are only sent over endpoint 0. >> Isochronous Transfers are sent periodically and are used for "real >> time" devices such as web cams (in practice, very very few people ever >> use this mode) >> Interrupts Transfers are next, they have a high priority after the >> first two types and are limited to 256 bytes (IIRC) >> Bulk Transfers are JUST like interrupt transfers, except, they are >> lower priority. >> >> As you apparently are using a bulk endpoint, you need to use bulk >> transfers with it. The priorities are only with regards to the USB >> system. Just as long as your device is using all the same priority, >> don't worry about which one you use. >> >> Your OS should have some tool to allow you to view the USB descriptors >> of the device. This will at least tell you where the endpoints are >> that you maybe could be communicating over. >> >> Please check your control panel or the command line utils (or /proc >> device) that tells you this info, as well as where you're stuck before >> we can help you more. >> >> --Michael >> >> PS: I would have loved to have know about these modules a couple >> months ago. I could have avoided some C kernel modules perhaps. >> >> >> >> >> On Wed, Mar 19, 2008 at 4:14 PM, Mike Holloway <[EMAIL PROTECTED]> wrote: >> > Hi all, >> > >> > I'm very new to this list, so hello all! >> > I'm just starting out using python, my background is lamp. >> > t >> > I have a Prolific Technologies bridged usb cable that I wish to talk to >> > using pyusb and libusb, I've tried following examples and compiling my >> > own code but I'm really struggling getting it to work. >> > >> > I'm trying to send a sequence of letters to the cable, for them to >> > reappear on the other side. I've been trying to use bulkWrite and >> > bulkRead methods but I'm not sure I'm using them right. There's also >> > controlMethod, but I'm not sure what that is used for. >> > >> > Can anyone help get me started, I'm concerned mostly with the >> > communication, I reckon I could actually get somewhere if I can just >> > nail the first bit, here's my code so far: >> > >> > * Cheers in advance, Mike. >> > >> > >> > import usb >> > import sys >> > import os >> > import time >> > from array import array >> > >> > class DeviceDescriptor: >> > def __init__(self, vendor_id, product_id, interface_id) : >> > self.vendor_id = vendor_id >> > self.product_id = product_id >> > self.interface_id = interface_id >> > >> > def get_device(self) : >> > buses = usb.busses() >> > for bus in buses : >> > for device in bus.devices : >> > if device.idVendor == self.vendor_id : >> > if device.idProduct == self.product_id : >> > return device >> > return None >> > >> > class XFPS(): >> > VENDOR_ID = 0x067B #: Vendor Id >> > PRODUCT_ID = 0x0000 #: Product Id for the bridged usb cable >> > INTERFACE_ID = 0 #: The interface we use to talk to the device >> > BULK_IN_EP = 0x83 #: Endpoint for Bulk reads >> > BULK_OUT_EP = 0x02 #: Endpoint for Bulk writes >> > PACKET_LENGTH = 0x40 #: 64 bytes >> > >> > device_descriptor = DeviceDescriptor(VENDOR_ID, \ >> > PRODUCT_ID, INTERFACE_ID) >> > >> > def __init__(self,) : >> > # The actual device (PyUSB object) >> > self.device = self.device_descriptor.get_device() >> > # Handle that is used to communicate with device. Setup in L{open} >> > self.handle = None >> > >> > def open(self) : >> > self.device = self.device_descriptor.get_device() >> > if not self.device: >> > print >> sys.stderr, "Cable isn't plugged in" >> > try: >> > self.handle = self.device.open() >> > >> self.handle.claimInterface(self.device_descriptor.interface_id) >> > except usb.USBError, err: >> > print >> sys.stderr, err >> > >> > def close(self): >> > """ Release device interface """ >> > try: >> > self.handle.reset() >> > self.handle.releaseInterface() >> > except Exception, err: >> > print >> sys.stderr, err >> > self.handle, self.device = None, None >> > >> > def my_bulk_write(self): >> > A = chr(0x75) # u >> > B = chr(0x69) # i >> > X = chr(0x6F) # o >> > Y = chr(0x70) # p >> > LB = chr(0x6C) # l >> > RB = chr(0x6B) # k >> > LT = chr(0x68) # h >> > RT = chr(0x6A) # j >> > >> > S = chr(0x32) >> > s = chr(0x73) >> > >> > self.close() >> > self.open() >> > >> > msg = [A,B,A,B,A,B,A,B] >> > #help(self.handle.bulkWrite) >> > help(self.handle.interruptWrite) >> > sent_bytes = self.handle.interruptWrite(XFPS.BULK_OUT_EP,msg,1000) >> > print sent_bytes >> > if sent_bytes: >> > read_bytes = self.handle.interruptRead(0x81,sent_bytes); >> > print read_bytes >> > >> > xfps = XFPS() >> > xfps.open() >> > xfps.my_bulk_write() >> > >> > _______________________________________________ >> > Tutor maillist - Tutor@python.org >> > http://mail.python.org/mailman/listinfo/tutor >> > >> >> >> >> -- >> Michael Langford >> Phone: 404-386-0495 >> Consulting: http://www.RowdyLabs.com >> >> > > > > _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor