Creating a MIPI CSI Camera driver on i.MX 8MP EVK

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Creating a MIPI CSI Camera driver on i.MX 8MP EVK

Jump to solution
23,702 Views
chrispeterson
Contributor IV

Hello all,

I am working on porting an IMX378 camera driver to the i.MX 8MP EVK board.  I am following the i.MX 8M Plus Camera and Display Guid, section 2 Camera Sensor Porting Guide.

I have followed section 2.7 Camera Sensor Driver in V4L2 mode and I get the following dmesg output:

6.440486] imx378: loading out-of-tree module taints kernel.
[ 6.449105] enter imx378_probe
[ 6.458998] enter imx378_retrieve_capture_properties
[ 6.466931] imx378 1-001a: supply DOVDD not found, using dummy regulator
[ 6.474198] imx378 1-001a: supply DVDD not found, using dummy regulator
[ 6.481092] imx378 1-001a: supply AVDD not found, using dummy regulator
[ 6.489336] enter imx378_regulator_enable
[ 6.493550] enter imx378_set_clk_rate
[ 6.497365] enter imx378_power_on
[ 6.500962] enter imx378_reset
[ 6.539481] imx8_media_dev: module is from the staging directory, the quality is unknown, you have been warned.
[ 6.558768] enter imx378_read_reg
[ 6.562991] enter imx378_read_reg
[ 6.590179] imx378_probe camera mipi imx378, is found
[ 6.648388] mx8-img-md: Registered sensor subdevice: imx378 1-001a (1)
[ 6.740810] enter imx378_link_setup
[ 6.744958] mx8-img-md: created link [imx378 1-001a] => [mxc-mipi-csi2.0]
[ 6.751831] mxc-md 32c00000.bus:camera: mxc_md_create_links
[ 6.768425] enter viv_dwe_init_module
[ 6.772649] enter dwe_hw_probe
[ 6.778619] enter viv_isp_init_module
[ 6.783472] vvcam dewa74] vvcam isp driver registered
[ 7.206408] enter imx378_priv_ioctl (cmd = -2140645888)
[ 7.211671] enter imx378_query_capability

 My media-ctl output is as follows:

root@imx8mpevk:~# media-ctl -p
[ 2002.167891] enter imx378_get_fmt
Media controller API version 5.10.52

Media device information
------------------------
driver mxc-md
model FSL Capture Media Device
serial
bus info
hw revision 0x0
driver version 5.10.52

Device topology
- entity 1: mxc-mipi-csi2.0 (8 pads, 1 link)
type Node subtype V4L flags 0
device node name /dev/v4l-subdev0
pad0: Sink
<- "imx378 1-001a":0 [ENABLED,IMMUTABLE]
pad1: Sink
pad2: Sink
pad3: Sink
pad4: Source
pad5: Source
pad6: Source
pad7: Source

