URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5963
[ Назад ]

Исходное сообщение
"Помогите с простым USB-драйвером"

Отправлено doomer , 27-Ноя-06 18:55 
Есть USB-устройство которое принимает данные во 2-й ендпоинт, а отдает в 5-й. Не долго думая я взял usb-skeleton.c. Изменил в нем Vid Pid на свои, сделал make и insmod.
После этого при подключении устройства в /dev создается файл утройства, но записывать и считывать с него данные у меня не получается. Я в код драйвера добавил такую строчку
info(“Endpoint in %d, endpoint out %d, total ep %d”,dev->bulk_in_endpointAddr, dev->bulk_out_endpointAddr,iface_desc->desc.bNumEndpoints);

В результате после подключения утройства в логах появляется следующая запись

Endpoint in 129, endpoint out 2, total ep 4

То есть всего он нашел 4 эндпоинта, а я знаю что в самом устройстве используется 7.
В функциях записи и чтения я пробовал подставлять вместо bulk_out_endpointAddr и bulk_in_endpointAddr 2 и 5 соответственно, но это не помогло.

На компьютере стоит Fedora 4-я ядро 2.6.11. Подскажите пожалуйста в каком направлении мне стоит искать решение своей задачи.

Заранее благодарю, Константин.


Содержание

Сообщения в этом обсуждении
"Помогите с простым USB-драйвером"
Отправлено int_0d , 27-Ноя-06 20:38 
копать нужно в сторону прочтения официальной документации на USB и осмысливания режимов передачи данных  USB.
(кстати на b4open.spb.ru лежит ряд статей по USB = очень советую ознакомиться)
usb-skeleto.c  передает/принимает данные посредством BulkTransport => будут использованы endPoint`ы умеющие, по мнению ядра, этот самый bulk (в вашем случае с адресом 129 и 2).

кроме того я немножко не осилил фразу "изменил в нем Vip Pid на свои". Не могли бы вы привести конкретный кусочек кода для наглядности?



"Помогите с простым USB-драйвером"
Отправлено int_0d , 27-Ноя-06 20:42 
кстати вы заполняете skel_table?

"Помогите с простым USB-драйвером"
Отправлено doomer , 28-Ноя-06 15:36 
Vid и Pid - это Vendor ID и Product ID то есть skel_table я заполнил.

вот по мнению Usb-skeleton адрес ендпоинта в который устройство умеет принимать bulk равен 2. Это как раз совпадает с моим мнением. Вот функция write из usb-skeleton

static ssize_t skel_write(struct file *file, const char *user_buffer, size_t count, loff_t *ppos)
{
    struct usb_skel *dev;
    int retval = 0;
    struct urb *urb = NULL;
    char *buf = NULL;

    dev = (struct usb_skel *)file->private_data;

    /* verify that we actually have some data to write */
    if (count == 0)
        goto exit;

    /* create a urb, and a buffer for it, and copy the data to the urb */
    urb = usb_alloc_urb(0, GFP_KERNEL);
    if (!urb) {
        retval = -ENOMEM;
        goto error;
    }

    buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma);
    if (!buf) {
        retval = -ENOMEM;
        goto error;
    }

    if (copy_from_user(buf, user_buffer, count)) {
        retval = -EFAULT;
        goto error;
    }

    /* initialize the urb properly */
        info("count = %d", count);
    usb_fill_bulk_urb(urb, dev->udev,
              usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr),
              buf, count, skel_write_bulk_callback, dev);
    urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

    /* send the data out the bulk port */
    retval = usb_submit_urb(urb, GFP_KERNEL);
        info("retval = %d", retval);
        
    if (retval) {
        err("%s - failed submitting write urb, error %d", __FUNCTION__, retval);
        goto error;
    }

    /* release our reference to this urb, the USB core will eventually free it entirely */
    usb_free_urb(urb);

exit:
    return count;

error:
    usb_buffer_free(dev->udev, count, buf, urb->transfer_dma);
    usb_free_urb(urb);
    return retval;
}


Я туда вставил вывод в логи значения retval и count.
Так вот после попытки записать 2 байта в логах видно что count равен 2, а retval нулю.
То есть получается что и ошибки никакой не выскочило и данные не передались. Вопрос почему?


"Помогите с простым USB-драйвером"
Отправлено doomer , 01-Дек-06 16:15 
Лазил по форумам увидел интересное сообщение http://forum.vingrad.ru/act-Print/client/html/f-101/t-117936.... Может кто-нибудь выскажет свое мнение по поводу такого способа работы с простыми USB-устройствами.

Может у кого-нибудь есть пример работы с usbpp.h?