Краткий ответ
Вы можете захватить видеокадр из следующих мест:
- Выясните, где находится ваш драйвер IPU, и найдите там данные.
- Напишите приложение пользовательского пространства, использующее API V4L2 для захвата кадра.
Второй вариант предпочтительнее и проще.
Подробный ответ
В игре три водителя:
- Драйвер камеры : реализует путь управления через I2C (например, начало потоковой передачи)
Пример : "ovti,ov5640"
- Драйвер CSI Receiver (драйвер хост-контроллера CSI-2) : в основном это PHY, который преобразует формат данных CSI-2 в некоторый внутренний формат данных для IPU.
Пример : "fsl,imx6-mipi-csi2"
- Драйвер IPU (устройства обработки изображений) : реализует множество функций, например, Изображение DMA, захват видео и т. Д.
Пример : "fsl,imx6q-ipu"
- Драйвер подсистемы захвата может быть отделен от драйвера IPU.
Пример : "fsl,imx-capture-subsystem"
Иногда драйверы CSI RX и IPU объединяются в одно IP-ядро (например, порт видеовхода в микросхемах TI AM57xx). Иногда захват видео может быть реализован в отдельном драйвере (хотя это часть IPU). Это просто вопрос архитектуры платформы, над которой вы работаете, но основная идея та же.
Посмотрите на эту картинку:
![Camera Architecture](https://i.stack.imgur.com/prVt6m.png)
Так что, если вы ищете место для подключения данных, оно должно быть в одном из следующих мест:
- В вашем драйвере IPU : драйвер, вероятно, выполняет передачу DMA в RAM, передавая эту область RAM в V4L2. Вот где вы можете попытаться прослушать данные изображения. Поскольку вы не ссылались на свою платформу, вам нужно найти этот драйвер самостоятельно. Загляните внутрь
drivers/media/platform/
и drivers/staging/media/
, оно должно быть где-то там. Кроме того, изучите файл дерева устройств, узел ov5640
должен ссылаться на драйвер CSI / IPU в узле port
.
- В вашем приложении пользовательского пространства : интерфейс пользовательского пространства 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. камера там: