хотел базовый пример libusb - PullRequest
4 голосов
/ 27 января 2011

Я пишу программу пользовательского пространства, предназначенную для управления некоторым устройством через usb, поэтому я решил использовать libusb (libusb-1.0) для отправки управляющих сообщений и получения ответов от этого устройства.

НоЯ постоянно получаю следующую кучу ошибок из своего кода (даже если он выполняется с использованием 'sudo'):

USB error: could not set config 0: Device or resource busy
set configuration: failed
Check that you have permissions to write to 007/012 and, if you don't, that you set up hotplug (http://linux-hotplug.sourceforge.net/) correctly.
USB error: could not claim interface 0: Device or resource busy
claim interface: failed
USB error: error submitting URB: No such file or directory
bulk writing: failed
USB error: error submitting URB: No such file or directory
bulk reading: failed
response was: 

Код:

usb_dev_handle* find_device ();

int 
main (int argc, char *argv[])
{
    usb_dev_handle* udev;
    int status;
    char request[] = "K1"; // 'ping' command used to check communication
    char response[256];

    udev = find_device ();
    // udev is successfully found here

    status = usb_set_configuration (udev, 0);
    printf ("set configuration: %s\n", status ? "failed" : "passed");

    status = usb_claim_interface (udev, 0);
    printf ("claim interface: %s\n", status ? "failed" : "passed");

    status = usb_bulk_write (udev, 3, request, sizeof (request), 500);
    printf ("bulk writing: %s\n", status ? "failed" : "passed");

    status = usb_bulk_read (udev, 2, response, sizeof (response), 500);
    printf ("bulk reading: %s\n", status ? "failed" : "passed");

    printf ("response was: %s\n", response);

    usb_close (udev);

    return 0;
}

Что не так с кодом?И как это можно исправить?

ОС: Ubuntu 10.10

Ответы [ 3 ]

9 голосов
/ 11 ноября 2011

Отвечая на этот вопрос, поскольку я столкнулся с этой проблемой в той же ОС и смог решить ее следующим образом:

Загрузите и скомпилируйте последнюю версию исходного кода libusb 1.0.8.

Ниже приведены некоторые вызовы API, которые я использовал для запроса интерфейса USB 0:

libusb_init(NULL);
libusb_open_device_with_vid_pid(NULL, vendor_id, product_id);
libusb_detach_kernel_driver(devh, 0);
libusb_claim_interface(devh, 0);
libusb_close(devh);
libusb_exit(NULL);

Описание переменных в приведенном выше примере:

static struct libusb_device_handle *devh = NULL;
uint16_t vendor_id;
uint16_t product_id;

Чтобы получить идентификатор поставщика и идентификатор продукта, вы можете выполнить следующие команды (например, сведения о моем устройстве)

$ lsusb
...
Шина 001 Устройство 013: ID 0930: 6544 Корпорация Toshiba Kingston DataTraveler 2.0 Stick (2 ГБ)
...

Строка, разделенная полужирным двоеточием, содержит соответственно идентификатор поставщика и продукта.

Как скомпилировать код:

Я использовал следующую команду для компиляции своего кода:

/ bin / bash libtool --silent --tag = CC --mode = ссылка g ++ -Wall -Wundef -Wunused -Wshadow -D_DEBUG -I ../ libusb -g -O2 -o читать read.cpp .. /libusb/libusb-1.0.la -lusb-1.0 -lrt

Скопируйте libtool в область компиляции из извлеченного каталога libusb-1.0.8.

Надеюсь, это поможет.

3 голосов
/ 28 января 2011

Разве вам не нужно открывать () устройство, прежде чем устанавливать его конфигурацию и запрашивать его?

1 голос
/ 19 октября 2018

вот типичный пример программы libusb, которую вы можете адаптировать по мере необходимости.

также см. API , что здорово!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libusb.h>
#include <err.h>

#define MFGR_ID 0 // given manufacturer ID 
#define DEV_ID 0  // given device ID

/* If device IDs are not known, use libusb_get_device_list() to see a 
list of all USB devices connected to the machine. Follow this call with    
libusb_free_device_list() to free the allocated device list memory.
*/


int main() {
    int init = libusb_init(NULL); // NULL is the default libusb_context

    if (init < 0) {
        errx(1,”\n\nERROR: Cannot Initialize libusb\n\n”);  
    }

    struct libusb_device_handle *dh = NULL; // The device handle
    dh = libusb_open_device_with_vid_pid(NULL,MFGR_ID,DEV_ID);

    if (!dh) {
        errx(1,”\n\nERROR: Cannot connect to device %d\n\n”,DEV_ID);
    }

    // set fields for the setup packet as needed              
    uint8_t       bmReqType = 0;   // the request type (direction of transfer)
    uint8_t            bReq = 0;   // the request field for this packet
    uint16_t           wVal = 0;   // the value field for this packet
    uint16_t         wIndex = 0;   // the index field for this packet
    unsigned char*   data = ‘ ‘;   // the data buffer for the in/output data
    uint16_t           wLen = 0;   // length of this setup packet 
    unsigned int     to = 0;       // timeout duration (if transfer fails)

    // transfer the setup packet to the USB device
    int config =     
    libusb_control_transfer(dh,bmReqType,bReq,wVal,wIndex,data,wLen,to);

    if (config < 0) {
        errx(1,”\n\nERROR: No data transmitted to device %d\n\n”,DEV_ID);
    }

    // now you can use libusb_bulk_transfer to send raw data to the device

    libusb_exit(NULL);
}
...