<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://developerwiki.proventusnova.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nico</id>
	<title>ProventusNova DeveloperWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://developerwiki.proventusnova.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nico"/>
	<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/Special:Contributions/Nico"/>
	<updated>2026-05-10T12:04:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=552</id>
		<title>How to read EEPROM data from NVIDIA Jetson platforms</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=552"/>
		<updated>2025-12-05T17:22:36Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Identifying your Jetson SoM by reading the EEPROM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to read EEPROM data from NVIDIA Jetson Platforms=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification, system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
Use this table to cross-reference the module part number obtained from the EEPROM dump.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is EEPROM? ==&lt;br /&gt;
EEPROM stand for electrically erasable programmable read-only memory. Is a non-volatile memory chip used to store important information, such as the module&#039;s part number, used for identifying and validating the System-on-Module (SoM).&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference.&lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represents the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Additional Commands for Module Verification ===&lt;br /&gt;
These commands provide supplementary ways to check your Jetson SoM and board information. Unlike reading the EEPROM, these methods are &#039;&#039;&#039;not authoritative&#039;&#039;&#039; and can be modified by software. Use these commands only for cross-checking or convenience. &lt;br /&gt;
&lt;br /&gt;
1. Run the following command to check your board’s model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/firmware/devicetree/base/model&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should return something like: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia,p3768-0000+p3767-0000nvidia,p3767-0000nvidia,tegra234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Check the SoM with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/device-tree/compatible&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=551</id>
		<title>How to read EEPROM data from NVIDIA Jetson platforms</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=551"/>
		<updated>2025-12-05T17:22:08Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* How to read EEPROM data from NVIDIA Jetson Platforms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to read EEPROM data from NVIDIA Jetson Platforms=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification, system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
Use this table to cross-reference the module part number obtained from the EEPROM dump.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is EEPROM? ==&lt;br /&gt;
EEPROM stand for electrically erasable programmable read-only memory. Is a non-volatile memory chip used to store important information, such as the module&#039;s part number, used for identifying and validating the System-on-Module (SoM).&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM by reading the EEPROM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference.&lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represents the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Additional Commands for Module Verification ===&lt;br /&gt;
These commands provide supplementary ways to check your Jetson SoM and board information. Unlike reading the EEPROM, these methods are &#039;&#039;&#039;not authoritative&#039;&#039;&#039; and can be modified by software. Use these commands only for cross-checking or convenience. &lt;br /&gt;
&lt;br /&gt;
1. Run the following command to check your board’s model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/firmware/devicetree/base/model&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should return something like: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia,p3768-0000+p3767-0000nvidia,p3767-0000nvidia,tegra234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Check the SoM with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/device-tree/compatible&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=550</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=550"/>
		<updated>2025-12-05T17:18:55Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* ⚙️ Technical Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Welcome to the ProventusNova Developer Wiki =&lt;br /&gt;
&#039;&#039;&#039;Expert knowledge for Embedded Systems, AI, and Software Development.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Looking to build high-performance embedded systems, optimize AI models, or streamline multimedia processing? This wiki is a &#039;&#039;&#039;public knowledge hub&#039;&#039;&#039; designed to help engineers, developers, and businesses solve real-world technical challenges.  &lt;br /&gt;
&lt;br /&gt;
Here, you’ll find &#039;&#039;&#039;step-by-step tutorials, best practices, and deep technical insights&#039;&#039;&#039; to help you bring your projects to life.  &lt;br /&gt;
&lt;br /&gt;
== 🚀 What You’ll Find Here ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🛠️ Hands-on Tutorials&#039;&#039;&#039;  &lt;br /&gt;
Practical guides to get you started quickly.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;📋 Industry Best Practices&#039;&#039;&#039;  &lt;br /&gt;
Proven workflows and methodologies.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;⚡ Optimized Solutions&#039;&#039;&#039;  &lt;br /&gt;
Performance tuning for embedded, AI, and multimedia applications.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🌍 Open-Source Resources&#039;&#039;&#039;  &lt;br /&gt;
Code samples, frameworks, and tools to accelerate development.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether you&#039;re an individual developer, a startup, or an enterprise, you’ll find resources here to &#039;&#039;&#039;enhance your expertise and improve your products&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ⚙️ Technical Resources ==&lt;br /&gt;
&lt;br /&gt;
Learn about core development domains, including embedded systems, AI, multimedia pipelines, and cloud-native solutions. Each section provides curated insights, guides, and best practices to help you build with assurance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded Systems Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Embedded Systems Development]] – BSPs, firmware, and real-time processing.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Embedded&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Embedded Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Yocto&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto meta layer|Create custom Yocto meta layer]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto recipe|Create custom Yocto recipe]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Create custom Yocto meta layer for MediaTek G510 board|Create custom Yocto meta layer for MediaTek G510 board]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to add a custom partition layout to NVIDIA Jetson Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to read EEPROM data from NVIDIA Jetson platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Nvidia&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Nano developer setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Orin NX with CTI Boson carrier board setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Jetson Linux BSP and Kernel Source Setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Adding Custom device tree overlay to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to add a loadable kernel module (LKM) to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Jetson CSI Camera Bring-Up, Debugging, and Development Guide]]&amp;lt;li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to run NVIDIA NanoOWL tutorial]]&amp;lt;li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- AI &amp;amp; CV Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[AI &amp;amp; Computer Vision]] – Edge AI, model training, and deployment.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GStreamer Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[GStreamer Development]] – High-performance video and audio streaming.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Fundamentals]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Daemon]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Interpipes]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Application Development]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Best Practices]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer video streaming, recording and snapshots with tee on Python]]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Web &amp;amp; Cloud Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Web &amp;amp; Cloud Solutions]] – Scalable, production-ready applications.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 👀 Are you a PM looking to expand your knowledge in the software development industry? ==&lt;br /&gt;
&lt;br /&gt;
This tutorial is for you!  &lt;br /&gt;
Explore essential concepts that will help you navigate technical discussions with engineers and clients more confidently.&lt;br /&gt;
&lt;br /&gt;
📄&#039;&#039;&#039;[[Project Manager Tutorials]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Developer Tools ==&lt;br /&gt;
&lt;br /&gt;
This section provides essential guidelines and practices to ensure consistency, clarity, and efficiency across all development efforts. These tools and standards help teams collaborate better and maintain high-quality codebases.&lt;br /&gt;
&lt;br /&gt;
🔀 &#039;&#039;&#039;[[Git workflow]]&#039;&#039;&#039;: A structured guide to how our team uses Git—from branching strategies to pull request protocols—ensuring smooth collaboration and clean version history.&lt;br /&gt;
&lt;br /&gt;
🧾 &#039;&#039;&#039;[[Naming Conventions]]&#039;&#039;&#039;: Standardized naming rules for code elements such as variables, functions, classes, and files, helping improve readability and maintainability across projects.&lt;br /&gt;
&lt;br /&gt;
== 🐞🛠️ Debugging methods and error/bug fixes ==&lt;br /&gt;
This section provides the best debugging methods as well as common error/bug fixes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yocto&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Yocto Project related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Error:_BitBake_%2B_AppArmor_User_Namespace_Restriction_Fix|Error: BitBake+AppArmor User Namespace Restriction Fix]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nvidia&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nvidia related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Debug_NVIDIA_Jetson_nvv4l2av1enc_VPR_Violation_(EMEM_decode_error)| Debug NVIDIA Jetson nvv4l2av1enc VPR Violation (EMEM decode error)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== 👀 Are You a PM Looking to Level Up in Software Development? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 1.1em; line-height: 1.6;&amp;quot;&amp;gt;&lt;br /&gt;
This tutorial is made just for you!  &lt;br /&gt;
Gain a solid grasp of essential software development concepts so you can confidently engage in technical discussions with both engineers and clients.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
📘&amp;lt;span class=&amp;quot;fa fa-book&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;&#039;[[Project Manager Tutorials|Start the Tutorial →]]&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Footer}}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=549</id>
		<title>How to read EEPROM data from NVIDIA Jetson platforms</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=549"/>
		<updated>2025-12-05T17:18:12Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Reading the EEPROM information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to read EEPROM data from NVIDIA Jetson Platforms=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;Orin Nano, Orin NX, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
Use this table to cross-reference the module part number obtained from the EEPROM dump.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is EEPROM? ==&lt;br /&gt;
EEPROM stand for electrically erasable programmable read-only memory. Is a non-volatile memory chip used to store important information, such as the module&#039;s part number, used for identifying and validating the System-on-Module (SoM).&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference.&lt;br /&gt;
&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represents the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Additional Commands for Module Verification ===&lt;br /&gt;
These commands provide supplementary ways to check your Jetson SoM and board information. Unlike reading the EEPROM, these methods are &#039;&#039;&#039;not authoritative&#039;&#039;&#039; and can be modified by software. Use these commands only for cross-checking or convenience. &lt;br /&gt;
&lt;br /&gt;
1. Run the following command to check your board’s model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/firmware/devicetree/base/model&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should return something like: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia,p3768-0000+p3767-0000nvidia,p3767-0000nvidia,tegra234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Check the SoM with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/device-tree/compatible&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=548</id>
		<title>How to read EEPROM data from NVIDIA Jetson platforms</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=548"/>
		<updated>2025-12-05T17:16:46Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to read EEPROM data from NVIDIA Jetson Platforms=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;Orin Nano, Orin NX, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
Use this table to cross-reference the module part number obtained from the EEPROM dump.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is EEPROM? ==&lt;br /&gt;
EEPROM stand for electrically erasable programmable read-only memory. Is a non-volatile memory chip used to store important information, such as the module&#039;s part number, used for identifying and validating the System-on-Module (SoM).&lt;br /&gt;
&lt;br /&gt;
== Reading the EEPROM information ==&lt;br /&gt;
In this tutorial I will be using an &#039;&#039;&#039;Orin NX 16GB&#039;&#039;&#039; SoM part number &#039;&#039;&#039;p3767-0000&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
1. Identify the I2C bus where the EEPROM device is. It should be located at address &#039;&#039;&#039;0x50&#039;&#039;&#039; of the bus for the SoM. For example for I2C bus 0:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
nvidia@tegra-ubuntu:~$ sudo i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At address &#039;&#039;&#039;0x50&#039;&#039;&#039;, the &#039;&#039;&#039;UU&#039;&#039;&#039; references the EEPROM. &lt;br /&gt;
&lt;br /&gt;
2. Read EEPROM contents: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
nico@tegra-ubuntu:~$ sudo i2cdump -f -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice the &#039;&#039;&#039;699-13767-0000-301&#039;&#039;&#039; references my &#039;&#039;&#039;Orin NX 16GB&#039;&#039;&#039; SoM.&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=547</id>
		<title>How to read EEPROM data from NVIDIA Jetson platforms</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_read_EEPROM_data_from_NVIDIA_Jetson_platforms&amp;diff=547"/>
		<updated>2025-12-05T17:16:17Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to read EEPROM data from NVIDIA Jetson Platforms=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;Orin Nano, Orin NX, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== What is EEPROM? ==&lt;br /&gt;
EEPROM stand for electrically erasable programmable read-only memory. Is a non-volatile memory chip used to store important information, such as the module&#039;s part number, used for identifying and validating the System-on-Module (SoM).&lt;br /&gt;
&lt;br /&gt;
== Reading the EEPROM information ==&lt;br /&gt;
In this tutorial I will be using an &#039;&#039;&#039;Orin NX 16GB&#039;&#039;&#039; SoM part number &#039;&#039;&#039;p3767-0000&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
1. Identify the I2C bus where the EEPROM device is. It should be located at address &#039;&#039;&#039;0x50&#039;&#039;&#039; of the bus for the SoM. For example for I2C bus 0:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
nvidia@tegra-ubuntu:~$ sudo i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At address &#039;&#039;&#039;0x50&#039;&#039;&#039;, the &#039;&#039;&#039;UU&#039;&#039;&#039; references the EEPROM. &lt;br /&gt;
&lt;br /&gt;
2. Read EEPROM contents: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
nico@tegra-ubuntu:~$ sudo i2cdump -f -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice the &#039;&#039;&#039;699-13767-0000-301&#039;&#039;&#039; references my &#039;&#039;&#039;Orin NX 16GB&#039;&#039;&#039; SoM.&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=546</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=546"/>
		<updated>2025-12-05T17:13:48Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Validation and Verification of NVIDIA Jetson SoMs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
Use this table to cross-reference the module part number obtained from the EEPROM dump.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference. &lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represents the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Additional Commands for Module Verification ===&lt;br /&gt;
These commands provide supplementary ways to check your Jetson SoM and board information. Unlike reading the EEPROM, these methods are &#039;&#039;&#039;not authoritative&#039;&#039;&#039; and can be modified by software. Use these commands only for cross-checking or convenience. &lt;br /&gt;
&lt;br /&gt;
1. Run the following command to check your board’s model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/firmware/devicetree/base/model&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should return something like: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia,p3768-0000+p3767-0000nvidia,p3767-0000nvidia,tegra234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Check the SoM with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/device-tree/compatible&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=545</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=545"/>
		<updated>2025-12-05T17:11:53Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Additional Commands for Module Verification */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference. &lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represent the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Additional Commands for Module Verification ===&lt;br /&gt;
These commands provide supplementary ways to check your Jetson SoM and board information. Unlike reading the EEPROM, these methods are not authoritative and can be modified by software. Use these commands only for cross-checking or convenience. &lt;br /&gt;
&lt;br /&gt;
1. Run the following command to check your board’s model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/firmware/devicetree/base/model&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should return something like: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia,p3768-0000+p3767-0000nvidia,p3767-0000nvidia,tegra234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Check the SoM with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/device-tree/compatible&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=544</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=544"/>
		<updated>2025-12-05T17:11:17Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Reading the EEPROM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference. &lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represent the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Additional Commands for Module Verification ===&lt;br /&gt;
These commands provide supplementary ways to check your Jetson SoM and board information. Unlike reading the EEPROM, these methods are not authoritative and can be modified by software. Use these commands only for cross-checking or convenience. &lt;br /&gt;
&lt;br /&gt;
1. Run the following command to check your board’s model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/firmware/devicetree/base/model&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Should return something like: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia,p3768-0000+p3767-0000nvidia,p3767-0000nvidia,tegra234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Check the SoM with:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/device-tree/compatible&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=543</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=543"/>
		<updated>2025-12-05T16:55:36Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Reading the EEPROM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference. &lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represent the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section &#039;&#039;&#039;NVIDIA Jetson SoM models and part number&#039;&#039;&#039;, it is confirmed the NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=542</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=542"/>
		<updated>2025-12-05T16:54:35Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Identifying your Jetson SoM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data. For this wiki, an NVIDIA Jetson OrinNX 16GB is used as reference. &lt;br /&gt;
&lt;br /&gt;
=== Reading the EEPROM ===&lt;br /&gt;
&lt;br /&gt;
The EEPROM address on NVIDIA Jetson Platforms is usually on I²C bus 0 address 0x50. Follow below steps to read the EEPROM from your SoM: &lt;br /&gt;
&lt;br /&gt;
1. Detect EEPROM: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdetect -y -r 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see a &#039;&#039;&#039;UU&#039;&#039;&#039; on address 0x50 which represent the EEPROM.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- 67 -- -- -- -- -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Dump EEPROM content: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Take for example the output for a Jetson OrinNX 16GB module: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo i2cdump -f -y 0 0x50 &lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 02 00 fe 00 00 00 00 00 00 00 00 ff 00 00 00 00    ?.?.............&lt;br /&gt;
10: 00 01 00 01 36 39 39 2d 31 33 37 36 37 2d 30 30    .?.?699-13767-00&lt;br /&gt;
20: 30 30 2d 33 30 31 20 47 2e 31 00 00 00 00 00 00    00-301 G.1......&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: b0 48 00 00 13 66 1f 66 6d 3c 31 34 32 30 32 32    ?H..?f?fm&amp;lt;142022&lt;br /&gt;
50: 35 30 35 36 34 32 33 00 00 00 00 00 00 00 00 00    5056423.........&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 4e 56 43 42 00 ff 4d 31 00 00    ......NVCB..M1..&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 13 66 1f 66    ............?f?f&lt;br /&gt;
b0: 6d 3c 01 00 00 00 00 00 00 00 00 00 00 00 00 00    m&amp;lt;?.............&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5e    ...............^&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. From this output we can see the module part number here: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
699-13767-0000-301&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the table on section Confirming my NVIDIA Jetson module is an &#039;&#039;&#039;OrinNX 16GB&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=541</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=541"/>
		<updated>2025-12-05T16:47:07Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Validation and Verification of NVIDIA Jetson SoMs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Identifying your Jetson SoM ==&lt;br /&gt;
