Отладка камеры: конфигурация ключа камеры RK3588 MIPI/DVP
Отладка камеры: конфигурация ключа камеры RK3588 MIPI/DVP

Предисловие:

В предыдущей статье было рассказано, как подсветить сенсор на RK3588 на примере камеры MIPI IMX577. Из предыдущей статьи мы также знаем, что RK3588 поддерживает до 6 камер MIPI и один DVP, поэтому данная статья является дополнением. ключевые точки конфигурации камеры MIPI и камеры DVP соответственно.

1. Знакомство с часто используемыми интерфейсами камеры:

Общие камеры классифицируются по различным интерфейсам: USB-камера, камера MIPI и камера DVP.

①USB camera:

Общие форматы данных USB-камеры: YUYV/MJPEG/H.264 YUYV: данные YUV передаются, объем данных большой, разрешение и частота кадров низкие, данные обычно повторно обрабатываются серверной частью для некоторых специальных приложений. (радужка глаза, инфракрасное распознавание лиц и т. д.). MJPEG: обычно используется для USB-камер с относительно низким разрешением (720P, VGA) и передачей больших объемов данных. H.264: обычно используется для USB-камер с более высоким разрешением (1080p, 720p), при этом передаваемые данные меньше.

②MIPI camera:

MIPI — это низковольтный дифференциальный сигнал с высокой скоростью передачи и сильной защитой от помех. Обычно он поддерживает камеры с разрешением 8 миллионов пикселей и выше. В настоящее время основные модули камер мобильных телефонов используют передачу MIPI, которая использует 4 пары дифференциальных сигналов данных и 1 пару дифференциальных тактовых сигналов.

③DVP camera:

Камера DVP также называется параллельной камерой. Интерфейс показан на рисунке ниже. Обычно он поддерживает передачу данных BT601/BT656/BT1120. DVP — это передача через параллельный порт с относительно низкой скоростью и низкой пропускной способностью. Обычно он используется для камер с числом пикселей менее 5 миллионов. Необходимо использовать тактовый сигнал PCLK, полевую синхронизацию VSYNC, горизонтальную синхронизацию HSYNC и данные параллельного порта D[0:11], которые могут иметь размер битов данных 8/10/12/16 бит.

2. Отладка RK3588:

①Обзор:

Блок-схема подключения показана ниже. Ниже приводится краткое описание ключевых моментов конфигурации камеры RK3588.

Согласно приведенной выше структурной схеме мы можем примерно увидеть, как связаны MIPI и DVP соответственно. Ключевые моменты следующие:

  • rk3588 поддерживает два dcphy, имена узлов — csi2_dcphy0/csi2_dcphy1. Каждое оборудование dcphy поддерживает одновременное использование RX/TX, а RX используется для входа камеры. Поддерживает мультиплексирование протоколов DPHY/CPHY. Следует отметить, что TX/RX одного и того же dcphy может одновременно использовать только DPHY или CPHY.
  • rk3588 поддерживает 2 оборудования dphy, здесь мы называем его dphy0_hw/dphy1_hw, оба оборудования dphy могут работать в полной мере mode и разделить режим в двух режимах. 1. dphy0_hw и dphy1_hw
    1. full режим: имя узла использует csi2_dphy0 и csi2_dphy3, поддерживает до 4 lane。
    2. split режим: разделен на 2 физических для использования, соответственно csi2_dphy1 (используйте 0/1 полоса), csi2_dphy2 (используйте 2/3 lane),dphy1_hw Затем он разбивается на csi2_dphy4иcsi2_dphy5, каждый phy поддерживает до 2 lane。
    3. Когда dphy0_hw использует полную режим,Ссылка должна быть по ссылке csi2_dphy1 Конфигурация,Но имя узла csi2_dphy1 необходимо изменить на csi2_dphy0.,Программное обеспечение использует серийный номер phy, чтобы определить режим, используемый phy. То же самое касается dphy1_hw.
  • Используя приведенный выше узел mipi phy, вам необходимо поместить соответствующий физический узел. Конфигурация csi2_dcphy0_hw/csi2_dcphy1_hw/csi2_dphy0_hw/csi2_dphy1_hw;
  • Каждому типу mipi требуется модуль csi2 для анализа протокола mipi, а имена узлов — mipi0_csi2~mipi5_csi2.
  • rk3588Все камерыданные должны пройти викап,Затем подключитесь к провайдеру. rk3588 поддерживает только одно оборудование vicap,Этот викап поддерживает одновременный ввод 6 мипи физ.,И все пути двпданные,Поэтому мы разделили vicap на 7 узлов, включая rkcif_mipi_lvds~rkcif_mipi_lvds5, rkcif_dvp и т. д.,Отношения привязки каждого узла должны строго соответствовать серийному номеру узла, указанному на блок-схеме. Конфигурация.
  • Связь между каждым узлом vicap и интернет-провайдером указывается соответствующим виртуальным XXX_sditf.
  • rk3588 поддерживает оборудование с двумя провайдерами,Каждое устройство интернет-провайдера может виртуализировать несколько виртуальных узлов.,Путем обратного чтения в программном обеспечении,Изображения каждого канала поочередно считываются из ддр и обрабатываются исп. Для многокамерных решений,Рекомендуется равномерно распределять поток данных между двумя интернет-провайдерами.
  • Режимы прохождения и обратного чтения:
    1. Прямой: относится к данным, собранным через vicap.,Отправить непосредственно провайдеру для обработки,Не сохраняется в DDR. Следует отметить, что при сквозном прохождении HDR,Только короткие кадры являются настоящим сквозным,Длинные кадры требуют DDR,isp затем читает из ddr.
    2. Повторное чтение: относится к DDR, собранным данными через vicap.,После подачи заявки на получение данных,Отправьте адрес буфера провайдеру,Затем провайдер получает данные изображения от ddr.
    3. При перенастройке дтс,оборудование провайдера,Если есть только один виртуальный узел,По умолчанию используется сквозной режим.,Если Конфигурация имеет несколько виртуальных узлов, по умолчанию используется режим обратного чтения.

