LINUX.ORG.RU

USB передачи bulk


0

2

День добрый.

Проблема в следующем. Во время запроса данных с USB устройства (IN-пакеты), через функции usb_fill_bulk_urb()/usb_submit_urb(), у меня перезаписывается входной буфер последним отправленным пакетом с устройства. Это происходит если пакеты были отправлены один за другим через достаточно короткий промежуток времени. То, что все пакеты доставляются на хост я вижу (работаю через виртуальную машину). Запрос на устройство делаю в контексте read (fops) драйвера раз в сек через 'tail -f /dev/usb_device'.

Существует ли метод, чтобы избежать потерь пакетов, кроме того, как тупо увеличить частоту обращения к функции usb_submit_urb...? Или это специфика для BULK передач?

static void read_bulk_callback(struct urb *urb)
{
         struct usb_skel *dev;
         
         dev = urb->context;
         
        /* sync/async unlink faults aren't errors */
        if (urb->status && 
            !(urb->status == -ENOENT || 
              urb->status == -ECONNRESET ||
              urb->status == -ESHUTDOWN)) {
                dbg("%s - nonzero write bulk status received: %d",
                    __FUNCTION__, urb->status);
        }else
        {
            dev->bulk_in_len = urb->actual_length;
        }
}

.....
   // prepare URB
   usb_fill_bulk_urb(   urb, dev->udev, 
                        usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
                        dev->bulk_in_buffer, dev->bulk_in_size, read_bulk_callback, dev );
   
   // send request to device
   result = usb_submit_urb( urb, GFP_KERNEL );

      
      if( result == 0 && dev->bulk_in_len != 0 )
      if (copy_to_user(buffer, dev->bulk_in_buffer, dev->bulk_in_len))    result = -EFAULT;
      else { result = dev->bulk_in_len; dev->bulk_in_len = 0; }

Нужно же сделать асинхронный цикл чтения, который перезапускать, как только приходит следующий пакет.

anonymous
()
Ответ на: комментарий от anonymous

Объясни подробней *** Я не понимаю, как я буду ловить тот момент, когда приходит очередной пакет, т.к. при следующем обращении в буфере будет не след пакет, а последний... Вообщем поясни пожалуйста.

userqest
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.