Integrating UDDF Drivers with SIPL#

After you build your UDDF driver, you must make it discoverable by SIPL. This page covers driver configuration matching, the JSON configuration structure, and the library installation path that SIPL scans at startup.

Driver Configuration Matching#

SIPL uses a name-matching system to connect your drivers with camera configurations. The DriverInfo.name in your driver code must exactly match the corresponding name field in the platform’s SensorSystemConfig JSON files.

A GMSL driver library typically provides four driver types:

  • Camera module driver: Controls the camera module (sensor and serializer). SIPL matches this driver using cameraConfigs[].moduleDriverName when the field is present, otherwise using cameraConfigs[].name.

  • Deserializer driver: Controls the GMSL deserializer. SIPL matches this driver using transportSettings[].deserInfo.name.

  • Module power driver: Manages camera module power sequencing. SIPL matches this driver using transportSettings[].powerControlInfo.moduleInfo.name.

  • Deserializer power driver: Manages deserializer power sequencing. SIPL matches this driver using transportSettings[].powerControlInfo.deserializerInfo.name.

In Your Driver Code#

Your driver library declares a DriverInfo structure for each driver it provides. SIPL uses the name field to match your driver against the JSON configuration:

static const ddi::DriverInfo g_moduleDriverInfo = {
    .name         = "SampleGmslModule",
    .description  = "A sample GMSL camera module driver",
    .vendor       = "NVIDIA Corporation",
    .revision     = "1.0.0"
};

static const ddi::DriverInfo g_deserDriverInfo = {
    .name         = "SampleGmslDeserializer",
    .description  = "A sample GMSL deserializer driver",
    .vendor       = "NVIDIA Corporation",
    .revision     = "1.0.0"
};

static const ddi::DriverInfo g_modulePowerDriverInfo = {
    .name         = "SampleModulePowerDriver",
    .description  = "A sample GMSL module power driver",
    .vendor       = "NVIDIA Corporation",
    .revision     = "1.0.0"
};

static const ddi::DriverInfo g_deserPowerDriverInfo = {
    .name         = "SampleDeserializerPowerDriver",
    .description  = "A sample GMSL deserializer power driver",
    .vendor       = "NVIDIA Corporation",
    .revision     = "1.0.0"
};

In Your SensorSystemConfig JSON#

The SensorSystemConfig JSON files define the camera and transport settings that SIPL uses to match against your driver names.

Camera Configuration#

The camera configuration defines the sensor, serializer, and link settings. For GMSL, SIPL matches the camera module driver using moduleDriverName when the field is present. If moduleDriverName is absent, SIPL falls back to the top-level name field. The selected value must exactly match your camera module driver’s DriverInfo.name:

{
    "cameraConfigs": [
        {
            "name": "SampleGmslModule",
            "moduleDriverName": "SampleGmslModule",
            "type": "GMSL",
            "description": "Sample RGGB GMSL Camera - 3840x2160 30FPS",
            "serInfo": {
                "name": "SerializerName",
                "i2cAddress": "0x40"
            },
            "linkMode": "LINK_MODE_GMSL2_6GBPS",
            "fsyncMode": "external",
            "mipiSettings": {
                "dphyRate": 1300000,
                "phyMode": "dphy"
            },
            "sensorInfo": {
                "name": "SampleSensor",
                "description": "Sample RGGB Sensor for GMSL",
                "i2cAddress": "0x1A",
                "numContext": 1,
                "virtualChannels": [
                    {
                        "cfa": "rggb",
                        "embeddedTopLines": 1,
                        "embeddedBottomLines": 20,
                        "inputFormat": "raw12",
                        "width": 3840,
                        "height": 2160,
                        "fps": 30.0,
                        "isEmbeddedDataTypeEnabled": false
                    }
                ]
            },
            "isEEPROMSupported": true
        }
    ]
}

Transport Configuration#

The transport configuration defines the deserializer and power control settings. Each name field must exactly match the corresponding driver’s DriverInfo.name:

{
    "transportSettings": [
        {
            "name": "transportSettings_AB",
            "type": "GMSL",
            "description": "GMSL transport settings for CSI-AB",
            "csiPort": "csi-ab",
            "phyMode": "dphy",
            "deserInfo": {
                "name": "SampleGmslDeserializer",
                "i2cAddress": "0x29"
            },
            "powerControlInfo": {
                "deserializerInfo": {
                    "name": "SampleDeserializerPowerDriver",
                    "gpioPinIndex": 7
                },
                "moduleInfo": {
                    "name": "SampleModulePowerDriver",
                    "i2cAddress": "0x27"
                }
            },
            "i2cDevice": 9,
            "desI2CPort": 9
        }
    ]
}

Note

The following JSON fields must match the corresponding DriverInfo.name values exactly:

  • cameraConfigs[].name must match your camera module driver name.

  • cameraConfigs[].moduleDriverName must match your camera module driver name when the field is present.

  • cameraConfigs[].name must match your camera module driver name when moduleDriverName is absent.

  • deserInfo.name must match your deserializer driver name.

  • powerControlInfo.deserializerInfo.name must match your deserializer power driver name.

  • powerControlInfo.moduleInfo.name must match your module power driver name.

Warning

JetPack 7.2 migration: Driver names are case-sensitive. Module and transport "name" fields in SensorSystemConfig JSON files are now matched case-sensitively against the driver-exported DriverInfo.name. JSON configs that worked on JetPack 7.1 with a different case (for example, "vb1940" versus "VB1940") will fail to bind on JetPack 7.2. Update each "name" field to match the exact case exported by the driver.

Note

Use moduleDriverName when multiple camera configuration names should share one module driver and NITO. For example, the shipped AR0234CS_HAWK_SINGLE_CAMERA and AR0234CS_HAWK_NON_STEREO configs use moduleDriverName: "AR0234CS_HAWK", and VB1940_Stereo uses moduleDriverName: "VB1940".

Driver Library Installation#

SIPL automatically discovers drivers from the following directories:

  • /usr/lib/nvsipl_drv

Configure your packaging scripts to install the compiled driver shared library to the appropriate directory for your target OS. At startup, SIPL scans these directories, loads each library, calls the uddf_discover_drivers() function, and matches the returned driver names against your configuration files.

Warning

JetPack 7.2 ABI break: Rebuild UDDF drivers against JetPack 7.2 headers. The UDDF interface UUIDs for IGmslDeserializer, IGmslModuleControl, IGmslSerializer, and ICoEBridgeControl were bumped in JetPack 7.2. Drivers compiled against JetPack 7.1 UUIDs will fail to load on JetPack 7.2 (the framework will not match the interfaces they export). Rebuild every UDDF driver against the JetPack 7.2 headers and re-install to /usr/lib/nvsipl_drv.