The most reliable and authoritative approach is reading the module’s EEPROM over I²C, which contains the official part number and hardware information programmed by NVIDIA. Additional commands are included to cross-check the module type using the device tree, system interfaces, and other board-level data.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=540</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=540"/>
		<updated>2025-12-05T16:40:46Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
&lt;br /&gt;
== NVIDIA Jetson SoM models and part number ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=539</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=539"/>
		<updated>2025-12-05T16:39:04Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
| For the Developer Kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
| For the developer kit only&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
| Commercial module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
| Original dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
| Dev-kit module&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
| With 64 GB RAM&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
| Industrial grade module with 32 GB RAM&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=538</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=538"/>
		<updated>2025-12-05T16:34:35Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 4GB&lt;br /&gt;
| P3767-0004&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB with SD card slot&lt;br /&gt;
| P3767-0005&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 16GB&lt;br /&gt;
| P3767-0000&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin NX 8GB&lt;br /&gt;
| P3767-0001&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin TM&lt;br /&gt;
| P3701-0000&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 32GB&lt;br /&gt;
| P3701-0004&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Orin 64GB&lt;br /&gt;
| P3701-0005&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0000&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX&lt;br /&gt;
| P3668-0001&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Xavier NX 16GB&lt;br /&gt;
| P3668-0003&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0001&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier&lt;br /&gt;
| P2888-0004&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier 64GB&lt;br /&gt;
| P2888-0005&lt;br /&gt;
|-&lt;br /&gt;
| Jetson AGX Xavier industrial&lt;br /&gt;
| P2888-0008&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=537</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=537"/>
		<updated>2025-12-05T16:25:11Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=536</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=536"/>
		<updated>2025-12-05T16:24:55Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
| Row 2, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=535</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=535"/>
		<updated>2025-12-05T16:24:10Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Compatible Developer Kit&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Jetson Orin Nano Developer Kit (P3766). Includes the P3767-0005 module&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
| Row 2, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=534</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=534"/>
		<updated>2025-12-05T16:23:57Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Compatible Developer Kit&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| P3767-0003&lt;br /&gt;
| Jetson Orin Nano Developer Kit (P3766)&lt;br /&gt;
| Includes the P3767-0005 module&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
| Row 2, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=533</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=533"/>
		<updated>2025-12-05T16:22:30Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Compatible Developer Kit&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
| Row 2, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=532</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=532"/>
		<updated>2025-12-05T16:21:49Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Compatible Developer Kit&lt;br /&gt;
|-&lt;br /&gt;
| Jetson Orin Nano 8GB, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
| Row 2, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=531</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=531"/>
		<updated>2025-12-05T16:19:52Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! P-number&lt;br /&gt;
! Compatible Developer Kit&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
| Row 1, Cell 3&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
| Row 2, Cell 3&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=530</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=530"/>
		<updated>2025-12-05T16:16:21Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module name&lt;br /&gt;
! Header 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=529</id>
		<title>Validation and Verification of NVIDIA Jetson SoMs</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Validation_and_Verification_of_NVIDIA_Jetson_SoMs&amp;diff=529"/>
		<updated>2025-12-05T16:11:53Z</updated>

		<summary type="html">&lt;p&gt;Nico: Created page with &amp;quot;=Validation and Verification of NVIDIA Jetson SoMs= &amp;#039;&amp;#039;Keywords&amp;#039;&amp;#039;: &amp;#039;&amp;#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&amp;#039;&amp;#039; ==Description== This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your ca...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Validation and Verification of NVIDIA Jetson SoMs=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, validation, verification,system-on-module, EEPROM&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This page explains how to validate and verify your NVIDIA Jetson System-on-Module (SoM) by identifying its hardware part number and related information. It includes steps for reading module data over I²C, interpreting the results, and using additional system commands to confirm the exact Jetson module installed on your carrier board.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Header 1&lt;br /&gt;
! Header 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 1, Cell 1&lt;br /&gt;
| Row 1, Cell 2&lt;br /&gt;
|-&lt;br /&gt;
| Row 2, Cell 1&lt;br /&gt;
| Row 2, Cell 2&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=528</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=528"/>
		<updated>2025-12-05T15:57:36Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* ⚙️ Technical Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Welcome to the ProventusNova Developer Wiki =&lt;br /&gt;
&#039;&#039;&#039;Expert knowledge for Embedded Systems, AI, and Software Development.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Looking to build high-performance embedded systems, optimize AI models, or streamline multimedia processing? This wiki is a &#039;&#039;&#039;public knowledge hub&#039;&#039;&#039; designed to help engineers, developers, and businesses solve real-world technical challenges.  &lt;br /&gt;
&lt;br /&gt;
Here, you’ll find &#039;&#039;&#039;step-by-step tutorials, best practices, and deep technical insights&#039;&#039;&#039; to help you bring your projects to life.  &lt;br /&gt;
&lt;br /&gt;
== 🚀 What You’ll Find Here ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🛠️ Hands-on Tutorials&#039;&#039;&#039;  &lt;br /&gt;
Practical guides to get you started quickly.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;📋 Industry Best Practices&#039;&#039;&#039;  &lt;br /&gt;
Proven workflows and methodologies.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;⚡ Optimized Solutions&#039;&#039;&#039;  &lt;br /&gt;
Performance tuning for embedded, AI, and multimedia applications.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🌍 Open-Source Resources&#039;&#039;&#039;  &lt;br /&gt;
Code samples, frameworks, and tools to accelerate development.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether you&#039;re an individual developer, a startup, or an enterprise, you’ll find resources here to &#039;&#039;&#039;enhance your expertise and improve your products&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ⚙️ Technical Resources ==&lt;br /&gt;
&lt;br /&gt;
Learn about core development domains, including embedded systems, AI, multimedia pipelines, and cloud-native solutions. Each section provides curated insights, guides, and best practices to help you build with assurance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded Systems Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Embedded Systems Development]] – BSPs, firmware, and real-time processing.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Embedded&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Embedded Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Yocto&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto meta layer|Create custom Yocto meta layer]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto recipe|Create custom Yocto recipe]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Create custom Yocto meta layer for MediaTek G510 board|Create custom Yocto meta layer for MediaTek G510 board]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to add a custom partition layout to NVIDIA Jetson Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to read EEPROM data from NVIDIA Jetson platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Nvidia&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Nano developer setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Orin NX with CTI Boson carrier board setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Jetson Linux BSP and Kernel Source Setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Adding Custom device tree overlay to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to add a loadable kernel module (LKM) to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Jetson CSI Camera Bring-Up, Debugging, and Development Guide]]&amp;lt;li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to run NVIDIA NanoOWL tutorial]]&amp;lt;li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Validation and Verification of NVIDIA Jetson SoMs]]&amp;lt;li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- AI &amp;amp; CV Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[AI &amp;amp; Computer Vision]] – Edge AI, model training, and deployment.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GStreamer Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[GStreamer Development]] – High-performance video and audio streaming.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Fundamentals]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Daemon]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Interpipes]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Application Development]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Best Practices]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer video streaming, recording and snapshots with tee on Python]]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Web &amp;amp; Cloud Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Web &amp;amp; Cloud Solutions]] – Scalable, production-ready applications.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 👀 Are you a PM looking to expand your knowledge in the software development industry? ==&lt;br /&gt;
&lt;br /&gt;
This tutorial is for you!  &lt;br /&gt;
Explore essential concepts that will help you navigate technical discussions with engineers and clients more confidently.&lt;br /&gt;
&lt;br /&gt;
📄&#039;&#039;&#039;[[Project Manager Tutorials]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Developer Tools ==&lt;br /&gt;
&lt;br /&gt;
This section provides essential guidelines and practices to ensure consistency, clarity, and efficiency across all development efforts. These tools and standards help teams collaborate better and maintain high-quality codebases.&lt;br /&gt;
&lt;br /&gt;
🔀 &#039;&#039;&#039;[[Git workflow]]&#039;&#039;&#039;: A structured guide to how our team uses Git—from branching strategies to pull request protocols—ensuring smooth collaboration and clean version history.&lt;br /&gt;
&lt;br /&gt;
🧾 &#039;&#039;&#039;[[Naming Conventions]]&#039;&#039;&#039;: Standardized naming rules for code elements such as variables, functions, classes, and files, helping improve readability and maintainability across projects.&lt;br /&gt;
&lt;br /&gt;
== 🐞🛠️ Debugging methods and error/bug fixes ==&lt;br /&gt;
This section provides the best debugging methods as well as common error/bug fixes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yocto&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Yocto Project related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Error:_BitBake_%2B_AppArmor_User_Namespace_Restriction_Fix|Error: BitBake+AppArmor User Namespace Restriction Fix]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nvidia&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nvidia related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Debug_NVIDIA_Jetson_nvv4l2av1enc_VPR_Violation_(EMEM_decode_error)| Debug NVIDIA Jetson nvv4l2av1enc VPR Violation (EMEM decode error)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== 👀 Are You a PM Looking to Level Up in Software Development? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 1.1em; line-height: 1.6;&amp;quot;&amp;gt;&lt;br /&gt;
This tutorial is made just for you!  &lt;br /&gt;
Gain a solid grasp of essential software development concepts so you can confidently engage in technical discussions with both engineers and clients.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
📘&amp;lt;span class=&amp;quot;fa fa-book&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;&#039;[[Project Manager Tutorials|Start the Tutorial →]]&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Footer}}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=527</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=527"/>
		<updated>2025-12-05T15:54:08Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* ⚙️ Technical Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Welcome to the ProventusNova Developer Wiki =&lt;br /&gt;
&#039;&#039;&#039;Expert knowledge for Embedded Systems, AI, and Software Development.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Looking to build high-performance embedded systems, optimize AI models, or streamline multimedia processing? This wiki is a &#039;&#039;&#039;public knowledge hub&#039;&#039;&#039; designed to help engineers, developers, and businesses solve real-world technical challenges.  &lt;br /&gt;
&lt;br /&gt;
Here, you’ll find &#039;&#039;&#039;step-by-step tutorials, best practices, and deep technical insights&#039;&#039;&#039; to help you bring your projects to life.  &lt;br /&gt;
&lt;br /&gt;
== 🚀 What You’ll Find Here ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🛠️ Hands-on Tutorials&#039;&#039;&#039;  &lt;br /&gt;
Practical guides to get you started quickly.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;📋 Industry Best Practices&#039;&#039;&#039;  &lt;br /&gt;
Proven workflows and methodologies.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;⚡ Optimized Solutions&#039;&#039;&#039;  &lt;br /&gt;
Performance tuning for embedded, AI, and multimedia applications.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🌍 Open-Source Resources&#039;&#039;&#039;  &lt;br /&gt;
Code samples, frameworks, and tools to accelerate development.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether you&#039;re an individual developer, a startup, or an enterprise, you’ll find resources here to &#039;&#039;&#039;enhance your expertise and improve your products&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ⚙️ Technical Resources ==&lt;br /&gt;
&lt;br /&gt;
Learn about core development domains, including embedded systems, AI, multimedia pipelines, and cloud-native solutions. Each section provides curated insights, guides, and best practices to help you build with assurance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded Systems Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Embedded Systems Development]] – BSPs, firmware, and real-time processing.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Embedded&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Embedded Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Yocto&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto meta layer|Create custom Yocto meta layer]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto recipe|Create custom Yocto recipe]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Create custom Yocto meta layer for MediaTek G510 board|Create custom Yocto meta layer for MediaTek G510 board]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to add a custom partition layout to NVIDIA Jetson Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to read EEPROM data from NVIDIA Jetson platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Nvidia&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Nano developer setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Orin NX with CTI Boson carrier board setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Jetson Linux BSP and Kernel Source Setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Adding Custom device tree overlay to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to add a loadable kernel module (LKM) to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Jetson CSI Camera Bring-Up, Debugging, and Development Guide]]&amp;lt;li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to run NVIDIA NanoOWL tutorial]]&amp;lt;li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Validation and Verification of NVIDIA Jetson SoM Modules]]&amp;lt;li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- AI &amp;amp; CV Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[AI &amp;amp; Computer Vision]] – Edge AI, model training, and deployment.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GStreamer Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[GStreamer Development]] – High-performance video and audio streaming.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Fundamentals]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Daemon]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Interpipes]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Application Development]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Best Practices]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer video streaming, recording and snapshots with tee on Python]]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Web &amp;amp; Cloud Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Web &amp;amp; Cloud Solutions]] – Scalable, production-ready applications.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 👀 Are you a PM looking to expand your knowledge in the software development industry? ==&lt;br /&gt;
&lt;br /&gt;
This tutorial is for you!  &lt;br /&gt;
Explore essential concepts that will help you navigate technical discussions with engineers and clients more confidently.&lt;br /&gt;
&lt;br /&gt;
📄&#039;&#039;&#039;[[Project Manager Tutorials]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Developer Tools ==&lt;br /&gt;
&lt;br /&gt;
This section provides essential guidelines and practices to ensure consistency, clarity, and efficiency across all development efforts. These tools and standards help teams collaborate better and maintain high-quality codebases.&lt;br /&gt;
&lt;br /&gt;
🔀 &#039;&#039;&#039;[[Git workflow]]&#039;&#039;&#039;: A structured guide to how our team uses Git—from branching strategies to pull request protocols—ensuring smooth collaboration and clean version history.&lt;br /&gt;
&lt;br /&gt;
🧾 &#039;&#039;&#039;[[Naming Conventions]]&#039;&#039;&#039;: Standardized naming rules for code elements such as variables, functions, classes, and files, helping improve readability and maintainability across projects.&lt;br /&gt;
&lt;br /&gt;
== 🐞🛠️ Debugging methods and error/bug fixes ==&lt;br /&gt;
This section provides the best debugging methods as well as common error/bug fixes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yocto&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Yocto Project related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Error:_BitBake_%2B_AppArmor_User_Namespace_Restriction_Fix|Error: BitBake+AppArmor User Namespace Restriction Fix]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nvidia&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nvidia related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Debug_NVIDIA_Jetson_nvv4l2av1enc_VPR_Violation_(EMEM_decode_error)| Debug NVIDIA Jetson nvv4l2av1enc VPR Violation (EMEM decode error)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== 👀 Are You a PM Looking to Level Up in Software Development? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 1.1em; line-height: 1.6;&amp;quot;&amp;gt;&lt;br /&gt;
This tutorial is made just for you!  &lt;br /&gt;
Gain a solid grasp of essential software development concepts so you can confidently engage in technical discussions with both engineers and clients.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
📘&amp;lt;span class=&amp;quot;fa fa-book&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;&#039;[[Project Manager Tutorials|Start the Tutorial →]]&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Footer}}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Jetson_CSI_Camera_Bring-Up,_Debugging,_and_Development_Guide&amp;diff=526</id>
		<title>Jetson CSI Camera Bring-Up, Debugging, and Development Guide</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Jetson_CSI_Camera_Bring-Up,_Debugging,_and_Development_Guide&amp;diff=526"/>
		<updated>2025-12-04T23:13:20Z</updated>

		<summary type="html">&lt;p&gt;Nico: Created page with &amp;quot;=NVIDIA Jetson CSI Camera bring up, debugging and development guide= &amp;#039;&amp;#039;Keywords&amp;#039;&amp;#039;: &amp;#039;&amp;#039;NVIDIA Jetson, camera drivers, CSI cameras, Linux kernel&amp;#039;&amp;#039; ==Description== This wiki page provides a guide to camera driver debugging, sensor bring-up, and driver development on the NVIDIA Jetson platform. It covers essential diagnostic steps, tools, and workflows for validating CSI camera connectivity, verifying I²C communication, checking device-tree configuration, reviewing kernel lo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=NVIDIA Jetson CSI Camera bring up, debugging and development guide=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, camera drivers, CSI cameras, Linux kernel&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page provides a guide to camera driver debugging, sensor bring-up, and driver development on the NVIDIA Jetson platform.&lt;br /&gt;
