diff options
Diffstat (limited to 'src/libcamera/device_enumerator_sysfs.cpp')
-rw-r--r-- | src/libcamera/device_enumerator_sysfs.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/libcamera/device_enumerator_sysfs.cpp b/src/libcamera/device_enumerator_sysfs.cpp index f3054d5e..78a7da8d 100644 --- a/src/libcamera/device_enumerator_sysfs.cpp +++ b/src/libcamera/device_enumerator_sysfs.cpp @@ -18,6 +18,7 @@ #include <unistd.h> #include "log.h" +#include "media_device.h" namespace libcamera { @@ -32,6 +33,7 @@ int DeviceEnumeratorSysfs::enumerate() { struct dirent *ent; DIR *dir; + int ret = 0; static const char * const sysfs_dirs[] = { "/sys/subsystem/media/devices", @@ -71,11 +73,42 @@ int DeviceEnumeratorSysfs::enumerate() continue; } - addDevice(devnode); + std::shared_ptr<MediaDevice> media = createDevice(devnode); + if (!media) { + ret = -ENODEV; + break; + } + + if (populateMediaDevice(media) < 0) { + ret = -ENODEV; + break; + } + + addDevice(media); } closedir(dir); + return ret; +} + +int DeviceEnumeratorSysfs::populateMediaDevice(const std::shared_ptr<MediaDevice> &media) +{ + /* Associate entities to device node paths. */ + for (MediaEntity *entity : media->entities()) { + if (entity->deviceMajor() == 0 && entity->deviceMinor() == 0) + continue; + + std::string deviceNode = lookupDeviceNode(entity->deviceMajor(), + entity->deviceMinor()); + if (deviceNode.empty()) + return -EINVAL; + + int ret = entity->setDeviceNode(deviceNode); + if (ret) + return ret; + } + return 0; } |