Adding a new camera sensor driver without flashing

Hello,

is there a possibility to add a new camera sensor driver without flashing the Jetson device?
My current steps:

that doesn’t seem to be enough, what am I missing?
By the way, I use Jetson Linux 36.3

hello daniel.kammerer,

it’s possible (add a new camera sensor driver without flashing) by running with JP-6.0/ r36.3.

practically, you may configure your sensor driver as a loadable module, Loadable Kernel Module (LKM).
you should also create Device-tree overlay for device registration.
please see-also Release Notes (r36.3) for [4. Implementation Details].

hello JerryChang,

this is actually what i have been trying to do without success, but before i go into detail, i would like to ask one thing.
If no camera is connected and i select the imx185 camera in the jetson-io tool, what should happen?

Because when I do that, after a reboot I get no error message (sudo dmesg -w) regarding the imx185 or tca9546 and also the modules are not loaded (lsmod), I can do it manually with “modprobe nv_imx185”, then it is listed, but there is still no kernel message.

I would expect an error message because it can’t find the devices or get a response from the i2c channel, is my assumption wrong or am I missing something?
because if it doesn’t work with the inbuilt imx185 driver, I don’t even need to try with my own driver.

hello daniel.kammerer,

it should have kernel messages reported for sensor registration.
for example,
here’re kernel logs from AGX Orin/r36.3 to detect IMX274 camera sensors.

[   10.265344] imx274 9-001a: probing v4l2 sensor.
[   10.265459] imx274 9-001a: supply vana not found, using dummy regulator
[   10.265908] imx274 9-001a: supply vif not found, using dummy regulator
[   10.266010] imx274 9-001a: tegracam sensor driver:imx274_v2.0.6
[   10.284946] tegra-camrtc-capture-vi tegra-capture-vi: subdev imx274 9-001a bound
[   10.318797] imx274 9-001a: Detected IMX274 sensor

did you have Boot Time Optimization, or… did you using quiet property in the kernel command-line (i.e. $ cat /proc/cmdline) to disable the logs?

hello JerryChang,

if it is not set by default, then no.

to rule out other errors, I deleted the nvidia folder in my home directory and reinstalled my Orin without any modification with the SDKManager (HW: Jetson AGX Orin 32GB DevKit , SW: JetPack 6.0 rev. 2), but I skipped the “last step” of installing the SDK components because this step doesn’t work for some reason.

after the installation I opened the tool Jetson-io.py → “Configure Jetson AGX CSI Connector” → “Configure for compatible hardware” → “Jetson Camera Dual-IMX274” or “Jetson Camera IMX185” or “Jetson Camera IMX390” (I tried all three) → “Save pin changes” → “Save and reboot to reconfigure pins” → press any key

During the boot process, when the Nvidia logo is displayed, I see e.g. “1: Custom Header Config: CSI Jetson Camera IMX390”

and when I then run the command “sudo dmesg -w” and search for “imx” I find no entry (nothing is connected to the CSI2 or I2C interface)

I really don’t understand what I’m doing wrong

please try… $ sudo dmesg | grep -i IMX

I have tried for all 3 IMX sensors and there is never a return.
I also searched for tca and pca and at least for the IMX390 I got a return for pca
“pca954x 2-0070: probe failed”

Update:
I also checked the other cameras and received the expected response, at least for the “Jetson Camera Hawk-Owl p3762 module”

Jetson Camera Hawk-Owl p3762 module:

[   10.789695] ar0234 2-0036: probing v4l2 sensor.
[   10.789706] ar0234 2-0036: ar0234_probe: channel 1
[   10.789709] ar0234 2-0036: ar0234_probe: sync_sensor = OWL4 
[   10.789861] ar0234 2-0036: tegracam sensor driver:ar0234_v2.0.6
[   10.791918] ar0234 9-0031: probing v4l2 sensor.
[   10.791922] ar0234 9-0031: ar0234_probe: channel 0
[   10.791923] ar0234 9-0031: ar0234_probe: sync_sensor = HAWK1 
[   10.793606] ar0234 9-0031: tegracam sensor driver:ar0234_v2.0.6
...

