The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите с простым USB-драйвером"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите с простым USB-драйвером"  
Сообщение от doomer email(??) on 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. Подскажите пожалуйста в каком направлении мне стоит искать решение своей задачи.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Помогите с простым USB-драйвером"  
Сообщение от int_0d email on 27-Ноя-06, 20:42 
кстати вы заполняете skel_table?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Помогите с простым USB-драйвером"  
Сообщение от doomer email(??) on 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 нулю.
То есть получается что и ошибки никакой не выскочило и данные не передались. Вопрос почему?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру