Adjust Hardware and Software JSON Manifest Files with NVIDIA SDK Manager#

Goal#

This document describes the method to use the SDK Manager client to create or change the carried data information to allow the use of it for the hardware and software that are not provided by NVIDIA official SDK releases.

The SDK Manager client gets information about software and hardware from official NVIDIA repositories; however, this can be overridden or recreated with your own settings.

The descriptions below will help you to create such repositories with requested modifications, and use them for distributing a modified setup of software and hardware.

The Flow to Create and Use Repositories#

The sections below will describe each step to create your own repository/server and use them.

The mailstone flow steps are:

  • Obtain current repository files for hardware and software.

  • Modify a local copy with requested changes.

  • Launch SDK Manager with a reference to the new repositories.

Obtain Reference Data#

To begin, get the hardware and software JSON manifest files that include the hardware and software information for the SDK release you want to customize:

Download the software JSON manifest file using one of the below methods:

  • Using the SDK Manager GUI: run the NVIDIA SDK Manager GUI, select the SDK you would like to customize, then go to STEP 02 to review the list of components. When finished, exit SDK Manager.

  • Using the SDK Manager command-line interface: run the NVIDIA SDK Manager CLI with the specific parameters needed. For example:

    # sdkmanager --cli
    

Review the related execution command. When finished, exit SDK Manager.

  • Hardware reference files should be contained in the ~/.nvsdkm/hwdata/ directory.

  • Software reference files should be contained in the ~/.nvsdkm/dist/ directory.

Create Your Own Configuration#

Review the hardware reference file directory ~/.nvsdkm/hwdata/, copy the related needed files to another location, and modify them based on the schema information provided in the Repository Schema Details.

Review the software reference directory ~/.nvsdkm/dist/, copy the related needed files to another location, and modify them based on the schema information provided in the Repository Schema Details.

An example is provided at the end of this documentation.

Launch SDK Manager with Your Own Configuration#

To launch SDK Manager with customized software JSON files, use the following:

sdkmanager --hw-server [customized_l1_json_uri] --server [customized_l1_json_uri]

Repository Schema Details#

File Hierarchies#

Hardware#

Relations between L1/L2/L3 files:

  • The L1 JSON file contains the general hw support information and the families (products) we have in SDK Manager. In families, the families.uri points to the L2 family JSON location.

  • The L2 JSON file contains the detailed family information for a product. Each family contains the hardware devices under that product, and In series, the series.uri points to the L3 series device’s JSON location. This will point to a series device JSON location. Difference between Series and Individual devices explained below.

  • The L3 JSON file contains the detailed hardware information of a series or an individual device.

Series and Individual devices:

  • An L3 HW schema file is either a Series or an Individual device.

  • A Series refers to a list of devices that have the similar module. It must contain a non-empty devices field in its JSON file. Also, devices.uri points to the L3 JSON of the representative individual device. An Individual device JSON file will not hold the devices field.

  • An Individual device must belong to one of the Series.

  • Information in the Series JSON will be used for all the containing devices, where the Individual device JSON can overwrite most of the fields in Series JSON.

  • The Series device L3 files provided by NVIDIA end with TARGETS.json or DEVKITS.json.

Software#

Relations between L1/L2/L3 files:

  • The L1 JSON file contains the general sw support information and the productCategories (products) we have in SDK Manager. In productCategories, the productCategories.releasesIndexURL points to the L2 product JSON location.

  • The L2 JSON file contains the detailed product releases information. Each productCategories contains multiple SDKs or additional SDK releases of this product. They have different versions, revisions, supported OSes, devices, etc. For each release/version, versions.compRepoURL or releases.compRepoURL points to the location of the L3 JSON, the SDK JSON.

  • The L3 JSON file contains the detailed SDK information. It has information about sections, groups, components, installation methods, and more.

Detailed Schemas#

You can review the detailed schemas here.

Example: Create a Customized Jetson AGX Orin-Based Device#

