blob: 1b3360df31baac573273cc942ef28fb244640995 [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2018-2019, Google Inc.
*
* device_enumerator_udev.h - udev-based device enumerator
*/
#pragma once
#include <list>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <sys/types.h>
#include "libcamera/internal/device_enumerator.h"
struct udev;
struct udev_device;
struct udev_monitor;
namespace libcamera {
class EventNotifier;
class MediaDevice;
class MediaEntity;
class DeviceEnumeratorUdev final : public DeviceEnumerator
{
public:
DeviceEnumeratorUdev();
~DeviceEnumeratorUdev();
int init();
int enumerate();
private:
using DependencyMap = std::map<dev_t, std::list<MediaEntity *>>;
struct MediaDeviceDeps {
MediaDeviceDeps(std::unique_ptr<MediaDevice> media,
DependencyMap deps)
: media_(std::move(media)), deps_(std::move(deps))
{
}
bool operator==(const MediaDeviceDeps &other) const
{
return media_ == other.media_;
}
std::unique_ptr<MediaDevice> media_;
DependencyMap deps_;
};
int addUdevDevice(struct udev_device *dev);
int populateMediaDevice(MediaDevice *media, DependencyMap *deps);
std::string lookupDeviceNode(dev_t devnum);
int addV4L2Device(dev_t devnum);
void udevNotify();
struct udev *udev_;
struct udev_monitor *monitor_;
EventNotifier *notifier_;
std::set<dev_t> orphans_;
std::list<MediaDeviceDeps> pending_;
std::map<dev_t, MediaDeviceDeps *> devMap_;
};
} /* namespace libcamera */