[   10.527877] max96712 2-0062: max96712_probe: enter
[   10.527945] max96712 2-0062: max96712_power_on: pwdn_gpio = 486
[   10.635236] max96712 2-0062: max96712_probe:  success
[   10.641309] max96712 8-0062: max96712_probe: enter
[   10.641459] max96712 8-0062: max96712_power_on: pwdn_gpio = 397
[   10.747209] max96712 8-0062: max96712_probe:  success
...

Jetson Camer e3653-dual-Hawk module:

[    3.986306] pca954x 2-0070: probe failed

Jetson Camera AR1335:

[    3.929960] pca954x 2-0070: probe failed
[    3.944744] pca953x 1-0022: supply vcc not found, using dummy regulator
[    3.944887] pca953x 1-0022: using AI
[    3.946188] pca953x 1-0022: failed writing register
[    3.946328] pca953x: probe of 1-0022 failed with error -121

I noticed that the device tree layout is different between Hawk-Owl p3762 and IMX185.
After using the p3762 as a base for my own driver, it seems to work.
Tomorrow I will test further and report back

so after a bit of testing I can confirm that it now works when I use the device tree from the “Hawk-Owl p3762” as a base
There is only one cosmetic thing that bothers me a little:
My original sensor (imx728) that I flashed the Orin with is still in my kernel log, how can I get rid of it?

[    3.934395] i2c i2c-2: Failed to register i2c client imx728 at 0x1a (-16)
[    3.934398] i2c i2c-2: of_i2c: Failure registering /bus@0/i2c@3180000/imx728@1a
[    3.934403] i2c i2c-2: Failed to create I2C device for /bus@0/i2c@3180000/imx728@1a
[   10.784590] imx800 2-001a: probing v4l2 sensor
[   10.784713] imx800 2-001a: tegracam sensor driver:imx800_v2.0.6
[   10.784764] tegra-camrtc-capture-vi tegra-capture-vi: subdev imx800 2-001a bound
[   10.785699] imx800 2-001a: Detected IMX800 sensor

hello daniel.kammerer,

cool, thanks for sharing the results.

may I confirm how you load the sensor driver?
you may see-also Device Registration for reference.

I hope like in your link, with the Overlay file and Jetson-IO tool.
below you can see my code.
and after that as I mentioned in the beginning:

  • rebuild kernel, modules and dtbs
  • copy files from Host to Orin:
  • kernel (Linux_for_Tegra/kernel/Image to /boot/dtb/)
  • DTBs/DTBOs (Linux_for_Tegra/kernel/dtb/* to /boot/dtb/)
  • modules (Linux_for_Tegra/rootfs/lib/modules/* to lib/modules/5.15.136-tegra/)
  • start Jetson-IO Tool and select the new camera

tegra234-camera-imx800-a00.dtsi

/ {
	fragment-camera@0 {
		target-path = "/";
		__overlay__ {
			tegra-capture-vi {
				num-channels = <1>;
				status = "okay";
				ports {
					#address-cells = <1>;
					#size-cells = <0>;
					status = "okay";
					port@0 {
						reg = <0>;
						status = "okay";
						liimx800_vi_in0: endpoint {
							port-index = <0>;
							bus-width = <4>;
							remote-endpoint = <&liimx800_csi_out0>;
							status = "okay";
						};
					};
				};
			};
			bus@0 {
				host1x@13e00000 {
					nvcsi@15a00000 {
						num-channels = <1>;
						#address-cells = <1>;
						#size-cells = <0>;
						status = "okay";
						channel@0 {
							reg = <0>;
							status = "okay";
							ports {
								#address-cells = <1>;
								#size-cells = <0>;
								status = "okay";
								port@0 {
									reg = <0>;
									status = "okay";
									liimx800_csi_in0: endpoint@0 {
										port-index = <0>;
										bus-width = <4>;
										remote-endpoint = <&liimx800_imx800_out0>;
										status = "okay";
									};
								};
								port@1 {
									reg = <1>;
									status = "okay";
									liimx800_csi_out0: endpoint@1 {
										remote-endpoint = <&liimx800_vi_in0>;
										status = "okay";
									};
								};
							};
						};
					};
				};
				i2c@3180000 {	
					imx800@1a {
						compatible = "sony,imx800";
						reg = <0x1a>;
						devnode = "video0";
						physical_w = "8.100";
						physical_h = "4.572";
						sensor_model = "imx800";
						status = "okay";
						mode0 {
							status = "okay";
							mclk_khz = "25000";
							num_lanes = "4";
							tegra_sinterface = "serial_a";
							phy_mode = "DPHY";
							discontinuous_clk = "no";
							dpcm_enable = "false";
							cil_settletime = "0";
							dynamic_pixel_bit_depth = "12";
							csi_pixel_bit_depth = "12";
							mode_type = "bayer";
							pixel_phase = "rggb";

							active_w = "3856";
							active_h = "2202";
							readout_orientation = "0";
							line_length = "3856";
							inherent_gain = "1";
							/*mclk_multiplier = "2";*/
							pix_clk_hz = "305672832";
							serdes_pix_clk_hz = "400000000";

							gain_factor = "10";
							min_gain_val = "0"; /* 0dB */
							max_gain_val = "1024"; /* 48dB */
							step_gain_val = "1"; /* 0.3 */
							default_gain = "256";
							min_hdr_ratio = "1";
							max_hdr_ratio = "1";
							framerate_factor = "1000000";
							min_framerate = "30000000"; /* 1.5 */
							max_framerate = "36000000"; /* 30 */
							step_framerate = "1";
							default_framerate= "30000000";
							exposure_factor = "1000000";
							min_exp_time = "1000"; /* us */
							max_exp_time = "30000"; /* us */
							step_exp_time = "1000";
							default_exp_time = "10000";/* us */
							embedded_metadata_height = "0";
						};

						ports {
							#address-cells = <1>;
							#size-cells = <0>;
							status = "okay";
							port@0 {
								reg = <0>;
								status = "okay";
								liimx800_imx800_out0: endpoint {
									port-index = <0>;
									bus-width = <4>;
									remote-endpoint = <&liimx800_csi_in0>;
									status = "okay";
								};
							};
						};
					};
				};
			};
			tegra-camera-platform {
				compatible = "nvidia, tegra-camera-platform";
				num_csi_lanes = <4>;
				max_lane_speed = <1200000>;
				min_bits_per_pixel = <12>;
				vi_peak_byte_per_pixel = <2>;
				vi_bw_margin_pct = <25>;
				isp_peak_byte_per_pixel = <5>;
				isp_bw_margin_pct = <25>;
				status = "okay";
				modules {
					status = "okay";
					module0 {
						badge = "imx800_rear_liimx800";
						position = "rear";
						orientation = "0";
						status = "okay";
						drivernode0 {
							pcl_id = "v4l2_sensor";
							sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/imx800@1a";
							status = "okay";
						};
					};
				};
			};
		};
	};
};

tegra234-p3737-camera-imx800-overlay.dts

// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
/*
 * Jetson Device-tree overlay for Camera IMX800 on t23x platforms
 *
 */

/dts-v1/;
/plugin/;

#include "tegra234-camera-imx800-a00.dtsi"
#include <dt-bindings/clock/tegra234-clock.h>
#include <dt-bindings/tegra234-p3737-0000+p3701-0000.h>

/ {
	overlay-name = "Jetson Camera IMX800";
	jetson-header-name = "Jetson AGX CSI Connector";
	compatible = JETSON_COMPATIBLE;

	fragment-camera@0 {
		target-path = "/";
		__overlay__ {
			tegra-capture-vi {
				num-channels = <1>;
				status = "okay";
				ports {
					status = "okay";
					port@0 {
						status = "okay";
						liimx800_vi_in0: endpoint {
							status = "okay";
							port-index = <0>;
							bus-width = <4>;
							remote-endpoint = <&liimx800_csi_out0>;
						};
					};
				};
			};
			tegra-camera-platform {
				modules {
					status = "okay";
					module0 {
						status = "okay";
						badge = "imx800_rear_liimx800";
						position = "rear";
						orientation = "0";
						drivernode0 {
							status = "okay";
							pcl_id = "v4l2_sensor";
							sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@3180000/imx800@1a";
						};
					};
				};
			};
			bus@0 {
				host1x@13e00000 {
					nvcsi@15a00000 {
						num-channels = <1>;
						status = "okay";
						channel@0 {
							status = "okay";
							ports {
								status = "okay";
								port@0 {
									status = "okay";
									liimx800_csi_in0: endpoint@0 {
										status = "okay";
										port-index = <0>;
										bus-width = <4>;
										remote-endpoint = <&liimx800_imx800_out0>;
									};
								};
								port@1 {
									status = "okay";
									liimx800_csi_out0: endpoint@1 {
										status = "okay";
										remote-endpoint = <&liimx800_vi_in0>;
									};
								};
							};
						};
					};
				};
				i2c@3180000 {	
					imx800@1a {
						status = "okay";
						clocks = <&bpmp TEGRA234_CLK_EXTPERIPH1>,
							 <&bpmp TEGRA234_CLK_EXTPERIPH1>;
						clock-names = "extperiph1", "pllp_grtba";
						mclk = "extperiph1";
						ports {
							status = "okay";
							port@0 {
								status = "okay";
								liimx800_imx800_out0: endpoint {
									status = "okay";
									port-index = <0>;
									bus-width = <4>;
									remote-endpoint = <&liimx800_csi_in0>;
								};
							};
						};
					};
				};
			};
		};
	};

	fragment-camera-imx800@0 {
		target-path = "/";
		__overlay__ {
			bus@0 {
				i2c@3180000 {
					imx800@1a {
						status = "okay";
						clocks = <&bpmp TEGRA234_CLK_EXTPERIPH1>,
							 <&bpmp TEGRA234_CLK_EXTPERIPH1>;
						clock-names = "extperiph1", "pllp_grtba";
						mclk = "extperiph1";
					};
				};
			};
		};
	};
};

tegra234-p3737-camera-modules.dtsi

// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

#include "tegra234-camera-e3331-a00.dtsi"
#include "tegra234-camera-e3333-a00.dtsi"
#include "tegra234-camera-imx390-a00.dtsi"
#include "tegra234-camera-ar0234-a00.dtsi"
#include "tegra234-camera-imx800-a00.dtsi"
#include "tegra234-p3737-0000-camera-imx185-a00.dtsi"
#include "tegra234-p3737-0000-camera-imx274-dual.dtsi"

#define CAM0_RST_L	TEGRA234_MAIN_GPIO(H, 3)
#define CAM0_PWDN	TEGRA234_MAIN_GPIO(H, 6)
#define CAM1_RST_L	TEGRA234_MAIN_GPIO(AC, 1)
#define CAM1_PWDN	TEGRA234_MAIN_GPIO(AC, 0)

