Hello,
 
(I am using an anonymous email address to avoid spam, but I
do not intend to anonymous. )
 
I have been using libusb + pyusb in spring with a first version of our board,
and now the second version arrived an nothing is working anymore.
However, I have the same problems with the develoment board, and that is 
unchanged.
Furthermore, a small C program works (which accesses the same libusb),
so I see the reason on the PyUSB side.
 
My device is a Cypress PSoC 3, and the problem already happens with the small
demo (wrapback) that they provide.
 
Here is the simplest test, and it fails with an IO-error:
 
>>>>
import usb
wrdev = usb.core.find(idVendor=0x04b4,idProduct=0x8051)
wrdev.set_configuration()
usb.util.claim_interface(wrdev,0)
 
written = wrdev.write(2,"hello",0,3000)
<<<<
 
Hence I tried a simpler test and replaced the last line by:
 
>>>>
wrdev._ctx.backend.bulk_write(wrdev._ctx.handle,1,0,usb._interop.as_array("hallo"),1000)
<<<<
 
I have not seen a packet on wireshark, so I guess it fails before in the libusb or linux kernel stack.
However the simple C test program works.
I show only the relevant calls:
 
 
#define DMA_EP_OUT 2
#define DMA_EP_IN 0x81
#define write_timeout 500
#define read_timeout 800
err = libusb_init(NULL);
handle = libusb_open_device_with_vid_pid(NULL, 0x04b4, 0x8051);
err = libusb_claim_interface(handle, 0);
err = libusb_bulk_transfer(handle,DMA_EP_OUT,combuf+1,cblen-1,&sent_len,write_timeout);
 
The buffer is filled from keyboard.
The detailed libusb debug messages were not very helpful to me, as they did not show the parameters (such as end points).
 
What particularly puzzles me is the interface parameter in the back end:
 
   #int libusb_bulk_transfer(
    #           struct libusb_device_handle *dev_handle,
    #           unsigned char endpoint,
    #           unsigned char *data,
    #           int length,
    #           int *transferred,
    #           unsigned int timeout
    #       )
    lib.libusb_bulk_transfer.argtypes = [
                _libusb_device_handle,
                c_ubyte,
                POINTER(c_ubyte),
                c_int,
                POINTER(c_int),
                c_uint
            ]
 
 
def bulk_write(self, dev_handle, ep, intf, data, timeout):
        return self.__write(self.lib.libusb_bulk_transfer,
                            dev_handle,
                            ep,
                            intf,
                            data,
                            timeout)
 
How does the data pointer interface get mixed up?
I mean, I am not very familiar with the way Python interacts with C-libraries but in the libusb declaration (and in my
operational C code) the interface is not passed to libusb_bulk_transfer.
The way I understand the core.py call of bulk_write, the interface is used. 
 
Hence, I am quite confused.
Do I mix with the wrong version of libusb?
I freshly installed libusb-1.0.9
I would guess that something as basic as bulk transfers are well tested.
 
Andreas
(Doering, IBM Research, Zurich)
------------------------------------------------------------------------------
November Webinars for C, C++, Fortran Developers
Accelerate application performance with scalable programming models. Explore
techniques for threading, error checking, porting, and tuning. Get the most 
from the latest Intel processors and coprocessors. See abstracts and register
http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk
_______________________________________________
pyusb-users mailing list
pyusb-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyusb-users

Reply via email to