It covers essential diagnostic steps, tools, and workflows for validating CSI camera connectivity, verifying I²C communication, checking device-tree configuration, reviewing kernel logs, testing V4L2 operation, and confirming Argus camera-stack functionality.&lt;br /&gt;
This resource is intended for developers integrating custom camera modules, writing or modifying camera drivers, or troubleshooting sensor issues on Jetson devices.&lt;br /&gt;
&lt;br /&gt;
== Required tools ==&lt;br /&gt;
This section lists the essential software utilities used for camera bring-up and debugging on NVIDIA Jetson platforms. These tools allow you to verify I²C communication, inspect V4L2 video devices, and perform low-level camera diagnostics.&lt;br /&gt;
&lt;br /&gt;
* I2C-Tools: Provides utilities such as &#039;&#039;&#039;i2cdetect, i2cget, and i2cset&#039;&#039;&#039; for scanning the I²C bus, reading sensor registers, and validating camera presence. Install with: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo apt-get install -y i2c-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* V4L-Utils: A set of tools for interacting with Linux Video4Linux2 (V4L2) devices. This is the primary tool for listing video devices, testing raw streaming, querying formats and inspecting V4L2 controls for linux devices. Install with: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo apt-get install -y v4l-utils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Camera driver debugging ==&lt;br /&gt;
&lt;br /&gt;
== Camera driver bring up ==&lt;br /&gt;
&lt;br /&gt;
== Device tree development ==&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=525</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=525"/>
		<updated>2025-12-04T21:46:52Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* ⚙️ Technical Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Welcome to the ProventusNova Developer Wiki =&lt;br /&gt;
&#039;&#039;&#039;Expert knowledge for Embedded Systems, AI, and Software Development.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Looking to build high-performance embedded systems, optimize AI models, or streamline multimedia processing? This wiki is a &#039;&#039;&#039;public knowledge hub&#039;&#039;&#039; designed to help engineers, developers, and businesses solve real-world technical challenges.  &lt;br /&gt;
&lt;br /&gt;
Here, you’ll find &#039;&#039;&#039;step-by-step tutorials, best practices, and deep technical insights&#039;&#039;&#039; to help you bring your projects to life.  &lt;br /&gt;
&lt;br /&gt;
== 🚀 What You’ll Find Here ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🛠️ Hands-on Tutorials&#039;&#039;&#039;  &lt;br /&gt;
Practical guides to get you started quickly.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;📋 Industry Best Practices&#039;&#039;&#039;  &lt;br /&gt;
Proven workflows and methodologies.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;⚡ Optimized Solutions&#039;&#039;&#039;  &lt;br /&gt;
Performance tuning for embedded, AI, and multimedia applications.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🌍 Open-Source Resources&#039;&#039;&#039;  &lt;br /&gt;
Code samples, frameworks, and tools to accelerate development.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether you&#039;re an individual developer, a startup, or an enterprise, you’ll find resources here to &#039;&#039;&#039;enhance your expertise and improve your products&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ⚙️ Technical Resources ==&lt;br /&gt;
&lt;br /&gt;
Learn about core development domains, including embedded systems, AI, multimedia pipelines, and cloud-native solutions. Each section provides curated insights, guides, and best practices to help you build with assurance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded Systems Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Embedded Systems Development]] – BSPs, firmware, and real-time processing.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Embedded&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Embedded Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Yocto&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto meta layer|Create custom Yocto meta layer]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto recipe|Create custom Yocto recipe]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Create custom Yocto meta layer for MediaTek G510 board|Create custom Yocto meta layer for MediaTek G510 board]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to add a custom partition layout to NVIDIA Jetson Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to read EEPROM data from NVIDIA Jetson platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Nvidia&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Nano developer setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Orin NX with CTI Boson carrier board setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Jetson Linux BSP and Kernel Source Setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Adding Custom device tree overlay to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to add a loadable kernel module (LKM) to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Jetson CSI Camera Bring-Up, Debugging, and Development Guide]]&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to run NVIDIA NanoOWL tutorial]]&amp;lt;li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- AI &amp;amp; CV Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[AI &amp;amp; Computer Vision]] – Edge AI, model training, and deployment.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GStreamer Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[GStreamer Development]] – High-performance video and audio streaming.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Fundamentals]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Daemon]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Interpipes]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Application Development]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Best Practices]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer video streaming, recording and snapshots with tee on Python]]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Web &amp;amp; Cloud Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Web &amp;amp; Cloud Solutions]] – Scalable, production-ready applications.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 👀 Are you a PM looking to expand your knowledge in the software development industry? ==&lt;br /&gt;
&lt;br /&gt;
This tutorial is for you!  &lt;br /&gt;
Explore essential concepts that will help you navigate technical discussions with engineers and clients more confidently.&lt;br /&gt;
&lt;br /&gt;
📄&#039;&#039;&#039;[[Project Manager Tutorials]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Developer Tools ==&lt;br /&gt;
&lt;br /&gt;
This section provides essential guidelines and practices to ensure consistency, clarity, and efficiency across all development efforts. These tools and standards help teams collaborate better and maintain high-quality codebases.&lt;br /&gt;
&lt;br /&gt;
🔀 &#039;&#039;&#039;[[Git workflow]]&#039;&#039;&#039;: A structured guide to how our team uses Git—from branching strategies to pull request protocols—ensuring smooth collaboration and clean version history.&lt;br /&gt;
&lt;br /&gt;
🧾 &#039;&#039;&#039;[[Naming Conventions]]&#039;&#039;&#039;: Standardized naming rules for code elements such as variables, functions, classes, and files, helping improve readability and maintainability across projects.&lt;br /&gt;
&lt;br /&gt;
== 🐞🛠️ Debugging methods and error/bug fixes ==&lt;br /&gt;
This section provides the best debugging methods as well as common error/bug fixes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yocto&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Yocto Project related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Error:_BitBake_%2B_AppArmor_User_Namespace_Restriction_Fix|Error: BitBake+AppArmor User Namespace Restriction Fix]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nvidia&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nvidia related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Debug_NVIDIA_Jetson_nvv4l2av1enc_VPR_Violation_(EMEM_decode_error)| Debug NVIDIA Jetson nvv4l2av1enc VPR Violation (EMEM decode error)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== 👀 Are You a PM Looking to Level Up in Software Development? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 1.1em; line-height: 1.6;&amp;quot;&amp;gt;&lt;br /&gt;
This tutorial is made just for you!  &lt;br /&gt;
Gain a solid grasp of essential software development concepts so you can confidently engage in technical discussions with both engineers and clients.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
📘&amp;lt;span class=&amp;quot;fa fa-book&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;&#039;[[Project Manager Tutorials|Start the Tutorial →]]&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Footer}}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_custom_partition_layout_to_NVIDIA_Jetson_Platforms&amp;diff=524</id>
		<title>How to add a custom partition layout to NVIDIA Jetson Platforms</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_custom_partition_layout_to_NVIDIA_Jetson_Platforms&amp;diff=524"/>
		<updated>2025-12-03T18:19:09Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Understanding the Flashing Process and Partition Layout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to Add a Custom Partition Layout to NVIDIA Jetson Platforms=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVMe, partition, flash, custom layout, JetPack&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to add a memory partition on NVIDIA&#039;S Jetson Platforms. This procedure was tested on a NVIDIA Jetson Orin NX with CTI Boson carrier board running JetPack 6.2.1(L4T R36.4.4) and demonstrates how to add an additional 2GiB partition on NVMe storage. &lt;br /&gt;
&lt;br /&gt;
==Understanding the Flashing Process and Partition Layout==&lt;br /&gt;
&lt;br /&gt;
* When flashing a Jetson platform that uses NVMe storage as the root device, the following command is typically used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -c tools/kernel_flash/flash_l4t_external.xml -p &#039;-c bootloader/generic/cfg/flash_t234_qspi.xml&#039; --showlogs --network usb0 &amp;lt;board-config&amp;gt; internal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;flash_l4t_external.xml&#039;&#039;&#039; file is the Jetson Linux (L4T) partition configuration file. It defines how partitions are laid out on the target storage device — in this case, the NVMe drive. &lt;br /&gt;
&lt;br /&gt;
* After flashing the board you can check the partition layout by running &#039;&#039;&#039;lsblk&#039;&#039;&#039;. The output should look similar to this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia@nvidia:~$ lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,PARTLABEL&lt;br /&gt;
NAME           SIZE TYPE MOUNTPOINT PARTLABEL&lt;br /&gt;
loop0           16M loop            &lt;br /&gt;
zram0          1.9G disk [SWAP]     &lt;br /&gt;
zram1          1.9G disk [SWAP]     &lt;br /&gt;
zram2          1.9G disk [SWAP]     &lt;br /&gt;
zram3          1.9G disk [SWAP]     &lt;br /&gt;
nvme0n1      119.2G disk            &lt;br /&gt;
├─nvme0n1p1  117.8G part /          APP&lt;br /&gt;
├─nvme0n1p2    128M part            A_kernel&lt;br /&gt;
├─nvme0n1p3    768K part            A_kernel-dtb&lt;br /&gt;
├─nvme0n1p4   31.6M part            A_reserved_on_user&lt;br /&gt;
├─nvme0n1p5    128M part            B_kernel&lt;br /&gt;
├─nvme0n1p6    768K part            B_kernel-dtb&lt;br /&gt;
├─nvme0n1p7   31.6M part            B_reserved_on_user&lt;br /&gt;
├─nvme0n1p8     80M part            recovery&lt;br /&gt;
├─nvme0n1p9    512K part            recovery-dtb&lt;br /&gt;
├─nvme0n1p10    64M part /boot/efi  esp&lt;br /&gt;
├─nvme0n1p11    80M part            recovery_alt&lt;br /&gt;
├─nvme0n1p12   512K part            recovery-dtb_alt&lt;br /&gt;
├─nvme0n1p13    64M part            esp_alt&lt;br /&gt;
├─nvme0n1p14   400M part            UDA&lt;br /&gt;
└─nvme0n1p15 479.5M part            reserved&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* To add a new partition we need to modify the partition layout in this &#039;&#039;&#039;flash_l4t_external.xml&#039;&#039;&#039; file.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Important&#039;&#039;&#039;: Notice NVMe size of &#039;&#039;&#039;119.2G&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Creating a custom partition layout ==&lt;br /&gt;
&lt;br /&gt;
In this section you will find the steps for adding an extra partition called &#039;&#039;&#039;EXTRA_DATA&#039;&#039;&#039; with size &#039;&#039;&#039;20 GiB&#039;&#039;&#039; to the partition layout file for flashing. &lt;br /&gt;
&lt;br /&gt;
1. Create a copy of the original file in case we need the default partition configuration. Let&#039;s call it: &#039;&#039;&#039;flash_l4t_external_copy.xml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2. Add the following section code before the &#039;&#039;&#039;APP&#039;&#039;&#039; partition to create a new partition block called &#039;&#039;&#039;EXTRA_DATA&#039;&#039;&#039;. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;partition name=&amp;quot;EXTRA_DATA&amp;quot; type=&amp;quot;data&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;allocation_policy&amp;gt; sequential &amp;lt;/allocation_policy&amp;gt;&lt;br /&gt;
    &amp;lt;filesystem_type&amp;gt; basic &amp;lt;/filesystem_type&amp;gt;&lt;br /&gt;
    &amp;lt;size&amp;gt; &amp;lt;EXTRA_DATA_SIZE&amp;gt; &amp;lt;/size&amp;gt;&lt;br /&gt;
    &amp;lt;file_system_attribute&amp;gt; 0 &amp;lt;/file_system_attribute&amp;gt;&lt;br /&gt;
    &amp;lt;allocation_attribute&amp;gt; 0x8 &amp;lt;/allocation_attribute&amp;gt;&lt;br /&gt;
    &amp;lt;percent_reserved&amp;gt; 0 &amp;lt;/percent_reserved&amp;gt;&lt;br /&gt;
    &amp;lt;align_boundary&amp;gt; 16384 &amp;lt;/align_boundary&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt; **Required.** This partition may be mounted and used to store user&lt;br /&gt;
     data. &amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/partition&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
3. Define how much size will be assigned to the new partition. To calculate the size in bytes use the next formula:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SIZE (GiB) * 1024^3 = Size (BYTES)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For 20 GiB:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
20 (GiB) * 1024^3 = 21474836480 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Change &#039;&#039;&#039;EXTRA_DATA_SIZE&#039;&#039;&#039; for &#039;&#039;&#039;21474836480&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
4. Recalculate APP size to adjust for the extra partition added: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
(119.8 GiB - 20 GiB ) * 1024^3 = 105011950387 bytes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Change &#039;&#039;&#039;APP size&#039;&#039;&#039; for &#039;&#039;&#039;105011950387&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
6. With this changes the file should look like this: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;partition name=&amp;quot;EXTRA_DATA&amp;quot; type=&amp;quot;data&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;allocation_policy&amp;gt; sequential &amp;lt;/allocation_policy&amp;gt;&lt;br /&gt;
    &amp;lt;filesystem_type&amp;gt; basic &amp;lt;/filesystem_type&amp;gt;&lt;br /&gt;
    &amp;lt;size&amp;gt; 21474836480 &amp;lt;/size&amp;gt;&lt;br /&gt;
    &amp;lt;file_system_attribute&amp;gt; 0 &amp;lt;/file_system_attribute&amp;gt;&lt;br /&gt;
    &amp;lt;allocation_attribute&amp;gt; 0x8 &amp;lt;/allocation_attribute&amp;gt;&lt;br /&gt;
    &amp;lt;percent_reserved&amp;gt; 0 &amp;lt;/percent_reserved&amp;gt;&lt;br /&gt;
    &amp;lt;align_boundary&amp;gt; 16384 &amp;lt;/align_boundary&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt; **Required.** This partition may be mounted and used to store user&lt;br /&gt;
      data. &amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/partition&amp;gt;&lt;br /&gt;
&amp;lt;partition name=&amp;quot;APP&amp;quot; id=&amp;quot;1&amp;quot; type=&amp;quot;data&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;allocation_policy&amp;gt; sequential &amp;lt;/allocation_policy&amp;gt;&lt;br /&gt;
    &amp;lt;filesystem_type&amp;gt; basic &amp;lt;/filesystem_type&amp;gt;&lt;br /&gt;
    &amp;lt;size&amp;gt; 105011950387 &amp;lt;/size&amp;gt;&lt;br /&gt;
    &amp;lt;file_system_attribute&amp;gt; 0 &amp;lt;/file_system_attribute&amp;gt;&lt;br /&gt;
    &amp;lt;allocation_attribute&amp;gt; 0x808 &amp;lt;/allocation_attribute&amp;gt;&lt;br /&gt;
    &amp;lt;align_boundary&amp;gt; 16384 &amp;lt;/align_boundary&amp;gt;&lt;br /&gt;
    &amp;lt;percent_reserved&amp;gt; 0 &amp;lt;/percent_reserved&amp;gt;&lt;br /&gt;
    &amp;lt;unique_guid&amp;gt; APPUUID &amp;lt;/unique_guid&amp;gt;&lt;br /&gt;
    &amp;lt;filename&amp;gt; APPFILE &amp;lt;/filename&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt; **Required.** Contains the rootfs. This partition must be assigned&lt;br /&gt;
      the &amp;quot;1&amp;quot; for id as it is physically put to the end of the device, so that it&lt;br /&gt;
      can be accessed as the fixed known special device `/dev/nvme0n1p1`. &amp;lt;/description&amp;gt;&lt;br /&gt;
&amp;lt;/partition&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Flashing with new partition layout ==&lt;br /&gt;
&lt;br /&gt;
1. To flash, use the new XML file created:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -c tools/kernel_flash/flash_l4t_external_copy.xml -p &#039;-c bootloader/generic/cfg/flash_t234_qspi.xml&#039; --showlogs --network usb0 &amp;lt;board-config&amp;gt; internal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Wait for board to flash and boot. &lt;br /&gt;
&lt;br /&gt;
3. Run &#039;&#039;&#039;lsusb&#039;&#039;&#039; command. The output should look like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nvidia@nvidia:~$ lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,PARTLABEL&lt;br /&gt;
NAME           SIZE TYPE MOUNTPOINT PARTLABEL&lt;br /&gt;
loop0           16M loop            &lt;br /&gt;
zram0          1.9G disk [SWAP]     &lt;br /&gt;
zram1          1.9G disk [SWAP]     &lt;br /&gt;
zram2          1.9G disk [SWAP]     &lt;br /&gt;
zram3          1.9G disk [SWAP]     &lt;br /&gt;
nvme0n1      119.2G disk            &lt;br /&gt;
├─nvme0n1p1   97.8G part /          APP&lt;br /&gt;
├─nvme0n1p2    128M part            A_kernel&lt;br /&gt;
├─nvme0n1p3    768K part            A_kernel-dtb&lt;br /&gt;
├─nvme0n1p4   31.6M part            A_reserved_on_user&lt;br /&gt;
├─nvme0n1p5    128M part            B_kernel&lt;br /&gt;
├─nvme0n1p6    768K part            B_kernel-dtb&lt;br /&gt;
├─nvme0n1p7   31.6M part            B_reserved_on_user&lt;br /&gt;
├─nvme0n1p8     80M part            recovery&lt;br /&gt;
├─nvme0n1p9    512K part            recovery-dtb&lt;br /&gt;
├─nvme0n1p10    64M part /boot/efi  esp&lt;br /&gt;
├─nvme0n1p11    80M part            recovery_alt&lt;br /&gt;
├─nvme0n1p12   512K part            recovery-dtb_alt&lt;br /&gt;
├─nvme0n1p13    64M part            esp_alt&lt;br /&gt;
├─nvme0n1p14   400M part            UDA&lt;br /&gt;
├─nvme0n1p15 479.5M part            reserved&lt;br /&gt;
└─nvme0n1p16    20G part            EXTRA_DATA&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see &#039;&#039;&#039;EXTRA_DATA&#039;&#039;&#039; partition with size &#039;&#039;&#039;20G&#039;&#039;&#039;. For APP, the size is now &#039;&#039;&#039;97.8G&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=523</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=523"/>
		<updated>2025-12-02T23:30:19Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Installing the NVIDIA out-of-tree modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_customcam.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Installing the NVIDIA out-of-tree modules ===&lt;br /&gt;
1. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this the module should be inside directory: &#039;&#039;&#039;Linux_for_Tegra/rootfs/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
From this point the kernel module is ready for use. You can either:&lt;br /&gt;
&lt;br /&gt;
1. Flash the board.&lt;br /&gt;
&lt;br /&gt;
2. Copy the module to the board using scp. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
scp $INSTALL_MOD_PATH/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/nv_customcam.ko nvidia@&amp;lt;board-ip&amp;gt;:/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.1 Inside the board: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo cp /tmp/nv_customcam.ko /lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&lt;br /&gt;
sudo depmod -a 5.15.148-tegra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.2 Load the module&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo modprobe nv_customcam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=522</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=522"/>
		<updated>2025-12-02T23:29:49Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Building the NVIDIA out-of-tree modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_customcam.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Installing the NVIDIA out-of-tree modules ===&lt;br /&gt;
1. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this the module should be inside directory: &#039;&#039;&#039;Linux_for_Tegra/rootfs/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
From this point the kernel module is ready for use. You can either:&lt;br /&gt;
&lt;br /&gt;
1. Flash the board.&lt;br /&gt;
2. Copy the module to the board using scp. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
scp $INSTALL_MOD_PATH/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/nv_customcam.ko nvidia@&amp;lt;board-ip&amp;gt;:/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.1 Inside the board: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo cp /tmp/nv_customcam.ko /lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&lt;br /&gt;
sudo depmod -a 5.15.148-tegra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.2 Load the module&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo modprobe nv_customcam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=521</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=521"/>
		<updated>2025-12-02T23:06:50Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Intergrating the driver into the kernel build system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_customcam.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
5. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this the module should be inside directory: &#039;&#039;&#039;Linux_for_Tegra/rootfs/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
6. Copy the module to the board using scp. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
scp $INSTALL_MOD_PATH/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/nv_customcam.ko nvidia@&amp;lt;board-ip&amp;gt;:/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Inside the board: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo cp /tmp/nv_customcam.ko /lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&lt;br /&gt;
sudo depmod -a 5.15.148-tegra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Load the module&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo modprobe nv_customcam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=520</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=520"/>
		<updated>2025-12-02T22:55:28Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* How to add a loadable kernel module (LKM) to JetPack 6.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
5. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this the module should be inside directory: &#039;&#039;&#039;Linux_for_Tegra/rootfs/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
6. Copy the module to the board using scp. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
scp $INSTALL_MOD_PATH/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/nv_customcam.ko nvidia@&amp;lt;board-ip&amp;gt;:/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Inside the board: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo cp /tmp/nv_customcam.ko /lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&lt;br /&gt;
sudo depmod -a 5.15.148-tegra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Load the module&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo modprobe nv_customcam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=519</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=519"/>
		<updated>2025-12-02T22:37:55Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Building the NVIDIA out-of-tree modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
5. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this the module should be inside directory: &#039;&#039;&#039;Linux_for_Tegra/rootfs/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
6. Copy the module to the board using scp. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
scp $INSTALL_MOD_PATH/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/nv_customcam.ko nvidia@&amp;lt;board-ip&amp;gt;:/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Inside the board: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo cp /tmp/nv_customcam.ko /lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&lt;br /&gt;
sudo depmod -a 5.15.148-tegra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. Load the module&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo modprobe nv_customcam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=518</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=518"/>
		<updated>2025-12-02T22:25:16Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Building the NVIDIA out-of-tree modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
5. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this the module should be inside directory: &#039;&#039;&#039;Linux_for_Tegra/rootfs/usr/lib/modules/5.15.148-tegra/updates/drivers/media/i2c/&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=517</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=517"/>
		<updated>2025-12-02T21:59:27Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Building the NVIDIA out-of-tree modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
5. Install the module. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
sudo -E make modules_install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=516</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=516"/>
		<updated>2025-12-02T21:47:36Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Intergrating the driver into the kernel build system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Building the NVIDIA out-of-tree modules ===&lt;br /&gt;
&lt;br /&gt;
First build the kernel to update the kernel configuration file. &lt;br /&gt;
&lt;br /&gt;
1. Go to &#039;&#039;&#039;Linux_for_Tegra/source&#039;&#039;&#039; directory. Set the following environment variables: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-&lt;br /&gt;
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src&lt;br /&gt;
export KERNEL_OUTPUT=$PWD/kernel_out&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Build the kernel. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make -C kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for the kernel to build. The kernel build will be under &#039;&#039;&#039;kernel_out&#039;&#039;&#039; set with environment variable &#039;&#039;&#039;KERNEL_OUTPUT&#039;&#039;&#039;. You can verify the changes to the files defconfig and the Kconfig inside &#039;&#039;&#039;kernel_out/.config&#039;&#039;&#039;. You should see this set: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Set the install path environment variable. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
export INSTALL_MOD_PATH=&amp;lt;PATH_TO&amp;gt;/Linux_for_Tegra/rootfs/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Build the NVIDIA OoT modules: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
make modules&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compiled files will be under directory: &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. You should see file: &#039;&#039;&#039;nv_customcam.ko&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=515</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=515"/>
		<updated>2025-12-02T21:32:02Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Intergrating the driver into the kernel build system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=514</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=514"/>
		<updated>2025-12-02T21:30:47Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Intergrating the driver into the kernel build system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
    tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=513</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=513"/>
		<updated>2025-12-02T17:50:28Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* How to add a loadable kernel module (LKM) to JetPack 6.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new entry to &#039;&#039;&#039;Kconfig&#039;&#039;&#039; file in directory &#039;&#039;&#039;kernel/kernel-jammy-src/drivers/media/i2c/&#039;&#039;&#039;. This defines a configuration option that controls whether the module is built and how it is included on the kernel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
config NV_VIDEO_CUSTOMCAM&lt;br /&gt;
        tristate &amp;quot;Custom cam&amp;quot;&lt;br /&gt;
	depends on I2C &amp;amp;&amp;amp; VIDEO_V4L2 &amp;amp;&amp;amp; VIDEO_V4L2_SUBDEV_API&lt;br /&gt;
	help&lt;br /&gt;
	  This driver supports CUSTOMCAM camera sensor.&lt;br /&gt;
&lt;br /&gt;
	  To compile this driver as a module, choose M here: the module&lt;br /&gt;
	  will be called CUSTOMCAM.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Modify &#039;&#039;&#039;Makefile&#039;&#039;&#039; inside directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039; to build the new camera module added. Add the following line inside the &#039;&#039;&#039;Makefile&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
obj-$(CONFIG_NV_VIDEO_CUSTOMCAM) += nv_imx708.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Add the following line to file &#039;&#039;&#039;defconfig&#039;&#039;&#039; in directory &#039;&#039;&#039;kernel/kernel-jammy-src/arch/arm64/configs/&#039;&#039;&#039; to configure the kernel for building the CUSTOMCAM driver as a module. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
CONFIG_NV_VIDEO_CUSTOMCAM=m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=512</id>
		<title>How to add a loadable kernel module (LKM) to JetPack 6.x</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_add_a_loadable_kernel_module_(LKM)_to_JetPack_6.x&amp;diff=512"/>
		<updated>2025-12-02T17:26:09Z</updated>

		<summary type="html">&lt;p&gt;Nico: Created page with &amp;quot;=How to add a loadable kernel module (LKM) to JetPack 6.x= &amp;#039;&amp;#039;Keywords&amp;#039;&amp;#039;: &amp;#039;&amp;#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&amp;#039;&amp;#039; ==Description== This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x.   == Adding loadable kernel module ==   Take &amp;#039;&amp;#039;&amp;#039;nv_customcam&amp;#039;&amp;#039;&amp;#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to add a loadable kernel module (LKM) to JetPack 6.x=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, JetPack, kernel customization, kernel modules, NVIDIA oot&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki page explains how to add a camera driver as a loadable kernel module on NVIDIA platforms running JetPack 6.x. &lt;br /&gt;
&lt;br /&gt;
== Adding loadable kernel module == &lt;br /&gt;
&lt;br /&gt;
Take &#039;&#039;&#039;nv_customcam&#039;&#039;&#039; as the example camera driver to be added as a loadable kernel module. For adding a new LKM the following kernel modifications are required: &lt;br /&gt;
&lt;br /&gt;
* Add the driver source files: &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; and &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039;&lt;br /&gt;
* Add register mode-table configuration file for the sensor&#039;s operating modes: &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039;.&lt;br /&gt;
* Add a Kconfig entry for the driver. &lt;br /&gt;
* Update Makefile to compile driver. &lt;br /&gt;
=== Adding the source and header files ===&lt;br /&gt;
1. Add source code file &#039;&#039;&#039;nv_customcam.c&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
2. Add header file &#039;&#039;&#039;nv_customcam.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/include/media/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
3. Add register mode-table configuration file &#039;&#039;&#039;customcam_mode_tbls.h&#039;&#039;&#039; to directory &#039;&#039;&#039;nvidia-oot/drivers/media/i2c/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Intergrating the driver into the kernel build system ===&lt;br /&gt;
&lt;br /&gt;
1. Add a new &#039;&#039;&#039;Kconfig&#039;&#039;&#039; section to &#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=511</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=Main_Page&amp;diff=511"/>
		<updated>2025-12-02T15:32:10Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* ⚙️ Technical Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= Welcome to the ProventusNova Developer Wiki =&lt;br /&gt;
