libcamera: device_enumerator: Move lookupDeviceNode() to child classes

The lookupDeviceNode() method is declared as pure virtual in the base
DeviceEnumerator class, but is only called by derived classes. Move it
to the DeviceEnumeratorSysfs and DeviceEnumeratorUdev. This allows
changing the udev version to take a dev_t instead of separate
major/minor, as that's what both the caller and the callee end up using.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
Laurent Pinchart
2019-09-09 13:26:37 +03:00
parent edd60994e8
commit b3cdccbff9
6 changed files with 25 additions and 24 deletions

View File

@@ -306,17 +306,4 @@ std::shared_ptr<MediaDevice> DeviceEnumerator::search(const DeviceMatch &dm)
return nullptr;
}
/**
* \fn DeviceEnumerator::lookupDeviceNode(int major, int minor)
* \brief Lookup device node path from device number
* \param[in] major The device major number
* \param[in] minor The device minor number
*
* Translate a device number given as \a major and \a minor to a device node
* path.
*
* \return the device node path on success, or an empty string if the lookup
* fails
*/
} /* namespace libcamera */

View File

@@ -112,6 +112,17 @@ int DeviceEnumeratorSysfs::populateMediaDevice(const std::shared_ptr<MediaDevice
return 0;
}
/**
* \brief Lookup device node path from device number
* \param[in] major The device major number
* \param[in] minor The device minor number
*
* Translate a device number given as \a major and \a minor to a device node
* path.
*
* \return The device node path on success, or an empty string if the lookup
* fails
*/
std::string DeviceEnumeratorSysfs::lookupDeviceNode(int major, int minor)
{
std::string deviceNode;

View File

@@ -178,10 +178,9 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
if (entity->deviceMajor() == 0 && entity->deviceMinor() == 0)
continue;
std::string deviceNode = lookupDeviceNode(entity->deviceMajor(),
entity->deviceMinor());
dev_t devnum = makedev(entity->deviceMajor(),
entity->deviceMinor());
std::string deviceNode = lookupDeviceNode(devnum);
/* Take device from orphan list first, if it is in the list. */
if (std::find(orphans_.begin(), orphans_.end(), devnum) != orphans_.end()) {
@@ -205,14 +204,21 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
return pendingNodes;
}
std::string DeviceEnumeratorUdev::lookupDeviceNode(int major, int minor)
/**
* \brief Lookup device node path from device number
* \param[in] devnum The device number
*
* Translate a device number given as \a devnum to a device node path.
*
* \return The device node path on success, or an empty string if the lookup
* fails
*/
std::string DeviceEnumeratorUdev::lookupDeviceNode(dev_t devnum)
{
struct udev_device *device;
const char *name;
dev_t devnum;
std::string deviceNode = std::string();
devnum = makedev(major, minor);
device = udev_device_new_from_devnum(udev_, 'c', devnum);
if (!device)
return std::string();
@@ -246,8 +252,7 @@ int DeviceEnumeratorUdev::addV4L2Device(dev_t devnum)
return 0;
}
std::string deviceNode = lookupDeviceNode(entity->deviceMajor(),
entity->deviceMinor());
std::string deviceNode = lookupDeviceNode(devnum);
if (deviceNode.empty())
return -EINVAL;

View File

@@ -50,8 +50,6 @@ protected:
private:
std::vector<std::shared_ptr<MediaDevice>> devices_;
virtual std::string lookupDeviceNode(int major, int minor) = 0;
};
} /* namespace libcamera */

View File

@@ -24,7 +24,7 @@ public:
private:
int populateMediaDevice(const std::shared_ptr<MediaDevice> &media);
std::string lookupDeviceNode(int major, int minor) final;
std::string lookupDeviceNode(int major, int minor);
};
} /* namespace libcamera */

View File

@@ -47,7 +47,7 @@ private:
int addUdevDevice(struct udev_device *dev);
int populateMediaDevice(const std::shared_ptr<MediaDevice> &media);
std::string lookupDeviceNode(int major, int minor) final;
std::string lookupDeviceNode(dev_t devnum);
int addV4L2Device(dev_t devnum);
void udevNotify(EventNotifier *notifier);