Create the hw Configuration Files#

  1. Copy the related files to a new location and review the files.

    cd ~
    mkdir hwsample
    cp ./.nvsdkm/hwdata/sdkml1_repo_hw.json ./hwsample
    cp ./.nvsdkm/hwdata/sdkml2_jetson_hw.json ./hwsample
    mkdir families
    cd families
    mkdir devices
    mkdir series
    cd ~
    cp ./.nvsdkm/hwdata/families/series/jetson-agx-orin-targets.json ./hwsample/families/series
    cp ./.nvsdkm/hwdata/families/devices/jetson-agx-orin-64gb.json ./hwsample/families/devices
    
  2. Update the related files’ general information in the newly created hwsample folder.

    1. In each file that you copied in the above step, find the information object.

    2. Change the information.title to some string you like. In this example, it was set to Sample Jetson HW releases.

    3. Change the information.buildNumber to your chosen string. In this example, it was set to samp100. Add some non-digit characters in this string so it won’t conflict with the official SDK Manager builds.

    4. Keep the information.contentVersion and information.schemaVersion values.

  3. Change the related files’ hw information in the newly created hwsample folder to the information of Sample AGX Orin.

    1. Rename the L3 series JSON file from jetson-agx-orin-targets.json to sample-agx-orin-targets.json.

    2. Rename the L3 device JSON file from jetson-agx-orin-64gb.json to sample-agx-orin.json.

    3. Go to the L1 JSON file sdkml1_repo_hw.json, remove unrelated family objects in the families array. The file would look like the following after editing:

      {
          "information": {
              "title": "Sample Jetson HW releases",
              "contentVersion": "0.0.1",
              "buildNumber": "samp100",
              "schemaVersion": "1"
      },
          "families": [
              {
                  "name": "Jetson",
                  "uri": "./sdkml2_jetson_hw.json"
              }
          ]
      }
      
    4. Go to the L2 JSON file sdkml2_jetson_hw.json, remove all unrelated series objects in the series array. Also, add the new series object based on our sample device. The file would look like the following after editing:

      {
          "information": {
              "title": "Sample Jetson HW releases",
              "contentVersion": "0.0.1",
              "buildNumber": "samp100",
              "schemaVersion": "1"
          },
          "series": [
              {
                  "id": "SAMPLE_AGX_ORIN_TARGETS",
                  "uri": "./families/jetson/series/sample-agx-orin-targets.json"
              }
          ]
      }
      
    5. Go to the L3 series JSON file sample-agx-orin-targets.json, replace the correct information of our sample device series. In this example, we will only replace the name of this series to Sample AGX Orin modules, and update its related ID/key. The file would look like the following after editing:

      {
          "information": {
              "title": "Sample Jetson HW releases",
              "contentVersion": "0.0.1",
              "buildNumber": "samp100",
              "schemaVersion": "1"
           },
          "hw": {
              "SAMPLE_AGX_ORIN_TARGETS": {
                  "name": "Sample AGX Orin modules",
                  "devices": [
                      {
                          "uri": "../devices/sample-agx-orin.json",
                          "id": "SAMPLE_AGX_ORIN"
                      }
                  ],
                  "products": [
                      "Jetson"
                  ],
                  "imagePath": "https://developer.download.nvidia.com/sdkmanager/resources/hw_images/JETSON/JETSON_AGX_ORIN.png",
                  "storages": [
                      {
                          "id": "default",
                          "displayName": "EMMC (default)",
                          "flashOptions": ""
                      },
                      {
                          "id": "nvme",
                          "displayName": "NVMe",
                          "flashOptions": "--storage nvme0n1p1"
                      },
                      {
                          "id": "usb",
                          "displayName": "USB",
                          "flashOptions": "--storage sda1"
                      },
                      {
                          "id": "custom",
                          "displayName": "Custom",
                          "flashOptions": "--custom ./nvautoflash.sh"
                      }
                  ],
                  "deviceInstructions": {
                      "flash": [
                          "Choose whether to put your %{DEVICE_NAME} into Force Recovery Mode via Manual Setup or Automatic Setup. Choose Automatic Setup only if the device has already been flashed and is currently running."
                      ],
                      "recoveryAuto": [
                          "Ensure the device has already been flashed, powered and running.",
                          "Connect the host computer to the front USB Type-C connector on the device.",
                          "Enter the connection information of your %{DEVICE_NAME}."
                      ],
                      "recoveryManual": [
                          "Make sure the device is connected to the power adapter, but powered off.",
                          "Connect the host computer to the front USB Type-C connector on the device.",
                          "Press and hold the middle (Force Recovery) button.",
                          "Press and hold the left (Power) button.",
                          "Release both buttons."
                      ],
                      "targetAccess": [
                          "Complete the Ubuntu 'System configuration wizard' on your %{targetName}, if you have chosen to configure it manually before flashing.",
                          "Wait for the OS login screen.",
                          "If proxy is used on host, also configure apt proxy on your %{targetName}.",
                          "Enter the username and password of your %{targetName}."
                      ]
                  },
                  "singularName": "Jetson AGX Orin module",
                  "id": "SAMPLE_AGX_ORIN_TARGETS"
              }
          }
      }
      
    6. Go to the L3 device JSON file sample-agx-orin.json, replace the correct information of the sample device. In this example, we will only replace the name of this device to Sample AGX Orin, and update its related ID/key. The file would look like the following after editing:

          {
              "information": {
                  "title": "Sample Jetson HW releases",
                  "contentVersion": "0.0.1",
                  "buildNumber": "samp100",
                  "schemaVersion": "1"
              },
              "hw": {
                  "SAMPLE_AGX_ORIN": {
                      "name": "Sample AGX Orin",
                      "products": [
                      "Jetson"
                  ],
                  "deviceIdentificationDetails": {
                      "moduleNames": [
                          "P3701-0005 [64GB]"
                      ],
                      "moduleIds": [
                          "3701-0005"
                      ],
                      "moduleDescription": "P3701-0005 module",
                      "tegraRecoveryModeCodes": [
                          "0955:703"
                      ],
                      "carrierIds": [
                          "3737-0000"
                      ],
                      "carrierDescription": "P3737-0000 carrier board"
                  },
                  "imagePath": "https://developer.download.nvidia.com/sdkmanager/resources/hw_images/JETSON/JETSON_AGX_ORIN.png",
                  "storages": [
                      {
                          "id": "default",
                          "displayName": "EMMC (default)",
                          "flashOptions": ""
                      },
                      {
                          "id": "nvme",
                          "displayName": "NVMe",
                          "flashOptions": "--storage nvme0n1p1"
                      },
                      {
                          "id": "usb",
                          "displayName": "USB",
                          "flashOptions": "--storage sda1"
                      },
                      {
                          "id": "custom",
                          "displayName": "Custom",
                          "flashOptions": "--custom ./nvautoflash.sh"
                      }
                  ],
                  "id": "SAMPLE_AGX_ORIN"
              }
          }
      }
      

