Jump to content
    

Видеокамера + tvp5150

Доброго дня

Бьюсь рыбой об лёд.... не могу камеру подключить.

 

Аппаратно сделано так - видеодеродер tvp5150, к нему к подключены два аналоговые камеры. выход tvp5150 - шина CSI. Через csi0 tvp5150 подключен к imx6q. Управляется tvp5150 через i2c.

В исходниках ядра есть мануал по device tree.

Вроде все понятно.... собрал - не работает.... при попытки что-то получить с камеры - драйвер сообщает что нет камеры.

Стал разбираться с DT и драйвером - всё в кучу смешалось и запуталось.

гугл точного мануала не дает... есть обрывки инфы на разных форумах... на сколько я понял, ещё нужен ipu, v4l2, mux.....

 

чем больше читаю, тем больше не понятно.

 

в процессоре есть ic2 к которому подключен tvp5150. В DT отображаем это

 

 
&i2c2 {
	[email protected] {
		compatible = "ti,tvp5150";
		reg = <0x5c>;

		//pdn-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>; - этот пин апаратно не используется.
		reset-gpios = <&gpio6 7 GPIO_ACTIVE_LOW>;
		#address-cells = <1>;
		#size-cells = <0>;

}

 

пытаюсь собрать, получаю ошибку сборки, что tvp5150 должен иметь по крайней мере один вход и один выход. Хорошо... добавляю

 

comp_connector_0 {
	compatible = "composite-video-connector";
	label = "Composite0";
	sdtv-standards = <SDTV_STD_PAL_M>; /* limit to pal-m signals */

	port {
		composite0_to_tvp5150: endpoint {
			remote-endpoint = <&tvp5150_to_composite0>;
		};
	};
};

comp_connector_1 {
	compatible = "composite-video-connector";
	label = "Composite1";
	sdtv-standards = <SDTV_STD_NTSC_M>; /* limit to ntsc-m signals */

	port {
		composite1_to_tvp5150: endpoint {
			remote-endpoint = <&tvp5150_to_composite1>;
		};
	};
};

&i2c2 {
	[email protected] {
		compatible = "ti,tvp5150";
		reg = <0x5c>;
		reset-gpios = <&gpio6 7 GPIO_ACTIVE_LOW>;
		#address-cells = <1>;
		#size-cells = <0>;

		[email protected] {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <0>;

			tvp5150_to_composite0: [email protected] {
				reg = <0>;
				remote-endpoint = <&composite0_to_tvp5150>;
			};

		};

		[email protected] {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <1>;

			tvp5150_to_composite1: [email protected] {
				reg = <0>;
                                remote-endpoint = <&composite1_to_tvp5150>;
			};

		};

		[email protected] {
			reg = <2>;

			tvp5150_1: endpoint {
				remote-endpoint = <&ccdc_ep>;
			};
		};
	};
};

Ошибка сборки, ccdc_ep - неизвестная ссылка.

 

как к tvp5150 прикрутить v4l2? как tvp5150 посадить на csi? как это всё прикрутить к ipu (если нужно)? Как осуществляется выбор камеры? Программно через драйвер или в DT нужно mux заводить?

 

 

 

 

Edited by ericN

Share this post


Link to post
Share on other sites

On 9/12/2022 at 3:23 PM, ericN said:

как к tvp5150 прикрутить v4l2? как tvp5150 посадить на csi? как это всё прикрутить к ipu (если нужно)?

ядро у вас майнстримное с kernel.org или из bsp NXP (linux-imx) ? там разные реализации драйверов и они конфигурируются по-разному.

Edited by sasamy

Share this post


Link to post
Share on other sites

ядро вот от сюда http://source.codeaurora.org/external/imx/linux-imx.git

версия if-5.10.y-1.0.0

Это buildroot такое ядро подтягивает при конфиге для imx6q-sabresd

При запуске Qml приложения получаю мессадж

Цитата

(gst-plugin-scanner:174): GLib-GObject-CRITICAL **: 00:11:06.084: Object class GstImxV4l2VideoSrc doesn't implement property 'exposure-mode' from interface 'GstPhotography'

[  542.998732] ERROR: in mxc_v4l_open()  v4l2 capture: slave not found!

qml: CAMERA ERR: 3 The camera service is missing

 

навтыкал printk в драйвер drivers/media/video/mxc/capture/mxc_v4l2_capture.c

запускаю qml и вижу...

Цитата

[ 542.702246] In MVC: mxc_v4l_open
[  542.706994]    device name is Mxc Camera
[  542.710919] adr of cam 0x826e8000
[  542.714292] ERROR: in mxc_v4l_open()  v4l2 capture: slave not found!
[  542.720662] cam->sensor == NULL!
[  542.723915] all_sensors[0] = 0x0
[  542.727152] all_sensors[1] = 0x0
[  542.730382] self = 0x826d0800
[  542.733371] cam_sensor = 0x0

При попытке открыть камеру проверяется указатель cam->sensor и если там 0, то slave not found!

cam инитится при загрузке в функции

  static int init_camera_struct(cam_data *cam, struct platform_device *pdev)

по выходу из неё  cam->sensor равен 0 и cam->sensors[*] равены 0.

 

Может нужно из кода qt/qml вызвать аттач/инит непосредственно камеры? Или камера должна после загрузки из командной строки приаттачена? Как это работает?

 

 

 

 

Share this post


Link to post
Share on other sites

On 9/13/2022 at 12:36 PM, ericN said:

это ядро NXP, драйвер  tvp5150 от майнстримного ядра не подойдёт. У Compulab есть в патчах драйвер для ядра linux-imx 4.1.15

https://github.com/compulab-yokneam/meta-compulab/tree/devel/recipes-kernel/linux/linux-compulab-4.1.15

https://github.com/compulab-yokneam/meta-compulab/blob/devel/recipes-kernel/linux/linux-compulab-4.1.15/0060-ARM-i.MX6-tvp5150-add-tvp5150-video-decoder-support.patch

в DTS он прописывается по-другому, вот их пример

https://github.com/compulab-yokneam/meta-compulab/blob/devel/recipes-kernel/linux/linux-compulab-4.1.15/cm-fx6-evk/0001-ARM-dts-update-support-for-cm-fx6.patch#L1138

 

это там по ошибке так обознчено

adv5150: [email protected]

видимо правили примпер NXP с adv7180, но это просто метка - роли не играет

Edited by sasamy

Share this post


Link to post
Share on other sites

В 13.09.2022 в 16:33, sasamy сказал:

да тут назови хоть "подеба", хоть "беда", главное compatible = "ti,tvp5150"; - это я увидел....

а вот дальше не понятно....

по патчу на ядро 4.1 я понял что там ни чего не исправляется, а добавляется драйвер tvp5150.

У меня ядро 5.10 от nxp, там вроде есть этот драйвер.... мне бы понять как это всё работает/собирается....

 

вот допустим DTS.... есть такой таг
 

&i2c3 {
    clock-frequency = <100000>;
    pinctrl-names = "default", "gpio";
    pinctrl-0 = <&pinctrl_i2c3>;
    pinctrl-1 = <&pinctrl_i2c3_gpio>;
    scl-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
    sda-gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
    status = "okay";

}

тут всё понятно... &i2c3 - это i2c3, частота 100 кГц, пины.... статус ОК. pinctrl-1 = <&pinctrl_i2c3_gpio>; - ссылается на группу пинов <&pinctrl_i2c3_gpio>. Есть в DTS группа пинов в отдельном таге - тут всё понятно.

        pinctrl_i2c3_gpio: i2c3_gpio_grp {
            fsl,pins = <
                MX6QDL_PAD_GPIO_3__GPIO1_IO03        0x1b8b0
                MX6QDL_PAD_GPIO_6__GPIO1_IO06        0x1b0b0
            >;
        };

таким образом i2c3 привязывается к пинам и у пинов GPIO1_IO03 и GPIO1_IO0 настраивается альтернативная функция i2c

далее... в таге <&i2c3> есть таг например тачпад gt928


 

&i2c3 {
    clock-frequency = <100000>;
    pinctrl-names = "default", "gpio";
    pinctrl-0 = <&pinctrl_i2c3>;
    pinctrl-1 = <&pinctrl_i2c3_gpio>;
    scl-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
    sda-gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
    status = "okay";

        gt928:[email protected] {
        compatible = "goodix,gt928";
        reg = <0x14>;
        pinctrl-names = "default";
        interrupt-parent = <&gpio4>;
        interrupts = <14 2>;
        pinctrl-0 = <&pinctrl_i2c3_gt928_int>;
        goodix,rst-gpio = <&gpio7 12 0>;
        goodix,irq-gpio = <&gpio4 14 0>;
        status = "okay";
    };

};

Тут таг gt928 - это на шине и2ц3 находится микросхема тачпада gt928, драйвер для неё "goodix,gt928";, адрес на шине 0х14 и т.д. - картина маслом.

добавляю на i2c кодер tvp5150 согластно мануалу
 

&i2c3 {
   
    [email protected] {
        compatible = "ti,tvp5150";
        reg = <0x5c>;
        //pdn-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
        reset-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;        //CSI0_RST
        //#address-cells = <1>;
        //#size-cells = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ipu1_2>;
        
        clocks = <&clks IMX6QDL_CLK_CKO>;
        clock-names = "csi_mclk";
        mclk = <27000000>;
        mclk_source = <0>;
        csi_id = <0>;

        [email protected] {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <0>;
            channels = <0>;

            tvp5150_to_composite0: [email protected] {
                reg = <0>;
                remote-endpoint = <&composite0_to_tvp5150>;
            };
        };

        [email protected] {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <1>;
            channels = <0>;

            tvp5150_to_composite1: [email protected] {
                reg = <0>;
                remote-endpoint = <&composite1_to_tvp5150>;
            };
        };

        [email protected] {
            reg = <2>;

            tvp5150_1: endpoint {
                remote-endpoint = <&ipu1_csi0_from_ipu1_csi0_mux>;
            };
        };
    };
};

 

вот тут вопросы. такое дерево собралось. Появилось /dev/video0. При запуске на таргете появился /dev/video0, но камера не работает.

как происходит связка между tvp5150, v4l2, csi0, ipu? Каким местом тут mxc_v4l2_capture.с? Каким местом тут v4l2-int-device.c? У tvp5150 два аналоговых входа для камеры. Как происходит переключение между камерами? Понятно, что надо по i2c в tvp5150 записать в соответствующий регистр нужное значение. Но это же происходит всё на уровне драйвера. Как это работает? Нужно произвести манипуляцию с /dev/video0? или при обращении к %_имя_чего_то_% драйвер сам по и2с переключит вход? Как это всё работает?

Я могу посмотреть исходник tvp5150.с... но там например переключение камеры происходит в функции

static void tvp5150_selmux(struct v4l2_subdev *sd);

Эта функция вызывается в функции

static int tvp5150_s_ctrl(struct v4l2_ctrl *ctrl);

Эта функция в структуре

static const struct v4l2_ctrl_ops tvp5150_ctrl_ops = {
    .s_ctrl = tvp5150_s_ctrl,
};

эта структура используется в static int tvp5150_probe(struct i2c_client *c)


 

static int tvp5150_probe(struct i2c_client *c)

{

...

v4l2_ctrl_handler_init(&core->hdl, 5);
    v4l2_ctrl_new_std(&core->hdl, &tvp5150_ctrl_ops,
            V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
    v4l2_ctrl_new_std(&core->hdl, &tvp5150_ctrl_ops,
            V4L2_CID_CONTRAST, 0, 255, 1, 128);
    v4l2_ctrl_new_std(&core->hdl, &tvp5150_ctrl_ops,
            V4L2_CID_SATURATION, 0, 255, 1, 128);
    v4l2_ctrl_new_std(&core->hdl, &tvp5150_ctrl_ops,
            V4L2_CID_HUE, -128, 127, 1, 0);
    v4l2_ctrl_new_std(&core->hdl, &tvp5150_ctrl_ops,
            V4L2_CID_PIXEL_RATE, 27000000,
            27000000, 1, 27000000);

...

}

всё.... что дальше? как-то ядро через указатель на структуру указателей структур указателей на указатели структур из тьмы тараканьей вызывает этот tvp5150_ctrl_ops(). Вот хотелось бы понять как это всё работает? Жаль нет полноценного дебага, а только printk().

 

Может DTS у меня правильный и драйвер ровный, надо всего лишь вызвать какойнить ifconfig eth0 192.168.1.10 "camera start 0" и всё заработает? или из си-кода в пользовательском приложении вызвать  tvp5150_init(...);?

 

 

 

Share this post


Link to post
Share on other sites

On 9/13/2022 at 3:24 PM, ericN said:

У меня ядро 5.10 от nxp, там вроде есть этот драйвер

там есть драйвер майнстримного ядра, у него другой API, с драйвером NXP

 

On 9/13/2022 at 12:36 PM, ericN said:

навтыкал printk в драйвер drivers/media/video/mxc/capture/mxc_v4l2_capture.c

он работать не будет в принципе, даже если пояаляется /dev/video0

Edited by sasamy

Share this post


Link to post
Share on other sites

В 13.09.2022 в 16:33, sasamy сказал:

У Compulab есть в патчах драйвер для ядра linux-imx 4.1.15

а есть не патчи, а пропатченое ядро?

Edited by ericN

Share this post


Link to post
Share on other sites

On 9/14/2022 at 6:25 AM, ericN said:

а есть не патчи, а пропатченое ядро?

у меня - нет, патч с драйвером должен подойти для 5.10 без изменений - в ядре NXP используется старый API времён ядра 2.6

 

On 9/13/2022 at 3:24 PM, ericN said:

Каким местом тут v4l2-int-device.c?

таким местом  они его портируют на новые ядра. Если не знаете как пачить своё ядро
 

Quote

 

в конфиге ядра нужно отключить майнстримный драйвер и включить этот

Edited by sasamy

Share this post


Link to post
Share on other sites

В 14.09.2022 в 13:03, sasamy сказал:
cd путь_к_исходникам/linux_imx

wget -O- https://github.com/compulab-yokneam/meta-compulab/raw/devel/recipes-kernel/linux/linux-compulab-4.1.15/0060-ARM-i.MX6-tvp5150-add-tvp5150-video-decoder-support.patch

не взлетело. патч не меняет исходники. выхлоп команды в аттаче

log.txt

Edited by ericN

Share this post


Link to post
Share on other sites

On 9/14/2022 at 11:40 AM, ericN said:

не взлетело. патч не меняет исходники

при копипасте обрезало конец строки

$ wget -O- https://github.com/compulab-yokneam/meta-compulab/raw/devel/recipes-kernel/linux/linux-compulab-4.1.15/0060-ARM-i.MX6-tvp5150-add-tvp5150-video-decoder-support.patch | patch -p1

Share this post


Link to post
Share on other sites

Еееееееееееееее...... ЗАРАБОТАЛО!!!! СПАСИБО огромное!!!

dmesg

Цитата

[    2.287088] i2c /dev entries driver
[    2.331654]    Video device registered: Mxc Camera #0
[    2.393570] tvp5150 2-005c: chip found at address 0x5c (21a8000.i2c)
[    2.453561] tvp5150 2-005c: tvp5150am1 detected.
[    2.553591] End of mxc_v4l2_master_attach: v2f pix widthxheight 288 x 352
[    2.560386] End of mxc_v4l2_master_attach: crop_bounds widthxheight 720 x 525
[    2.567546] End of mxc_v4l2_master_attach: crop_defrect widthxheight 720 x 525
[    2.574786] End of mxc_v4l2_master_attach: crop_current widthxheight 720 x 525

Но при запуске qt/qml что-то опять не едет....

Цитата

CameraBin error: "Missing element 'encodebin' - check your GStreamer installation."
qml: CAMERA ERR: 1 Missing element 'encodebin' - check your GStreamer installation.
CameraBin error: "Missing element 'encodebin' - check your GStreamer installation."

Я GStreamer ставил из buildroot-а. В нем нет компонента encodebin. буду дальше бороться...

 

Share this post


Link to post
Share on other sites

Цитата

(<unknown>:185): GLib-GObject-CRITICAL **: 02:13:51.285: Object class GstImxV4l2VideoSrc doesn't implement property 'exposure-mode' from interface 'GstPhotography'
Segmentation fault

последнюю очередную ошибку не получается побороть. При запуске qt/qml приложения такая ошибка. Есть какие нибудь мысли?

Share this post


Link to post
Share on other sites

On 9/16/2022 at 6:28 AM, ericN said:

(<unknown>:185): GLib-GObject-CRITICAL **: 02:13:51.285: Object class GstImxV4l2VideoSrc doesn't implement property 'exposure-mode' from interface 'GstPhotography'

у меня работает с таким же сообщением в логе, попробуйте такой простой пример, tvin.qml

import QtQuick 2.0
import QtMultimedia 5.4

Item {
    MediaPlayer {
        id: player
        source: "imxv4l2:///dev/video0"
        autoPlay: true
    }

    VideoOutput {
        source: player
        fillMode: VideoOutput.Stretch
        anchors.fill: parent
    }
}

запуcкать

Quote

$ qmlscene tvin.qml

у меня немого патченый плагин imxv4l2videosrc, не уверен что патч решит вашу проблему, на всякий случай прикреплю его

0001-use-UYVY-for-tvin-sk.patch

Share this post


Link to post
Share on other sites

В 18.09.2022 в 11:45, sasamy сказал:

попробуйте такой простой пример

та же ошибка

В 18.09.2022 в 11:45, sasamy сказал:

у меня немого патченый плагин imxv4l2videosrc

что за плагин? В ядре или в rootfs? Я делаю сборку с помощью buildroot. В пакетах buildroot есть пакет gstreamer1-1.18.5, патч исправляет пакет gstreamer-imx-0.13.0.

Share this post


Link to post
Share on other sites

Скажите, пожалуйста, какой сигнал декодируете? pal/ntsc?

Я на tvp5151 получаю такую проблему: происходит сдвиг полукадров в случайный момент времени. 

У вас стабильное видео?

Вот пример картинок

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...