I programmed on the device a couple of Vendor requests so i know for
sure what does it answers.
I also programmed the comunication in C with libusb 1.0 and with pyusb.
PyUSB gives different error messages (always -1 Input/Output Error)
than the errors with libusb 1.0 in C.

Also here is a working example in C but the same in python with pyusb
doesnt work.

Please check if it is correctly programmed for pyusb:

==============================================================================
=== Example-libusb.c
==============================================================================


#include <stdio.h>
#include <string.h>

#include <libusb-1.0/libusb.h>

#define CTRL_IN  (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE
| LIBUSB_ENDPOINT_IN)
#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE
| LIBUSB_ENDPOINT_OUT)

//=============================================================================
// Constantes para la comunicacion con el Firmware.
#define USB_REQ_GPIO 15
#define REQUEST_LINE 0

#define LIBUSB_DEBUG 3

libusb_device_handle* usb_find_and_open(int vendorID, int productID);

int main()
{
    const unsigned char rawVid[2] = {0x51, 0x04};
    const unsigned char rawPid[2] = {0x10, 0x34};
    int vendorID, productID;
    libusb_device_handle* usbdev;
    unsigned char buffer[8+1]={0};
    int rc, wValue;

    vendorID = rawVid[1] * 256 + rawVid[0];
    productID = rawPid[1] * 256 + rawPid[0];

    printf("Buscando: VID=%x, PID=%x\n",vendorID,productID);

        if ( libusb_init(NULL) != 0 ) {
            fprintf(stderr, "failed to init libusb\n");
        return 0;
        }
    //libusb_set_debug(NULL,3);

    usbdev = usb_find_and_open(vendorID, productID);
    if (usbdev == NULL)
    {
            fprintf(stderr, "failed to find device\n");
        libusb_exit(NULL);
        return 0;
    }

    printf("Encontrado.\n");

    if ( libusb_detach_kernel_driver(usbdev, 0) !=0 ){
            fprintf(stderr, "failed to detach kernel driver, already 
detached?\n");
        //libusb_close(usbdev);
        //libusb_exit(NULL);
        //return 0;
    }
    else
        printf("Kernel driver detached.\n");

    if ( libusb_claim_interface(usbdev, 0) !=0 ){
            fprintf(stderr, "failed to claim interface\n");
        libusb_close(usbdev);
        libusb_exit(NULL);
        return 0;
    }

    rc = libusb_control_transfer(usbdev, CTRL_IN, REQUEST_LINE, 0, 0,
buffer, 8, 1000 );
    if ( rc < 0){
            fprintf(stderr, "failed to transfer a few bytes, failed with
error %d\n", rc);
        libusb_release_interface(usbdev, 0);
        libusb_close(usbdev);
        libusb_exit(NULL);
        return 0;
    }
    buffer[rc] = '\0';
    printf("Lectura realizada REQUEST_LINE correctamente. Transferido
%d bytes: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
rc, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5],
buffer[6], buffer[7]);


    rc = libusb_control_transfer(usbdev, CTRL_IN, USB_REQ_GPIO, 0, 0,
buffer, 8, 1000 );
    if ( rc < 0){
            fprintf(stderr, "failed to transfer a few bytes, failed with
error %d\n", rc);
        libusb_release_interface(usbdev, 0);
        libusb_close(usbdev);
        libusb_exit(NULL);
        return 0;
    }
    buffer[rc] = '\0';
    printf("Lectura realizada USB_REQ_GPIO correctamente. Transferido
%d bytes: 0x%02x\n", rc, buffer[0]);



    wValue = 0x00FF;
    rc = libusb_control_transfer(usbdev, CTRL_OUT, USB_REQ_GPIO,
wValue, 0, 0, 0, 1000 );
    if ( rc < 0){
            fprintf(stderr, "failed to transfer a few bytes, failed with
error %d\n", rc);
        libusb_release_interface(usbdev, 0);
        libusb_close(usbdev);
        libusb_exit(NULL);
        return 0;
    }
    /*if ( rc!=1 ){
            fprintf(stderr, "failed to transfer safelly a few bytes\n");
        libusb_release_interface(usbdev, 0);
        libusb_close(usbdev);
        libusb_exit(NULL);
        return 0;
    }*/

    printf("Escritura realizada USB_REQ_GPIO correctamente. Estado:
0x%02x\n", wValue);
/*
    libusb_release_interface(usbdev, 0);
    if ( libusb_attach_kernel_driver(usbdev, 0) !=0 ){
            fprintf(stderr, "failed to attach kernel driver\n");
        //libusb_close(usbdev);
        //libusb_exit(NULL);
        //return 0;
    }
    else
        printf("Kernel driver reattached.\n");*/
    libusb_close(usbdev);
    libusb_exit(NULL);
    return 0;
}


libusb_device_handle* usb_find_and_open(int vendorID, int productID)
{
    libusb_device_handle *handle;
    libusb_device **list;
    size_t i = 0;
    size_t cnt;
    int err = 0;
    char buffer[60];
    int len=0;

    cnt = libusb_get_device_list(NULL, &list);
    if (cnt < 0){
        fprintf(stderr, "failed to get device list\n");
    }

    for (i = 0; i < cnt; i++)
    {
        libusb_device *dev = list[i];
        struct libusb_device_descriptor desc;

        int r = libusb_get_device_descriptor(dev, &desc);
        if (r < 0) {
            fprintf(stderr, "failed to get device descriptor\n");
            continue;
        }

        if ( ! (vendorID==0
             || desc.idVendor == vendorID) )
            continue;

        if ( ! (productID == 0
             || desc.idProduct == productID) )
            continue;

        printf("--> VID=%x, PID=%x\n",vendorID,productID);

        err = libusb_open(dev, &handle);
        if (err){
            fprintf(stderr, "failed to open device\n");
            continue;
            }


        len = buffer[0] = 0;
        if(desc.iManufacturer > 0){
            len = libusb_get_string_descriptor_ascii(handle,
desc.iManufacturer, (unsigned char*)buffer, sizeof(buffer));
            if(len < 0)
                fprintf(stderr, "cannot query manufacturer for
VID=0x%04x PID=0x%04x\n", vendorID, productID);
        }
        else { libusb_close(handle);
                continue;
        }

        printf("--> vendor=%s\n",buffer);

        len = buffer[0] = 0;
        if(desc.iProduct > 0){
            len = libusb_get_string_descriptor_ascii(handle,
desc.iProduct, (unsigned char*)buffer, sizeof(buffer));
            if(len < 0)
                fprintf(stderr, "cannot query product for VID=0x%04x
PID=0x%04x\n", vendorID, productID);
        }
        else { libusb_close(handle);
                continue;
        }

        printf("--> product=%s\n",buffer);

        libusb_free_device_list(list, 1);
        return handle;
    }

    libusb_free_device_list(list, 1);
    return NULL;
}

=================================================================================
==== PyUSB-example.py
=================================================================================
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import usb.core
import usb.util

USB_REQ_GPIO = 15
REQUEST_LINE = 0
TI_VENDOR_ID = 0x0451
TI_3410_PRODUCT_ID = 0x3410

# Configuration Descriptors IDs
# Very important to know if the firmware was loaded
TI_BOOT_CONFIG = 1
TI_ACTIVE_CONFIG = 2

if __name__ == '__main__':


    # find our device
    dev = usb.core.find(idVendor=TI_VENDOR_ID, idProduct=TI_3410_PRODUCT_ID)
    # was it found?
    if dev is None:
        raise ValueError('Device not found')

    interface = dev.get_interface_altsetting()

    if dev.is_kernel_driver_active(interface.bInterfaceNumber):
        dev.detach_kernel_driver(interface.bInterfaceNumber)

    # Setting configuration
    if dev.bNumConfigurations == 1:
        raise "ERROR: The firmware was not yet uploaded"
    elif dev.get_active_configuration().bConfigurationValue == 1:
        dev.set_configuration(TI_ACTIVE_CONFIG)
    else:
        print "Configuration already set in ", TI_ACTIVE_CONFIG

    interface = dev.get_interface_altsetting()
    if dev.is_kernel_driver_active(interface.bInterfaceNumber):
        dev.detach_kernel_driver(interface.bInterfaceNumber)



    print "Going for reading: REQUEST_LINE "
    requesttype = (usb.util.CTRL_TYPE_VENDOR |
usb.util.CTRL_RECIPIENT_DEVICE | usb.util.CTRL_IN)
    command = REQUEST_LINE
    value = 0
    moduleid = 0 #USBCTRL_UART1_PORT#USBCTRL_RAM_PORT
    msg = 0
    print dev.ctrl_transfer(bmRequestType=requesttype,
                             bRequest=command,
                             wValue=value,
                             wIndex=moduleid,
                             data_or_wLength=msg,
                             timeout=1000)

    print "Going for reading: USB_REQ_GPIO "
    requesttype = (usb.util.CTRL_TYPE_VENDOR |
usb.util.CTRL_RECIPIENT_DEVICE | usb.util.CTRL_IN)
    command = USB_REQ_GPIO
    value = 0
    moduleid = 0 #USBCTRL_UART1_PORT#USBCTRL_RAM_PORT
    msg = 0
    print dev.ctrl_transfer(bmRequestType=requesttype,
                             bRequest=command,
                             wValue=value,
                             wIndex=moduleid,
                             data_or_wLength=msg,
                             timeout=1000)

    print "Going for writing: USB_REQ_GPIO "
    requesttype = (usb.util.CTRL_TYPE_VENDOR |
usb.util.CTRL_RECIPIENT_DEVICE | usb.util.CTRL_OUT)
    command = USB_REQ_GPIO
    value = 0xFF
    moduleid = 0 #USBCTRL_UART1_PORT#USBCTRL_RAM_PORT
    msg = 0
    print dev.ctrl_transfer(bmRequestType=requesttype,
                             bRequest=command,
                             wValue=value,
                             wIndex=moduleid,
                             data_or_wLength=msg,
                             timeout=1000)

    #try:
    #xdata_set_register(dev,UART1_MCR, MCR_DTR | MCR_RTS, 0xFF)
    #except usb.core.USBError as (a,b,c,d):
    #    print "ERROR: Control Transfer", (a,b,c)

    #print "reattaching"
    #try:
    #    dev.attach_kernel_driver(interface.bInterfaceNumber)
    #except usb.core.USBError as e:
    #    print "ERROR: Reattaching driver ", e














2010/6/24 Xiaofan Chen <xiaof...@gmail.com>:
> On Fri, Jun 25, 2010 at 1:44 AM, Diego Jacobi <jacobidi...@gmail.com> wrote:
>> I cant get ctrol_transfer to work in anyway. It will always give an error.
>> Calling it even without payload:
>>
>> I readed all of the pertinent source code of pyusb until the call to
>> libusb, and I myself cant find what the problem is.
>
> All I can say is that you will have to know how the device works
> before using libusb or pyusb. You can not just send any control
> message and expect it to work.
>
> If you suspect that pyusb has a bug, then you can try to use libusb
> directly. Once it works there, you can come back to use pyusb.
>
>
>
> --
> Xiaofan http://mcuee.blogspot.com
>
> ------------------------------------------------------------------------------
> ThinkGeek and WIRED's GeekDad team up for the Ultimate
> GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the
> lucky parental unit.  See the prize list and enter to win:
> http://p.sf.net/sfu/thinkgeek-promo
> _______________________________________________
> pyusb-users mailing list
> pyusb-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/pyusb-users
>

------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
pyusb-users mailing list
pyusb-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyusb-users

Reply via email to