Отладка камеры: Как на RK3588 загорается сенсор?
Отладка камеры: Как на RK3588 загорается сенсор?

(1) Как я могу считать, что датчик горит?

①Идентификатор чипа датчика можно правильно прочитать через i2c, что означает, что i2c может нормально взаимодействовать;

② Используйте инструмент media-ctl, чтобы просмотреть конвейер, а также конкретное разрешение и формат датчика;

③ Если при использовании инструмента V4L2 для захвата изображений нет ошибок, происходит нормальный вывод данных, а команды V4L2 можно использовать для управления усилением экспозиции и т. д., можно считать, что с драйвером проблем нет;

④В режиме SOC конфигурации xml вы можете использовать apk для предварительного просмотра изображения (изображение может быть темнее и зеленее, о том, как настроить xml, мы поговорим позже). На этом этапе можно считать, что с HAL проблем нет;

⑤ Перенесите файлы эффектов других датчиков самостоятельно, и вы сможете создавать изображения (эффекты изображения могут быть ненормальными, о том, как первоначально изменить файлы эффектов, мы поговорим позже. На этом этапе вы можете начать отладку эффекта). Если вам нужно найти РК для отладки эффекта, этот шаг также необходимо выполнить.

(2) SENSOR_TYPE_RAW и SENSOR_TYPE_SOC:

Это настроено для cameraHAL, чтобы подтвердить тип датчика.

SENSOR_TYPE_RAW: обычно это датчик RAWRGB, который требует включения эффектов 3A для нормального создания изображений и требует правильного пути к файлу эффекта, прежде чем его можно будет использовать;

SENSOR_TYPE_SOC: Обычно он выводит датчики, такие как YUV или RGB888/RGB565. Он не требует запуска эффектов 3A. Обычно он используется для датчиков, которые поставляются с собственным ISP, и может использоваться без необходимости использования файлов эффектов;

Если во время общей отладки датчика RAW вы уже можете захватывать изображения с помощью V4L2, вы можете сначала настроить датчик на режим SENSOR_TYPE_SOC, чтобы подтвердить, можно ли захватывать изображения без запуска 3A.

(3) Трансплантация драйвера датчика

Драйвер датчика находится в папке driver/media/i2c. Драйвер датчика не зависит от драйверов контроллера RKCIF и RKISP. Они регистрируются асинхронно и подключаются к конвейеру через платформы v4l2 и media-framework. Здесь мы в основном представляем код драйвера датчика, конфигурацию dts и т. д. Драйвер датчика в основном разделен на несколько частей:

①Конфигурация регистра датчика:

Определите различные режимы инициализации в support_modes, в основном настраивая разрешение, формат изображения, частоту кадров, список инициализации регистров и т. д. Список инициализации регистров можно заполнить напрямую, как это предусмотрено производителем. hts_def и vts_def могут напрямую заполнять значения согласно списку инициализации регистра. Для exp_def можно проверить, имеет ли даташит значение по умолчанию, или вообще заполнить его чуть меньшим, чем vts.

