Есть 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 и осмысливания режимов передачи данных USB.
(кстати на b4open.spb.ru лежит ряд статей по USB = очень советую ознакомиться)
usb-skeleto.c передает/принимает данные посредством BulkTransport => будут использованы endPoint`ы умеющие, по мнению ядра, этот самый bulk (в вашем случае с адресом 129 и 2).кроме того я немножко не осилил фразу "изменил в нем Vip Pid на свои". Не могли бы вы привести конкретный кусочек кода для наглядности?
кстати вы заполняете skel_table?
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 нулю.
То есть получается что и ошибки никакой не выскочило и данные не передались. Вопрос почему?
Лазил по форумам увидел интересное сообщение http://forum.vingrad.ru/act-Print/client/html/f-101/t-117936.... Может кто-нибудь выскажет свое мнение по поводу такого способа работы с простыми USB-устройствами.Может у кого-нибудь есть пример работы с usbpp.h?