/ {
	fragment-camera-module@0 {
		target-path = "/";
		__overlay__ {
			/* all cameras are disabled by default */
			capture_vi_base: tegra-capture-vi {
				ports {
					vi_port0: port@0 {
						status = "disabled";
						vi_in0: endpoint {
							vc-id = <0>;
							status = "disabled";
						};
					};
					vi_port1: port@1 {
						status = "disabled";
						vi_in1: endpoint {
							vc-id = <0>;
							status = "disabled";
						};
					};
					vi_port2: port@2 {
						status = "disabled";
						vi_in2: endpoint {
							vc-id = <0>;
							status = "disabled";
						};
					};
					vi_port3: port@3 {
						status = "disabled";
						vi_in3: endpoint {
							vc-id = <0>;
							status = "disabled";
						};
					};
					vi_port4: port@4 {
						status = "disabled";
						vi_in4: endpoint {
							vc-id = <0>;
							status = "disabled";
						};
					};
					vi_port5: port@5 {
						status = "disabled";
						vi_in5: endpoint {
							vc-id = <0>;
							status = "disabled";
						};
					};
				};
			};

			tcp: tegra-camera-platform {
				compatible = "nvidia, tegra-camera-platform";
				/**
				* tpg_max_iso = <>;
				* Max iso bw for 6 streams of tpg
				* streams * nvcsi_freq * PG_bitrate / RG10 * BPP
				* 6 * 102Mhz * 32 bits/ 10 bits * 2 Bps
				* = 3916.8 MBps
				*/
				tpg_max_iso = <3916800>;
				modules {
					cam_module0: module0 {
						status = "disabled";
						cam_module0_drivernode0: drivernode0 {
							status = "disabled";
						};
						cam_module0_drivernode1: drivernode1 {
							status = "disabled";
							pcl_id = "v4l2_lens";
						};
					};
					cam_module1: module1 {
						status = "disabled";
						cam_module1_drivernode0: drivernode0 {
							status = "disabled";
						};
						cam_module1_drivernode1: drivernode1 {
							status = "disabled";
							pcl_id = "v4l2_lens";
						};
					};
					cam_module2: module2 {
						status = "disabled";
						cam_module2_drivernode0: drivernode0 {
							status = "disabled";
						};
						cam_module2_drivernode1: drivernode1 {
							status = "disabled";
							pcl_id = "v4l2_lens";
						};
					};
					cam_module3: module3 {
						status = "disabled";
						cam_module3_drivernode0: drivernode0 {
							status = "disabled";
						};
						cam_module3_drivernode1: drivernode1 {
							status = "disabled";
							pcl_id = "v4l2_lens";
						};
					};
					cam_module4: module4 {
						status = "disabled";
						cam_module4_drivernode0: drivernode0 {
							status = "disabled";
						};
						cam_module4_drivernode1: drivernode1 {
							status = "disabled";
							pcl_id = "v4l2_lens";
						};
					};
					cam_module5: module5 {
						status = "disabled";
						cam_module5_drivernode0: drivernode0 {
							status = "disabled";
						};
						cam_module5_drivernode1: drivernode1 {
							status = "disabled";
							pcl_id = "v4l2_lens";
						};
					};
				};
			};

			bus@0 {
				/* set camera gpio direction to output */
				gpio@2200000 {
					camera-control-output-low {
						gpio-hog;
						output-low;
						gpios = <CAM0_RST_L 0 CAM0_PWDN 0
							 CAM1_RST_L 0 CAM1_PWDN 0>;
						label = "cam0-rst", "cam0-pwdn",
							"cam1-rst", "cam1-pwdn";
					};
				};

				host1x@13e00000 {
					csi_base: nvcsi@15a00000 {
						num-tpg-channels = <36>;
						csi_chan0: channel@0 {
							status = "disabled";
							ports {
								csi_chan0_port0: port@0 {
									status = "disabled";
									csi_in0: endpoint@0 {
										status = "disabled";
									};
								};
								csi_chan0_port1: port@1 {
									status = "disabled";
									csi_out0: endpoint@1 {
										status = "disabled";
									};
								};
							};
						};
						csi_chan1: channel@1 {
							status = "disabled";
							ports {
								csi_chan1_port0: port@0 {
									status = "disabled";
									csi_in1: endpoint@2 {
										status = "disabled";
									};
								};
								csi_chan1_port1: port@1 {
									status = "disabled";
									csi_out1: endpoint@3 {
										status = "disabled";
									};
								};
							};
						};
						csi_chan2: channel@2 {
							status = "disabled";
							ports {
								csi_chan2_port0: port@0 {
									status = "disabled";
									csi_in2: endpoint@4 {
										status = "disabled";
									};
								};
								csi_chan2_port1: port@1 {
									status = "disabled";
									csi_out2: endpoint@5 {
										status = "disabled";
									};
								};
							};
						};
						csi_chan3: channel@3 {
							status = "disabled";
							ports {
								csi_chan3_port0: port@0 {
									status = "disabled";
									csi_in3: endpoint@6 {
										status = "disabled";
									};
								};
								csi_chan3_port1: port@1 {
									status = "disabled";
									csi_out3: endpoint@7 {
										status = "disabled";
									};
								};
							};
						};
						csi_chan4: channel@4 {
							status = "disabled";
							ports {
								csi_chan4_port0: port@0 {
									status = "disabled";
									csi_in4: endpoint@8 {
										status = "disabled";
									};
								};
								csi_chan4_port1: port@1 {
									status = "disabled";
									csi_out4: endpoint@9 {
										status = "disabled";
									};
								};
							};
						};
						csi_chan5: channel@5 {
							status = "disabled";
							ports {
								csi_chan5_port0: port@0 {
									status = "disabled";
									csi_in5: endpoint@10 {
										status = "disabled";
									};
								};
								csi_chan5_port1: port@1 {
									status = "disabled";
									csi_out5: endpoint@11 {
										status = "disabled";
									};
								};
							};
						};
					};
				};
				i2c@3180000 {
					imx800@1a {
						status = "disabled";
					};
					tca6408@21 {
						status = "disabled";
					};
					tca9548@77 {
						status = "disabled";
						i2c@0 {
							ov5693_a@36 {
								status = "disabled";
							};
						};
						i2c@1 {
							ov5693_b@36 {
								status = "disabled";
							};
						};
						i2c@2 {
							ov5693_c@36 {
								status = "disabled";
							};
						};
						i2c@3 {
							ov5693_d@36 {
								status = "disabled";
							};
						};
						i2c@4 {
							ov5693_e@36 {
								status = "disabled";
							};
						};
						i2c@5 {
							ov5693_g@36 {
								status = "disabled";
							};
						};
					};
					tca9548@70 {
						status = "disabled";
						i2c@0 {
							ar1335_a@42 {
								status = "disabled";
							};
						};
						i2c@2 {
							ar1335_c@42 {
								status = "disabled";
							};
						};
						i2c@4 {
							ar1335_e@42 {
								status = "disabled";
							};
						};
						i2c@5 {
							ar1335_g@42 {
								status = "disabled";
							};
						};
					};
					tca9546@70 {
						status = "disabled";
						i2c@0 {
							dual_hawk0: dual_hawk_a@18 {
								status = "disabled";
							};
							dual_hawk1: dual_hawk_b@10 {
								status = "disabled";
							};
							max96712_dser: single_max96712_a@62 {
								status = "disabled";
							};
							pca9570_a@24 {
								status = "disabled";
							};
							imx274_a@1a {
								status = "disabled";
							};
							imx185_a@1a {
								status = "disabled";
							};
							imx318_a@10 {
								status = "disabled";
							};
							max9296@48 {
								status = "disabled";
							};
							max9295_prim@62 {
								status = "disabled";
							};
							max9295_a@40 {
								status = "disabled";
							};
							max9295_b@60 {
								status = "disabled";
							};
							imx390_a@1b {
								status = "disabled";
							};
							imx390_b@1c {
								status = "disabled";
							};
						};
						i2c@1 {
							dual_hawk2: dual_hawk_c@18 {
								status = "disabled";
							};
							dual_hawk3: dual_hawk_d@10 {
								status = "disabled";
							};
							imx274_c@1a {
								status = "disabled";
							};
						};
					};
				};
			};
		};
	};
};

hello daniel.kammerer,

I don’t see IMX728 in your latest code, it should not load IMX728.
is there IMX728’s kernel modules on your target?

hello JerryChang,

no, but there are still some files that I cannot delete:
/sys/firmware/devicetree/base/bus@0/i2c@3180000/imx728@1a
/sys/firmware/devicetree/base/__symbols__/

hello daniel.kammerer,

it should your base device tree with some definition of IMX728.
please review your implementation, you may try rebuild the kernel sources and updating the DTB accordingly.

hello JerryChang,

I can’t find any file mentioning imx728, neither in the source files on my host PC nor on the Orin.
and when I decompile the tegra234-p3737-0000+p3701-0000-dynamic.dtbo, no imx728 is mentioned either. (wasn’t really necessary because the search command also searches within dtbo’s, but just to be sure)

another thing i have noticed, only when i select my driver in the jetson io tool, the imx728 error appear in the kernel protocol.
if I select another sensor it does not appear, but the entrys in:
/sys/firmware/devicetree/base/bus@0/i2c@3180000/imx728@1a
/sys/firmware/devicetree/base/__symbols__/
are still available

hello daniel.kammerer,

you should dig into your base device tree instead of overlay files.

please also note that,
the default DTB and overlays to be located in the same place (i.e. on the QSPI). Hence, now by default there is no DTB specified in the extlinux.conf.
however, you can specify FDT alone. you can specify FDT + OVERLAYS. you CANNOT do only OVERLAYS though.
overlays from Rootfs are processed only if DTB is coming from Rootfs. when FDT entry is not present in extlinux.conf UEFI DTB is used.

