[libcamera-devel] [PATCH 1/9] libcamera: v4l2_device: Add method to lookup device path

Niklas Söderlund niklas.soderlund at ragnatech.se
Sat Jul 18 15:23:16 CEST 2020


Add a method to lookup a V4L2 devices path in sysfs. The device path
describes the bus and device backing the V4L2 device and is guaranteed
to be unique in the system and is persistent between reboots of the
system.

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
 include/libcamera/internal/v4l2_device.h |  1 +
 src/libcamera/v4l2_device.cpp            | 27 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h
index bf643f2ec966bb33..3b605aab343b3b94 100644
--- a/include/libcamera/internal/v4l2_device.h
+++ b/include/libcamera/internal/v4l2_device.h
@@ -30,6 +30,7 @@ public:
 	int setControls(ControlList *ctrls);
 
 	const std::string &deviceNode() const { return deviceNode_; }
+	std::string devicePath() const;
 
 protected:
 	V4L2Device(const std::string &deviceNode);
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 56ea1ddda2c1425f..2f95e45261463f34 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -9,6 +9,7 @@
 
 #include <fcntl.h>
 #include <iomanip>
+#include <limits.h>
 #include <string.h>
 #include <sys/ioctl.h>
 #include <sys/syscall.h>
@@ -350,6 +351,32 @@ int V4L2Device::setControls(ControlList *ctrls)
 	return ret;
 }
 
+/**
+ * \brief Retrieve the device path
+ *
+ * The device path describes the bus and device backing the V4L2 device and is
+ * guaranteed to be unique in the system and is persistent between reboots of
+ * the system.
+ *
+ * The path is located by utilising that every V4L2 device have an entry under
+ * /sys/class/video4linux/ that contains a symlink the device backing it.
+ *
+ * \todo When switching to C++17 use std::filesystem:: in the implementation.
+ *
+ * \return The device path
+ */
+std::string V4L2Device::devicePath() const
+{
+	std::string vdev = basename(deviceNode_.c_str());
+	std::string sysfs = "/sys/class/video4linux/" + vdev + "/device";
+
+	char path[PATH_MAX];
+	if (!realpath(sysfs.c_str(), path))
+		LOG(V4L2, Fatal) << "Can not resolve path for " << deviceNode_;
+
+	return path;
+}
+
 /**
  * \brief Perform an IOCTL system call on the device node
  * \param[in] request The IOCTL request code
-- 
2.27.0



More information about the libcamera-devel mailing list