В предыдущей статье было рассказано, как подсветить сенсор на RK3588 на примере камеры MIPI IMX577. Из предыдущей статьи мы также знаем, что RK3588 поддерживает до 6 камер MIPI и один DVP, поэтому данная статья является дополнением. ключевые точки конфигурации камеры MIPI и камеры DVP соответственно.
Общие камеры классифицируются по различным интерфейсам: USB-камера, камера MIPI и камера DVP.
Общие форматы данных USB-камеры: YUYV/MJPEG/H.264 YUYV: данные YUV передаются, объем данных большой, разрешение и частота кадров низкие, данные обычно повторно обрабатываются серверной частью для некоторых специальных приложений. (радужка глаза, инфракрасное распознавание лиц и т. д.). MJPEG: обычно используется для USB-камер с относительно низким разрешением (720P, VGA) и передачей больших объемов данных. H.264: обычно используется для USB-камер с более высоким разрешением (1080p, 720p), при этом передаваемые данные меньше.
MIPI — это низковольтный дифференциальный сигнал с высокой скоростью передачи и сильной защитой от помех. Обычно он поддерживает камеры с разрешением 8 миллионов пикселей и выше. В настоящее время основные модули камер мобильных телефонов используют передачу MIPI, которая использует 4 пары дифференциальных сигналов данных и 1 пару дифференциальных тактовых сигналов.
Камера DVP также называется параллельной камерой. Интерфейс показан на рисунке ниже. Обычно он поддерживает передачу данных BT601/BT656/BT1120. DVP — это передача через параллельный порт с относительно низкой скоростью и низкой пропускной способностью. Обычно он используется для камер с числом пикселей менее 5 миллионов. Необходимо использовать тактовый сигнал PCLK, полевую синхронизацию VSYNC, горизонтальную синхронизацию HSYNC и данные параллельного порта D[0:11], которые могут иметь размер битов данных 8/10/12/16 бит.
Блок-схема подключения показана ниже. Ниже приводится краткое описание ключевых моментов конфигурации камеры RK3588.
Согласно приведенной выше структурной схеме мы можем примерно увидеть, как связаны MIPI и DVP соответственно. Ключевые моменты следующие:
RK3588 может использовать до четырех 2-полосных и двух 4-полосных камер с интерфейсом MIPI. Основные конфигурации следует отметить следующим образом:
Конфигурация интерфейса драйвера:
Драйвер в основном уделяет внимание настройке интерфейса g_mbus_config. Этот интерфейс необходимо настроить для использования интерфейса DVP или интерфейса MIPI, а также того, является ли он MIPI DPHY или MIPI. CPHY, например, IMX577 настроен как V4L2_MBUS_CSI2_DPHY, во-вторых, если это интерфейс MIPI, для интерфейса также необходимо настроить количество полос, а IMX577 настроить как 4-полосное, необходимо настроить количество виртуальных каналов; например IMX577, один канал настроен в линейном режиме, а два — в режиме HDR, если это многоканальный вк.
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, который поддерживает 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, в противном случае это приведет к невозможности получения данных;
Конфигурация интерфейса драйвера следующая:
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 выглядит следующим образом:
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 выглядит следующим образом:
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 выглядит следующим образом:
&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.