The above are all the steps taken to create a customized Jetson AGX Orin based device, Sample AGX Orin, with a hardware configuration file. You can also host all the files with the layout on a server, so the end user can easily load them with a single link (example: sdkmanager --hw-server [link_to_your_customized_file]).

Create the sw Configuration Files#

  1. Copy the related files to a new location and review them.

    cd ~
    mkdir swsample
    cp -r ./.nvsdkm/dist/main ./swsample
    cp -r ./.nvsdkm/dist/Jetson ./swsample
    cp ./.nvsdkm/dist/sdkml3_jetpack_512.json ./swsample
    
  2. Update the related files’ general information in the newly created swsample folder.

    1. In the L1 and L2 files you copied in the above step, find the information object.

    2. Change the information.title to your preferred string. In this example, it was set to Sample Jetson SW releases.

    3. Change the information.serverConfigurationBuild to your preferred string. In this example, it was set to samp100, add some non-digit characters to this string so it won’t conflict with the official SDK Manager builds.

    4. In the L3 file you copied in the upper step, find the information object. Change the information.release.releaseBuild to sampb100, then add some non-digit characters to this string so it won’t conflict with the official SDK Manager builds.

  3. Change the related files sw information in the newly created swsample folder to the information of Sample AGX Orin.

    1. Go to the L1 JSON file ./main/sdkml1_repo.json, remove unrelated productCategories objects in the productCategories array. After editing, the end of the file would look like the following:

      {
        "information": {
             "title": "Sample Jetson SW releases",
             "version": "9",
             "revision": 0,
             "serverConfigurationBuild": "samp100"
         },
         "productCategories": [
             {
                 "categoryName": "Jetson",
                 "productLines": [
                     {
                         "targetOS": "Linux",
                         "targetType": "",
                         "serverType": [
                             "PID",
                             "DEVZONE"
                         ],
                         "releasesIndexURL": "../Jetson/Linux/sdkml2_jetson_linux.json"
                     }
                 ]
             }
         ]
      }
      
    2. Go to the L2 JSON file ./Jetson/Linux/sdkml2_jetson_linux.json.

      1. Remove all unrelated release objects in the releases array.

      2. Remove the additionalSDKs object since it’s the old schema for backward compatibility, and no longer used in current SDKs.

      3. Replace the correct information in this release. In this example, you will only change this release to support a new series, Sample AGX Orin modules, which was created above in the HW files.

      • Change the releaseBuild under this release to match the one you changed above, sampb100.

      • Change the targetHW lists’ hardwares to only contain SAMPLE_AGX_ORIN_TARGETS.

      • Change the compRepoURL under this release to the uri where the L3 JSON is located. In this example, we change it to the local relative uri: ./../../sdkml3_jetpack_512.json.

      1. After editing, the end of the file would look like the following:

      {
          "information": {
              "title": "Sample Jetson SW releases",
              "fileVersion": "1",
              "fileRevision": 0,
              "serverConfigurationBuild": "samp100"
          },
          "releases": [
              {
                  "productDisplayName": "Jetson",
                  "serverType": [
                      "DEVZONE"
                  ],
                  "title": "JetPack 5.1.2",
                  "releaseRevision": 0,
                  "minSDKMVer": "1.9.3",
                  "releaseMessage": "",
                  "pidGroupId": "",
                  "targetHW": [
                      "SAMPLE_AGX_ORIN_TARGETS",
                  ],
                  "hostOperatingSystemsSupportFor": {
                      "hostGroups": [
                          "ubuntu18.04",
                          "ubuntu20.04"
                      ],
                      "targetGroups": [
                          "ubuntu18.04",
                          "ubuntu20.04"
                      ]
                  },
                  "IntHWSupport": false,
                  "releaseNotes": {
                      "releaseNotesTooltip": "<div><span class=\"tooltip-title\">What's new in JetPack 5.1.2:</span><ul><li>Support for Jetson AGX Orin Industrial Module</li><li>Enhanced Argus error resiliency</li><li>Support for multiple camera synchronization </li><li>Software based deterministic fixed alternating exposure support in Argus</li><li>Deskew Calibration supported for high data rate sensors</li></ul><a href=\"https://docs.nvidia.com/jetson/archives/jetpack-archived/jetpack-512/release-notes/index.html\" target=\"_blank\" class=\"tooltip-link\">Open Release Notes</a></div>",
                      "releaseNotesURL": "https://docs.nvidia.com/jetson/archives/jetpack-archived/jetpack-512/release-notes/index.html",
                      "releaseNotesDownload": false
                  },
                  "showInMainList": true,
                  "setupDeviceRecoveryModeOptions": [
                      "manual",
                      "automatic"
                  ],
                  "supportsOEMPreConfiguration": true,
                  "architectures": [
                      "x86_64"
                  ],
                  "productCategory": "Jetson",
                  "targetOS": "Linux",
                  "releaseVersion": "5.1.2",
                  "releaseEdition": "",
                  "id": "",
                  "hasTargetComponents": true,
                  "hardwareConfiguration": [
                      "host",
                      "target"
                  ],
                  "releaseBuild": "sampb100",
                  "schemaVersion": "19.0",
                  "compRepoURL": "../../sdkml3_jetpack_512.json"
              }
          ]
      }
      
    3. Go to the L3 JSON file sdkml3_jetpack_512.json, replace the correct information in this release. In this example, we will only change this release to support a new series Sample AGX Orin modules.

      1. Change the release.targetHW lists’ hardwares to only contain SAMPLE_AGX_ORIN_TARGETS to match the above steps.

      2. Under the component object, for each component: if the platforms.targetIds include JETSON_AGX_ORIN_TARGETS, changes it to only contain SAMPLE_AGX_ORIN_TARGETS; if the platforms.targetIds does not include JETSON_AGX_ORIN_TARGETS, remove this platform, and if there is no more platform in this component, remove this component.

The steps above are all you need to create a customized Jetson AGX Orin based device, Sample AGX Orin, with software config. You can also host all the files with the layout on a server, so the end user can easily load them with a single link (example: sdkmanager --server [link_to_your_customized_file]).