Язык кода:javascript
копировать
static const struct imx577_mode supported_modes[] = {
 {
  .width = 4056,
  .height = 3040,
  .max_fps = {
   .numerator = 10000,
   .denominator = 300000,
  },
  .exp_def = 0x0c10,
  .hts_def = 0x2318,
  .vts_def = 0x0c2c,
  .bpp = 10,
  .bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
  .reg_list = imx577_linear_10bit_4056x3040_30fps_regs,
  .hdr_mode = NO_HDR,
  .link_freq_idx = 1,
  .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
 },

②Последовательность включения датчика:

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

В таблице данных датчика обычно есть временная диаграмма включения. В коде драйвера просто настройте ее в соответствии с временем включения imx577. Аналогично, время выключения также должно быть. реализовано согласно описанию в даташите.

Язык кода:javascript
копировать
static int __imx577_power_on(struct imx577 *imx577)
{
 int ret;
 u32 delay_us;
 struct device *dev = &imx577->client->dev;
 
 if (!IS_ERR(imx577->power_gpio))
  gpiod_set_value_cansleep(imx577->power_gpio, 1);
 
 usleep_range(1000, 2000);
 
 if (!IS_ERR_OR_NULL(imx577->pins_default)) {
  ret = pinctrl_select_state(imx577->pinctrl,
        imx577->pins_default);
  if (ret < 0)
   dev_err(dev, "could not set pins\n");
 }
 ret = clk_set_rate(imx577->xvclk, IMX577_XVCLK_FREQ);
 if (ret < 0)
  dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
 if (clk_get_rate(imx577->xvclk) != IMX577_XVCLK_FREQ)
  dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
 ret = clk_prepare_enable(imx577->xvclk);
 if (ret < 0) {
  dev_err(dev, "Failed to enable xvclk\n");
  return ret;
 }
 if (!IS_ERR(imx577->reset_gpio))
  gpiod_set_value_cansleep(imx577->reset_gpio, 0);
 
 ret = regulator_bulk_enable(IMX577_NUM_SUPPLIES, imx577->supplies);
 if (ret < 0) {
  dev_err(dev, "Failed to enable regulators\n");
  goto disable_clk;
 }
 
 if (!IS_ERR(imx577->reset_gpio))
  gpiod_set_value_cansleep(imx577->reset_gpio, 1);
 
 usleep_range(500, 1000);
 if (!IS_ERR(imx577->pwdn_gpio))
  gpiod_set_value_cansleep(imx577->pwdn_gpio, 1);
 
 /* 8192 cycles prior to first SCCB transaction */
 delay_us = imx577_cal_delay(8192);
 usleep_range(delay_us, delay_us * 2);
 
 return 0;
 
disable_clk:
 clk_disable_unprepare(imx577->xvclk);
 
 return ret;
}

③Реализация функции обратного вызова, связанной с V4l2_subdev_ops

v4l2_subdev_ops — это ядро ​​управления драйвером датчика платформы. Вот некоторые важные функции обратного вызова:

  • .s_power,Функция включения и выключения питания,Это место будет вызываться при включении и выключении камеры. Обычно pm_rntime используется для управления.
  • .ioctl обеспечивает интерфейс ioctl.
  • s_stream,интерфейс для переключения потоков данных,включатьstream включить и транслировать off
  • .enum_mbus_code перечисляет форматы изображений, поддерживаемые драйвером.
  • .enum_frame_size, разрешения, поддерживаемые драйвером перечисления
  • .enum_frame_interval,В дополнение к частоте кадров разрешения формата, поддерживаемой драйвером обратной связи,,Когда есть режим HDR,тоже нужно пройтиfie->reserved[0]Участники оставляют отзывы。
  • .get_fmt, получить текущий формат датчика
  • .set_fmt, установить формат датчика
  • .get_selection, получить информацию о резке
  • .get_mbus_config,Получить конфигурацию автобуса,Включает интерфейс mipi/dvp.,Количество полос,Полярность и т. д.

④Управление V4L2:

Как правило, необработанным датчикам необходимо контролировать экспозицию, усиление, vblank и т. д., поэтому им необходимо реализовать соответствующие интерфейсные функции.

imx577_initialize_controls объявляет, какие элементы управления требуются драйверу, и устанавливает диапазон регулировки и другую информацию.

Интерфейс imx577_set_ctrl реализует управление экспозицией, усилением и vblank.

⑤ Датчик функции записи регистрации водителя:

Среди функций регистрации драйверов, помимо разбора dts, получения тактовой мощности и т. д., наиболее важными являются регистрация медиа-объекта и V4L2 subdev. Ключевые моменты заключаются в следующем:

  • v4l2_i2c_subdev_init(), зарегистрированный как v4l2 subdev, функция обратного вызова предоставляется в параметре.
  • imx577_initialize_controls инициализирует элементы управления v4l2.
  • media_entity_init(), зарегистрируйтесь как медиа-объект.
  • v4l2_async_register_subdev() объявляет, что Датчик требует асинхронной регистрации. Поскольку и RKISP, и RKCIF используют асинхронную регистрацию вспомогательного устройства, этот вызов является обязательным.

(4) анализ конфигурации dts:

Язык кода:javascript
копировать
&csi2_dphy0 {
 status = "okay";
 
 ports {
  #address-cells = <1>;
  #size-cells = <0>;
  port@0 {
   reg = <0>;
   #address-cells = <1>;
   #size-cells = <0>;
 
   mipi_in_ucam0: endpoint@1 {
    reg = <1>;
    remote-endpoint = <&imx577_out0>;
    data-lanes = <1 2 3 4>;
   };
  };
  port@1 {
   reg = <1>;
   #address-cells = <1>;
   #size-cells = <0>;
 
   csidphy0_out: endpoint@0 {
    reg = <0>;
    remote-endpoint = <&mipi2_csi2_input>;
    data-lanes = <1 2 3 4>;
   };
  };
 };
};
 
&i2c3 {
 status = "okay";
 pinctrl-0 = <&i2c3m0_xfer>;
 
 imx577: imx577@1a {
  compatible = "sony,imx577";
  reg = <0x1a>;
  clocks = <&cru CLK_MIPI_CAMARAOUT_M3>;
  clock-names = "xvclk";
  pinctrl-names = "default";
  pinctrl-0 = <&mipim0_camera3_clk>;
  power-domains = <&power RK3588_PD_VI>;
  pwdn-gpios = <&gpio1 RK_PB3 GPIO_ACTIVE_HIGH>;
  // reset-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
  // power-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
  avdd-supply = <&vcc_mipicsi0>;
  rockchip,camera-module-index = <0>;
  rockchip,camera-module-facing = "back";
  rockchip,camera-module-name = "default";
  rockchip,camera-module-lens-name = "default";
  port {
   imx577_out0: endpoint {
    remote-endpoint = <&mipi_in_ucam0>;
    data-lanes = <1 2 3 4>;
   };
  };
 };
};
 
&csi2_dphy0_hw {
 status = "okay";
};
 
&mipi2_csi2 {
 status = "okay";
 
 ports {
  #address-cells = <1>;
  #size-cells = <0>;
 
  port@0 {
   reg = <0>;
   #address-cells = <1>;
   #size-cells = <0>;
 
   mipi2_csi2_input: endpoint@1 {
    reg = <1>;
    remote-endpoint = <&csidphy0_out>;
    data-lanes = <1 2 3 4>;
   };
  };
 
  port@1 {
   reg = <1>;
   #address-cells = <1>;
   #size-cells = <0>;
 
   mipi2_csi2_output: endpoint@0 {
    reg = <0>;
    remote-endpoint = <&cif_mipi_in2>;
    data-lanes = <1 2 3 4>;
   };
  };
 };
};
&rkcif {
 status = "okay";
};
&rkcif_mipi_lvds2 {
 status = "okay";
 
 port {
  cif_mipi_in2: endpoint {
   remote-endpoint = <&mipi2_csi2_output>;
  };
 };
};
 
&rkcif_mipi_lvds2_sditf {
 status = "okay";
 
 port {
  mipi_lvds2_sditf: endpoint {
   remote-endpoint = <&isp0_vir0>;
  };
 };
};
 
&rkcif_mmu {
 status = "okay";
};
 
&rkisp0 {
 status = "okay";
 
};
 
&isp0_mmu {
 status = "okay";
};
 
&rkisp0_vir0 {
 status = "okay";
 // rockchip,hw = <&rkisp_unite>;
 
 port {
  #address-cells = <1>;
  #size-cells = <0>;
 
  isp0_vir0: endpoint@0 {
   reg = <0>;
   remote-endpoint = <&mipi_lvds2_sditf>;
  };
 };
};

Конфигурация dts - это в основном конфигурация конвейера. Вы можете обратиться к официальному описанию RK. Соответствующая конфигурация 7-канальной камеры следующая:

(5) Отладка драйвера:

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

①Пересадка драйвера датчика: см. введение выше, чтобы пересадить код драйвера;

② Настройте соответствующие dts в соответствии с используемым интерфейсом mipi. rk3588 поддерживает несколько камер, поэтому этот шаг должен быть правильным;

③ Подтвердите, успешна ли связь i2c. Только если связь i2c успешна, регистр датчика может быть правильно установлен;

④Инструмент Media-ctl проверяет, является ли топология нормальной.

⑤Используйте V4L2 для захвата изображений и настройки экспозиции, усиления и других параметров, чтобы они вступили в силу.

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose