libcamera: add model() for retrieving model name in V4L2Subdevice
CameraSensor retrieves model name from media entity. Move the heuristics method into V4L2Subdevice, so CameraLens can reuse the function. Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
95937ff189
commit
5d2aad02e8
3 changed files with 59 additions and 30 deletions
|
@ -61,6 +61,8 @@ public:
|
||||||
int setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
|
int setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
|
||||||
Whence whence = ActiveFormat);
|
Whence whence = ActiveFormat);
|
||||||
|
|
||||||
|
const std::string &model();
|
||||||
|
|
||||||
static std::unique_ptr<V4L2Subdevice>
|
static std::unique_ptr<V4L2Subdevice>
|
||||||
fromEntityName(const MediaDevice *media, const std::string &entity);
|
fromEntityName(const MediaDevice *media, const std::string &entity);
|
||||||
|
|
||||||
|
@ -75,6 +77,8 @@ private:
|
||||||
unsigned int code);
|
unsigned int code);
|
||||||
|
|
||||||
const MediaEntity *entity_;
|
const MediaEntity *entity_;
|
||||||
|
|
||||||
|
std::string model_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace libcamera */
|
} /* namespace libcamera */
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <regex>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <libcamera/property_ids.h>
|
#include <libcamera/property_ids.h>
|
||||||
|
@ -347,34 +346,7 @@ void CameraSensor::initTestPatternModes(
|
||||||
|
|
||||||
int CameraSensor::initProperties()
|
int CameraSensor::initProperties()
|
||||||
{
|
{
|
||||||
/*
|
model_ = subdev_->model();
|
||||||
* Extract the camera sensor model name from the media entity name.
|
|
||||||
*
|
|
||||||
* There is no standardized naming scheme for sensor entities in the
|
|
||||||
* Linux kernel at the moment.
|
|
||||||
*
|
|
||||||
* - The most common rule, used by I2C sensors, associates the model
|
|
||||||
* name with the I2C bus number and address (e.g. 'imx219 0-0010').
|
|
||||||
*
|
|
||||||
* - When the sensor exposes multiple subdevs, the model name is
|
|
||||||
* usually followed by a function name, as in the smiapp driver (e.g.
|
|
||||||
* 'jt8ew9 pixel_array 0-0010').
|
|
||||||
*
|
|
||||||
* - The vimc driver names its sensors 'Sensor A' and 'Sensor B'.
|
|
||||||
*
|
|
||||||
* Other schemes probably exist. As a best effort heuristic, use the
|
|
||||||
* part of the entity name before the first space if the name contains
|
|
||||||
* an I2C address, and use the full entity name otherwise.
|
|
||||||
*/
|
|
||||||
std::string entityName = entity_->name();
|
|
||||||
std::regex i2cRegex{ " [0-9]+-[0-9a-f]{4}" };
|
|
||||||
std::smatch match;
|
|
||||||
|
|
||||||
if (std::regex_search(entityName, match, i2cRegex))
|
|
||||||
model_ = entityName.substr(0, entityName.find(' '));
|
|
||||||
else
|
|
||||||
model_ = entityName;
|
|
||||||
|
|
||||||
properties_.set(properties::Model, utils::toAscii(model_));
|
properties_.set(properties::Model, utils::toAscii(model_));
|
||||||
|
|
||||||
/* Generate a unique ID for the sensor. */
|
/* Generate a unique ID for the sensor. */
|
||||||
|
@ -832,7 +804,7 @@ int CameraSensor::generateId()
|
||||||
/*
|
/*
|
||||||
* Virtual sensors not described in firmware
|
* Virtual sensors not described in firmware
|
||||||
*
|
*
|
||||||
* Verify it's a platform device and construct ID from the deive path
|
* Verify it's a platform device and construct ID from the device path
|
||||||
* and model of sensor.
|
* and model of sensor.
|
||||||
*/
|
*/
|
||||||
if (devPath.find("/sys/devices/platform/", 0) == 0) {
|
if (devPath.find("/sys/devices/platform/", 0) == 0) {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <regex>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
@ -442,6 +443,58 @@ int V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the model name of the device
|
||||||
|
*
|
||||||
|
* The model name allows identification of the specific device model. This can
|
||||||
|
* be used to infer device characteristics, for instance to determine the
|
||||||
|
* analogue gain model of a camera sensor based on the sensor model name.
|
||||||
|
*
|
||||||
|
* Neither the V4L2 API nor the Media Controller API expose an explicit model
|
||||||
|
* name. This function implements a heuristics to extract the model name from
|
||||||
|
* the subdevice's entity name. This should produce accurate results for
|
||||||
|
* I2C-based devices. If the heuristics can't match a known naming pattern,
|
||||||
|
* the function returns the full entity name.
|
||||||
|
*
|
||||||
|
* \return The model name of the device
|
||||||
|
*/
|
||||||
|
const std::string &V4L2Subdevice::model()
|
||||||
|
{
|
||||||
|
if (!model_.empty())
|
||||||
|
return model_;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extract model name from the media entity name.
|
||||||
|
*
|
||||||
|
* There is no standardized naming scheme for sensor or other entities
|
||||||
|
* in the Linux kernel at the moment.
|
||||||
|
*
|
||||||
|
* - The most common rule, used by I2C sensors, associates the model
|
||||||
|
* name with the I2C bus number and address (e.g. 'imx219 0-0010').
|
||||||
|
*
|
||||||
|
* - When the sensor exposes multiple subdevs, the model name is
|
||||||
|
* usually followed by a function name, as in the smiapp driver (e.g.
|
||||||
|
* 'jt8ew9 pixel_array 0-0010').
|
||||||
|
*
|
||||||
|
* - The vimc driver names its sensors 'Sensor A' and 'Sensor B'.
|
||||||
|
*
|
||||||
|
* Other schemes probably exist. As a best effort heuristic, use the
|
||||||
|
* part of the entity name before the first space if the name contains
|
||||||
|
* an I2C address, and use the full entity name otherwise.
|
||||||
|
*/
|
||||||
|
std::string entityName = entity_->name();
|
||||||
|
std::regex i2cRegex{ " [0-9]+-[0-9a-f]{4}" };
|
||||||
|
std::smatch match;
|
||||||
|
|
||||||
|
std::string model;
|
||||||
|
if (std::regex_search(entityName, match, i2cRegex))
|
||||||
|
model_ = entityName.substr(0, entityName.find(' '));
|
||||||
|
else
|
||||||
|
model_ = entityName;
|
||||||
|
|
||||||
|
return model_;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Create a new video subdevice instance from \a entity in media device
|
* \brief Create a new video subdevice instance from \a entity in media device
|
||||||
* \a media
|
* \a media
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue