①Идентификатор чипа датчика можно правильно прочитать через i2c, что означает, что i2c может нормально взаимодействовать;
② Используйте инструмент media-ctl, чтобы просмотреть конвейер, а также конкретное разрешение и формат датчика;
③ Если при использовании инструмента V4L2 для захвата изображений нет ошибок, происходит нормальный вывод данных, а команды V4L2 можно использовать для управления усилением экспозиции и т. д., можно считать, что с драйвером проблем нет;
④В режиме SOC конфигурации xml вы можете использовать apk для предварительного просмотра изображения (изображение может быть темнее и зеленее, о том, как настроить xml, мы поговорим позже). На этом этапе можно считать, что с HAL проблем нет;
⑤ Перенесите файлы эффектов других датчиков самостоятельно, и вы сможете создавать изображения (эффекты изображения могут быть ненормальными, о том, как первоначально изменить файлы эффектов, мы поговорим позже. На этом этапе вы можете начать отладку эффекта). Если вам нужно найти РК для отладки эффекта, этот шаг также необходимо выполнить.
Это настроено для cameraHAL, чтобы подтвердить тип датчика.
SENSOR_TYPE_RAW: обычно это датчик RAWRGB, который требует включения эффектов 3A для нормального создания изображений и требует правильного пути к файлу эффекта, прежде чем его можно будет использовать;
SENSOR_TYPE_SOC: Обычно он выводит датчики, такие как YUV или RGB888/RGB565. Он не требует запуска эффектов 3A. Обычно он используется для датчиков, которые поставляются с собственным ISP, и может использоваться без необходимости использования файлов эффектов;
Если во время общей отладки датчика RAW вы уже можете захватывать изображения с помощью V4L2, вы можете сначала настроить датчик на режим SENSOR_TYPE_SOC, чтобы подтвердить, можно ли захватывать изображения без запуска 3A.
Драйвер датчика находится в папке driver/media/i2c. Драйвер датчика не зависит от драйверов контроллера RKCIF и RKISP. Они регистрируются асинхронно и подключаются к конвейеру через платформы v4l2 и media-framework. Здесь мы в основном представляем код драйвера датчика, конфигурацию dts и т. д. Драйвер датчика в основном разделен на несколько частей:
Определите различные режимы инициализации в support_modes, в основном настраивая разрешение, формат изображения, частоту кадров, список инициализации регистров и т. д. Список инициализации регистров можно заполнить напрямую, как это предусмотрено производителем. hts_def и vts_def могут напрямую заполнять значения согласно списку инициализации регистра. Для exp_def можно проверить, имеет ли даташит значение по умолчанию, или вообще заполнить его чуть меньшим, чем vts.
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. Аналогично, время выключения также должно быть. реализовано согласно описанию в даташите.
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 — это ядро управления драйвером датчика платформы. Вот некоторые важные функции обратного вызова:
Как правило, необработанным датчикам необходимо контролировать экспозицию, усиление, vblank и т. д., поэтому им необходимо реализовать соответствующие интерфейсные функции.
imx577_initialize_controls объявляет, какие элементы управления требуются драйверу, и устанавливает диапазон регулировки и другую информацию.
Интерфейс imx577_set_ctrl реализует управление экспозицией, усилением и vblank.
Среди функций регистрации драйверов, помимо разбора dts, получения тактовой мощности и т. д., наиболее важными являются регистрация медиа-объекта и V4L2 subdev. Ключевые моменты заключаются в следующем:
&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-канальной камеры следующая:
Основные ключевые моменты отладки драйвера датчика следующие:
①Пересадка драйвера датчика: см. введение выше, чтобы пересадить код драйвера;
② Настройте соответствующие dts в соответствии с используемым интерфейсом mipi. rk3588 поддерживает несколько камер, поэтому этот шаг должен быть правильным;
③ Подтвердите, успешна ли связь i2c. Только если связь i2c успешна, регистр датчика может быть правильно установлен;
④Инструмент Media-ctl проверяет, является ли топология нормальной.
⑤Используйте V4L2 для захвата изображений и настройки экспозиции, усиления и других параметров, чтобы они вступили в силу.
Ссылка: http://t.csdnimg.cn/nsp0h.