V4L2 запрос VIDIOC_DQBUF и версия ядра

Взгляд изнутри

Модератор: Модераторы разделов

Ответить
IMB
Сообщения: 2559
ОС: Debian

V4L2 запрос VIDIOC_DQBUF и версия ядра

Сообщение IMB »

Доброго дня!
Имеется программа захвата изображения с CCDC-матрицы, управляется через NEXTCHIP NVP2120. Захват буфера осуществляется посредством ioctl (captureFd, VIDIOC_DQBUF, &v4l2buf). На ядре 2.6.10 всё работает.
Пробуем использовать ядро 2.6.18 и получаем на этом ioctl "зависание" программы, помогает только прерывание работы по Ctrl-C.
Отслеженная цепочка: ioctl (captureFd, VIDIOC_DQBUF, &v4l2buf) --> videobuf_dqbuf(&vpfe->bufqueue, arg, 0) (файл drivers/media/video/video-buf.c) --> videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr).
videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)

Код: Выделить всё

int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
{
    int retval = 0;
    DECLARE_WAITQUEUE(wait, current);

    MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
    add_wait_queue(&vb->done, &wait);
    dprintk(1, "buffer waiton: after add_wait_queue\n");
    while (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED) {
        if (non_blocking) {
            retval = -EAGAIN;
            break;
        }
        set_current_state(intr  ? TASK_INTERRUPTIBLE
                    : TASK_UNINTERRUPTIBLE);
        dprintk(1, "buffer waiton: after set_current_state\n");
        if (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED)
            schedule();
        dprintk(1, "buffer waiton: after schedule\n");
        set_current_state(TASK_RUNNING);
        dprintk(1, "buffer waiton: after set_current_state\n");
        if (intr && signal_pending(current)) {
            dprintk(1,"buffer waiton: -EINTR\n");
            retval = -EINTR;
            break;
        }
    }
    remove_wait_queue(&vb->done, &wait);
    return retval;
}

Вывод программы

Код: Выделить всё

vbuf: reqbufs: bufs=3, size=0x3f5000 [3039 pages total]
Creating Dmai clvbuf: mmap setup: 3 buffers, 4149248 bytes each
ass!
vbuf: mmap c63f0fe0: q=bf01062c 41334000-41729000 pgoff 00085800 bufs 0-0

vbuf: qbuf: requesting next field
vbuf: qbuf: succeded
vbuf: mmap c63f0fc0: q=bf01062c 41729000-41b1e000 pgoff 00085c00 bufs 1-1
vbuf: qbuf: requesting next field
vbuf: qbuf: succeded
vbuf: mmap c63f0fa0: q=bf01062c 41b1e000-41f13000 pgoff 00084000 bufs 2-2
vbuf: qbuf: requesting next field
vbuf: qbuf: succeded
vbuf: dqbuf: Running...
[Capture thread]vbuf: dqbuf: running list_entry
vbuf: dqbuf: running videobuf_waiton

vbuf: buffer waiton: after add_wait_queue
vbuf: buffer waiton: after set_current_state
vbuf: buffer waiton: after schedule //появляется после Ctrl-C
vbuf: buffer waiton: after set_current_state
vbuf: buffer waiton: -EINTR
vbuf: dqbuf: waiton returned -4

Я перепробовал четыре доступных планировщика: NOOP, AS, DEADLINE и CFQ - везде этот результат.
В чём причина такого поведения?
Спасибо.
Спасибо сказали:
Аватара пользователя
PodBot
Сообщения: 13
ОС: GNU/Linux

Re: V4L2 запрос VIDIOC_DQBUF и версия ядра

Сообщение PodBot »

С последними стабильными ядром 2.6.33.3 такой же эффект?
Спасибо сказали:
IMB
Сообщения: 2559
ОС: Debian

Re: V4L2 запрос VIDIOC_DQBUF и версия ядра

Сообщение IMB »

Видите ли в чём штука, это разработка для ARM-процессора и в составе SDK производителя идёт имено это ядро.
Спасибо сказали:
Ответить