&#039;&#039;&#039;Expert knowledge for Embedded Systems, AI, and Software Development.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Looking to build high-performance embedded systems, optimize AI models, or streamline multimedia processing? This wiki is a &#039;&#039;&#039;public knowledge hub&#039;&#039;&#039; designed to help engineers, developers, and businesses solve real-world technical challenges.  &lt;br /&gt;
&lt;br /&gt;
Here, you’ll find &#039;&#039;&#039;step-by-step tutorials, best practices, and deep technical insights&#039;&#039;&#039; to help you bring your projects to life.  &lt;br /&gt;
&lt;br /&gt;
== 🚀 What You’ll Find Here ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🛠️ Hands-on Tutorials&#039;&#039;&#039;  &lt;br /&gt;
Practical guides to get you started quickly.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;📋 Industry Best Practices&#039;&#039;&#039;  &lt;br /&gt;
Proven workflows and methodologies.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;⚡ Optimized Solutions&#039;&#039;&#039;  &lt;br /&gt;
Performance tuning for embedded, AI, and multimedia applications.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 250px; border: 1px solid #ccc; border-radius: 8px; padding: 1em; background-color: #f9f9f9;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;🌍 Open-Source Resources&#039;&#039;&#039;  &lt;br /&gt;
Code samples, frameworks, and tools to accelerate development.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Whether you&#039;re an individual developer, a startup, or an enterprise, you’ll find resources here to &#039;&#039;&#039;enhance your expertise and improve your products&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ⚙️ Technical Resources ==&lt;br /&gt;
&lt;br /&gt;
Learn about core development domains, including embedded systems, AI, multimedia pipelines, and cloud-native solutions. Each section provides curated insights, guides, and best practices to help you build with assurance.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; gap: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Embedded Systems Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Embedded Systems Development]] – BSPs, firmware, and real-time processing.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Embedded&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Embedded Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Yocto&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto meta layer|Create custom Yocto meta layer]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to create a custom yocto recipe|Create custom Yocto recipe]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Create custom Yocto meta layer for MediaTek G510 board|Create custom Yocto meta layer for MediaTek G510 board]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to add a custom partition layout to NVIDIA Jetson Platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[How to read EEPROM data from NVIDIA Jetson platforms]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;div style=&amp;quot;font-weight: bold; margin-top: 1em;&amp;quot;&amp;gt;Nvidia&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Nano developer setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Nvidia Jetson Orin NX with CTI Boson carrier board setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;[[Jetson Linux BSP and Kernel Source Setup]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[Adding Custom device tree overlay to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to add a loadable kernel module (LKM) to JetPack 6.x]]&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; [[How to run NVIDIA NanoOWL tutorial]]&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- AI &amp;amp; CV Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[AI &amp;amp; Computer Vision]] – Edge AI, model training, and deployment.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- GStreamer Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[GStreamer Development]] – High-performance video and audio streaming.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Fundamentals]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Daemon]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Interpipes]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Application Development]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer Best Practices]]&amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;[[GStreamer video streaming, recording and snapshots with tee on Python]]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Web &amp;amp; Cloud Card --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex: 1 1 calc(50% - 1em); min-width: 300px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; background-color: #eef6ff;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background-color: #d9eaff; padding: 0.75em; font-weight: bold; font-size: 1.1em;&amp;quot;&amp;gt;&lt;br /&gt;
[[Web &amp;amp; Cloud Solutions]] – Scalable, production-ready applications.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;padding: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt;Coming Soon!&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 👀 Are you a PM looking to expand your knowledge in the software development industry? ==&lt;br /&gt;
&lt;br /&gt;
This tutorial is for you!  &lt;br /&gt;
Explore essential concepts that will help you navigate technical discussions with engineers and clients more confidently.&lt;br /&gt;
&lt;br /&gt;
📄&#039;&#039;&#039;[[Project Manager Tutorials]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 🛠️ Developer Tools ==&lt;br /&gt;
&lt;br /&gt;
This section provides essential guidelines and practices to ensure consistency, clarity, and efficiency across all development efforts. These tools and standards help teams collaborate better and maintain high-quality codebases.&lt;br /&gt;
&lt;br /&gt;
🔀 &#039;&#039;&#039;[[Git workflow]]&#039;&#039;&#039;: A structured guide to how our team uses Git—from branching strategies to pull request protocols—ensuring smooth collaboration and clean version history.&lt;br /&gt;
&lt;br /&gt;
🧾 &#039;&#039;&#039;[[Naming Conventions]]&#039;&#039;&#039;: Standardized naming rules for code elements such as variables, functions, classes, and files, helping improve readability and maintainability across projects.&lt;br /&gt;
&lt;br /&gt;
== 🐞🛠️ Debugging methods and error/bug fixes ==&lt;br /&gt;
This section provides the best debugging methods as well as common error/bug fixes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Yocto&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Yocto Project related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Error:_BitBake_%2B_AppArmor_User_Namespace_Restriction_Fix|Error: BitBake+AppArmor User Namespace Restriction Fix]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nvidia&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Nvidia related debugging methods and error/bug fixes &amp;lt;br&amp;gt;&lt;br /&gt;
*[[Debug_NVIDIA_Jetson_nvv4l2av1enc_VPR_Violation_(EMEM_decode_error)| Debug NVIDIA Jetson nvv4l2av1enc VPR Violation (EMEM decode error)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== 👀 Are You a PM Looking to Level Up in Software Development? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 1.1em; line-height: 1.6;&amp;quot;&amp;gt;&lt;br /&gt;
This tutorial is made just for you!  &lt;br /&gt;
Gain a solid grasp of essential software development concepts so you can confidently engage in technical discussions with both engineers and clients.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
📘&amp;lt;span class=&amp;quot;fa fa-book&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; &#039;&#039;&#039;[[Project Manager Tutorials|Start the Tutorial →]]&#039;&#039;&#039;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Footer}}&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=510</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=510"/>
		<updated>2025-11-26T18:59:45Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Performance improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Now you are ready to test some prompts! Use the following as examples: &lt;br /&gt;
* [a face]&lt;br /&gt;
* [a face, a ball]&lt;br /&gt;
* [a face [a nose, an eye]]&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance improvements ==&lt;br /&gt;
&lt;br /&gt;
* Observation: In the original implementation, both frame capture and model prediction were executed inside the same synchronous function (&#039;&#039;&#039;_read_and_encode_image&#039;&#039;&#039;). This caused the entire video pipeline to block while waiting for the model to finish inference, resulting in several seconds of latency in the browser.&lt;br /&gt;
&lt;br /&gt;
* Improvement: To resolve this, the prediction logic was moved into a separate asynchronous background task (&#039;&#039;&#039;prediction_loop&#039;&#039;&#039;). This design fully decouples capture from prediction, ensuring that the video stream remains smooth and low-latency, even when inference takes several seconds.&lt;br /&gt;
&lt;br /&gt;
Find below the complete code implementation separating the capture loop from the prediction loop. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION &amp;amp; AFFILIATES. All rights reserved.&lt;br /&gt;
# SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
#&lt;br /&gt;
# Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
# you may not use this file except in compliance with the License.&lt;br /&gt;
# You may obtain a copy of the License at&lt;br /&gt;
#&lt;br /&gt;
# http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
#&lt;br /&gt;
# Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
# distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
# See the License for the specific language governing permissions and&lt;br /&gt;
# limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import asyncio&lt;br /&gt;
import argparse&lt;br /&gt;
from aiohttp import web, WSCloseCode&lt;br /&gt;
import logging&lt;br /&gt;
import weakref&lt;br /&gt;
import cv2&lt;br /&gt;
import time&lt;br /&gt;
import PIL.Image&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from typing import List&lt;br /&gt;
from nanoowl.tree import Tree&lt;br /&gt;
from nanoowl.tree_predictor import (&lt;br /&gt;
    TreePredictor&lt;br /&gt;
)&lt;br /&gt;
from nanoowl.tree_drawing import draw_tree_output&lt;br /&gt;
from nanoowl.owl_predictor import OwlPredictor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;image_encode_engine&amp;quot;, type=str)&lt;br /&gt;
    parser.add_argument(&amp;quot;--image_quality&amp;quot;, type=int, default=50)&lt;br /&gt;
    parser.add_argument(&amp;quot;--port&amp;quot;, type=int, default=7860)&lt;br /&gt;
    parser.add_argument(&amp;quot;--host&amp;quot;, type=str, default=&amp;quot;0.0.0.0&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--camera&amp;quot;, type=int, default=0)&lt;br /&gt;
    parser.add_argument(&amp;quot;--resolution&amp;quot;, type=str, default=&amp;quot;640x480&amp;quot;, help=&amp;quot;Camera resolution as WIDTHxHEIGHT&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
    width, height = map(int, args.resolution.split(&amp;quot;x&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    CAMERA_DEVICE = args.camera&lt;br /&gt;
    IMAGE_QUALITY = args.image_quality&lt;br /&gt;
&lt;br /&gt;
    predictor = TreePredictor(&lt;br /&gt;
        owl_predictor=OwlPredictor(&lt;br /&gt;
            image_encoder_engine=args.image_encode_engine&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    prompt_data = None&lt;br /&gt;
    &lt;br /&gt;
    # Shared state between capture and prediction&lt;br /&gt;
    shared_state = {&lt;br /&gt;
        &amp;quot;latest_frame&amp;quot;: None,&lt;br /&gt;
        &amp;quot;latest_detections&amp;quot;: None,&lt;br /&gt;
        &amp;quot;frame_count&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    def get_colors(count: int):&lt;br /&gt;
        cmap = plt.cm.get_cmap(&amp;quot;rainbow&amp;quot;, count)&lt;br /&gt;
        colors = []&lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            color = cmap(i)&lt;br /&gt;
            color = [int(255 * value) for value in color]&lt;br /&gt;
            colors.append(tuple(color))&lt;br /&gt;
        return colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def cv2_to_pil(image):&lt;br /&gt;
        t0 = time.perf_counter_ns()&lt;br /&gt;
        t1 = time.perf_counter_ns()&lt;br /&gt;
        dt = (t1 - t0) / 1e9&lt;br /&gt;
        logging.info(f&amp;quot;CV2 to PIL time: {dt:.3f}s&amp;quot;)&lt;br /&gt;
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)&lt;br /&gt;
        return PIL.Image.fromarray(image)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def handle_index_get(request: web.Request):&lt;br /&gt;
        logging.info(&amp;quot;handle_index_get&amp;quot;)&lt;br /&gt;
        return web.FileResponse(&amp;quot;./index.html&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def websocket_handler(request):&lt;br /&gt;
&lt;br /&gt;
        global prompt_data&lt;br /&gt;
&lt;br /&gt;
        ws = web.WebSocketResponse()&lt;br /&gt;
&lt;br /&gt;
        await ws.prepare(request)&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Websocket connected.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        request.app[&#039;websockets&#039;].add(ws)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            async for msg in ws:&lt;br /&gt;
                logging.info(f&amp;quot;Received message from websocket.&amp;quot;)&lt;br /&gt;
                if &amp;quot;prompt&amp;quot; in msg.data:&lt;br /&gt;
                    header, prompt = msg.data.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
                    logging.info(&amp;quot;Received prompt: &amp;quot; + prompt)&lt;br /&gt;
                    try:&lt;br /&gt;
                        tree = Tree.from_prompt(prompt)&lt;br /&gt;
                        clip_encodings = predictor.encode_clip_text(tree)&lt;br /&gt;
                        owl_encodings = predictor.encode_owl_text(tree)&lt;br /&gt;
                        prompt_data = {&lt;br /&gt;
                            &amp;quot;tree&amp;quot;: tree,&lt;br /&gt;
                            &amp;quot;clip_encodings&amp;quot;: clip_encodings,&lt;br /&gt;
                            &amp;quot;owl_encodings&amp;quot;: owl_encodings&lt;br /&gt;
                        }&lt;br /&gt;
                        logging.info(&amp;quot;Set prompt: &amp;quot; + prompt)&lt;br /&gt;
                    except Exception as e:&lt;br /&gt;
                        print(e)&lt;br /&gt;
        finally:&lt;br /&gt;
            request.app[&#039;websockets&#039;].discard(ws)&lt;br /&gt;
&lt;br /&gt;
        return ws&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def on_shutdown(app: web.Application):&lt;br /&gt;
        for ws in set(app[&#039;websockets&#039;]):&lt;br /&gt;
            await ws.close(code=WSCloseCode.GOING_AWAY,&lt;br /&gt;
                        message=&#039;Server shutdown&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def detection_loop(app: web.Application):&lt;br /&gt;
&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Opening camera.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
        logging.info(&amp;quot;Loading predictor.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        def _read_and_encode_image():&lt;br /&gt;
            re, image = camera.read()&lt;br /&gt;
            if not re:&lt;br /&gt;
                return re, None&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_frame&amp;quot;] = image.copy()  # keep a copy for prediction&lt;br /&gt;
            shared_state[&amp;quot;frame_count&amp;quot;] += 1&lt;br /&gt;
&lt;br /&gt;
            # draw predictions if available (non-blocking)&lt;br /&gt;
            if prompt_data is not None and shared_state[&amp;quot;latest_detections&amp;quot;] is not None:&lt;br /&gt;
                image = draw_tree_output(image, shared_state[&amp;quot;latest_detections&amp;quot;], prompt_data[&amp;quot;tree&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
            image_jpeg = bytes(&lt;br /&gt;
                cv2.imencode(&amp;quot;.jpg&amp;quot;, image, [cv2.IMWRITE_JPEG_QUALITY, IMAGE_QUALITY])[1]&lt;br /&gt;
            )&lt;br /&gt;
            return re, image_jpeg&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
&lt;br /&gt;
            re, image = await loop.run_in_executor(None, _read_and_encode_image)&lt;br /&gt;
            &lt;br /&gt;
            if not re:&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            for ws in app[&amp;quot;websockets&amp;quot;]:&lt;br /&gt;
                await ws.send_bytes(image)&lt;br /&gt;
&lt;br /&gt;
        camera.release()&lt;br /&gt;
&lt;br /&gt;
    async def prediction_loop():&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
        while True:&lt;br /&gt;
            await asyncio.sleep(0)  &lt;br /&gt;
&lt;br /&gt;
            if prompt_data is None or shared_state[&amp;quot;latest_frame&amp;quot;] is None:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            # Copy latest frame for prediction&lt;br /&gt;
            frame_to_predict = shared_state[&amp;quot;latest_frame&amp;quot;].copy()&lt;br /&gt;
            image_pil = cv2_to_pil(frame_to_predict)&lt;br /&gt;
&lt;br /&gt;
            # Run predictor in thread pool (non-blocking)&lt;br /&gt;
            detections = await loop.run_in_executor(&lt;br /&gt;
                None,&lt;br /&gt;
                lambda: predictor.predict(&lt;br /&gt;
                    image_pil,&lt;br /&gt;
                    tree=prompt_data[&#039;tree&#039;],&lt;br /&gt;
                    clip_text_encodings=prompt_data[&#039;clip_encodings&#039;],&lt;br /&gt;
                    owl_text_encodings=prompt_data[&#039;owl_encodings&#039;]&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_detections&amp;quot;] = detections&lt;br /&gt;
&lt;br /&gt;
    async def run_detection_loop(app):&lt;br /&gt;
        try:&lt;br /&gt;
            task_video = asyncio.create_task(detection_loop(app))&lt;br /&gt;
            task_pred = asyncio.create_task(prediction_loop())&lt;br /&gt;
    &lt;br /&gt;
            yield &lt;br /&gt;
            await asyncio.gather(task_video, task_pred)&lt;br /&gt;
        except asyncio.CancelledError:&lt;br /&gt;
            pass&lt;br /&gt;
        finally:&lt;br /&gt;
            task_video.cancel()&lt;br /&gt;
            task_pred.cancel()&lt;br /&gt;
            await asyncio.gather(task_video, task_pred, return_exceptions=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    logging.basicConfig(level=logging.INFO)&lt;br /&gt;
    app = web.Application()&lt;br /&gt;
    app[&#039;websockets&#039;] = weakref.WeakSet()&lt;br /&gt;
    app.router.add_get(&amp;quot;/&amp;quot;, handle_index_get)&lt;br /&gt;
    app.router.add_route(&amp;quot;GET&amp;quot;, &amp;quot;/ws&amp;quot;, websocket_handler)&lt;br /&gt;
    app.on_shutdown.append(on_shutdown)&lt;br /&gt;
    app.cleanup_ctx.append(run_detection_loop)&lt;br /&gt;
    web.run_app(app, host=args.host, port=args.port)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=509</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=509"/>
		<updated>2025-11-26T18:58:55Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Performance improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Now you are ready to test some prompts! Use the following as examples: &lt;br /&gt;
* [a face]&lt;br /&gt;
* [a face, a ball]&lt;br /&gt;
* [a face [a nose, an eye]]&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance improvements ==&lt;br /&gt;
&lt;br /&gt;
* Observation: In the original implementation, both frame capture and model prediction were executed inside the same synchronous function (&#039;&#039;&#039;_read_and_encode_image&#039;&#039;&#039;). This caused the entire video pipeline to block while waiting for the model to finish inference, resulting in several seconds of latency in the browser.&lt;br /&gt;
&lt;br /&gt;
* Improvement: To resolve this, the prediction logic was moved into a separate asynchronous background task (&#039;&#039;&#039;prediction_loop&#039;&#039;&#039;). This design fully decouples capture from prediction, ensuring that the video stream remains smooth and low-latency, even when inference takes several seconds.&lt;br /&gt;
&lt;br /&gt;
Find below the complete code implementation separating the capture loop from the prediction loop. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION &amp;amp; AFFILIATES. All rights reserved.&lt;br /&gt;
# SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
#&lt;br /&gt;
# Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
# you may not use this file except in compliance with the License.&lt;br /&gt;
# You may obtain a copy of the License at&lt;br /&gt;
#&lt;br /&gt;
# http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
#&lt;br /&gt;
# Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
# distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
# See the License for the specific language governing permissions and&lt;br /&gt;
# limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import asyncio&lt;br /&gt;
import argparse&lt;br /&gt;
from aiohttp import web, WSCloseCode&lt;br /&gt;
import logging&lt;br /&gt;
import weakref&lt;br /&gt;
import cv2&lt;br /&gt;
import time&lt;br /&gt;
import PIL.Image&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from typing import List&lt;br /&gt;
from nanoowl.tree import Tree&lt;br /&gt;
from nanoowl.tree_predictor import (&lt;br /&gt;
    TreePredictor&lt;br /&gt;
)&lt;br /&gt;
from nanoowl.tree_drawing import draw_tree_output&lt;br /&gt;
from nanoowl.owl_predictor import OwlPredictor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;image_encode_engine&amp;quot;, type=str)&lt;br /&gt;
    parser.add_argument(&amp;quot;--image_quality&amp;quot;, type=int, default=50)&lt;br /&gt;
    parser.add_argument(&amp;quot;--port&amp;quot;, type=int, default=7860)&lt;br /&gt;
    parser.add_argument(&amp;quot;--host&amp;quot;, type=str, default=&amp;quot;0.0.0.0&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--camera&amp;quot;, type=int, default=0)&lt;br /&gt;
    parser.add_argument(&amp;quot;--resolution&amp;quot;, type=str, default=&amp;quot;640x480&amp;quot;, help=&amp;quot;Camera resolution as WIDTHxHEIGHT&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
    width, height = map(int, args.resolution.split(&amp;quot;x&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    CAMERA_DEVICE = args.camera&lt;br /&gt;
    IMAGE_QUALITY = args.image_quality&lt;br /&gt;
&lt;br /&gt;
    predictor = TreePredictor(&lt;br /&gt;
        owl_predictor=OwlPredictor(&lt;br /&gt;
            image_encoder_engine=args.image_encode_engine&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    prompt_data = None&lt;br /&gt;
    &lt;br /&gt;
    # Shared state between capture and prediction&lt;br /&gt;
    shared_state = {&lt;br /&gt;
        &amp;quot;latest_frame&amp;quot;: None,&lt;br /&gt;
        &amp;quot;latest_detections&amp;quot;: None,&lt;br /&gt;
        &amp;quot;frame_count&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    def get_colors(count: int):&lt;br /&gt;
        cmap = plt.cm.get_cmap(&amp;quot;rainbow&amp;quot;, count)&lt;br /&gt;
        colors = []&lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            color = cmap(i)&lt;br /&gt;
            color = [int(255 * value) for value in color]&lt;br /&gt;
            colors.append(tuple(color))&lt;br /&gt;
        return colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def cv2_to_pil(image):&lt;br /&gt;
        t0 = time.perf_counter_ns()&lt;br /&gt;
        t1 = time.perf_counter_ns()&lt;br /&gt;
        dt = (t1 - t0) / 1e9&lt;br /&gt;
        logging.info(f&amp;quot;CV2 to PIL time: {dt:.3f}s&amp;quot;)&lt;br /&gt;
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)&lt;br /&gt;
        return PIL.Image.fromarray(image)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def handle_index_get(request: web.Request):&lt;br /&gt;
        logging.info(&amp;quot;handle_index_get&amp;quot;)&lt;br /&gt;
        return web.FileResponse(&amp;quot;./index.html&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def websocket_handler(request):&lt;br /&gt;
&lt;br /&gt;
        global prompt_data&lt;br /&gt;
&lt;br /&gt;
        ws = web.WebSocketResponse()&lt;br /&gt;
&lt;br /&gt;
        await ws.prepare(request)&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Websocket connected.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        request.app[&#039;websockets&#039;].add(ws)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            async for msg in ws:&lt;br /&gt;
                logging.info(f&amp;quot;Received message from websocket.&amp;quot;)&lt;br /&gt;
                if &amp;quot;prompt&amp;quot; in msg.data:&lt;br /&gt;
                    header, prompt = msg.data.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
                    logging.info(&amp;quot;Received prompt: &amp;quot; + prompt)&lt;br /&gt;
                    try:&lt;br /&gt;
                        tree = Tree.from_prompt(prompt)&lt;br /&gt;
                        clip_encodings = predictor.encode_clip_text(tree)&lt;br /&gt;
                        owl_encodings = predictor.encode_owl_text(tree)&lt;br /&gt;
                        prompt_data = {&lt;br /&gt;
                            &amp;quot;tree&amp;quot;: tree,&lt;br /&gt;
                            &amp;quot;clip_encodings&amp;quot;: clip_encodings,&lt;br /&gt;
                            &amp;quot;owl_encodings&amp;quot;: owl_encodings&lt;br /&gt;
                        }&lt;br /&gt;
                        logging.info(&amp;quot;Set prompt: &amp;quot; + prompt)&lt;br /&gt;
                    except Exception as e:&lt;br /&gt;
                        print(e)&lt;br /&gt;
        finally:&lt;br /&gt;
            request.app[&#039;websockets&#039;].discard(ws)&lt;br /&gt;
&lt;br /&gt;
        return ws&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def on_shutdown(app: web.Application):&lt;br /&gt;
        for ws in set(app[&#039;websockets&#039;]):&lt;br /&gt;
            await ws.close(code=WSCloseCode.GOING_AWAY,&lt;br /&gt;
                        message=&#039;Server shutdown&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def detection_loop(app: web.Application):&lt;br /&gt;
&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Opening camera.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
        logging.info(&amp;quot;Loading predictor.&amp;quot;)&lt;br /&gt;
        frame_count = 0&lt;br /&gt;
        predict_every_n_frames = 1  # predict every 15 frames&lt;br /&gt;
&lt;br /&gt;
        def _read_and_encode_image():&lt;br /&gt;
            re, image = camera.read()&lt;br /&gt;
            if not re:&lt;br /&gt;
                return re, None&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_frame&amp;quot;] = image.copy()  # keep a copy for prediction&lt;br /&gt;
            shared_state[&amp;quot;frame_count&amp;quot;] += 1&lt;br /&gt;
&lt;br /&gt;
            # draw predictions if available (non-blocking)&lt;br /&gt;
            if prompt_data is not None and shared_state[&amp;quot;latest_detections&amp;quot;] is not None:&lt;br /&gt;
                image = draw_tree_output(image, shared_state[&amp;quot;latest_detections&amp;quot;], prompt_data[&amp;quot;tree&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
            image_jpeg = bytes(&lt;br /&gt;
                cv2.imencode(&amp;quot;.jpg&amp;quot;, image, [cv2.IMWRITE_JPEG_QUALITY, IMAGE_QUALITY])[1]&lt;br /&gt;
            )&lt;br /&gt;
            return re, image_jpeg&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
&lt;br /&gt;
            re, image = await loop.run_in_executor(None, _read_and_encode_image)&lt;br /&gt;
            &lt;br /&gt;
            if not re:&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            for ws in app[&amp;quot;websockets&amp;quot;]:&lt;br /&gt;
                await ws.send_bytes(image)&lt;br /&gt;
&lt;br /&gt;
        camera.release()&lt;br /&gt;
&lt;br /&gt;
    async def prediction_loop():&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
        while True:&lt;br /&gt;
            await asyncio.sleep(0)  &lt;br /&gt;
&lt;br /&gt;
            if prompt_data is None or shared_state[&amp;quot;latest_frame&amp;quot;] is None:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            # Copy latest frame for prediction&lt;br /&gt;
            frame_to_predict = shared_state[&amp;quot;latest_frame&amp;quot;].copy()&lt;br /&gt;
            image_pil = cv2_to_pil(frame_to_predict)&lt;br /&gt;
&lt;br /&gt;
            # Run predictor in thread pool (non-blocking)&lt;br /&gt;
            detections = await loop.run_in_executor(&lt;br /&gt;
                None,&lt;br /&gt;
                lambda: predictor.predict(&lt;br /&gt;
                    image_pil,&lt;br /&gt;
                    tree=prompt_data[&#039;tree&#039;],&lt;br /&gt;
                    clip_text_encodings=prompt_data[&#039;clip_encodings&#039;],&lt;br /&gt;
                    owl_text_encodings=prompt_data[&#039;owl_encodings&#039;]&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_detections&amp;quot;] = detections&lt;br /&gt;
&lt;br /&gt;
    async def run_detection_loop(app):&lt;br /&gt;
        try:&lt;br /&gt;
            task_video = asyncio.create_task(detection_loop(app))&lt;br /&gt;
            task_pred = asyncio.create_task(prediction_loop())&lt;br /&gt;
    &lt;br /&gt;
            yield &lt;br /&gt;
            await asyncio.gather(task_video, task_pred)&lt;br /&gt;
        except asyncio.CancelledError:&lt;br /&gt;
            pass&lt;br /&gt;
        finally:&lt;br /&gt;
            task_video.cancel()&lt;br /&gt;
            task_pred.cancel()&lt;br /&gt;
            await asyncio.gather(task_video, task_pred, return_exceptions=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    logging.basicConfig(level=logging.INFO)&lt;br /&gt;
    app = web.Application()&lt;br /&gt;
    app[&#039;websockets&#039;] = weakref.WeakSet()&lt;br /&gt;
    app.router.add_get(&amp;quot;/&amp;quot;, handle_index_get)&lt;br /&gt;
    app.router.add_route(&amp;quot;GET&amp;quot;, &amp;quot;/ws&amp;quot;, websocket_handler)&lt;br /&gt;
    app.on_shutdown.append(on_shutdown)&lt;br /&gt;
    app.cleanup_ctx.append(run_detection_loop)&lt;br /&gt;
    web.run_app(app, host=args.host, port=args.port)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=508</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=508"/>
		<updated>2025-11-26T18:58:42Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Performance improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Now you are ready to test some prompts! Use the following as examples: &lt;br /&gt;
* [a face]&lt;br /&gt;
* [a face, a ball]&lt;br /&gt;
* [a face [a nose, an eye]]&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance improvements ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;details&amp;gt;&lt;br /&gt;
&amp;lt;summary&amp;gt;Click to show full code&amp;lt;/summary&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# ... your code here ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/details&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Observation: In the original implementation, both frame capture and model prediction were executed inside the same synchronous function (&#039;&#039;&#039;_read_and_encode_image&#039;&#039;&#039;). This caused the entire video pipeline to block while waiting for the model to finish inference, resulting in several seconds of latency in the browser.&lt;br /&gt;
&lt;br /&gt;
* Improvement: To resolve this, the prediction logic was moved into a separate asynchronous background task (&#039;&#039;&#039;prediction_loop&#039;&#039;&#039;). This design fully decouples capture from prediction, ensuring that the video stream remains smooth and low-latency, even when inference takes several seconds.&lt;br /&gt;
&lt;br /&gt;
Find below the complete code implementation separating the capture loop from the prediction loop. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION &amp;amp; AFFILIATES. All rights reserved.&lt;br /&gt;
# SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
#&lt;br /&gt;
# Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
# you may not use this file except in compliance with the License.&lt;br /&gt;
# You may obtain a copy of the License at&lt;br /&gt;
#&lt;br /&gt;
# http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
#&lt;br /&gt;
# Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
# distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
# See the License for the specific language governing permissions and&lt;br /&gt;
# limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import asyncio&lt;br /&gt;
import argparse&lt;br /&gt;
from aiohttp import web, WSCloseCode&lt;br /&gt;
import logging&lt;br /&gt;
import weakref&lt;br /&gt;
import cv2&lt;br /&gt;
import time&lt;br /&gt;
import PIL.Image&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from typing import List&lt;br /&gt;
from nanoowl.tree import Tree&lt;br /&gt;
from nanoowl.tree_predictor import (&lt;br /&gt;
    TreePredictor&lt;br /&gt;
)&lt;br /&gt;
from nanoowl.tree_drawing import draw_tree_output&lt;br /&gt;
from nanoowl.owl_predictor import OwlPredictor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;image_encode_engine&amp;quot;, type=str)&lt;br /&gt;
    parser.add_argument(&amp;quot;--image_quality&amp;quot;, type=int, default=50)&lt;br /&gt;
    parser.add_argument(&amp;quot;--port&amp;quot;, type=int, default=7860)&lt;br /&gt;
    parser.add_argument(&amp;quot;--host&amp;quot;, type=str, default=&amp;quot;0.0.0.0&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--camera&amp;quot;, type=int, default=0)&lt;br /&gt;
    parser.add_argument(&amp;quot;--resolution&amp;quot;, type=str, default=&amp;quot;640x480&amp;quot;, help=&amp;quot;Camera resolution as WIDTHxHEIGHT&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
    width, height = map(int, args.resolution.split(&amp;quot;x&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    CAMERA_DEVICE = args.camera&lt;br /&gt;
    IMAGE_QUALITY = args.image_quality&lt;br /&gt;
&lt;br /&gt;
    predictor = TreePredictor(&lt;br /&gt;
        owl_predictor=OwlPredictor(&lt;br /&gt;
            image_encoder_engine=args.image_encode_engine&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    prompt_data = None&lt;br /&gt;
    &lt;br /&gt;
    # Shared state between capture and prediction&lt;br /&gt;
    shared_state = {&lt;br /&gt;
        &amp;quot;latest_frame&amp;quot;: None,&lt;br /&gt;
        &amp;quot;latest_detections&amp;quot;: None,&lt;br /&gt;
        &amp;quot;frame_count&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    def get_colors(count: int):&lt;br /&gt;
        cmap = plt.cm.get_cmap(&amp;quot;rainbow&amp;quot;, count)&lt;br /&gt;
        colors = []&lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            color = cmap(i)&lt;br /&gt;
            color = [int(255 * value) for value in color]&lt;br /&gt;
            colors.append(tuple(color))&lt;br /&gt;
        return colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def cv2_to_pil(image):&lt;br /&gt;
        t0 = time.perf_counter_ns()&lt;br /&gt;
        t1 = time.perf_counter_ns()&lt;br /&gt;
        dt = (t1 - t0) / 1e9&lt;br /&gt;
        logging.info(f&amp;quot;CV2 to PIL time: {dt:.3f}s&amp;quot;)&lt;br /&gt;
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)&lt;br /&gt;
        return PIL.Image.fromarray(image)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def handle_index_get(request: web.Request):&lt;br /&gt;
        logging.info(&amp;quot;handle_index_get&amp;quot;)&lt;br /&gt;
        return web.FileResponse(&amp;quot;./index.html&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def websocket_handler(request):&lt;br /&gt;
&lt;br /&gt;
        global prompt_data&lt;br /&gt;
&lt;br /&gt;
        ws = web.WebSocketResponse()&lt;br /&gt;
&lt;br /&gt;
        await ws.prepare(request)&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Websocket connected.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        request.app[&#039;websockets&#039;].add(ws)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            async for msg in ws:&lt;br /&gt;
                logging.info(f&amp;quot;Received message from websocket.&amp;quot;)&lt;br /&gt;
                if &amp;quot;prompt&amp;quot; in msg.data:&lt;br /&gt;
                    header, prompt = msg.data.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
                    logging.info(&amp;quot;Received prompt: &amp;quot; + prompt)&lt;br /&gt;
                    try:&lt;br /&gt;
                        tree = Tree.from_prompt(prompt)&lt;br /&gt;
                        clip_encodings = predictor.encode_clip_text(tree)&lt;br /&gt;
                        owl_encodings = predictor.encode_owl_text(tree)&lt;br /&gt;
                        prompt_data = {&lt;br /&gt;
                            &amp;quot;tree&amp;quot;: tree,&lt;br /&gt;
                            &amp;quot;clip_encodings&amp;quot;: clip_encodings,&lt;br /&gt;
                            &amp;quot;owl_encodings&amp;quot;: owl_encodings&lt;br /&gt;
                        }&lt;br /&gt;
                        logging.info(&amp;quot;Set prompt: &amp;quot; + prompt)&lt;br /&gt;
                    except Exception as e:&lt;br /&gt;
                        print(e)&lt;br /&gt;
        finally:&lt;br /&gt;
            request.app[&#039;websockets&#039;].discard(ws)&lt;br /&gt;
&lt;br /&gt;
        return ws&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def on_shutdown(app: web.Application):&lt;br /&gt;
        for ws in set(app[&#039;websockets&#039;]):&lt;br /&gt;
            await ws.close(code=WSCloseCode.GOING_AWAY,&lt;br /&gt;
                        message=&#039;Server shutdown&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def detection_loop(app: web.Application):&lt;br /&gt;
&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Opening camera.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
        logging.info(&amp;quot;Loading predictor.&amp;quot;)&lt;br /&gt;
        frame_count = 0&lt;br /&gt;
        predict_every_n_frames = 1  # predict every 15 frames&lt;br /&gt;
&lt;br /&gt;
        def _read_and_encode_image():&lt;br /&gt;
            re, image = camera.read()&lt;br /&gt;
            if not re:&lt;br /&gt;
                return re, None&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_frame&amp;quot;] = image.copy()  # keep a copy for prediction&lt;br /&gt;
            shared_state[&amp;quot;frame_count&amp;quot;] += 1&lt;br /&gt;
&lt;br /&gt;
            # draw predictions if available (non-blocking)&lt;br /&gt;
            if prompt_data is not None and shared_state[&amp;quot;latest_detections&amp;quot;] is not None:&lt;br /&gt;
                image = draw_tree_output(image, shared_state[&amp;quot;latest_detections&amp;quot;], prompt_data[&amp;quot;tree&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
            image_jpeg = bytes(&lt;br /&gt;
                cv2.imencode(&amp;quot;.jpg&amp;quot;, image, [cv2.IMWRITE_JPEG_QUALITY, IMAGE_QUALITY])[1]&lt;br /&gt;
            )&lt;br /&gt;
            return re, image_jpeg&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
&lt;br /&gt;
            re, image = await loop.run_in_executor(None, _read_and_encode_image)&lt;br /&gt;
            &lt;br /&gt;
            if not re:&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            for ws in app[&amp;quot;websockets&amp;quot;]:&lt;br /&gt;
                await ws.send_bytes(image)&lt;br /&gt;
&lt;br /&gt;
        camera.release()&lt;br /&gt;
&lt;br /&gt;
    async def prediction_loop():&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
        while True:&lt;br /&gt;
            await asyncio.sleep(0)  &lt;br /&gt;
&lt;br /&gt;
            if prompt_data is None or shared_state[&amp;quot;latest_frame&amp;quot;] is None:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            # Copy latest frame for prediction&lt;br /&gt;
            frame_to_predict = shared_state[&amp;quot;latest_frame&amp;quot;].copy()&lt;br /&gt;
            image_pil = cv2_to_pil(frame_to_predict)&lt;br /&gt;
&lt;br /&gt;
            # Run predictor in thread pool (non-blocking)&lt;br /&gt;
            detections = await loop.run_in_executor(&lt;br /&gt;
                None,&lt;br /&gt;
                lambda: predictor.predict(&lt;br /&gt;
                    image_pil,&lt;br /&gt;
                    tree=prompt_data[&#039;tree&#039;],&lt;br /&gt;
                    clip_text_encodings=prompt_data[&#039;clip_encodings&#039;],&lt;br /&gt;
                    owl_text_encodings=prompt_data[&#039;owl_encodings&#039;]&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_detections&amp;quot;] = detections&lt;br /&gt;
&lt;br /&gt;
    async def run_detection_loop(app):&lt;br /&gt;
        try:&lt;br /&gt;
            task_video = asyncio.create_task(detection_loop(app))&lt;br /&gt;
            task_pred = asyncio.create_task(prediction_loop())&lt;br /&gt;
    &lt;br /&gt;
            yield &lt;br /&gt;
            await asyncio.gather(task_video, task_pred)&lt;br /&gt;
        except asyncio.CancelledError:&lt;br /&gt;
            pass&lt;br /&gt;
        finally:&lt;br /&gt;
            task_video.cancel()&lt;br /&gt;
            task_pred.cancel()&lt;br /&gt;
            await asyncio.gather(task_video, task_pred, return_exceptions=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    logging.basicConfig(level=logging.INFO)&lt;br /&gt;
    app = web.Application()&lt;br /&gt;
    app[&#039;websockets&#039;] = weakref.WeakSet()&lt;br /&gt;
    app.router.add_get(&amp;quot;/&amp;quot;, handle_index_get)&lt;br /&gt;
    app.router.add_route(&amp;quot;GET&amp;quot;, &amp;quot;/ws&amp;quot;, websocket_handler)&lt;br /&gt;
    app.on_shutdown.append(on_shutdown)&lt;br /&gt;
    app.cleanup_ctx.append(run_detection_loop)&lt;br /&gt;
    web.run_app(app, host=args.host, port=args.port)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=507</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=507"/>
		<updated>2025-11-26T18:57:19Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* How to run NVIDIA NanoOWL tutorial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Now you are ready to test some prompts! Use the following as examples: &lt;br /&gt;
* [a face]&lt;br /&gt;
* [a face, a ball]&lt;br /&gt;
* [a face [a nose, an eye]]&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance improvements ==&lt;br /&gt;
&lt;br /&gt;
* Observation: In the original implementation, both frame capture and model prediction were executed inside the same synchronous function (&#039;&#039;&#039;_read_and_encode_image&#039;&#039;&#039;). This caused the entire video pipeline to block while waiting for the model to finish inference, resulting in several seconds of latency in the browser.&lt;br /&gt;
&lt;br /&gt;
* Improvement: To resolve this, the prediction logic was moved into a separate asynchronous background task (&#039;&#039;&#039;prediction_loop&#039;&#039;&#039;). This design fully decouples capture from prediction, ensuring that the video stream remains smooth and low-latency, even when inference takes several seconds.&lt;br /&gt;
&lt;br /&gt;
Find below the complete code implementation separating the capture loop from the prediction loop. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION &amp;amp; AFFILIATES. All rights reserved.&lt;br /&gt;
# SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
#&lt;br /&gt;
# Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
# you may not use this file except in compliance with the License.&lt;br /&gt;
# You may obtain a copy of the License at&lt;br /&gt;
#&lt;br /&gt;
# http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
#&lt;br /&gt;
# Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
# distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
# See the License for the specific language governing permissions and&lt;br /&gt;
# limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import asyncio&lt;br /&gt;
import argparse&lt;br /&gt;
from aiohttp import web, WSCloseCode&lt;br /&gt;
import logging&lt;br /&gt;
import weakref&lt;br /&gt;
import cv2&lt;br /&gt;
import time&lt;br /&gt;
import PIL.Image&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from typing import List&lt;br /&gt;
from nanoowl.tree import Tree&lt;br /&gt;
from nanoowl.tree_predictor import (&lt;br /&gt;
    TreePredictor&lt;br /&gt;
)&lt;br /&gt;
from nanoowl.tree_drawing import draw_tree_output&lt;br /&gt;
from nanoowl.owl_predictor import OwlPredictor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;image_encode_engine&amp;quot;, type=str)&lt;br /&gt;
    parser.add_argument(&amp;quot;--image_quality&amp;quot;, type=int, default=50)&lt;br /&gt;
    parser.add_argument(&amp;quot;--port&amp;quot;, type=int, default=7860)&lt;br /&gt;
    parser.add_argument(&amp;quot;--host&amp;quot;, type=str, default=&amp;quot;0.0.0.0&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--camera&amp;quot;, type=int, default=0)&lt;br /&gt;
    parser.add_argument(&amp;quot;--resolution&amp;quot;, type=str, default=&amp;quot;640x480&amp;quot;, help=&amp;quot;Camera resolution as WIDTHxHEIGHT&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
    width, height = map(int, args.resolution.split(&amp;quot;x&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    CAMERA_DEVICE = args.camera&lt;br /&gt;
    IMAGE_QUALITY = args.image_quality&lt;br /&gt;
&lt;br /&gt;
    predictor = TreePredictor(&lt;br /&gt;
        owl_predictor=OwlPredictor(&lt;br /&gt;
            image_encoder_engine=args.image_encode_engine&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    prompt_data = None&lt;br /&gt;
    &lt;br /&gt;
    # Shared state between capture and prediction&lt;br /&gt;
    shared_state = {&lt;br /&gt;
        &amp;quot;latest_frame&amp;quot;: None,&lt;br /&gt;
        &amp;quot;latest_detections&amp;quot;: None,&lt;br /&gt;
        &amp;quot;frame_count&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    def get_colors(count: int):&lt;br /&gt;
        cmap = plt.cm.get_cmap(&amp;quot;rainbow&amp;quot;, count)&lt;br /&gt;
        colors = []&lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            color = cmap(i)&lt;br /&gt;
            color = [int(255 * value) for value in color]&lt;br /&gt;
            colors.append(tuple(color))&lt;br /&gt;
        return colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def cv2_to_pil(image):&lt;br /&gt;
        t0 = time.perf_counter_ns()&lt;br /&gt;
        t1 = time.perf_counter_ns()&lt;br /&gt;
        dt = (t1 - t0) / 1e9&lt;br /&gt;
        logging.info(f&amp;quot;CV2 to PIL time: {dt:.3f}s&amp;quot;)&lt;br /&gt;
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)&lt;br /&gt;
        return PIL.Image.fromarray(image)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def handle_index_get(request: web.Request):&lt;br /&gt;
        logging.info(&amp;quot;handle_index_get&amp;quot;)&lt;br /&gt;
        return web.FileResponse(&amp;quot;./index.html&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def websocket_handler(request):&lt;br /&gt;
&lt;br /&gt;
        global prompt_data&lt;br /&gt;
&lt;br /&gt;
        ws = web.WebSocketResponse()&lt;br /&gt;
&lt;br /&gt;
        await ws.prepare(request)&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Websocket connected.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        request.app[&#039;websockets&#039;].add(ws)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            async for msg in ws:&lt;br /&gt;
                logging.info(f&amp;quot;Received message from websocket.&amp;quot;)&lt;br /&gt;
                if &amp;quot;prompt&amp;quot; in msg.data:&lt;br /&gt;
                    header, prompt = msg.data.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
                    logging.info(&amp;quot;Received prompt: &amp;quot; + prompt)&lt;br /&gt;
                    try:&lt;br /&gt;
                        tree = Tree.from_prompt(prompt)&lt;br /&gt;
                        clip_encodings = predictor.encode_clip_text(tree)&lt;br /&gt;
                        owl_encodings = predictor.encode_owl_text(tree)&lt;br /&gt;
                        prompt_data = {&lt;br /&gt;
                            &amp;quot;tree&amp;quot;: tree,&lt;br /&gt;
                            &amp;quot;clip_encodings&amp;quot;: clip_encodings,&lt;br /&gt;
                            &amp;quot;owl_encodings&amp;quot;: owl_encodings&lt;br /&gt;
                        }&lt;br /&gt;
                        logging.info(&amp;quot;Set prompt: &amp;quot; + prompt)&lt;br /&gt;
                    except Exception as e:&lt;br /&gt;
                        print(e)&lt;br /&gt;
        finally:&lt;br /&gt;
            request.app[&#039;websockets&#039;].discard(ws)&lt;br /&gt;
&lt;br /&gt;
        return ws&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def on_shutdown(app: web.Application):&lt;br /&gt;
        for ws in set(app[&#039;websockets&#039;]):&lt;br /&gt;
            await ws.close(code=WSCloseCode.GOING_AWAY,&lt;br /&gt;
                        message=&#039;Server shutdown&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def detection_loop(app: web.Application):&lt;br /&gt;
&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Opening camera.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
        logging.info(&amp;quot;Loading predictor.&amp;quot;)&lt;br /&gt;
        frame_count = 0&lt;br /&gt;
        predict_every_n_frames = 1  # predict every 15 frames&lt;br /&gt;
&lt;br /&gt;
        def _read_and_encode_image():&lt;br /&gt;
            re, image = camera.read()&lt;br /&gt;
            if not re:&lt;br /&gt;
                return re, None&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_frame&amp;quot;] = image.copy()  # keep a copy for prediction&lt;br /&gt;
            shared_state[&amp;quot;frame_count&amp;quot;] += 1&lt;br /&gt;
&lt;br /&gt;
            # draw predictions if available (non-blocking)&lt;br /&gt;
            if prompt_data is not None and shared_state[&amp;quot;latest_detections&amp;quot;] is not None:&lt;br /&gt;
                image = draw_tree_output(image, shared_state[&amp;quot;latest_detections&amp;quot;], prompt_data[&amp;quot;tree&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
            image_jpeg = bytes(&lt;br /&gt;
                cv2.imencode(&amp;quot;.jpg&amp;quot;, image, [cv2.IMWRITE_JPEG_QUALITY, IMAGE_QUALITY])[1]&lt;br /&gt;
            )&lt;br /&gt;
            return re, image_jpeg&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
&lt;br /&gt;
            re, image = await loop.run_in_executor(None, _read_and_encode_image)&lt;br /&gt;
            &lt;br /&gt;
            if not re:&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            for ws in app[&amp;quot;websockets&amp;quot;]:&lt;br /&gt;
                await ws.send_bytes(image)&lt;br /&gt;
&lt;br /&gt;
        camera.release()&lt;br /&gt;
&lt;br /&gt;
    async def prediction_loop():&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
        while True:&lt;br /&gt;
            await asyncio.sleep(0)  &lt;br /&gt;
&lt;br /&gt;
            if prompt_data is None or shared_state[&amp;quot;latest_frame&amp;quot;] is None:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            # Copy latest frame for prediction&lt;br /&gt;
            frame_to_predict = shared_state[&amp;quot;latest_frame&amp;quot;].copy()&lt;br /&gt;
            image_pil = cv2_to_pil(frame_to_predict)&lt;br /&gt;
&lt;br /&gt;
            # Run predictor in thread pool (non-blocking)&lt;br /&gt;
            detections = await loop.run_in_executor(&lt;br /&gt;
                None,&lt;br /&gt;
                lambda: predictor.predict(&lt;br /&gt;
                    image_pil,&lt;br /&gt;
                    tree=prompt_data[&#039;tree&#039;],&lt;br /&gt;
                    clip_text_encodings=prompt_data[&#039;clip_encodings&#039;],&lt;br /&gt;
                    owl_text_encodings=prompt_data[&#039;owl_encodings&#039;]&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_detections&amp;quot;] = detections&lt;br /&gt;
&lt;br /&gt;
    async def run_detection_loop(app):&lt;br /&gt;
        try:&lt;br /&gt;
            task_video = asyncio.create_task(detection_loop(app))&lt;br /&gt;
            task_pred = asyncio.create_task(prediction_loop())&lt;br /&gt;
    &lt;br /&gt;
            yield &lt;br /&gt;
            await asyncio.gather(task_video, task_pred)&lt;br /&gt;
        except asyncio.CancelledError:&lt;br /&gt;
            pass&lt;br /&gt;
        finally:&lt;br /&gt;
            task_video.cancel()&lt;br /&gt;
            task_pred.cancel()&lt;br /&gt;
            await asyncio.gather(task_video, task_pred, return_exceptions=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    logging.basicConfig(level=logging.INFO)&lt;br /&gt;
    app = web.Application()&lt;br /&gt;
    app[&#039;websockets&#039;] = weakref.WeakSet()&lt;br /&gt;
    app.router.add_get(&amp;quot;/&amp;quot;, handle_index_get)&lt;br /&gt;
    app.router.add_route(&amp;quot;GET&amp;quot;, &amp;quot;/ws&amp;quot;, websocket_handler)&lt;br /&gt;
    app.on_shutdown.append(on_shutdown)&lt;br /&gt;
    app.cleanup_ctx.append(run_detection_loop)&lt;br /&gt;
    web.run_app(app, host=args.host, port=args.port)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Need Further Support? =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📞 Book Consultation Call:&#039;&#039;&#039; [https://proventusnova.com/contact-us/ Show Calendar!]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;📩 Contact Via Email:&#039;&#039;&#039; [mailto:support@proventusnova.com support@proventusnova.com]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;🌐 Visit Our Website:&#039;&#039;&#039; [https://proventusnova.com ProventusNova.com]&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=506</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=506"/>
		<updated>2025-11-26T18:56:38Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Adaptations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Now you are ready to test some prompts! Use the following as examples: &lt;br /&gt;
* [a face]&lt;br /&gt;
* [a face, a ball]&lt;br /&gt;
* [a face [a nose, an eye]]&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance improvements ==&lt;br /&gt;
&lt;br /&gt;
* Observation: In the original implementation, both frame capture and model prediction were executed inside the same synchronous function (&#039;&#039;&#039;_read_and_encode_image&#039;&#039;&#039;). This caused the entire video pipeline to block while waiting for the model to finish inference, resulting in several seconds of latency in the browser.&lt;br /&gt;
&lt;br /&gt;
* Improvement: To resolve this, the prediction logic was moved into a separate asynchronous background task (&#039;&#039;&#039;prediction_loop&#039;&#039;&#039;). This design fully decouples capture from prediction, ensuring that the video stream remains smooth and low-latency, even when inference takes several seconds.&lt;br /&gt;
&lt;br /&gt;
Find below the complete code implementation separating the capture loop from the prediction loop. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION &amp;amp; AFFILIATES. All rights reserved.&lt;br /&gt;
# SPDX-License-Identifier: Apache-2.0&lt;br /&gt;
#&lt;br /&gt;
# Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
# you may not use this file except in compliance with the License.&lt;br /&gt;
# You may obtain a copy of the License at&lt;br /&gt;
#&lt;br /&gt;
# http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
#&lt;br /&gt;
# Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
# distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
# See the License for the specific language governing permissions and&lt;br /&gt;
# limitations under the License.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import asyncio&lt;br /&gt;
import argparse&lt;br /&gt;
from aiohttp import web, WSCloseCode&lt;br /&gt;
import logging&lt;br /&gt;
import weakref&lt;br /&gt;
import cv2&lt;br /&gt;
import time&lt;br /&gt;
import PIL.Image&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
from typing import List&lt;br /&gt;
from nanoowl.tree import Tree&lt;br /&gt;
from nanoowl.tree_predictor import (&lt;br /&gt;
    TreePredictor&lt;br /&gt;
)&lt;br /&gt;
from nanoowl.tree_drawing import draw_tree_output&lt;br /&gt;
from nanoowl.owl_predictor import OwlPredictor&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    parser = argparse.ArgumentParser()&lt;br /&gt;
    parser.add_argument(&amp;quot;image_encode_engine&amp;quot;, type=str)&lt;br /&gt;
    parser.add_argument(&amp;quot;--image_quality&amp;quot;, type=int, default=50)&lt;br /&gt;
    parser.add_argument(&amp;quot;--port&amp;quot;, type=int, default=7860)&lt;br /&gt;
    parser.add_argument(&amp;quot;--host&amp;quot;, type=str, default=&amp;quot;0.0.0.0&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--camera&amp;quot;, type=int, default=0)&lt;br /&gt;
    parser.add_argument(&amp;quot;--resolution&amp;quot;, type=str, default=&amp;quot;640x480&amp;quot;, help=&amp;quot;Camera resolution as WIDTHxHEIGHT&amp;quot;)&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
    width, height = map(int, args.resolution.split(&amp;quot;x&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    CAMERA_DEVICE = args.camera&lt;br /&gt;
    IMAGE_QUALITY = args.image_quality&lt;br /&gt;
&lt;br /&gt;
    predictor = TreePredictor(&lt;br /&gt;
        owl_predictor=OwlPredictor(&lt;br /&gt;
            image_encoder_engine=args.image_encode_engine&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    prompt_data = None&lt;br /&gt;
    &lt;br /&gt;
    # Shared state between capture and prediction&lt;br /&gt;
    shared_state = {&lt;br /&gt;
        &amp;quot;latest_frame&amp;quot;: None,&lt;br /&gt;
        &amp;quot;latest_detections&amp;quot;: None,&lt;br /&gt;
        &amp;quot;frame_count&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    def get_colors(count: int):&lt;br /&gt;
        cmap = plt.cm.get_cmap(&amp;quot;rainbow&amp;quot;, count)&lt;br /&gt;
        colors = []&lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            color = cmap(i)&lt;br /&gt;
            color = [int(255 * value) for value in color]&lt;br /&gt;
            colors.append(tuple(color))&lt;br /&gt;
        return colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def cv2_to_pil(image):&lt;br /&gt;
        t0 = time.perf_counter_ns()&lt;br /&gt;
        t1 = time.perf_counter_ns()&lt;br /&gt;
        dt = (t1 - t0) / 1e9&lt;br /&gt;
        logging.info(f&amp;quot;CV2 to PIL time: {dt:.3f}s&amp;quot;)&lt;br /&gt;
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)&lt;br /&gt;
        return PIL.Image.fromarray(image)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def handle_index_get(request: web.Request):&lt;br /&gt;
        logging.info(&amp;quot;handle_index_get&amp;quot;)&lt;br /&gt;
        return web.FileResponse(&amp;quot;./index.html&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def websocket_handler(request):&lt;br /&gt;
&lt;br /&gt;
        global prompt_data&lt;br /&gt;
&lt;br /&gt;
        ws = web.WebSocketResponse()&lt;br /&gt;
&lt;br /&gt;
        await ws.prepare(request)&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Websocket connected.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        request.app[&#039;websockets&#039;].add(ws)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            async for msg in ws:&lt;br /&gt;
                logging.info(f&amp;quot;Received message from websocket.&amp;quot;)&lt;br /&gt;
                if &amp;quot;prompt&amp;quot; in msg.data:&lt;br /&gt;
                    header, prompt = msg.data.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
                    logging.info(&amp;quot;Received prompt: &amp;quot; + prompt)&lt;br /&gt;
                    try:&lt;br /&gt;
                        tree = Tree.from_prompt(prompt)&lt;br /&gt;
                        clip_encodings = predictor.encode_clip_text(tree)&lt;br /&gt;
                        owl_encodings = predictor.encode_owl_text(tree)&lt;br /&gt;
                        prompt_data = {&lt;br /&gt;
                            &amp;quot;tree&amp;quot;: tree,&lt;br /&gt;
                            &amp;quot;clip_encodings&amp;quot;: clip_encodings,&lt;br /&gt;
                            &amp;quot;owl_encodings&amp;quot;: owl_encodings&lt;br /&gt;
                        }&lt;br /&gt;
                        logging.info(&amp;quot;Set prompt: &amp;quot; + prompt)&lt;br /&gt;
                    except Exception as e:&lt;br /&gt;
                        print(e)&lt;br /&gt;
        finally:&lt;br /&gt;
            request.app[&#039;websockets&#039;].discard(ws)&lt;br /&gt;
&lt;br /&gt;
        return ws&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def on_shutdown(app: web.Application):&lt;br /&gt;
        for ws in set(app[&#039;websockets&#039;]):&lt;br /&gt;
            await ws.close(code=WSCloseCode.GOING_AWAY,&lt;br /&gt;
                        message=&#039;Server shutdown&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    async def detection_loop(app: web.Application):&lt;br /&gt;
&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
&lt;br /&gt;
        logging.info(&amp;quot;Opening camera.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
        logging.info(&amp;quot;Loading predictor.&amp;quot;)&lt;br /&gt;
        frame_count = 0&lt;br /&gt;
        predict_every_n_frames = 1  # predict every 15 frames&lt;br /&gt;
&lt;br /&gt;
        def _read_and_encode_image():&lt;br /&gt;
            re, image = camera.read()&lt;br /&gt;
            if not re:&lt;br /&gt;
                return re, None&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_frame&amp;quot;] = image.copy()  # keep a copy for prediction&lt;br /&gt;
            shared_state[&amp;quot;frame_count&amp;quot;] += 1&lt;br /&gt;
&lt;br /&gt;
            # draw predictions if available (non-blocking)&lt;br /&gt;
            if prompt_data is not None and shared_state[&amp;quot;latest_detections&amp;quot;] is not None:&lt;br /&gt;
                image = draw_tree_output(image, shared_state[&amp;quot;latest_detections&amp;quot;], prompt_data[&amp;quot;tree&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
            image_jpeg = bytes(&lt;br /&gt;
                cv2.imencode(&amp;quot;.jpg&amp;quot;, image, [cv2.IMWRITE_JPEG_QUALITY, IMAGE_QUALITY])[1]&lt;br /&gt;
            )&lt;br /&gt;
            return re, image_jpeg&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
&lt;br /&gt;
            re, image = await loop.run_in_executor(None, _read_and_encode_image)&lt;br /&gt;
            &lt;br /&gt;
            if not re:&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            for ws in app[&amp;quot;websockets&amp;quot;]:&lt;br /&gt;
                await ws.send_bytes(image)&lt;br /&gt;
&lt;br /&gt;
        camera.release()&lt;br /&gt;
&lt;br /&gt;
    async def prediction_loop():&lt;br /&gt;
        loop = asyncio.get_running_loop()&lt;br /&gt;
        while True:&lt;br /&gt;
            await asyncio.sleep(0)  &lt;br /&gt;
&lt;br /&gt;
            if prompt_data is None or shared_state[&amp;quot;latest_frame&amp;quot;] is None:&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            # Copy latest frame for prediction&lt;br /&gt;
            frame_to_predict = shared_state[&amp;quot;latest_frame&amp;quot;].copy()&lt;br /&gt;
            image_pil = cv2_to_pil(frame_to_predict)&lt;br /&gt;
&lt;br /&gt;
            # Run predictor in thread pool (non-blocking)&lt;br /&gt;
            detections = await loop.run_in_executor(&lt;br /&gt;
                None,&lt;br /&gt;
                lambda: predictor.predict(&lt;br /&gt;
                    image_pil,&lt;br /&gt;
                    tree=prompt_data[&#039;tree&#039;],&lt;br /&gt;
                    clip_text_encodings=prompt_data[&#039;clip_encodings&#039;],&lt;br /&gt;
                    owl_text_encodings=prompt_data[&#039;owl_encodings&#039;]&lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            shared_state[&amp;quot;latest_detections&amp;quot;] = detections&lt;br /&gt;
&lt;br /&gt;
    async def run_detection_loop(app):&lt;br /&gt;
        try:&lt;br /&gt;
            task_video = asyncio.create_task(detection_loop(app))&lt;br /&gt;
            task_pred = asyncio.create_task(prediction_loop())&lt;br /&gt;
    &lt;br /&gt;
            yield &lt;br /&gt;
            await asyncio.gather(task_video, task_pred)&lt;br /&gt;
        except asyncio.CancelledError:&lt;br /&gt;
            pass&lt;br /&gt;
        finally:&lt;br /&gt;
            task_video.cancel()&lt;br /&gt;
            task_pred.cancel()&lt;br /&gt;
            await asyncio.gather(task_video, task_pred, return_exceptions=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    logging.basicConfig(level=logging.INFO)&lt;br /&gt;
    app = web.Application()&lt;br /&gt;
    app[&#039;websockets&#039;] = weakref.WeakSet()&lt;br /&gt;
    app.router.add_get(&amp;quot;/&amp;quot;, handle_index_get)&lt;br /&gt;
    app.router.add_route(&amp;quot;GET&amp;quot;, &amp;quot;/ws&amp;quot;, websocket_handler)&lt;br /&gt;
    app.on_shutdown.append(on_shutdown)&lt;br /&gt;
    app.cleanup_ctx.append(run_detection_loop)&lt;br /&gt;
    web.run_app(app, host=args.host, port=args.port)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=505</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=505"/>
		<updated>2025-11-26T18:39:39Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Tutorial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Now you are ready to test some prompts! Use the following as examples: &lt;br /&gt;
* [a face]&lt;br /&gt;
* [a face, a ball]&lt;br /&gt;
* [a face [a nose, an eye]]&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=504</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=504"/>
		<updated>2025-11-26T18:38:42Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Tutorial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
======== Running on http://0.0.0.0:7860 ========&lt;br /&gt;
(Press CTRL+C to quit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. On your host PC, open browser to: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
http://&amp;lt;board_ip&amp;gt;:7860&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
	<entry>
		<id>https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=503</id>
		<title>How to run NVIDIA NanoOWL tutorial</title>
		<link rel="alternate" type="text/html" href="https://developerwiki.proventusnova.com/index.php?title=How_to_run_NVIDIA_NanoOWL_tutorial&amp;diff=503"/>
		<updated>2025-11-26T18:34:02Z</updated>

		<summary type="html">&lt;p&gt;Nico: /* Set up */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=How to run NVIDIA NanoOWL tutorial=&lt;br /&gt;
&#039;&#039;Keywords&#039;&#039;: &#039;&#039;NVIDIA Jetson, NanoOWL, object detection&#039;&#039;&lt;br /&gt;
==Description==&lt;br /&gt;
This wiki pages shows how to run the tree prediction with a live camera tutorial from NVIDIA NanoOWL. NanoOWL is a project that optimizes OWL-ViT to run &#039;&#039;&#039;real-time&#039;&#039;&#039; on NVIDIA Jetson Orin Platforms with NVIDIA TensorRT. NanoOWL also introduces a new &amp;quot;tree detection&amp;quot; pipeline that combines OWL-ViT and CLIP to enable nested detection and classification of anything, at any level, simply by providing text.&lt;br /&gt;
&lt;br /&gt;
==Set up==&lt;br /&gt;
Minimal requirements:&lt;br /&gt;
* One of the following Jetson:&lt;br /&gt;
** Jetson Orin NX (16 GB)&lt;br /&gt;
** Jetson Orin Nano (8 GB)&lt;br /&gt;
** Jetson AGX Orin (32 GB or 64 GB) &lt;br /&gt;
&lt;br /&gt;
* Running one of the following JetPack versions: &lt;br /&gt;
** Jetpack 5 (L4T r35.x)&lt;br /&gt;
** Jetpack 6 (L4T r36.x)&lt;br /&gt;
&lt;br /&gt;
This tutorial was tested with the following setup: &lt;br /&gt;
* x86/x64 based host machine running Ubuntu 24.04&lt;br /&gt;
* Jetson Orin NX (16 GB) + CTI Boson carrier board running Jetpack 6.2.1 (L4T 36.4.4).&lt;br /&gt;
* One Framos IMX464 camera &lt;br /&gt;
* Ethernet cable &lt;br /&gt;
&lt;br /&gt;
1. Connect to the board via ssh: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ssh &amp;lt;user&amp;gt;@&amp;lt;board_ip&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you should be inside the board.&lt;br /&gt;
&lt;br /&gt;
== Tutorial == &lt;br /&gt;
&lt;br /&gt;
1. Clone and setup &#039;&#039;&#039;jetson-containers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
git clone https://github.com/dusty-nv/jetson-containers&lt;br /&gt;
bash jetson-containers/install.sh&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Run the following to pull or build a compatible container image. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
jetson-containers run --workdir /opt/nanoowl $(autotag nanoowl)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After running above command you should be in workdir (&#039;&#039;&#039;/opt/nanoowl&#039;&#039;&#039;) inside the container. &lt;br /&gt;
&lt;br /&gt;
3. Verify you have a camera connected: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
ls /dev/video*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Install missing module inside container: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If this takes too long or fails, try the following command: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
pip install aiohttp --index-url https://pypi.org/simple --prefer-binary&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Run the &#039;&#039;&#039;tree_demo.py&#039;&#039;&#039; example.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
cd examples/tree_demo&lt;br /&gt;
python3 tree_demo.py --camera 0 --resolution 640x480 ../../data/owl_image_encoder_patch32.engine&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should see the following after the application starts:&lt;br /&gt;
&lt;br /&gt;
== Adaptations ==&lt;br /&gt;
&lt;br /&gt;
* If you are using a camera that does not support the GStreamer &#039;&#039;&#039;v4l2src&#039;&#039;&#039; element—for example, a CSI-connected camera—you may encounter an error similar to the following: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; &lt;br /&gt;
[ WARN:0@15.685] global cap_gstreamer.cpp:2829 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error. &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To enable frame capture from such a camera, modify the &#039;&#039;&#039;detection_loop&#039;&#039;&#039; method as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; &lt;br /&gt;
        # Delete or comment the three lines of code below&lt;br /&gt;
        # camera = cv2.VideoCapture(CAMERA_DEVICE)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)&lt;br /&gt;
        # camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)&lt;br /&gt;
&lt;br /&gt;
        # Add the following GStreamer pipeline to use nvarguscamerasrc&lt;br /&gt;
        gst_pipeline = (&lt;br /&gt;
                 f&amp;quot;nvarguscamerasrc ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;video/x-raw(memory:NVMM), width={width}, height={height}, format=NV12, framerate=30/1 ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! &amp;quot;&lt;br /&gt;
                 f&amp;quot;appsink&amp;quot;&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        camera = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)&lt;br /&gt;
        camera.set(cv2.CAP_PROP_BUFFERSIZE, 1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nico</name></author>
	</entry>
</feed>