Перейти к содержанию
    

Доброго дня

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

 

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

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

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

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

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

 

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

 

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

 

 
&i2c2 {
	tvp5150@5c {
		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 {
	tvp5150@5c {
		compatible = "ti,tvp5150";
		reg = <0x5c>;
		reset-gpios = <&gpio6 7 GPIO_ACTIVE_LOW>;
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <0>;

			tvp5150_to_composite0: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&composite0_to_tvp5150>;
			};

		};

		port@1 {
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <1>;

			tvp5150_to_composite1: endpoint@0 {
				reg = <0>;
                                remote-endpoint = <&composite1_to_tvp5150>;
			};

		};

		port@2 {
			reg = <2>;

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

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

 

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

 

 

 

 

Изменено пользователем ericN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ядро вот от сюда 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 вызвать аттач/инит непосредственно камеры? Или камера должна после загрузки из командной строки приаттачена? Как это работает?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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: adv5150@5c

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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

adv5150: adv5150@5c

да тут назови хоть "подеба", хоть "беда", главное 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:gt928_ts@14 {
        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 {
   
    tvp5150@5c {
        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>;

        port@0 {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <0>;
            channels = <0>;

            tvp5150_to_composite0: endpoint@0 {
                reg = <0>;
                remote-endpoint = <&composite0_to_tvp5150>;
            };
        };

        port@1 {
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <1>;
            channels = <0>;

            tvp5150_to_composite1: endpoint@0 {
                reg = <0>;
                remote-endpoint = <&composite1_to_tvp5150>;
            };
        };

        port@2 {
            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(...);?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем ericN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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

Изменено пользователем ericN

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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. буду дальше бороться...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

(<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 приложения такая ошибка. Есть какие нибудь мысли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...