libcamera: device_enumerator: add DeviceEnumeratorUdev class
Provide a DeviceEnumeratorUdev class which is a specialization of DeviceEnumerator which uses udev to enumerate information in the system. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
af8c212600
commit
4db38e82a3
2 changed files with 113 additions and 0 deletions
|
@ -266,4 +266,102 @@ DeviceInfo *DeviceEnumerator::search(DeviceMatch &dm) const
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Enumerator Udev
|
||||||
|
*/
|
||||||
|
|
||||||
|
DeviceEnumeratorUdev::DeviceEnumeratorUdev()
|
||||||
|
: udev_(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceEnumeratorUdev::~DeviceEnumeratorUdev()
|
||||||
|
{
|
||||||
|
if (udev_)
|
||||||
|
udev_unref(udev_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DeviceEnumeratorUdev::init()
|
||||||
|
{
|
||||||
|
if (udev_)
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
udev_ = udev_new();
|
||||||
|
if (!udev_)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DeviceEnumeratorUdev::enumerate()
|
||||||
|
{
|
||||||
|
struct udev_enumerate *udev_enum = nullptr;
|
||||||
|
struct udev_list_entry *ents, *ent;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
udev_enum = udev_enumerate_new(udev_);
|
||||||
|
if (!udev_enum)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = udev_enumerate_add_match_subsystem(udev_enum, "media");
|
||||||
|
if (ret < 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
ret = udev_enumerate_scan_devices(udev_enum);
|
||||||
|
if (ret < 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
ents = udev_enumerate_get_list_entry(udev_enum);
|
||||||
|
if (!ents)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
udev_list_entry_foreach(ent, ents) {
|
||||||
|
struct udev_device *dev;
|
||||||
|
const char *devnode;
|
||||||
|
const char *syspath = udev_list_entry_get_name(ent);
|
||||||
|
|
||||||
|
dev = udev_device_new_from_syspath(udev_, syspath);
|
||||||
|
if (!dev) {
|
||||||
|
LOG(Error) << "Failed to get device for '" <<
|
||||||
|
syspath << "', skipping";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
devnode = udev_device_get_devnode(dev);
|
||||||
|
if (!devnode) {
|
||||||
|
udev_device_unref(dev);
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
addDevice(devnode);
|
||||||
|
|
||||||
|
udev_device_unref(dev);
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
udev_enumerate_unref(udev_enum);
|
||||||
|
return ret >= 0 ? 0 : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string DeviceEnumeratorUdev::lookupDevnode(int major, int minor)
|
||||||
|
{
|
||||||
|
struct udev_device *device;
|
||||||
|
const char *name;
|
||||||
|
dev_t devnum;
|
||||||
|
std::string devnode = std::string();
|
||||||
|
|
||||||
|
devnum = makedev(major, minor);
|
||||||
|
device = udev_device_new_from_devnum(udev_, 'c', devnum);
|
||||||
|
if (!device)
|
||||||
|
return std::string();
|
||||||
|
|
||||||
|
name = udev_device_get_devnode(device);
|
||||||
|
if (name)
|
||||||
|
devnode = name;
|
||||||
|
|
||||||
|
udev_device_unref(device);
|
||||||
|
|
||||||
|
return devnode;
|
||||||
|
}
|
||||||
|
|
||||||
} /* namespace libcamera */
|
} /* namespace libcamera */
|
||||||
|
|
|
@ -75,6 +75,21 @@ private:
|
||||||
virtual std::string lookupDevnode(int major, int minor) = 0;
|
virtual std::string lookupDevnode(int major, int minor) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DeviceEnumeratorUdev: public DeviceEnumerator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DeviceEnumeratorUdev();
|
||||||
|
~DeviceEnumeratorUdev();
|
||||||
|
|
||||||
|
int init() final;
|
||||||
|
int enumerate() final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct udev *udev_;
|
||||||
|
|
||||||
|
std::string lookupDevnode(int major, int minor) final;
|
||||||
|
};
|
||||||
|
|
||||||
} /* namespace libcamera */
|
} /* namespace libcamera */
|
||||||
|
|
||||||
#endif /* __LIBCAMERA_DEVICE_ENUMERATOR_H__ */
|
#endif /* __LIBCAMERA_DEVICE_ENUMERATOR_H__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue