Hi,
I am using this camera from ST, along with their driver and overlay for the RPi5: https://www.st.com/en/imaging-and-photo ... d66gy.html
When I try to use it with the Raspberry Pi OS, I have no issues getting the camera detected on I2C and dmesg gives out positive logs (except for the second camera, which I do not have connected):Same hardware, just the SD card switched, this is what I get on my custom build:Adding i2c_designware does not make a difference, I have tried it before without it.
If I do i2cdetect -y 6 or i2cdetect -y 4, I do not get any address recognized.I tried plugging in a sensor on I2C-1, and I get its address correctly after I perform i2cdetect:I am doing the process manually on my build, for now:
This is my overlay:
This is the part of the driver where it fails (looks like it's the first time i2c is used):
Does someone have a clue on what I can try?
I am using this camera from ST, along with their driver and overlay for the RPi5: https://www.st.com/en/imaging-and-photo ... d66gy.html
When I try to use it with the Raspberry Pi OS, I have no issues getting the camera detected on I2C and dmesg gives out positive logs (except for the second camera, which I do not have connected):
Code:
[ 90.841191] vd56g3 11-0010: Sensor reset failed -121[ 90.841207] vd56g3 11-0010: error -EREMOTEIO: Sensor power on failed.[ 90.841400] vd56g3: probe of 11-0010 failed with error -121[ 90.855888] rp1-cfe 1f00110000.csi: Using sensor vd56g3 10-0010 for capture[ 90.855984] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-csi2_ch0] node id 0 successfully as /dev/video0[ 90.856021] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-embedded] node id 1 successfully as /dev/video1[ 90.856055] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-csi2_ch2] node id 2 successfully as /dev/video2[ 90.856087] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-csi2_ch3] node id 3 successfully as /dev/video3[ 90.856120] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-fe_image0] node id 4 successfully as /dev/video4[ 90.856156] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-fe_image1] node id 5 successfully as /dev/video5[ 90.856189] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-fe_stats] node id 6 successfully as /dev/video6[ 90.856216] rp1-cfe 1f00110000.csi: Registered [rp1-cfe-fe_config] node id 7 successfully as /dev/video7[ 90.856304] vd56g3 10-0010: Successfully probe vd66gy sensor
Code:
[ 112.207052] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/i2c@88000/#address-cells[ 112.219046] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/i2c@88000/#size-cells[ 112.230768] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/i2c@88000/status[ 112.242051] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/csi@110000/status[ 112.253410] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/csi@110000/brcm,media-controller[ 112.266101] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /cam0_reg/status[ 112.275540] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__overrides__/cam0-pwdn-ctrl[ 112.286111] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__overrides__/cam0-pwdn[ 112.296246] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__overrides__/cam1-pwdn-ctrl[ 112.306816] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__overrides__/cam1-pwdn[ 112.316950] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /__overrides__/media-controller[ 112.327696] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/i2c@80000/#address-cells[ 112.339664] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/i2c@80000/#size-cells[ 112.351373] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/i2c@80000/status[ 112.362654] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/csi@128000/status[ 112.374015] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /axi/pcie@120000/rp1/csi@128000/brcm,media-controller[ 112.386685] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /cam1_reg/status[ 112.403436] i2c_designware 1f00088000.i2c: clock-frequency: 100000[ 112.403444] i2c_designware 1f00088000.i2c: i2c-scl-rising-time-ns: 65[ 112.403447] i2c_designware 1f00088000.i2c: i2c-scl-falling-time-ns: 100[ 112.403449] i2c_designware 1f00088000.i2c: i2c-scl-internal-delay-ns: 0[ 112.403453] i2c_designware 1f00088000.i2c: i2c-sda-falling-time-ns: 0[ 112.403455] i2c_designware 1f00088000.i2c: i2c-sda-hold-time-ns: 0[ 112.403457] i2c_designware 1f00088000.i2c: i2c-digital-filter-width-ns: 0[ 112.403460] i2c_designware 1f00088000.i2c: i2c-analog-filter-cutoff-frequency: 0[ 112.403499] i2c_designware 1f00088000.i2c: Standard Mode HCNT:LCNT = 781:1186[ 112.403503] i2c_designware 1f00088000.i2c: Fast Mode HCNT:LCNT = 781:1186[ 112.403507] i2c_designware 1f00088000.i2c: SDA Hold Time TX:RX = 593:1[ 112.403510] i2c_designware 1f00088000.i2c: Bus speed: Standard Mode (100 kHz)[ 112.403648] i2c_dev: adapter [Synopsys DesignWare I2C adapter] registered as minor 6[ 112.403665] i2c i2c-6: adapter [Synopsys DesignWare I2C adapter] registered[ 112.403671] i2c i2c-6: of_i2c: walking child nodes[ 112.403674] i2c i2c-6: of_i2c: register /axi/pcie@120000/rp1/i2c@88000/fox@10[ 112.403801] i2c i2c-6: client [vd66gy] registered with bus id 6-0010[ 112.404085] platform 1f00110000.csi: bcm2712_iommu_probe_device: MMU 1000005280.iommu[ 112.411988] platform 1f00110000.csi: bcm2712_iommu_device_group: MMU 1000005280.iommu[ 112.419873] platform 1f00110000.csi: Adding to iommu group 2[ 112.425560] platform 1f00110000.csi: bcm2712_iommu_attach_dev: MMU 1000005280.iommu[ 112.433923] i2c_designware 1f00080000.i2c: clock-frequency: 100000[ 112.433928] i2c_designware 1f00080000.i2c: i2c-scl-rising-time-ns: 65[ 112.433931] i2c_designware 1f00080000.i2c: i2c-scl-falling-time-ns: 100[ 112.433934] i2c_designware 1f00080000.i2c: i2c-scl-internal-delay-ns: 0[ 112.433936] i2c_designware 1f00080000.i2c: i2c-sda-falling-time-ns: 0[ 112.433938] i2c_designware 1f00080000.i2c: i2c-sda-hold-time-ns: 0[ 112.433941] i2c_designware 1f00080000.i2c: i2c-digital-filter-width-ns: 0[ 112.433943] i2c_designware 1f00080000.i2c: i2c-analog-filter-cutoff-frequency: 0[ 112.433966] i2c_designware 1f00080000.i2c: Standard Mode HCNT:LCNT = 781:1186[ 112.433968] i2c_designware 1f00080000.i2c: Fast Mode HCNT:LCNT = 781:1186[ 112.433972] i2c_designware 1f00080000.i2c: SDA Hold Time TX:RX = 593:1[ 112.433974] i2c_designware 1f00080000.i2c: Bus speed: Standard Mode (100 kHz)[ 112.434070] i2c_dev: adapter [Synopsys DesignWare I2C adapter] registered as minor 4[ 112.434086] i2c i2c-4: adapter [Synopsys DesignWare I2C adapter] registered[ 112.434091] i2c i2c-4: of_i2c: walking child nodes[ 112.434094] i2c i2c-4: of_i2c: register /axi/pcie@120000/rp1/i2c@80000/fox@10[ 112.434188] i2c i2c-4: client [vd66gy] registered with bus id 4-0010[ 112.434436] platform 1f00128000.csi: bcm2712_iommu_probe_device: MMU 1000005280.iommu[ 112.442367] platform 1f00128000.csi: bcm2712_iommu_device_group: MMU 1000005280.iommu[ 112.450247] platform 1f00128000.csi: Adding to iommu group 2[ 112.455931] platform 1f00128000.csi: bcm2712_iommu_attach_dev: MMU 1000005280.iommu[ 112.470473] rp1-cfe 1f00110000.csi: bcm2712_iommu_of_xlate: MMU 1000005280.iommu[ 112.478291] rp1-cfe 1f00110000.csi: DW dphy Host HW v1.20[ 112.483735] rp1-cfe 1f00110000.csi: PiSP FE HW v0.1[ 112.488711] rp1-cfe 1f00110000.csi: found subdevice /axi/pcie@120000/rp1/i2c@88000/fox@10[ 112.497044] rp1-cfe 1f00128000.csi: bcm2712_iommu_of_xlate: MMU 1000005280.iommu[ 112.504797] rp1-cfe 1f00128000.csi: DW dphy Host HW v1.20[ 112.510229] rp1-cfe 1f00128000.csi: PiSP FE HW v0.1[ 112.515171] rp1-cfe 1f00128000.csi: found subdevice /axi/pcie@120000/rp1/i2c@80000/fox@10[ 134.908678] vd56g3: loading out-of-tree module taints kernel.[ 134.914959] vd56g3 6-0010: probe[ 134.919164] i2c_designware 1f00088000.i2c: i2c_dw_xfer: msgs: 2[ 134.919193] i2c_designware 1f00088000.i2c: enabled=0x1 stat=0x10[ 134.919613] i2c_designware 1f00088000.i2c: enabled=0x1 stat=0x550[ 134.919624] i2c_designware 1f00088000.i2c: i2c_dw_handle_tx_abort: slave address not acknowledged (7bit mode)[ 134.919629] vd56g3 6-0010: Sensor reset failed -121[ 134.924550] vd56g3 6-0010: error -EREMOTEIO: Sensor power on failed.[ 134.931035] vd56g3: probe of 6-0010 failed with error -121[ 134.936631] vd56g3 4-0010: probe[ 134.940453] i2c_designware 1f00080000.i2c: i2c_dw_xfer: msgs: 2[ 134.940475] i2c_designware 1f00080000.i2c: enabled=0x1 stat=0x10[ 134.940897] i2c_designware 1f00080000.i2c: enabled=0x1 stat=0x550[ 134.940907] i2c_designware 1f00080000.i2c: i2c_dw_handle_tx_abort: slave address not acknowledged (7bit mode)[ 134.940912] vd56g3 4-0010: Sensor reset failed -121[ 134.945814] vd56g3 4-0010: error -EREMOTEIO: Sensor power on failed.[ 134.952314] vd56g3: probe of 4-0010 failed with error -121[ 134.957854] i2c-core: driver [vd56g3] registered
If I do i2cdetect -y 6 or i2cdetect -y 4, I do not get any address recognized.
Code:
# i2cdetect -y 4 0 1 2 3 4 5 6 7 8 9 a b c d e f00: -- -- -- -- -- -- -- --10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --70: -- -- -- -- -- -- -- --# i2cdetect -y 6 0 1 2 3 4 5 6 7 8 9 a b c d e f00: -- -- -- -- -- -- -- --10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --70: -- -- -- -- -- -- -- --
Code:
# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f00: -- -- -- -- -- -- -- --10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- --70: -- -- -- -- -- -- -- --
Code:
mount -t configfs none /sys/kernel/configmkdir -p /sys/kernel/config/device-tree/overlays/pcb4188_vd66gy_camcat pcb4188_vd66gy_cam.dtbo > /sys/kernel/config/device-tree/overlays/pcb4188_vd66gy_cam/dtbomodprobe i2c-bcm2835modprobe i2c-devmodprobe videodevmodprobe v4l2-asyncmodprobe v4l2-fwnodemodprobe regmap-i2cinsmod vd56g3.ko
Code:
// SPDX-License-Identifier: GPL-2.0-only/dts-v1/;/plugin/;/{compatible = "brcm,bcm2835";fragment@0 {target-path="/";__overlay__ {camera_clk_12M: camera_clk_12M {#clock-cells = <0>;compatible = "fixed-clock";clock-frequency = <12000000>;};v1v2: v1v2 {compatible = "regulator-fixed";regulator-name = "fixed-supply-1v2";regulator-min-microvolt = <1200000>;regulator-max-microvolt = <1200000>;};v1v8: v1v8 {compatible = "regulator-fixed";regulator-name = "fixed-supply-1v8";regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;};v2v8: v2v8 {compatible = "regulator-fixed";regulator-name = "fixed-supply-2v8";regulator-min-microvolt = <2800000>;regulator-max-microvolt = <2800000>;};};};fragment@1 {target = <&i2c_csi_dsi0>;__overlay__ {#address-cells = <1>;#size-cells = <0>;status = "okay";fox_0: fox@10 {status = "ok";compatible = "st,vd66gy";reg = <0x10>;clocks = <&camera_clk_12M>;clock-names = "xclk";vcore-supply = <&v1v2>;vddio-supply = <&v1v8>;vana-supply = <&v2v8>;reset-gpios = <&gpio 5 1>;port {fox_ep_0: endpoint {clock-lanes = <0>;data-lanes = <1 2>;remote-endpoint = <&csi_ep_0>;clock-noncontinuous;link-frequencies =/bits/ 64 <402000000>;lane-polarities = <1 1 1>;};};};};};fragment@2 {target = <&csi0>;csi_0: __overlay__ {status = "okay";brcm,media-controller;port {csi_ep_0: endpoint {remote-endpoint = <&fox_ep_0>;clock-lanes = <0>;data-lanes = <1 2>;clock-noncontinuous;};};};};fragment@3 {target = <&cam0_reg>;__overlay__ {status = "disable";};};fragment@4 { target-path = "/__overrides__"; __overlay__ { cam0-pwdn-ctrl = <&fox_0>, "reset-gpios:0"; cam0-pwdn = <&fox_0>, "reset-gpios:4"; cam1-pwdn-ctrl = <&fox_1>, "reset-gpios:0"; cam1-pwdn = <&fox_1>, "reset-gpios:4"; media-controller = <&csi0>, "brcm,media-controller?", <&csi1>, "brcm,media-controller?"; }; }; fragment@5 {target = <&i2c_csi_dsi1>;__overlay__ {#address-cells = <1>;#size-cells = <0>;status = "okay";fox_1: fox@10 {status = "ok";compatible = "st,vd66gy";reg = <0x10>;clocks = <&camera_clk_12M>;clock-names = "xclk";vcore-supply = <&v1v2>;vddio-supply = <&v1v8>;vana-supply = <&v2v8>;reset-gpios = <&gpio 5 1>;port {fox_ep_1: endpoint {clock-lanes = <0>;data-lanes = <1 2>;remote-endpoint = <&csi_ep_1>;clock-noncontinuous;link-frequencies =/bits/ 64 <402000000>;lane-polarities = <1 1 1>;};};};};}; fragment@6 {target = <&csi1>;csi_1: __overlay__ {status = "okay";brcm,media-controller;port {csi_ep_1: endpoint {remote-endpoint = <&fox_ep_1>;clock-lanes = <0>;data-lanes = <1 2>;clock-noncontinuous;};};};}; fragment@7 {target = <&cam1_reg>;__overlay__ {status = "disable";};};};
Code:
#if KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODEstatic int vd56g3_probe(struct i2c_client *client,const struct i2c_device_id *id)#elsestatic int vd56g3_probe(struct i2c_client *client)#endif{struct device *dev = &client->dev;struct vd56g3 *sensor;int ret;sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);if (!sensor)return -ENOMEM;sensor->i2c_client = client;ret = vd56g3_parse_dt(sensor);if (ret)return dev_err_probe(dev, ret, "Failed to parse Device Tree.");/* Get (and check) resources : power regs, ext clock, reset gpio */ret = vd56g3_get_regulators(sensor);if (ret)return dev_err_probe(dev, ret, "Failed to get regulators.");sensor->xclk = devm_clk_get(dev, NULL);if (IS_ERR(sensor->xclk))return dev_err_probe(dev, PTR_ERR(sensor->xclk), "Failed to get xclk.");sensor->xclk_freq = clk_get_rate(sensor->xclk);ret = vd56g3_prepare_clock_tree(sensor);if (ret)return ret;sensor->reset_gpio =devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);if (IS_ERR(sensor->reset_gpio))return dev_err_probe(dev, PTR_ERR(sensor->reset_gpio), "Failed to get reset gpio.");#if KERNEL_VERSION(6, 8, 0) > LINUX_VERSION_CODEsensor->regmap = devm_regmap_init_i2c(client, &vd56g3_regmap_config);#elsesensor->regmap = devm_cci_regmap_init_i2c(client, 16);#endifif (IS_ERR(sensor->regmap))return dev_err_probe(dev, PTR_ERR(sensor->regmap), "Failed to init regmap.");/* Power ON */ret = vd56g3_power_on(sensor);if (ret)return dev_err_probe(dev, ret, "Sensor power on failed.");/* Enable PM runtime with autosuspend (sensor being ON, set active) */pm_runtime_set_active(dev);pm_runtime_get_noresume(dev);pm_runtime_enable(dev);pm_runtime_set_autosuspend_delay(dev, 4000);pm_runtime_use_autosuspend(dev);/* Check HW model/version */ret = vd56g3_boot(sensor);if (ret) {dev_err(&client->dev, "Sensor boot failed : %d", ret);goto err_power_off;}ret = vd56g3_detect(sensor);if (ret) {dev_err(&client->dev, "Sensor detect failed : %d", ret);goto err_power_off;}/* Initialize, then register V4L2 subdev */ret = vd56g3_subdev_init(sensor);if (ret) {dev_err(&client->dev, "V4l2 init failed : %d", ret);goto err_power_off;}ret = v4l2_async_register_subdev(&sensor->sd);if (ret) {dev_err(&client->dev, "async subdev register failed %d", ret);goto err_subdev;}/* Sensor could now be powered off (after the autosuspend delay) */if (sensor->is_fastboot)pm_runtime_set_autosuspend_delay(dev, 1000);pm_runtime_mark_last_busy(dev);pm_runtime_put_autosuspend(dev);dev_info(&client->dev, "Successfully probe %s sensor", (sensor->is_mono) ? "vd56g3" : "vd66gy");return 0;err_subdev:vd56g3_subdev_cleanup(sensor);err_power_off:pm_runtime_disable(dev);pm_runtime_put_noidle(dev);vd56g3_power_off(sensor);return ret;}static int vd56g3_power_on(struct vd56g3 *sensor){struct i2c_client *client = sensor->i2c_client;int ret;ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), sensor->supplies);if (ret) {dev_err(&client->dev, "Failed to enable regulators %d", ret);return ret;}ret = clk_prepare_enable(sensor->xclk);if (ret) {dev_err(&client->dev, "Failed to enable clock %d", ret);goto disable_reg;}gpiod_set_value_cansleep(sensor->reset_gpio, 0);usleep_range(3500, 4000);ret = vd56g3_wait_state(sensor, VD56G3_SYSTEM_FSM_READY_TO_BOOT, NULL);if (ret) {dev_err(&client->dev, "Sensor reset failed %d\n", ret);goto disable_clock;}return 0;disable_clock:clk_disable_unprepare(sensor->xclk);gpiod_set_value_cansleep(sensor->reset_gpio, 1);disable_reg:regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies);return ret;}
Does someone have a clue on what I can try?
Statistics: Posted by invisiblepuzzle — Sun Dec 15, 2024 1:15 pm — Replies 0 — Views 27