ericN 3 September 12, 2022 Posted September 12, 2022 (edited) · Report post Доброго дня Бьюсь рыбой об лёд.... не могу камеру подключить. Аппаратно сделано так - видеодеродер 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 September 12, 2022 by ericN Quote Share this post Link to post Share on other sites More sharing options...
sasamy 1 September 13, 2022 Posted September 13, 2022 (edited) · Report post On 9/12/2022 at 3:23 PM, ericN said: как к tvp5150 прикрутить v4l2? как tvp5150 посадить на csi? как это всё прикрутить к ipu (если нужно)? ядро у вас майнстримное с kernel.org или из bsp NXP (linux-imx) ? там разные реализации драйверов и они конфигурируются по-разному. Edited September 13, 2022 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 13, 2022 Posted September 13, 2022 · Report post ядро вот от сюда 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 вызвать аттач/инит непосредственно камеры? Или камера должна после загрузки из командной строки приаттачена? Как это работает? Quote Share this post Link to post Share on other sites More sharing options...
sasamy 1 September 13, 2022 Posted September 13, 2022 (edited) · Report post On 9/13/2022 at 12:36 PM, ericN said: ядро вот от сюда http://source.codeaurora.org/external/imx/linux-imx.git это ядро 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 September 13, 2022 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 13, 2022 Posted September 13, 2022 · Report post В 13.09.2022 в 16:33, sasamy сказал: adv5150: [email protected] да тут назови хоть "подеба", хоть "беда", главное 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(...);? Quote Share this post Link to post Share on other sites More sharing options...
sasamy 1 September 13, 2022 Posted September 13, 2022 (edited) · Report post 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 September 13, 2022 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 14, 2022 Posted September 14, 2022 (edited) · Report post В 13.09.2022 в 16:33, sasamy сказал: У Compulab есть в патчах драйвер для ядра linux-imx 4.1.15 а есть не патчи, а пропатченое ядро? Edited September 14, 2022 by ericN Quote Share this post Link to post Share on other sites More sharing options...
sasamy 1 September 14, 2022 Posted September 14, 2022 (edited) · Report post 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 $ 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 | patch -p1 в конфиге ядра нужно отключить майнстримный драйвер и включить этот Edited September 14, 2022 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 14, 2022 Posted September 14, 2022 (edited) · Report post В 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 September 14, 2022 by ericN Quote Share this post Link to post Share on other sites More sharing options...
sasamy 1 September 14, 2022 Posted September 14, 2022 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 15, 2022 Posted September 15, 2022 · Report post Еееееееееееееее...... ЗАРАБОТАЛО!!!! СПАСИБО огромное!!! 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. буду дальше бороться... Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 16, 2022 Posted September 16, 2022 · Report post Цитата (<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 приложения такая ошибка. Есть какие нибудь мысли? Quote Share this post Link to post Share on other sites More sharing options...
sasamy 1 September 18, 2022 Posted September 18, 2022 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
ericN 3 September 28, 2022 Posted September 28, 2022 · Report post В 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. Quote Share this post Link to post Share on other sites More sharing options...
Niyaz 0 September 30, 2022 Posted September 30, 2022 · Report post Скажите, пожалуйста, какой сигнал декодируете? pal/ntsc? Я на tvp5151 получаю такую проблему: происходит сдвиг полукадров в случайный момент времени. У вас стабильное видео? Вот пример картинок Quote Share this post Link to post Share on other sites More sharing options...