LINUX.ORG.RU

Usb-video под арм


0

0

Добрый день!

Пытаюсь подключать usb-камеру под линукс 2.6 на arm (at91rm9200). Для работы использую драйвер gspca. Камера подключается, определяется и работает, но на некоторых камерах изображение выглядит покоцаным.
Например изображение с камеры Logitech IM/Connect:
http://img520.imageshack.us/img520/2466/23825307is1.jpg
http://img520.imageshack.us/img520/7779/19872679nh9.jpg
С других камер (например Genius Messenger) изображение нормальное.
На x86 та же программа с тем же драйвером выдаёт нормальное изображение для всех камер.

Если вдруг кто-нибудь вдруг сможет помочь с решением этой проблемы (дать идею куда копать), то помогите!
Например, возможно ли, что у меня под at91rm9200 usb-порт работает не в режиме full-speed? Или возможно ли, что не хватает питания для камеры?

Заранее спасибо.

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

>Камера-то сама не покоцанная?

Под x86 и аналогичной конфигурации (только собрано под x86) всё работает правильно

anonymous
()

>Пытаюсь подключать usb-камеру под линукс 2.6 на arm (at91rm9200). Для работы использую драйвер gspca. Камера подключается, определяется и работает, но на некоторых камерах изображение выглядит покоцаным.

>На x86 та же программа с тем же драйвером выдаёт нормальное изображение для всех камер.

Это известная бага ARM-ов на gspca с выравниванием буфера.

Есть патч на эту тему, к сожалению у меня он на другом ноуте (для оригинального gspca)

Ну или возьми мою модульную версию gspca. Там этот патч уже наложен.

http://mgspca.e1.bmstu.ru/mgspcav1-01.00.20.tar.bz2

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

>Это известная бага ARM-ов на gspca
А не наоборот?

>Есть патч на эту тему
Вот спасибо. Если вас не затруднит, будьте так добры прислать мне этот патч на почту uint64 (at) yandex.ru, или оставить здесь ссылку, чтобы я мог посмотреть изменения, а модульная версия - это интересно.
Спасибо за решение.

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

>>Это известная бага ARM-ов на gspca 

>>А не наоборот? 

Нет ;) ... эта проблема не документирована в спеках на OHCI (для ARM)

Вот выдержка из письма автора патча.

I've read of others complaining about corrupted images or
transfer errors and I suspect this patch may solve their problem too.  My
copy of the OHCI spec doesn't mention any restrictions on alignment for the
transfer buffers, so I'm not sure if the fault is with Atmel, or if this is
a more generic problem.

>Вот спасибо. Если вас не затруднит, будьте так добры прислать мне этот патч

Легко...

--- gspca_core.c.orig   2007-11-23 15:59:43.000000000 -0800
+++ gspca_core.c        2007-11-23 15:58:44.000000000 -0800
@@ -966,7 +966,7 @@
        struct usb_host_endpoint *ep;
        struct usb_interface *intf;
        struct urb *urb;
-       __u16 psize;
+       __u16 psize, aligned_psize;
        int n,fx;
        struct usb_device *dev = spca50x->dev;
 //     struct usb_host_interface *altsetting = NULL;
@@ -987,7 +987,9 @@
                        return -EIO;
                psize = le16_to_cpu(ep->desc.wMaxPacketSize);
                psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3));
-               PDEBUG(3, "packet size %d", psize);
+               /* (some embedded HCs don't like non-word-aligned transfer buffers) */
+               aligned_psize = ((psize+sizeof(int)-1)/sizeof(int)) * sizeof(int);
+               PDEBUG(3, "packet size %d, pktbuf size %d", psize, aligned_psize);
                for (n = 0; n < SPCA50X_NUMSBUF; n++) {
                        urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
                        if (!urb) {
@@ -996,10 +998,10 @@
                        }
                        
                        spca50x->sbuf[n].data = usb_buffer_alloc(spca50x->dev,
-                                       psize * FRAMES_PER_DESC,
+                                       aligned_psize * FRAMES_PER_DESC,
                                        GFP_KERNEL, &urb->transfer_dma);
                        
-                       //gspca_dev->sbuf[n].data = kmalloc((psize+1)* FRAMES_PER_DESC,GFP_KERNEL);
+                       //gspca_dev->sbuf[n].data = kmalloc((aligned_psize+1)* FRAMES_PER_DESC,GFP_KERNEL);
                        
                        if(spca50x->sbuf[n].data == NULL){
                                usb_free_urb(urb);
@@ -1017,9 +1019,9 @@
                        urb->transfer_buffer = spca50x->sbuf[n].data;
                        urb->complete = spca50x_isoc_irq;
                        urb->number_of_packets = FRAMES_PER_DESC;
-                       urb->transfer_buffer_length = psize * FRAMES_PER_DESC;
+                       urb->transfer_buffer_length = aligned_psize * FRAMES_PER_DESC;
                        for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
-                               urb->iso_frame_desc[fx].offset = psize * fx;
+                               urb->iso_frame_desc[fx].offset = aligned_psize * fx;
                                urb->iso_frame_desc[fx].length = psize;
                        }
                }

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