②Конфигурация MIPI RK3588:

RK3588 может использовать до четырех 2-полосных и двух 4-полосных камер с интерфейсом MIPI. Основные конфигурации следует отметить следующим образом:

Конфигурация интерфейса драйвера:

Драйвер в основном уделяет внимание настройке интерфейса g_mbus_config. Этот интерфейс необходимо настроить для использования интерфейса DVP или интерфейса MIPI, а также того, является ли он MIPI DPHY или MIPI. CPHY, например, IMX577 настроен как V4L2_MBUS_CSI2_DPHY, во-вторых, если это интерфейс MIPI, для интерфейса также необходимо настроить количество полос, а IMX577 настроить как 4-полосное, необходимо настроить количество виртуальных каналов; например IMX577, один канал настроен в линейном режиме, а два — в режиме HDR, если это многоканальный вк.

Язык кода:javascript
копировать
static int imx577_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
    struct v4l2_mbus_config *config)
{
 struct imx577 *imx577 = to_imx577(sd);
 const struct imx577_mode *mode = imx577->cur_mode;
 u32 lane_num = imx577->bus_cfg.bus.mipi_csi2.num_data_lanes;
 u32 val = 0;
 
 val = 1 << (lane_num - 1) |
  V4L2_MBUS_CSI2_CHANNEL_0 |
  V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
 if (mode->hdr_mode != NO_HDR)
  val |= V4L2_MBUS_CSI2_CHANNEL_1;
 
 config->type = V4L2_MBUS_CSI2_DPHY;
 config->flags = val;
 
 return 0;
}

конфигурация dts

Компоненты dts можно найти в разделе «Конфигурация IMX577» в предыдущей статье. Здесь мы в основном подчеркиваем несколько ключевых моментов:

data-lanes:Конфигурацияlaneчисло,в случае4laneТогда это<1 2 3 4>,2laneТогда это<1 2>;

имя-модуля-камеры и имя-модуля-камеры-объектива: используются, когда датчик RAW запускает aiq;

RAW sensorКонфигурация:sensor->csi2_dphy->mipi_csi->rkcif_mipi_lvds ... rkcif_mipi_lvds_stdif->rkisp_vir

YUV/RGB888 sensorиз Конфигурация:sensor->csi2_dphy->mipi_csi->rkcif_mipi_lvds

Датчики YUV или RGB888 обычно поставляются со своим собственным ISP и напрямую выводят изображения YUV422, минуя ISP RK3588, поэтому их можно напрямую сохранять в DDR на уровне vicap.

③RK3588 DVP camera:

RK3588 имеет интерфейс DVP, который поддерживает BT601/BT656/BT1120 и т. д. Аналогичным образом, если это датчик RAW, его необходимо настроить для ISP. Если это датчик YUV, ему не нужно проходить через ISP. Ключевая конфигурация следующая:

