Platform: NVIDIA AGX Thor / JetPack 7.1, Holoscan 2.5.0, Holoscan Sensor Bridge (HSB)
- I’m building a SIPL UDDF for non-camera sensors on HSB — currently a IMU and ..etc planned on the same carrier.
- Each of these needs SPI (e.g. IMU control plane) and/or APB / hololink-register writes (e.g. dToF FPGA control regs, mipi-bridge enable bits) during Init / StartStreaming.
My understanding (please confirm)
For UDDF self-containment — i.e. keeping HsbTransportDriver sensor-agnostic and pushing all sensor init into the per-sensor ModuleDriver — these SPI / APB sequences should be encoded inside HSL bytecode, the same way I2C sequences are today (SubmitSequence(probe/init/start/stop)).
Otherwise the transport driver (or even worse, the application) ends up owning sensor-specific register writes, which doesn’t scale to multi-sensor configurations sharing one HSB.
What I see today (JetPack 7.1)
HSL appears to be I2C-only (plus GPIO / memory / fence / delay / annotate). I checked:
/usr/src/jetson_sipl_api/sipl/hsl/pyhsl/pyhsl.py — HSLRecorder methods (lines ~60–152) cover only addI2CDevice / writeI2C / writeStreamI2C / writeMaskedI2C / pollI2C / readVerifyI2C / readDiscardI2C / writeI2CFromMemory / readI2CToMemory, plus addGPIOPin / writeGPIO /
readVerifyGPIO / pollGPIO. The only device class is I2CDevice (line 172). grep -rE “spi|apb|SPIDevice|APBDevice” under pyhsl/ returns no matches.
/usr/src/jetson_sipl_api/sipl/uddf/include/uddf/cdi/IHardwareAccess.hpp — what ModuleDrivers see is also I2C-only:
class IHardwareAccess {
virtual HSLDynamicSequence& GetDynamicSequence();
virtual HSLResult SubmitSequence(HSLDynamicSequence&);
virtual bool ReadI2C(deviceIndex, startOffset, length, buffer);
// (no SPI / APB / register-write entry points)
};
Questions
- Am I right that SPI / APB writes belong inside HSL for proper UDDF self-containment? Is that the intended direction?
- If yes, are SPI / APB opcodes (or some equivalent device class) planned for a future HSL release? Any rough timeline?
- If not — what is NVIDIA’s recommended pattern to keep a non-camera sensor’s UDDF self-contained without leaking SPI / APB writes into HsbTransportDriver or the application code?
Any pointer to a sample UDDF that demonstrates non-camera sensor integration with SPI/APB-class init would be very helpful. Thanks!
hello daegyu,
as you can see.. Guide to Writing UDDF Drivers, it has only i2c now.
please see-also HSB documentation for the samples, i.e. gpio_example_app.py for reference,.
These respond to your grep.
/opt/nvidia/holoscan$ grep -rlE “apb|SPIDevice|APBDevice”
bin/pose_tree_basic
bin/distributed_pose_tree
include/3rdparty/Eigen/include/Eigen/src/Core/Reshaped.h
include/3rdparty/Eigen/include/Eigen/src/Core/CoreEvaluators.h
examples/build/video_replayer/cpp/recording_output/video_replayer_output.gxf_entities
examples/build/holoviz/cpp/recording_output/holoviz_geometry_output.gxf_entities
examples/build/pose_tree/pose_tree_basic/cpp/pose_tree_basic
examples/build/pose_tree/pose_tree_basic/cpp/CMakeFiles/pose_tree_basic.dir/pose_tree_basic.cpp.o
examples/build/pose_tree/distributed_pose_tree/cpp/CMakeFiles/distributed_pose_tree.dir/distributed_pose_tree.cpp.o
examples/build/pose_tree/distributed_pose_tree/cpp/distributed_pose_tree
examples/build/tools/pose_tree_basic
examples/build/tools/distributed_pose_tree
data/racerx/racerx-medium.mp4
data/racerx/racerx-high.mp4
data/racerx/racerx.gxf_entities
python/lib/holoscan/pose_tree/_pose_tree.cpython-312-aarch64-linux-gnu.so
/opt/nvidia/hololink$ grep -rlE “apb|SPIDevice|APBDevice”
bin/hololink-reset
bin/linux_imx274_player
bin/hololink-set-ip
bin/vb1940_player
bin/program_leopard_cpnx100
bin/program_lattice_cpnx100
bin/hololink-read
bin/hololink-write
bin/signal_generator
bin/linux_single_network_stereo_imx274_player
bin/hololink-enumerate
bin/imx274_player
bin/single_network_stereo_vb1940_player
lib/libemulationroce.a
lib/liblinux_data_plane.a
lib/libemulation.a
lib/libemulation_sensors.a
lib/libemulationcoe.a
lib/libsig_gen.a
lib/libhololink_core.a
include/hololink/core/hololink.hpp
include/hololink/emulation/hsb_emulator.hpp
python/hololink/operators/sig_gen/_sig_gen.cpython-312-aarch64-linux-gnu.so
python/hololink/operators/linux_coe_receiver/_linux_coe_receiver.cpython-312-aarch64-linux-gnu.so
python/hololink/operators/roce_receiver/_roce_receiver.cpython-312-aarch64-linux-gnu.so
python/hololink/operators/linux_receiver_op/_linux_receiver_op.cpython-312-aarch64-linux-gnu.so
python/hololink/operators/linux_receiver/_linux_receiver.cpython-312-aarch64-linux-gnu.so
python/hololink/_hololink.cpython-312-aarch64-linux-gnu.so
python/hololink/emulation/_emulation.cpython-312-aarch64-linux-gnu.so
python/hololink/emulation/sensors/_emulation_sensors.cpython-312-aarch64-linux-gnu.so
python/hololink/sensors/_hololink_sensor.cpython-312-aarch64-linux-gnu.so
python/hololink/sensors/camera/imx274/_native_imx274_camera_sensor.cpython-312-aarch64-linux-gnu.so