libusb
Доброго времени суток. INTRO
Работаю под Ubuntu 11.04 (ядро 2.6.35-28-generic-pae ). Пишу программу, в функционал которой входит работа с USB устройством. В первых версиях программы использовалась libusb-0.1-4. Тогда я столкнулся с 2 проблемами: 1) Мое устройство по умолчанию захватывал HID драйвер. Приходилось «отсоединять» устройство при помощи «usb_detach_kernel_driver_np», а для этого нужно было запускать программу от имени суперпользователя. 2) После завершения программы, libusb не освобождала интерфейс( т.е. usb_release_interface не отрабатывала). В результате, приходилось вынимать устройство из USB порта и подключать обратно. Код был перенесен под windows. Никаких проблем не возникло. В интернет рекомендовали перейти на libusb-1.0, не совместимую с предыдущей версией. После перехода на новую библиотеку проблемы не решились(((.
Я написал тестовую программу:
==========================================================================
#include <stdio.h>
#include <libusb-1.0/libusb.h>
#define TIMEOUT 500
int main( int argc, char **argv)
{
int i=0,
rv=0,
bTransfer=0;
unsigned short VID = 0xXXXX; //vendor id
unsigned short PID = 0xXXXX; //product id
unsigned char EP_out = 0x82; // write into usb end point
unsigned char EP_in = 0x01; // read from usb end point
unsigned char TX[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; //reqwest
unsigned char RX[521]; //answer
struct libusb_device_descriptor desc; //description of device structure
libusb_device_handle *dev_handle = NULL; //a device handle
libusb_context *ctx = NULL; //a libusb session
libusb_device *dev = NULL; //pointer to device
libusb_device **devs = NULL; //pointer to pointer of device
//init libusb
libusb_init(ctx);
// get device list
rv = libusb_get_device_list( ctx, &devs); //get the list of devices
printf("Number of devices: %d\n",rv);
//get need device descriptor and number
while ((dev = devs[i++]) != NULL) //take all connected device one by one
{
rv = libusb_get_device_descriptor(dev, &desc); // look in deckritption of current device
if(rv == 0)
printf("\tGet descriptor of device\n");
//test device vendor and product identify
if( desc.idVendor == VID && desc.idProduct == PID ) // if VID & PID is positive
{
// open device
rv = libusb_open(dev, &dev_handle);
if(rv == 0)
printf("Open my device\n");
break;
}
}
// free device list
libusb_free_device_list(devs, 1);
// test to enable device
if ( dev_handle == NULL )
{
printf("Not device found\n");
//exit work with usb
libusb_exit(ctx);
printf("Exit libusb\n");
return 0;
}
// test to device to grubed by kernel
if(libusb_kernel_driver_active(dev_handle, 0) == 1)
if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it
printf("Detach device\n");
// config device
rv = libusb_set_configuration(dev_handle, 1);
if(rv == 0)
printf("Set configuration\n");
// claim interface
rv = libusb_claim_interface(dev_handle, 0);
if( rv == 0 )
printf("Claim 0 interface\n");
// send data block to device
rv = libusb_bulk_transfer(dev_handle, EP_in, TX, sizeof(TX), &bTransfer, TIMEOUT);
printf("Write to device.\n\tReturn value = %d\n\tSend bytes = %d\n",rv,bTransfer);
// read answer
rv = libusb_bulk_transfer(dev_handle, EP_out, RX, sizeof(RX), &bTransfer, TIMEOUT);
printf("Read from device.\n\tReturn value = %d\n\tAccept bytes = %d\n",rv,bTransfer);
//release the claimed interface
rv = libusb_release_interface(dev_handle, 0);
if( rv == 0 )
printf("Release 0 interface\n");
// close usb device
libusb_close(dev_handle);
printf("Close device\n");
//exit work with usb
libusb_exit(ctx);
printf("Exit libusb\n");
//erase dev_handle
dev_handle = NULL;
return 0;
}
==========================================================================
Результаты ее работы: 1 запуск
Number of devices: 7
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Open my device
Detach device
Set configuration
Claim 0 interface
Write to device.
Return value = 0
Send bytes = 8
Read from device.
Return value = 0
Accept bytes = 521
Release 0 interface
Close device
Exit libusb
2 запуск
Number of devices: 7
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Get descriptor of device
Open my device
Set configuration
Claim 0 interface
Write to device.
Return value = 0
Send bytes = 8
Read from device.
Return value = -7
Accept bytes = 0
Release 0 interface
Close device
Exit libusb
Ошибка, которую возвращает функции передачи - превышено время ожидания. Подскажите в чем дело? Спасибо.