- entity 10: imx378 1-001a (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev1
pad0: Source
[fmt:SGBRG10_1X10/4056x3040 field:none]
-> "mxc-mipi-csi2.0":0 [ENABLED,IMMUTABLE]

root@imx8mpevk:~#

 At this point I can see that the I2C communication is working, however I cannot for the life of me figure out how to tell V4L2 to start the stream so I can view it.   When I list V4L2 devices I do not see a video source:

root@imx8mpevk:~# v4l2-ctl --list-devices
[ 2130.712823] enter imx378_priv_ioctl (cmd = -2140645888)
[ 2130.718106] enter imx378_query_capability
():
/dev/v4l-subdev0

(csi0):
/dev/v4l-subdev1

FSL Capture Media Device (platform:mxc-md):
/dev/media0

vsi_v4l2dec (platform:vsi_v4l2dec):
/dev/video1

vsi_v4l2enc (platform:vsi_v4l2enc):
/dev/video0

 What am I missing?

My DTS file is as below:

// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
 * Copyright 2020 NXP
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

/dts-v1/;

#include "imx8mp-evk.dts"

&i2c2 {
	/delete-node/ov5640_mipi@3c;

	imx378_0: imx378_mipi@1a {
		compatible = "sony,imx378";
		reg = <0x1a>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_csi0_pwn>, <&pinctrl_csi0_rst>, <&pinctrl_csi_mclk>;
		clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
		clock-names = "csi_mclk";
		assigned-clocks = <&clk IMX8MP_CLK_IPP_DO_CLKO2>;
		assigned-clock-parents = <&clk IMX8MP_CLK_24M>;
		assigned-clock-rates = <24000000>;
		csi_id = <0>;
		pwn-gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
		rst-gpios = <&gpio1 6 GPIO_ACTIVE_LOW>;
		mclk = <24000000>;
		mclk_source = <0>;
		status = "okay";

		port {
			imx378_mipi_0_ep: endpoint {
				data-lanes = <1 2 3 4>;
				clock-lanes = <0>;
				max-pixel-frequency = /bits/ 64 <500000000>;
				remote-endpoint = <&mipi_csi0_ep>;
			};
		};

	};
};

&i2c3 {
	clock-frequency = <100000>;
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c3>;
	status = "okay";

	ov5640_1: ov5640_mipi@3c {
		status = "disabled";
	};
};

&cameradev {
	status = "okay";
};

&isi_0 {
	status = "disabled";
};

&isi_1 {
	status = "disabled";
};

&isp_0 {
	status = "okay";
};

&dewarp {
	status = "okay";
};

&mipi_csi_0 {
	status = "okay";
	clock-frequency = <500000000>;
	assigned-clock-rates = <500000000>;

	port@0 {
		endpoint {
			remote-endpoint = <&imx378_mipi_0_ep>;
			data-lanes = <4>;
			csis-hs-settle = <16>;			
		};
	};
};

&mipi_csi_1 {
	status = "disabled";
};

ISI driver, and VVCAM driver Attached

Thank you,

Chris

Labels (1)
0 Kudos
1 Solution
23,653 Views
khang_letruong
Senior Contributor III

Hi @chrispeterson ,

Firstly, the imx378.drv is important and it is used by the isp_media_server (or communicate with this later). Missing it is critical since there's no way for the isp_media_server to propagate the IOCTL calls to VVCAM kernel driver.

The IMX378.c that you created in isp-imx will serve to generate the imx378.drv. However, it might not be taken into account yet and you will need to add it via some relevant CMakelists.txt files.

Together with IMX378.c, you will ned an IMX378.xml for the calibration parameters,

Aside from the imx378.drv, there's will be libimx378.so, libimx378.so.1libimx378.so.1.0.0 generated. Let's suppose that you build your isp-imx with ./build-all-isp.sh command, then the generated files would be found in build_output_release_partial/opt/imx8-isp/ and build_output_release_partial/usr/lib/.  You will need to copy them to to the target board :

 

 

scp -r build_output_release_partial/opt/imx8-isp target@target-ip:/opt/

scp -r build_output_release_partial/usr/lib/* target@target-ip:/usr/lib/

 

 

Also, you will need to adapt the start_isp.sh script and run.sh script to take into account of loading of your newly generated imx378.drv and IMX378.xml as well as the vvcam kernel driver (imx378.ko) described below :

For lower level vvcam kernel module (imx378.ko generated from imx378_mipi.c), you will need to compile it and copy to target board under /lib/module/<kernel-version>/extra/sensor/imx378/ (you might need to create this folder if it does not exist). 

On another note, I found a different porting guide to what I was using (IMX8MPCSPUG.pdf) and section 6.2.6 mentions that I need to add some defines to the cmake command, however I am using the Yocto build system and I do not see a way to do this.

Further, section 6.2.4 mentions needing a "<sensor>.drv" file and I see n way of creating one.

-- > You can modify the isp-imx recipe to add patch for your custom stuff of IMX378 described above. Or you can build it separately then scp-ing to the target board.

You can inspire the example of ov2775 which is a good example.

Regards,

K.

 

 

View solution in original post

0 Kudos
38 Replies
12,920 Views
khang_letruong
Senior Contributor III

Hi @chrispeterson ,

Might it be an issue of HW (or wrong/incidental register's setting) during the streaming?

BR,
K.

 

Tags (1)
0 Kudos
10,925 Views
chrispeterson
Contributor IV

Hi @khang_letruong,

Something weird is going on.  The latest message from me was actually sent a day before the solution acceptance.  When I posted the message it just disappeared.  In the mean time I figured out the issue was my IMX378.xml file.   (I changed to use the DAA3840_30MC_4K.xml file and then everything started working).

Thank you very much for the help.

-Chris

0 Kudos
6,854 Views
Amal_Antony3331
Contributor III

Hi @chrispeterson 

I am working on porting an IMX219 camera driver to the i.MX 8MP EVK board. Im referring to the OV2775 example. Im also facing the same issue as yours.

One thing to clarify, how to get .xml files for respective sensor. Is there any tool to generate XML for respective sensor?

Now I'm using the OV2775 xml file.

Can you please guide on this.

0 Kudos
6,832 Views
chrispeterson
Contributor IV

Hi @Amal_Antony3331 ,

 

You have three options:

  1. You need to use the NXP ISP tuning tool for this (you will need to ask your FAE for access).  
  2. You can pay NXP professional services to do the tune
  3. You can pay a third party vendor to do you tune (you can get a list from NXP)

A couple of notes:

The tuning process is not trivial.  It involves tuning the gains, auto white balance, exposure, and many more aspects of the video stream.   Further you'll need a separate configuration file for each camera output resolution and/or frame rate (if you want to do AC light mitigation). 

I also found that the tuning tool can generate XML files that simply will not work if you use incompatible settings (In this case the ISP output stream will fail to start and you'll get a few errors in the debug console, but nothing telling you exactly what is wrong).

 

-Chris

0 Kudos
6,824 Views
Amal_Antony3331
Contributor III

Hi @chrispeterson  and @khang_letruong 

Thanks for the reply.

I used OV2775 example to port my IMX219 to iMX8MP. It is able to get the video nodes using v4l2-ctl command.

root@imx8mpevk:/opt/imx8-isp/bin# v4l2-ctl --list-devices
[   42.315180] enter imx219_priv_ioctl
[   42.381284] enter isp_mi_stop
[   42.441880] enter isp_mi_stop
 ():
        /dev/v4l-subdev0
        /dev/v4l-subdev3
        /dev/v4l-subdev4

 ():
        /dev/v4l-subdev1
        /dev/v4l-subdev5
        /dev/v4l-subdev6

 (csi0):
        /dev/v4l-subdev2

FSL Capture Media Device (platform:mxc-md):
        /dev/media0

VIV (platform:viv0):
        /dev/video2

VIV (platform:viv1):
        /dev/video3

vsi_v4l2dec (platform:vsi_v4l2dec):
        /dev/video1

vsi_v4l2enc (platform:vsi_v4l2enc):
        /dev/video0

viv_media (platform:vvcam-video):
        /dev/media1

But on checking the v4l2 capabilities ,I'm getting the following error so that not able to dump a single frame using gst-launch-1.0

root@imx8mpevk:/opt/imx8-isp/bin# v4l2-ctl -d /dev/video2 -l
ERROR  : [MediaPipeline] NativeSensor open error!
ERROR  : [V4l2Event] initialize MediaPipeline error!


User Controls

                   viv_ext_ctrl 0x0098f901 (str)    : min=0 max=65535 step=1 value='' flags=has-payload
error 22 getting ctrl sensor.resw
[  595.325550] viv_gen_g_ctrl: unsubscribed event id =11 type=0x08002000
error 22 getting ctrl sensor.resh
[  595.485545] viv_gen_g_ctrl: unsubscribed event id =11 type=0x08002000
root@imx8mpevk:/opt/imx8-isp/bin# 
root@imx8mpevk:/opt/imx8-isp/bin# 
root@imx8mpevk:/opt/imx8-isp/bin# v4l2-ctl -d /dev/video3 -l                                                                                                                           
[  595.649546] viv_post_event: unsubscribed event id =14 type=0x08002000

User Controls

                   viv_ext_ctrl 0x0098f901 (str)    : min=0 max=65535 step=1 value='' flags=has-payload
[  602.053538] viv_post_event: unsubscribed event id =14 type=0x08002000
error 22 getting ctrl sensor.resw
[  602.217565] viv_gen_g_ctrl: unsubscribed event id =11 type=0x08002000
error 22 getting ctrl sensor.resh
[  602.381562] viv_gen_g_ctrl: unsubscribed event id =11 type=0x08002000
root@imx8mpevk:/opt/imx8-isp/bin# 
Do I miss to set any basic register that is required to start streaming?
Right now I'm using the OV2775 xml file for IMX215.
What could be the possible reason for this?
 
One thing to clarify, at what point this xml file is getting loaded and parse its values?
Attaching the ISI driver and VVCAM driver  files.
 
Best Regards
 
Charles
0 Kudos
6,820 Views
khang_letruong
Senior Contributor III

Hi @Amal_Antony3331 ,

First finding is that IMX219 outputs RAW10 while OV2775 is RAW12.

Regards,
Khang

0 Kudos
6,808 Views
khang_letruong
Senior Contributor III

Hi @Amal_Antony3331 ,

You might also need to enable the tracing of isp-imx and debugging fo isp-vvcam for better investigation. Something similar to this : 

loading [imx327.drv]...
Info - IMX327_IsiHalQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (exit)
loading [imx327.drv]...
Info - IMX327_IsiHalQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (exit)
Video Test:caps supports:{
	count = 1
	{
	index    = 0
	width    = 1920
	height   = 1080
	fps      = 30
	hdr_mode = 0
	}
}
loading [imx327.drv]...
Info - IMX327_IsiHalQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (exit)
loading [imx327.drv]...
Info - IMX327_IsiHalQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (exit)
Info - IMX327_IsiGetSensorIss (enter)
Info - IMX327_IsiGetSensorIss (exit)
Info - IMX327_IsiHalQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (exit)
Info - IMX327_IsiCreateSensorIss (enter)
Info - IMX327_IsiSensorSetPowerIss: (enter)
Info - IMX327_IsiSensorSetPowerIss: set power 1
Info - IMX327_IsiSensorSetPowerIss: (exit)
Info - IMX327_IsiSensorGetClkIss: (enter)
Info - IMX327_IsiSensorGetClkIss: status:276111060 sensor_mclk:37125000 
Info - IMX327_IsiSensorGetClkIss: (exit)
Info - IMX327_IsiSensorSetClkIss: (enter)
Info - IMX327_IsiSensorSetClkIss: status:1 sensor_mclk:37125000 
Info - IMX327_IsiSensorSetClkIss: (exit)
Info - IMX327_IsiResetSensorIss: (enter)
Info - IMX327_IsiResetSensorIss: (exit)
Info - IMX327_IsiSetSensorModeIss (enter)
Info - IMX327_IsiSetSensorModeIss (exit) 
Info - IMX327_IsiCreateSensorIss (exit)
Info - IMX327_IsiGetSensorModeIss (enter)
Info - IMX327_IsiGetSensorModeIss (exit) 
Info - IMX327_IsiGetCapsIss (enter) 
Info - IMX327_IsiQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (enter) 
Info - IMX327_IsiHalQuerySensorIss (exit)
Info - IMX327_IsiQuerySensorIss (exit)
Info - IMX327_IsiGetCapsIss (exit)
isp  input: 1920x1080 RAW12
isp output: 1920x1080 YUV422I
dewarp   input: 1920x1080 YUV422I
dewarp  output: 1920x1080 YUV422I
Info - IMX327_IsiSetupSensorIss (enter)
Info - IMX327_IsiSetupSensorIss (exit)
Info - IMX327_IsiSetTestPatternIss (enter)
Info - IMX327_IsiSetTestPatternIss: test pattern enable[0] mode[0]
Info - IMX327_IsiSetTestPatternIss: (exit)
Info - IMX327_IsiSetSensorFpsIss: (enter)
Info - IMX327_IsiSetSensorFpsIss: (exit)
Info - IMX327_IsiGetSensorModeIss (enter)
Info - IMX327_IsiGetSensorModeIss (exit) 
Info - IMX327_IsiGetSensorModeIss (enter)
Info - IMX327_IsiGetSensorModeIss (exit) 
Info - IMX327_IsiGetAeInfoIss (enter)
Info - IMX327_IsiGetAeInfoIss (exit)
Info - IMX327_IsiGetSensorFpsIss: (enter)
Info - IMX327_IsiGetSensorFpsIss: (exit)
Info - IMX327_IsiGetAeStartExposureIs (enter)
Info - IMX327_IsiGetAeStartExposureIs:get start exposure 36403200
Info - IMX327_IsiGetAeStartExposureIs: (exit)
Info - IMX327_IsiGetSensorModeIss (enter)
Info - IMX327_IsiGetSensorModeIss (exit) 
Info - IMX327_IsiGetAeInfoIss (enter)
Info - IMX327_IsiGetAeInfoIss (exit)
Info - IMX327_IsiSetIntegrationTimeIss (enter)
Info - IMX327_IsiSetIntegrationTimeIss set linear exp 400 
Info - IMX327_IsiSetIntegrationTimeIss (exit)
Info - IMX327_IsiSetGainIss (enter)
Info - IMX327_IsiSetGainIss set linear gain 3072
Info - IMX327_IsiSetGainIss (exit)
Info - IMX327_IsiGetIntegrationTimeIss (enter)
Info - IMX327_IsiGetIntegrationTimeIss (exit)
Info - IMX327_IsiGetGainIss (enter)
Info - IMX327_IsiGetGainIss (exit)
#### CsiSetFormat 1920 1080 842090322
Info - IMX327_IsiGetSensorIspStatusIss: (enter)
Info - IMX327_IsiGetSensorIspStatusIss: (exit)
Info - IMX327_IsiGetSensorIspStatusIss: (enter)
Info - IMX327_IsiGetSensorIspStatusIss: (exit)
Info - IMX327_IsiGetSensorIspStatusIss: (enter)
Info - IMX327_IsiGetSensorIspStatusIss: (exit)
Info - IMX327_IsiGetSensorModeIss (enter)
Info - IMX327_IsiGetSensorModeIss (exit) 
Info - IMX327_IsiGetSensorModeIss (enter)
Info - IMX327_IsiGetSensorModeIss (exit) 
Info - IMX327_IsiGetSensorIspStatusIss: (enter)
Info - IMX327_IsiGetSensorIspStatusIss: (exit)
Info - IMX327_IsiSensorSetStreamingIss (enter)
Info - IMX327_IsiSensorSetStreamingIss: set streaming 1
Info - IMX327_IsiSensorSetStreamingIss (exit) 

 

and this :

[ 304.427751] enter imx378_priv_ioctl (cmd = -2140645888)
[ 304.439580] enter imx378_query_capability
[ 304.483156] enter imx378_priv_ioctl (cmd = -2140645888)
[ 304.488406] enter imx378_query_capability

[ 304.510213] enter imx378_priv_ioctl (cmd = 261)
[ 304.516684] enter imx378_query_supports
[ 304.521098] enter imx378_priv_ioctl (cmd = -2140645888)
[ 304.529218] enter imx378_query_capability
[ 304.568089] enter imx378_query_supports
[ 304.572873] enter imx378_priv_ioctl (cmd = 261)

[ 304.579125] enter imx378_query_supports
[ 304.584259] enter imx378_priv_ioctl (cmd = 261)

[ 304.590577] enter imx378_query_supports
[ 304.606186] enter imx378_priv_ioctl (cmd = 261)
[ 304.610754] enter imx378_query_supports
[ 304.614608] enter imx378_priv_ioctl (cmd = 257)
[ 304.619173] enter imx378_priv_ioctl (cmd = 260)
[ 304.623720] enter imx378_get_clk
[ 304.626963] enter imx378_priv_ioctl (cmd = 259)
[ 304.631530] enter imx378_priv_ioctl (cmd = 256)
[ 304.636073] enter imx378_priv_ioctl (cmd = 262)
[ 304.640612] enter imx378_set_sensor_mode
[ 304.644553] enter imx378_priv_ioctl (cmd = 263)
[ 304.649109] enter imx378_get_sensor_mode
[ 304.653054] enter imx378_priv_ioctl (cmd = 261)
[ 304.657593] enter imx378_query_supports
[ 304.751846] enter isp_mi_stop
[ 304.757250] enter imx378_set_fmt
[ 304.760529] enter imx378_write_reg_arry
[ 304.905955] enter imx378_get_format_code
[ 304.909943] enter imx378_priv_ioctl (cmd = 285)
[ 304.914513] enter imx378_set_test_pattern
[ 304.918557] enter imx378_write_reg
[ 304.922576] enter imx378_write_reg
[ 304.926560] enter imx378_write_reg
[ 304.930558] enter imx378_write_reg
[ 304.934583] enter imx378_priv_ioctl (cmd = 279)
[ 304.939124] enter imx378_set_fps
[ 304.942349] enter imx378_write_reg
[ 304.946360] enter imx378_write_reg
[ 304.950353] enter imx378_write_reg
[ 304.954342] enter imx378_write_reg
[ 304.958352] enter imx378_priv_ioctl (cmd = 263)
[ 304.962900] enter imx378_get_sensor_mode

 

But first simple step could be stop the imx8-isp service, enable the logging of ISP service and re-start it manually as below :

# systemctl stop imx8-isp.service
# export ISP_LOG_LEVEL=8
# cd /opt/imx8-isp/bin
#./start_isp.sh

 

Regards,
K.

 

0 Kudos
6,803 Views
Amal_Antony3331
Contributor III

Hi @khang_letruong 

I'm getting this much logs only from ISP .

root@imx8mpevk:/opt/imx8-isp/bin# systemctl stop imx8-isp.service
root@imx8mpevk:/opt/imx8-isp/bin# 
root@imx8mpevk:/opt/imx8-isp/bin# export ISP_LOG_LEVEL=8
root@imx8mpevk:/opt/imx8-isp/bin# 
root@imx8mpevk:/opt/imx8-isp/bin# ./run.sh -c imx219_4K -lm
RUN_SCRIPT=/opt/imx8-isp/bin/run.sh
RUN_SCRIPT_PATH=/opt/imx8-isp/bin
Trying configuration "imx219_4K"...
Killing preexisting instances of video_test and isp_media_server:
PID TTY STAT TIME COMMAND 859 ttymxc1 S 0:00 ./isp_media_server CAMERA0
Removing vvcam-isp...
Removing vvcam-dwe...
Removing vvcam-video...
[  416.253663] enter viv_video_exit_module
Removing imx8-media-dev...
[  416.391695] : Unregistered all entities
Removing ov2775...
Removing os08a20...
Removing basler-camera-driver-vvcam...
Loading module imx219 ...
imx219
imx219                 32768  0
imx219 already loaded.
Loading module imx8-media-dev ...
imx8_media_dev
[  416.481570] imx8_media_dev: module is from the staging directory, the quality is unknown, you have been warned.
[  416.492701] mx8-img-md: Registered sensor subdevice: imx219 6-0010 (1)
[  416.499294]   enter (( imx219_link_setup ))
[  416.503501] mx8-img-md: created link [imx219 6-0010] => [mxc-mipi-csi2.0]
[  416.510316] mxc-md 32c00000.bus:camera: mxc_md_create_links
Loaded /lib/modules/5.10.35-lts-5[  416.520390]    enter imx219_priv_ioctl ((( (cmd = -2140645888))))
.10.y+g1b8cec2a6c43/kernel/driver[  416.529418]  <<<  Command : VIDIOC_QUERYCAP 
s/staging/media/imx/imx8-media-de[  416.536277]   enter (( imx219_ioc_qcap ))
v.ko 
Loading module vvcam-video[  416.543152]  CSI number = 0 
 ...
vvcam_video
[  416.548866] cap->bus_info[VVCAM_CAP_BUS_INFO_I2C_ADAPTER_NR_POS] = 6 
[  416.557118] enter viv_video_init_module
Loaded /lib/modules/5.10.35-lts-5.10.y+g1b8cec2a6c43/extra/video/vvcam-video.ko 
Loading module vvcam-dwe ...
vvcam_dwe
[  416.577394] enter isp_mi_stop
vvcam_dwe              28672  3
vvcam-dwe already loaded.
Loading module vvcam-isp ...
vvcam_isp
[  416.589329] enter isp_mi_stop
vvcam_isp              65536  4
vvcam-isp already loaded.
Starting isp_media_server with configuration file CAMERA0
root@imx8mpevk:/opt/imx8-isp/bin# INFO   : [ISP_MEDIA_SERVER] ******************************************************************
INFO   : [ISP_MEDIA_SERVER] VIV ISP Media Control Framework V4.2.2p13 (Jun  8 2021, 10:39:59)
INFO   : [ISP_MEDIA_SERVER] ******************************************************************

 Also can you please guide me to enable the complete Trace logs of the isp-imx?

Regards

Charles

0 Kudos
6,800 Views
khang_letruong
Senior Contributor III

Hi @Amal_Antony3331 ,

You could ask the author of this thread for enabling the tracing of isp-imx as I copied the tracing and log from his posts.

Otherwise, tracing is not available to customer release but only available in full source build as far as I learnt from professional support.

Btw, are you testing 4K instead of 1080p resolution? Can you share your XML file as well?

Regards,
Khang

0 Kudos
6,792 Views
Amal_Antony3331
Contributor III

Hi @khang_letruong 

I'm testing with 1080p resolution only.

Attaching the xml file.

0 Kudos
6,790 Views
khang_letruong
Senior Contributor III

Hi @Amal_Antony3331 ,

In your run.sh :

               imx219_4K )
                        MODULES=("imx219" "${MODULES[@]}")
                        RUN_OPTION="CAMERA0"
                        CAM_NAME="imx219"
                        DRV_FILE="IMX219.drv"
                        MODE_FILE="IMX219_MODES.txt"
                        MODE="1"
                        write_sensor_cfg_file "Sensor2_Entry.cfg" $CAM_NAME $DRV_FILE $MODE_FILE $MODE
                        ;;

Why did you use Sensor2_Entry.cfg instead of Sensor0_Entry.cfg ? I am not sure that it exists.

Regards,
K.

 

0 Kudos
6,787 Views
Amal_Antony3331
Contributor III

Hi @khang_letruong 

Yes. Sensor2_Entry.cfg file exists.

root@imx8mpevk:/opt/imx8-isp/bin# cat Sensor2_Entry.cfg 
name = "imx219"
drv = "IMX219.drv"
mode = 0
[mode.0]
xml = "IMX219.xml"
dwe = "dewarp_config/sensor_dwe_1080P_config.json"
[mode.1]
xml = "IMX219.xml"
dwe = "dewarp_config/sensor_dwe_1080P_config.json"
[mode.2]
xml = "IMX219.xml"
dwe = "dewarp_config/sensor_dwe_1080P_config.json"
[mode.3]
xml = "IMX219_8M_02_720p.xml"
dwe = "dewarp_config/sensor_dwe_720P_config.json"
root@imx8mpevk:/opt/imx8-isp/bin# 

 Just used this number since Sensor 0 and Sensor 1 are used for default sesnors already present .

0 Kudos
6,785 Views
khang_letruong
Senior Contributor III

Hi @Amal_Antony3331 ,

I did mean that Sensor2_Entry.cfg would not be recognized by the system, only Sensor0_Entry.cfg or Sensor1_Entry.cfg as there's 2 pipelines.

Regards,

K

0 Kudos
6,763 Views
Amal_Antony3331
Contributor III

Hi @khang_letruong 

I tried by changing to Sensor0_Entry.cfg also. Still the same result.

0 Kudos
6,755 Views
chrispeterson
Contributor IV

Hi @Amal_Antony3331 

To enable the logging I went thought and added print statements in all the functions of my driver (that also output additional information where needed).  To add the print statements to the ISP driver code you can force some of the libraries used of the isp_media_server to be built with print statements you add but it requires a lot of tweaking of the cmake files for that to work.   Unfortunately I no longer have those changes to share.

 

I noticed the following line in your logs:

imx219 already loaded.

When you use -lm you should also unload your camera driver the order the modules come up in is important for all the links between the /dev/video and /dev/v4l_subdev nodes.

Are you able to use the video_test program under /opt/imx8-isp/bin to see if you can get raw video (I tested this by saving the raw video to a file as the DRM or display buffer methods could not use it as a source).  

-Chris

0 Kudos
6,832 Views
khang_letruong
Senior Contributor III

Hi @Amal_Antony3331 ,

Each sensor has its own spectral response but they are somehow similar in the range of visible light (especially in daylight condition which it optimal condition). So, you can very well borrow the XML file in the examples found in isp-imx and isp-vvcam (ov2775) for your own sensor as long as you manage to have same resolution(s) which are 1080p or 4K in most cases.  I used the ov2775's XML file to bringup ISP drivers for different sensors before deciding which one to go with because the calibration process (for having the XML file of each) is not free.

In order to have the XML for your own sensor (i.e. the calibration process for your own sensor), you might need to pass by a professional service which is one of the partners of NXP.

Regards,
Khang

0 Kudos
5,276 Views
chrispeterson
Contributor IV

Hello@khang_letruong ,

Thank you very much for the help.  I was able to get further now that I have copied over the .drv and .xml files and updated the run.sh.

However I am not getting a parameter error from within the start function in cam_engine_interface.cpp as shown below.

root@imx8mpevk:/opt/imx8-isp/bin# ./run.sh -c imx378
RUN_SCRIPT=/opt/imx8-isp/bin/run.sh
RUN_SCRIPT_PATH=/opt/imx8-isp/bin
Trying configuration "imx378"...
Killing preexisting instances of video_test and isp_media_server:
PID TTY STAT TIME COMMAND 1033 pts/0 S+ 0:00 ./video_test -w 4048 -h 3040 -f RAW10 -t file -m 0 -d 2
[ 296.878947] viv_post_event: unsubscribed event id =4 type=0x08002000
Starting isp_media_server with configuration file CAMERA0
[ 297.038965] viv_post_event: unsubscribed event id =2 type=0x08002000
[ 304.427751] enter imx378_priv_ioctl (cmd = -2140645888)
[ 304.439580] enter imx378_query_capability
[ 304.483156] enter imx378_priv_ioctl (cmd = -2140645888)
[ 304.488406] enter imx378_query_capability
loading [imx378.drv]...
[ 304.510213] enter imx378_priv_ioctl (cmd = 261)
[ 304.516684] enter imx378_query_supports
WARN : [DEWARP_HW] dw[ 304.521098] enter imx378_priv_ioctl (cmd = -2140645888)
e type /dev/v4l-subdev0 0
[ 304.529218] enter imx378_query_capability
WARN : [DEWARP_HW] dwe type /dev/v4l-subdev1 1
WARN : [DEWARP_HW] dwe type /dev/v4l-subdev2 2
loading [imx378.drv]...[ 304.561912] enter imx378_priv_ioctl (cmd = 261)

[ 304.568089] enter imx378_query_supports
loading [imx378.drv]...[ 304.572873] enter imx378_priv_ioctl (cmd = 261)

[ 304.579125] enter imx378_query_supports
loading [imx378.drv]...[ 304.584259] enter imx378_priv_ioctl (cmd = 261)

[ 304.590577] enter imx378_query_supports
[ 304.606186] enter imx378_priv_ioctl (cmd = 261)
[ 304.610754] enter imx378_query_supports
[ 304.614608] enter imx378_priv_ioctl (cmd = 257)
[ 304.619173] enter imx378_priv_ioctl (cmd = 260)
[ 304.623720] enter imx378_get_clk
[ 304.626963] enter imx378_priv_ioctl (cmd = 259)
[ 304.631530] enter imx378_priv_ioctl (cmd = 256)
[ 304.636073] enter imx378_priv_ioctl (cmd = 262)
[ 304.640612] enter imx378_set_sensor_mode
[ 304.644553] enter imx378_priv_ioctl (cmd = 263)
[ 304.649109] enter imx378_get_sensor_mode
[ 304.653054] enter imx378_priv_ioctl (cmd = 261)
[ 304.657593] enter imx378_query_supports
isp input: 4048x3040 RAW10
isp output: 3840x2160 YUV422I
dewarp input: 3840x2160 YUV422I
dewarp output: 3840x2160 YUV422I
[ 304.751846] enter isp_mi_stop
[ 304.757250] enter imx378_set_fmt
[ 304.760529] enter imx378_write_reg_arry
[ 304.905955] enter imx378_get_format_code
[ 304.909943] enter imx378_priv_ioctl (cmd = 285)
[ 304.914513] enter imx378_set_test_pattern
[ 304.918557] enter imx378_write_reg
[ 304.922576] enter imx378_write_reg
[ 304.926560] enter imx378_write_reg
[ 304.930558] enter imx378_write_reg
[ 304.934583] enter imx378_priv_ioctl (cmd = 279)
[ 304.939124] enter imx378_set_fps
[ 304.942349] enter imx378_write_reg
[ 304.946360] enter imx378_write_reg
[ 304.950353] enter imx378_write_reg
[ 304.954342] enter imx378_write_reg
[ 304.958352] enter imx378_priv_ioctl (cmd = 263)
[ 304.962900] enter imx378_get_sensor_mode
camEngineConfig.type = 1[ 304.967415] enter imx378_priv_ioctl (cmd = 274)

camEngineConfig.pathConfig[0].w[ 304.973526] enter imx378_set_exp
idth = 3840
camEngineConfig.path[ 304.979670] enter imx378_write_reg
Config[0].height = 2160
camEngin[ 304.986491] enter imx378_write_reg
eConfig.pathConfig[0].mode = 4
c[ 304.992758] enter imx378_write_reg
amEngineConfig.pathConfig[0].layo[ 304.999031] enter imx378_write_reg
ut = 3
camEngineConfig.pathConfi[ 305.005318] enter imx378_priv_ioctl (cmd = 277)
g[0].alignMode = 0
camEngineConf[ 305.012126] enter imx378_set_gain
ig.pathConfig[1].width = 0
camEn[ 305.018323] enter imx378_write_reg
gineConfig.pathConfig[1].height =[ 305.025170] enter imx378_write_reg
0
camEngineConfig.pathConfig[1][ 305.031449] enter imx378_write_reg
.mode = 1
camEngineConfig.pathCo[ 305.037712] enter imx378_write_reg
nfig[1].layout = 3
camEngineConfig.pathConfig[1].alignMode = 0
camEngineConfig.pathConfig[2].width = 0
camEngineConfig.pathConfig[2].height = 0
camEngineConfig.pathConfig[2].mode = 1
camEngineConfig.pathConfig[2].layout = 3
camEngineConfig.pathConfig[2].alignMode = 0
camEngineConfig.pathConfig[3].width = 0
camEngineConfig.pathConfig[3].height = 0
camEngineConfig.pathConfig[3].mode = 1
camEngineConfig.pathConfig[3].layout = 3
camEngineConfig.pathConfig[3].alignMode = 65535
camEngineConfig.pathConfig[4].width = 0
camEngineConfig.pathConfig[4].height = 0
camEngineConfig.pathConfig[4].mode = 1
camEngineConfig.pathConfig[4].layout = 3
camEngineConfig.pathConfig[4].alignMode = 65535
camEngineConfig.data.sensor.hSensor = 281473366536816
camEngineConfig.data.sensor.hSubSensor = 0
camEngineConfig.data.sensor.hCamCalibDb = 281473366260096
camEngineConfig.data.sensor.ifSelect = 1
camEngineConfig.data.sensor.sampleEdge = 2
camEngineConfig.data.sensor.hSyncPol = 1
camEngineConfig.data.sensor.vSyncPol = 2
camEngineConfig.data.sensor.bayerPattern = 3
camEngineConfig.data.sensor.subSampling = 3
camEngineConfig.data.sensor.seqCCIR = 1
camEngineConfig.data.sensor.fieldSelection = 1
camEngineConfig.data.sensor.inputSelection = 2
camEngineConfig.data.sensor.dvpPinMapping = 0
camEngineConfig.data.sensor.mode = 4
camEngineConfig.data.sensor.acqWindow.hOffset = 0
camEngineConfig.data.sensor.acqWindow.vOffset = 0
camEngineConfig.data.sensor.acqWindow.width = 4048
camEngineConfig.data.sensor.acqWindow.height = 3040
camEngineConfig.data.sensor.outWindow.hOffset = 0
camEngineConfig.data.sensor.outWindow.vOffset = 0
camEngineConfig.data.sensor.outWindow.width = 4048
camEngineConfig.data.sensor.outWindow.height = 3040
camEngineConfig.data.sensor.isWindow.hOffset = 0
camEngineConfig.data.sensor.isWindow.vOffset = 0
camEngineConfig.data.sensor.isWindow.width = 4048
camEngineConfig.data.sensor.isWindow.height = 3040
camEngineConfig.data.sensor.mipiMode = 43
camEngineConfig.data.sensor.enable3D = 0
camEngineConfig.data.sensor.enableTestpattern = 0
camEngineConfig.data.sensor.flickerPeriod = 1
camEngineConfig.data.sensor.enableAfps = 0
camEngineConfig.data.sensor.szSensorName[256] =
camEngineConfig.data.sensor.szCsiName[256] =
camEngineConfig.data.sensor.csiFormat = 808534599
camEngineConfig.data.sensor.csiPad = 0
camEngineConfig.data.sensor.stitchingMode = 0
camEngineConfig.data.sensor.compress_curve.enable = 0
camEngineConfig.data.sensor.compress_curve.in_bit = 0
camEngineConfig.data.sensor.compress_curve.out_bit = 0
camEngineConfig.data.sensor.expand_curve.enable = 0
camEngineConfig.data.sensor.expand_curve.in_bit = 0
camEngineConfig.data.sensor.expand_curve.out_bit = 0
camEngineConfig.data.sensor.colorspace = 0
camEngineConfig.data.sensor.colorrange = 0
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_engine_interface.cpp:2340: start() = 13(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:427: inputConnect() = 13(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:1359: cameraConnect() = 13(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_engine_interface.cpp:2371: streamingStart() = 12(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:1084: streamingStart() = 12(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:1639: previewStart() = 12(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_engine_interface.cpp:2382: streamingStop() = 12(RET_WRONG_STATE)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:1104: streamingStop() = 12(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/un[ 308.127902] enter imx378_priv_ioctl (cmd = 272)
its/cam_device/source/camera/cam_[ 308.133165] enter imx378_s_stream
operations.cpp:1652: previewStop([ 308.139233] enter imx378_write_reg
) = 12(ret)
[ERR] /usr/src/debu[ 308.146157] enter imx378_priv_ioctl (cmd = 260)
g/isp-imx/4.2.2.15.0-r0/isp-imx-4[ 308.152908] enter imx378_get_clk
.2.2.15.0/units/cam_device/source[ 308.158977] enter imx378_priv_ioctl (cmd = 259)
/camera/cam_engine_interface.cpp:[ 308.166368] enter imx378_priv_ioctl (cmd = 257)
757: cprocEnableSet() = 12(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:820: inputDisconnect() = 12(ret)
[ERR] /usr/src/debug/isp-imx/4.2.2.15.0-r0/isp-imx-4.2.2.15.0/units/cam_device/source/camera/cam_operations.cpp:1372: cameraDisconnect() = 12(ret)

 As can be seen above, I am gettin an invalid parameter error (return of 13).  So I modified the source to output the configuration and everything looks ok to me.  I have no idea why it is failing at this step.

Do you have any idea what would cause the CamEngineStart (I cannot find source for this function) to return a parameter error?

Thank you again for the help,

-Chris

0 Kudos
5,276 Views
chrispeterson
Contributor IV

Hi @khang_letruong 

Thank you very much for the help.  I was generating the imx378.drv file and had the IMX378.xml file already, they were just not being copied over.   I did have to modify run.sh to add my sensor.

As a side note I looked through the porting guide and none of this information is in there.

So, I am now getting further.   I can start the isp_media_server with the properly and it appears to run.  I get a /dev/video2 output device that I can run gst-laucher-1.0 or video_test on, however both of those fail no matter what settings I use.   This appears to be a result of an error being returned by the start function of the ISP driver:

root@imx8mpevk:/opt/imx8-isp/bin#
root@imx8mpevk:/opt/imx8-isp/bin# ./run.sh -c imx378
RUN_SCRIPT=/opt/imx8-isp/bin/run.sh
RUN_SCRIPT_PATH=/opt/imx8-isp/bin
Trying configuration "imx378"...
Starting isp_media_server with configuration file CAMERA0
[ 1575.105955] enter imx378_priv_ioctl (cmd = -2140645888)
[ 1575.111223] enter imx378_query_capability
[ 1575.163435] enter imx378_priv_ioctl (cmd = -2140645888)
[ 1575.168688] enter imx378_query_capability
loading [imx378.drv]...
[ 1575.190939] enter imx378_priv_ioctl (cmd = 261)
[ 1575.197381] enter imx378_query_supports
WARN : [DEWARP_HW] dw[ 1575.201767] enter imx378_priv_ioctl (cmd = -2140645888)
e type /dev/v4l-subdev0 0
[ 1575.209895] enter imx378_query_capability
WARN : [DEWARP_HW] dwe type /dev/v4l-subdev1 1
WARN : [DEWARP_HW] dwe type /dev/v4l-subdev2 2
loading [imx378.drv]...
[ 1575.241807] enter imx378_priv_ioctl (cmd = 261)
[ 1575.248236] enter imx378_query_supports
loading [imx378.drv]...
[ 1575.252899] enter imx378_priv_ioctl (cmd = 261)
[ 1575.259324] enter imx378_query_supports
loading [imx378.drv]...
[ 1575.264312] enter imx378_priv_ioctl (cmd = 261)
[ 1575.270708] enter imx378_query_supports
[ 1575.285873] enter imx378_priv_ioctl (cmd = 261)
[ 1575.290449] enter imx378_query_supports
[ 1575.294366] enter imx378_priv_ioctl (cmd = 257)
[ 1575.298938] enter imx378_priv_ioctl (cmd = 260)
[ 1575.303495] enter imx378_get_clk
[ 1575.306798] enter imx378_priv_ioctl (cmd = 259)
[ 1575.311367] enter imx378_priv_ioctl (cmd = 256)
[ 1575.315970] enter imx378_priv_ioctl (cmd = 262)
[ 1575.320519] enter imx378_set_sensor_mode
[ 1575.324479] enter imx378_priv_ioctl (cmd = 263)
[ 1575.329027] enter imx378_get_sensor_mode
[ 1575.332983] enter imx378_priv_ioctl (cmd = 261)
[ 1575.337522] enter imx378_query_supports
isp input: 4056x3040 RAW10
isp output: 3840x2160 YUV422I
dewarp input: 3840x2160 YUV422I
dewarp output: 3840x2160 YUV422I
[ 1575.431535] enter isp_mi_stop
[ 1575.436987] enter imx378_set_fmt
[ 1575.440238] enter imx378_write_reg_arry
[ 1575.748238] enter imx378_get_format_code
[ 1575.752190] enter imx378_priv_ioctl (cmd = 285)
[ 1575.756739] enter imx378_set_test_pattern
[ 1575.760817] enter imx378_write_reg
[ 1575.764872] enter imx378_write_reg
[ 1575.768871] enter imx378_write_reg
[ 1575.772940] enter imx378_write_reg
[ 1575.776975] enter imx378_priv_ioctl (cmd = 279)
[ 1575.781529] enter imx378_set_fps
[ 1575.784774] enter imx378_write_reg
[ 1575.788775] enter imx378_write_reg
[ 1575.792785] enter imx378_write_reg
[ 1575.796770] enter imx378_write_reg
[ 1575.800766] enter imx378_priv_ioctl (cmd = 263)
[ 1575.805320] enter imx378_get_sensor_mode
[ 1575.809508] enter imx378_priv_ioctl (cmd = 274)
[ 1575.814056] enter imx378_set_exp
[ 1575.817397] enter imx378_write_reg
[ 1575.821409] enter imx378_write_reg
[ 1575.825409] enter imx378_write_reg
[ 1575.829436] enter imx378_write_reg
[ 1575.833441] enter imx378_priv_ioctl (cmd = 277)
[ 1575.837986] enter imx378_set_gain
[ 1575.841330] enter imx378_write_reg
[ 1575.845322] enter imx378_write_reg
[ 1575.849325] enter imx378_write_reg
[ 1575.853327] enter imx378_write_reg
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_engine_interface.cpp:2156: start() = 13(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:427: inputConnect() = 13(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:1359: cameraConnect() = 13(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_engine_interface.cpp:2187: streamingStart() = 12(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:1084: streamingStart() = 12(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:1639: previewStart() = 12(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_engine_interface.cpp:2198: streamingStop() = 12(RET_WRONG_STATE)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:1104: streamingStop() = 12(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/[ 1581.094935] enter imx378_priv_ioctl (cmd = 272)
[ 1581.099651] enter imx378_s_stream
[ 1581.103013] enter imx378_write_reg
camera/cam_operations.cpp:1652: p[ 1581.107345] enter imx378_priv_ioctl (cmd = 260)
reviewStop() = 12(ret)
[ERR] /h[ 1581.114106] enter imx378_get_clk
ome/nxa14866/data/verisilicon_sw_[ 1581.120208] enter imx378_priv_ioctl (cmd = 259)
isp/units/cam_device/source/camer[ 1581.127589] enter imx378_priv_ioctl (cmd = 257)
a/cam_engine_interface.cpp:757: cprocEnableSet() = 12(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:820: inputDisconnect() = 12(ret)
[ERR] /home/nxa14866/data/verisilicon_sw_isp/units/cam_device/source/camera/cam_operations.cpp:1372: cameraDisconnect() = 12(ret)

 As shown above, all the proper configuration is being written to the camera and it is just about to start the stream when the ISP start function fails with a return code of 13.

Looking through the code, return code of 13 is

#define RET_INVALID_PARM 13 //!< invalid parameter

However I cannot find any information on what parameter is wrong.

Any thoughts?

-Chris

0 Kudos