usb: почему мой f_uvc не отвечает на запрос GET_DEF?

Мне нужно реализовать спецификации uvc1.5 на моем устройстве, я выбрал linux3.4 в качестве ядра и хочу использовать drivers/usb/gadget/webcam.c как мой функциональный драйвер. Но это не работает должным образом.

Согласно сигналам, захваченным wireshark, когда хост отправляет GET_DEF запрос к устройству, ответ моего устройства -ENOENT что приводит к невозможности перечисления.

Я узнаю, что когда composite.c получает такого рода запросы, он будет направлять их f->set_up продолжать.

Основная часть f->set_up является:

    uvc->event_setup_out = !(ctrl->bRequestType & USB_DIR_IN);
    uvc->event_length = le16_to_cpu(ctrl->wLength);

    memset(&v4l2_event, 0, sizeof(v4l2_event));
    v4l2_event.type = UVC_EVENT_SETUP;
    memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req));
    v4l2_event_queue(&uvc->vdev, &v4l2_event);

Зов v4l2_event_queue что меня озадачивает: кто будет заниматься этим событием? Я не видел ни одного кода, выполняющего такую ​​инициализацию, связанную с событием.....

И мой вопрос, как правильно обработать это событие, чтобы я мог ответить на GET_DEF запрос?

1 ответ

Это событие V4L2, с которым вам нужно иметь дело в другом месте. Вы можете получить событие v4l2 через

rt = ioctl(dev->fd, VIDIOC_DQEVENT,&v4l2_event);

Затем вы можете проанализировать этот v4l2_event, может быть, GET_CUR, GER_LEN и т. Д. Таким образом, вы можете ответить на эти запросы самостоятельно определить.

Другие вопросы по тегам