Где Linux вызывает драйвер камеры для доставки изображений - PullRequest
1 голос
/ 24 июня 2019

Драйвер Linux для камеры OV5640 обеспечивает ограниченную функциональность.

static struct i2c_driver ov5640_i2c_driver = {
    .driver = {
        .name  = "ov5640",
        .of_match_table = ov5640_dt_ids,
    },
    .id_table = ov5640_id,
    .probe    = ov5640_probe,
    .remove   = ov5640_remove,
};

Эти функции name, probe и remove.

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

В какой части кода происходит передача данных снятого изображения? Я ищу два места: одно в драйвере и другое на более высоком уровне, который вызывает драйвер.

1 Ответ

3 голосов
/ 25 июня 2019

Краткий ответ

Вы можете захватить видеокадр из следующих мест:

  1. Выясните, где находится ваш драйвер IPU, и найдите там данные.
  2. Напишите приложение пользовательского пространства, использующее API V4L2 для захвата кадра.

Второй вариант предпочтительнее и проще.

Подробный ответ

В игре три водителя:

  1. Драйвер камеры : реализует путь управления через I2C (например, начало потоковой передачи)
    Пример : "ovti,ov5640"
  2. Драйвер CSI Receiver (драйвер хост-контроллера CSI-2) : в основном это PHY, который преобразует формат данных CSI-2 в некоторый внутренний формат данных для IPU.
    Пример : "fsl,imx6-mipi-csi2"
  3. Драйвер IPU (устройства обработки изображений) : реализует множество функций, например, Изображение DMA, захват видео и т. Д.
    Пример : "fsl,imx6q-ipu"
    • Драйвер подсистемы захвата может быть отделен от драйвера IPU.
      Пример : "fsl,imx-capture-subsystem"

Иногда драйверы CSI RX и IPU объединяются в одно IP-ядро (например, порт видеовхода в микросхемах TI AM57xx). Иногда захват видео может быть реализован в отдельном драйвере (хотя это часть IPU). Это просто вопрос архитектуры платформы, над которой вы работаете, но основная идея та же.

Посмотрите на эту картинку:

Camera Architecture

Так что, если вы ищете место для подключения данных, оно должно быть в одном из следующих мест:

  1. В вашем драйвере IPU : драйвер, вероятно, выполняет передачу DMA в RAM, передавая эту область RAM в V4L2. Вот где вы можете попытаться прослушать данные изображения. Поскольку вы не ссылались на свою платформу, вам нужно найти этот драйвер самостоятельно. Загляните внутрь drivers/media/platform/ и drivers/staging/media/, оно должно быть где-то там. Кроме того, изучите файл дерева устройств, узел ov5640 должен ссылаться на драйвер CSI / IPU в узле port.
  2. В вашем приложении пользовательского пространства : интерфейс пользовательского пространства V4L2 позволяет захватывать видеокадр; см. этот пример для деталей.

Вы можете попытаться найти свой драйвер захвата, либо выбрав дерево исходного кода ядра по некоторой известной константе V4L2, например ::101074

$ grep -lIr V4L2_BUF_TYPE_VIDEO_CAPTURE drivers/media/platform/* drivers/staging/media/*

или попробуйте найти это из файла дерева вашего устройства. Например, на платформе iMX6 все связанные узлы выглядят так:

ov5640: camera@3c {
    compatible = "ovti,ov5640";
    port {
        ov5640_to_mipi_csi2: endpoint { remote-endpoint = <&mipi_csi2_in>; };
    };
};

mipi_csi: mipi@21e0000 {
    compatible = "fsl,imx6-mipi-csi2";
    port@0 {
        mipi_csi2_in: endpoint { remote-endpoint = <&ov5640_to_mipi_csi2>; };
    };
};

ipu1: ipu@2800000 {
    compatible = "fsl,imx6q-ipu";
    ipu1_csi0: port@0 { };
};

capture-subsystem {
    compatible = "fsl,imx-capture-subsystem";
    ports = <&ipu1_csi0>;
};

Но я бы посоветовал вам попытаться захватить видеокадр из приложения пользовательского пространства, как это сделано здесь , поскольку это может быть трудной задачей в драйвере ядра. Кроме того, в приложении пользовательского пространства было бы легче сохранить захваченный кадр в файл jpg, как это сделано здесь .

ресурсы iMX6

Существует много документации для iMX6 w.r.t. камера там:

...