Интерфейс BT601:

Ключевые моменты конфигурации интерфейса BT601:

hsync-active/vsync-active должен быть настроен на использование асинхронной регистрации платформы v4l2 для идентификации интерфейса BT601. Если он не настроен, он будет идентифицироваться как интерфейс BT656.

pclk-sample/bus-width не является обязательным;

Действующая полярность hsync-acitve/vsyncactive/pclk-ative текущего датчика должна быть указана через флаг в интерфейсе g_mbus_config драйвера датчика, иначе данные не будут получены;

pinctrl должен ссылаться на пару, чтобы выполнить соответствующий iomux для gpio, связанного с bt601, в противном случае это приведет к невозможности получения данных;

Конфигурация интерфейса драйвера следующая:

Язык кода:javascript
копировать
static int gc2145_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
    struct v4l2_mbus_config *config)
{
 struct gc2145 *gc2145 = to_gc2145(sd);
 
  config->type = V4L2_MBUS_PARALLEL;
  config->flags = V4L2_MBUS_HSYNC_ACTIVE_HIGH |
    V4L2_MBUS_VSYNC_ACTIVE_LOW |
    V4L2_MBUS_PCLK_SAMPLE_RISING;
 
 return 0;
}

Конструкция dts по сути такая же, как у BT656иBT1120.,Здесь не повторяется,Пожалуйста, обратитесь к BT656/BT1120 ниже;

BT656/BT1120:

Ключевые моменты настройки следующие:

Не настраивайте hsync-active/vsync-active, иначе платформа v4l2 распознает его как BT601 во время асинхронной регистрации;

pclk-sample/bus-width не является обязательным;

Действующая полярность pclk-атива текущего датчика должна быть указана через переменную flag в интерфейсе g_mbus_config драйвера датчика, иначе данные не будут получены;

Интерфейс querystd в v4l2_subdev_video_ops должен быть реализован, указав, что текущий интерфейс является интерфейсом ATSC, иначе данные не будут получены;

RKMODULE_GET_BT656_MBUS_INFO должен быть реализован. Все BT656/BT1120 вызывают этот интерфейс. Интерфейс совместим. Для реализации обратитесь к драйверам/media/i2c/nvp6158_drv/nvp6158_v4l2.c.

pinctrl должен ссылаться на пару, чтобы выполнить соответствующий iomux для gpio, связанного с bt656/bt1120, иначе данные не будут получены.

Пример кода интерфейса g_mbus_config выглядит следующим образом:

Язык кода:javascript
копировать
static int lt8619c_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
        struct v4l2_mbus_config *cfg)
{
 struct lt8619c *lt8619c = to_lt8619c(sd);
 
 cfg->type = V4L2_MBUS_BT656;
 if (lt8619c->clk_ddrmode_en) {
  cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
   V4L2_MBUS_PCLK_SAMPLE_RISING |
   V4L2_MBUS_PCLK_SAMPLE_FALLING;
 } else {
  cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
   V4L2_MBUS_PCLK_SAMPLE_RISING;
 }
 
 return 0;
}

Пример интерфейса querystd выглядит следующим образом:

Язык кода:javascript
копировать
static int lt8619c_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
{
 struct lt8619c *lt8619c = to_lt8619c(sd);
 
 if (lt8619c->yuv_output_mode == BT656_OUTPUT)
  *std = V4L2_STD_PAL;
 else
  *std = V4L2_STD_ATSC;
 
 return 0;
}

Ссылка на dts выглядит следующим образом:

Язык кода:javascript
копировать
&i2c2 {
 status = "okay";
 pinctrl-names = "default";
 pinctrl-0 = <&i2c2m4_xfer>;
 
 nvp6158: nvp6158@30 {
  compatible = "nvp6158-v4l2";
  status = "okay";
  reg = <0x30>;
  clocks = <&cru CLK_CIFOUT_OUT>;
  clock-names = "xvclk";
  power-domains = <&power RK3588_PD_VI>;
  pinctrl-names = "default";
  pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus8 &cif_dvp_bus16>;
  // pwr-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>;
  pwr2-gpios = <&gpio1 RK_PA5 GPIO_ACTIVE_HIGH>;
  rst-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
  // rst2-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
  // pwdn-gpios = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>;
  // pwdn2-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
  rockchip,camera-module-index = <0>;
  rockchip,camera-module-facing = "back";
  rockchip,camera-module-name = "default";
  rockchip,camera-module-lens-name = "default";
  rockchip,dvp_mode = "BT1120"; //BT656 or BT1120 or BT656_TEST
  rockchip,channel_nums = <4>; //channel nums, 1/2/4
  rockchip,dual_edge = <1>; // pclk dual edge, 0/1
  rockchip,default_rect= <1920 1080>; // default resolution
  port {
   nvp6158_out: endpoint {
    remote-endpoint = <&dvp_in_bcam1>;
   };
  };
 };
};
 
&rkcif {
 status = "okay";
};
 
&rkcif_dvp {
 status = "okay";
 ports {
  #address-cells = <1>;
  #size-cells = <0>;
 
  port@0 {
   #address-cells = <1>;
   #size-cells = <0>;
   /* Parallel bus endpoint */
   dvp_in_bcam1: endpoint@1 {
    reg = <1>;
    remote-endpoint = <&nvp6158_out>;
    bus-width = <16>;
   };
  };
 };
};
 
&rkcif_mmu {
 status = "okay";
};

Такой же,конфигурация dtsсередина,Если это датчик YUV,Тогда вам нужна только вышеуказанная Конфигурация,Просто подключитесь к узлу rkcif_dvp.,Если это датчик RAW,Вам необходимо добавить узел rkcif_dvp_sditf.,И подключитесь к узлу rkisp_vir.

Ссылка: http://t.csdnimg.cn/r7kNF.

boy illustration
Демо1 Laravel5.2 — генерация и хранение URL-адресов
boy illustration
Spring boot интегрирует Kafka и реализует отправку и потребление информации (действительно при личном тестировании)
boy illustration
Мысли о решениях по внутренней реализации сортировки методом перетаскивания
boy illustration
Междоменный доступ к конфигурации nginx не может вступить в силу. Междоменный доступ к странице_Page
boy illustration
Как написать текстовый контент на php
boy illustration
PHP добавляет текстовый водяной знак или водяной знак изображения к изображениям – метод инкапсуляции
boy illustration
Интерпретация быстрой таблицы (TLB)
boy illustration
Интерфейс WeChat API (полный) — оплата WeChat/красный конверт WeChat/купон WeChat/магазин WeChat/JSAPI
boy illustration
Преобразование Java-объекта в json string_complex json-строки в объект
boy illustration
Примените сегментацию слов jieba (версия Java) и предоставьте пакет jar
boy illustration
matinal: Самый подробный анализ управления разрешениями во всей сети SAP. Все управление разрешениями находится здесь.
boy illustration
Коротко расскажу обо всем процессе работы алгоритма сборки мусора G1 --- Теоретическая часть -- Часть 1
boy illustration
[Спецификация] Результаты и исключения возврата интерфейса SpringBoot обрабатываются единообразно, поэтому инкапсуляция является элегантной.
boy illustration
Интерпретация каталога веб-проекта Flask
boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально
boy illustration
Подведение итогов десяти самых популярных веб-фреймворков для Go
boy illustration
5 рекомендуемых проектов CMS с открытым исходным кодом на базе .Net Core
boy illustration
Java использует httpclient для отправки запросов HttpPost (отправка формы, загрузка файлов и передача данных Json)
boy illustration
Руководство по развертыванию Nginx в Linux (Centos)
boy illustration
Интервью с Alibaba по Java: можно ли использовать @Transactional и @Async вместе?
boy illustration
Облачный шлюз Spring реализует примеры балансировки нагрузки и проверки входа в систему.
boy illustration
Используйте Nginx для решения междоменных проблем
boy illustration
Произошла ошибка, когда сервер веб-сайта установил соединение с базой данных. WordPress предложил решение проблемы с установкой соединения с базой данных... [Легко понять]
boy illustration
Новый адрес java-библиотеки_16 топовых Java-проектов с открытым исходным кодом, достойных вашего внимания! Обязательно к просмотру новичкам
boy illustration
Лучшие практики Kubernetes для устранения несоответствий часовых поясов внутри контейнеров
boy illustration
Введение в проект удаления водяных знаков из коротких видео на GitHub Douyin_TikTok_Download_API
boy illustration
Весенние аннотации: подробное объяснение @Service!
boy illustration
Пожалуйста, не используйте foreach для пакетной вставки в MyBatis. Для 5000 фрагментов данных потребовалось 14 минут. .
boy illustration
Как создать проект Node.js с помощью npm?