hello JerryChang,

this is my extlinux.conf

TIMEOUT 30
DEFAULT JetsonIO

MENU TITLE L4T boot options

LABEL primary
      MENU LABEL primary kernel
      LINUX /boot/Image
      INITRD /boot/initrd
      APPEND ${cbootargs} root=PARTUUID=bd0f91da-131b-4fd9-bb82-4189944e6ef5 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 nospectre_bhb video=efifb:off console=tty0 

# When testing a custom kernel, it is recommended that you create a backup of
# the original kernel and add a new entry to this file so that the device can
# fallback to the original kernel. To do this:
#
# 1, Make a backup of the original kernel
#      sudo cp /boot/Image /boot/Image.backup
#
# 2, Copy your custom kernel into /boot/Image
#
# 3, Uncomment below menu setting lines for the original kernel
#
# 4, Reboot

# LABEL backup
#    MENU LABEL backup kernel
#    LINUX /boot/Image.backup
#    INITRD /boot/initrd
#    APPEND ${cbootargs}

LABEL JetsonIO
	MENU LABEL Custom Header Config: <CSI Jetson Camera IMX800>
	LINUX /boot/Image
	FDT /boot/dtb/kernel_tegra234-p3737-0000+p3701-0000-nv.dtb
	INITRD /boot/initrd
	APPEND ${cbootargs} root=PARTUUID=bd0f91da-131b-4fd9-bb82-4189944e6ef5 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 nospectre_bhb video=efifb:off console=tty0
	OVERLAYS /boot/tegra234-p3737-camera-imx800-overlay.dtbo

in the FDT (kernel_tegra234-p3737-0000+p3701-0000-nv.dtb) neither imx728 nor imx800 is mentioned

and when I search for imx728 or imx800 in the files

$ sudo find /boot -type f -exec grep -l "imx728" {} \;
$ sudo find /boot -type f -exec grep -l "imx800" {} \;
/boot/tegra234-p3737-0000+p3701-0000-dynamic.dtbo
/boot/tegra234-p3737-camera-imx800-overlay.dtbo
/boot/extlinux/extlinux.conf

hello daniel.kammerer,

you may also update kernel-dtb partition completely. there’re two partitions,A_kernel-dtb and B_kernel-dtb.

hello JerryChang,

in my case it was not enough to flash the A_kernel-dtb and B_kernel-dtb
but after I had flashed the QSPI, my old camera was gone.
$ sudo ./flash.sh --no-systemimg -c bootloader/generic/cfg/flash_t234_qspi.xml
at the moment, this approach is fine for me.

thanks for your help